blob: 35e3691ec2672abac499f8458600c869093a36f8 [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 Cabecinhasf2a3aec2015-01-31 23:05:51 +00003952 bool IsCXX = types::isCXX(InputType);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003953 bool RTTIEnabled = false;
3954 Arg *NoRTTIArg = Args.getLastArg(
3955 options::OPT_mkernel, options::OPT_fapple_kext, options::OPT_fno_rtti);
3956
3957 // PS4 requires rtti when exceptions are enabled. If -fno-rtti was
3958 // explicitly passed, error out. Otherwise enable rtti and emit a
3959 // warning.
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003960 Arg *Exceptions = Args.getLastArg(
3961 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
3962 options::OPT_fexceptions, options::OPT_fno_exceptions);
3963 if (Triple.isPS4CPU() && Exceptions) {
3964 bool CXXExceptions =
3965 (IsCXX &&
3966 Exceptions->getOption().matches(options::OPT_fexceptions)) ||
3967 Exceptions->getOption().matches(options::OPT_fcxx_exceptions);
3968 if (CXXExceptions) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003969 if (NoRTTIArg)
3970 D.Diag(diag::err_drv_argument_not_allowed_with)
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003971 << NoRTTIArg->getAsString(Args) << Exceptions->getAsString(Args);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003972 else {
3973 RTTIEnabled = true;
3974 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
3975 }
3976 }
3977 }
Mike Stump183c3d22009-07-31 23:15:31 +00003978
Richard Smith52be6192012-11-05 22:04:41 +00003979 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003980 if (Sanitize.sanitizesVptr()) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003981 // If rtti was explicitly disabled and the vptr sanitizer is on, error
3982 // out. Otherwise, warn that vptr will be disabled unless -frtti is
3983 // passed.
3984 if (NoRTTIArg) {
3985 D.Diag(diag::err_drv_argument_not_allowed_with)
3986 << "-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
3987 } else {
3988 D.Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
3989 // All sanitizer switches have been pushed. This -fno-sanitize
3990 // will override any -fsanitize={vptr,undefined} passed before it.
3991 CmdArgs.push_back("-fno-sanitize=vptr");
3992 }
Richard Smith52be6192012-11-05 22:04:41 +00003993 }
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003994
3995 if (!RTTIEnabled)
3996 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00003997 }
3998
Tony Linthicum76329bf2011-12-12 21:14:55 +00003999 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004000 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004001 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004002 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004003 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004004 CmdArgs.push_back("-fshort-enums");
4005
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004006 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004007 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004008 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004009 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004010
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004011 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004012 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004013 options::OPT_fno_threadsafe_statics))
4014 CmdArgs.push_back("-fno-threadsafe-statics");
4015
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004016 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004017 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4018 options::OPT_fno_use_cxa_atexit,
4019 !IsWindowsCygnus && !IsWindowsGNU &&
4020 getToolChain().getArch() != llvm::Triple::hexagon &&
4021 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004022 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004023 CmdArgs.push_back("-fno-use-cxa-atexit");
4024
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004025 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004026 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004027 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004028 CmdArgs.push_back("-fms-extensions");
4029
Francois Pichet1b4f1632011-09-17 04:32:15 +00004030 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004031 if (Args.hasFlag(options::OPT_fms_compatibility,
4032 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004033 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4034 options::OPT_fno_ms_extensions,
4035 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004036 CmdArgs.push_back("-fms-compatibility");
4037
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004038 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004039 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004040 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4041 Args.hasArg(options::OPT_fms_compatibility_version)) {
4042 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4043 const Arg *MSCompatibilityVersion =
4044 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004045
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004046 if (MSCVersion && MSCompatibilityVersion)
4047 D.Diag(diag::err_drv_argument_not_allowed_with)
4048 << MSCVersion->getAsString(Args)
4049 << MSCompatibilityVersion->getAsString(Args);
4050
4051 std::string Ver;
4052 if (MSCompatibilityVersion)
4053 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4054 else if (MSCVersion)
4055 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4056
4057 if (Ver.empty())
4058 CmdArgs.push_back("-fms-compatibility-version=17.00");
4059 else
4060 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4061 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004062
Eric Christopher5ecce122013-02-18 00:38:31 +00004063 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004064 if (Args.hasFlag(options::OPT_fborland_extensions,
4065 options::OPT_fno_borland_extensions, false))
4066 CmdArgs.push_back("-fborland-extensions");
4067
Francois Pichet02744872011-09-01 16:38:08 +00004068 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4069 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004070 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004071 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004072 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004073
Chandler Carruthe03aa552010-04-17 20:17:31 +00004074 // -fgnu-keywords default varies depending on language; only pass if
4075 // specified.
4076 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004077 options::OPT_fno_gnu_keywords))
4078 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004079
Rafael Espindola922a6242011-06-02 17:30:53 +00004080 if (Args.hasFlag(options::OPT_fgnu89_inline,
4081 options::OPT_fno_gnu89_inline,
4082 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004083 CmdArgs.push_back("-fgnu89-inline");
4084
Chad Rosier9c76d242012-03-15 22:31:42 +00004085 if (Args.hasArg(options::OPT_fno_inline))
4086 CmdArgs.push_back("-fno-inline");
4087
Chad Rosier64d6be92012-03-06 21:17:19 +00004088 if (Args.hasArg(options::OPT_fno_inline_functions))
4089 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004090
John McCall5fb5df92012-06-20 06:18:46 +00004091 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004092
John McCall5fb5df92012-06-20 06:18:46 +00004093 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004094 // legacy is the default. Except for deployment taget of 10.5,
4095 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4096 // gets ignored silently.
4097 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004098 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4099 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004100 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004101 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004102 if (getToolChain().UseObjCMixedDispatch())
4103 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4104 else
4105 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4106 }
4107 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004108
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004109 // When ObjectiveC legacy runtime is in effect on MacOSX,
4110 // turn on the option to do Array/Dictionary subscripting
4111 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004112 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4113 getToolChain().getTriple().isMacOSX() &&
4114 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4115 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004116 objcRuntime.isNeXTFamily())
4117 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4118
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004119 // -fencode-extended-block-signature=1 is default.
4120 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4121 CmdArgs.push_back("-fencode-extended-block-signature");
4122 }
4123
John McCall24fc0de2011-07-06 00:26:06 +00004124 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4125 // NOTE: This logic is duplicated in ToolChains.cpp.
4126 bool ARC = isObjCAutoRefCount(Args);
4127 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004128 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004129
John McCall24fc0de2011-07-06 00:26:06 +00004130 CmdArgs.push_back("-fobjc-arc");
4131
Chandler Carruth491db322011-11-04 07:34:47 +00004132 // FIXME: It seems like this entire block, and several around it should be
4133 // wrapped in isObjC, but for now we just use it here as this is where it
4134 // was being used previously.
4135 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4136 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4137 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4138 else
4139 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4140 }
4141
John McCall24fc0de2011-07-06 00:26:06 +00004142 // Allow the user to enable full exceptions code emission.
4143 // We define off for Objective-CC, on for Objective-C++.
4144 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4145 options::OPT_fno_objc_arc_exceptions,
4146 /*default*/ types::isCXX(InputType)))
4147 CmdArgs.push_back("-fobjc-arc-exceptions");
4148 }
4149
4150 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4151 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004152 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004153 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004154
John McCall24fc0de2011-07-06 00:26:06 +00004155 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4156 // takes precedence.
4157 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4158 if (!GCArg)
4159 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4160 if (GCArg) {
4161 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004162 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004163 << GCArg->getAsString(Args);
4164 } else if (getToolChain().SupportsObjCGC()) {
4165 GCArg->render(Args, CmdArgs);
4166 } else {
4167 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004168 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004169 << GCArg->getAsString(Args);
4170 }
4171 }
4172
Reid Klecknerc542d372014-06-27 17:02:02 +00004173 // Handle GCC-style exception args.
4174 if (!C.getDriver().IsCLMode())
4175 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4176 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004177
4178 if (getToolChain().UseSjLjExceptions())
4179 CmdArgs.push_back("-fsjlj-exceptions");
4180
4181 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004182 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4183 options::OPT_fno_assume_sane_operator_new))
4184 CmdArgs.push_back("-fno-assume-sane-operator-new");
4185
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004186 // -fconstant-cfstrings is default, and may be subject to argument translation
4187 // on Darwin.
4188 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4189 options::OPT_fno_constant_cfstrings) ||
4190 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4191 options::OPT_mno_constant_cfstrings))
4192 CmdArgs.push_back("-fno-constant-cfstrings");
4193
John Thompsoned4e2952009-11-05 20:14:16 +00004194 // -fshort-wchar default varies depending on platform; only
4195 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004196 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4197 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004198 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004199
Hans Wennborg28c96312013-07-31 23:39:13 +00004200 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004201 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004202 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004203 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004204 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004205
Daniel Dunbar096ed292011-10-05 21:04:55 +00004206 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4207 // -fno-pack-struct doesn't apply to -fpack-struct=.
4208 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004209 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004210 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004211 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004212 } else if (Args.hasFlag(options::OPT_fpack_struct,
4213 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004214 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004215 }
4216
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004217 // Handle -fmax-type-align=N and -fno-type-align
4218 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4219 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4220 if (!SkipMaxTypeAlign) {
4221 std::string MaxTypeAlignStr = "-fmax-type-align=";
4222 MaxTypeAlignStr += A->getValue();
4223 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4224 }
4225 } else if (getToolChain().getTriple().isOSDarwin()) {
4226 if (!SkipMaxTypeAlign) {
4227 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4228 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4229 }
4230 }
4231
Robert Lytton0e076492013-08-13 09:43:10 +00004232 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004233 if (!Args.hasArg(options::OPT_fcommon))
4234 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004235 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004236 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004237
Daniel Dunbard18049a2009-04-07 21:16:11 +00004238 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004239 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004240 CmdArgs.push_back("-fno-common");
4241
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004242 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004243 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004244 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004245 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004246 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004247 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4248
Daniel Dunbar6358d682010-10-15 22:30:42 +00004249 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4250 if (!Args.hasFlag(options::OPT_ffor_scope,
4251 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004252 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004253 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4254
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004255 // -finput_charset=UTF-8 is default. Reject others
4256 if (Arg *inputCharset = Args.getLastArg(
4257 options::OPT_finput_charset_EQ)) {
4258 StringRef value = inputCharset->getValue();
4259 if (value != "UTF-8")
4260 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4261 }
4262
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004263 // -fexec_charset=UTF-8 is default. Reject others
4264 if (Arg *execCharset = Args.getLastArg(
4265 options::OPT_fexec_charset_EQ)) {
4266 StringRef value = execCharset->getValue();
4267 if (value != "UTF-8")
4268 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4269 }
4270
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004271 // -fcaret-diagnostics is default.
4272 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4273 options::OPT_fno_caret_diagnostics, true))
4274 CmdArgs.push_back("-fno-caret-diagnostics");
4275
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004276 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004277 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004278 options::OPT_fno_diagnostics_fixit_info))
4279 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004280
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004281 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004282 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004283 options::OPT_fno_diagnostics_show_option))
4284 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004285
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004286 if (const Arg *A =
4287 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4288 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004289 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004290 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004291
Douglas Gregor643c9222011-05-21 17:07:29 +00004292 if (const Arg *A =
4293 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4294 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004295 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004296 }
4297
Chandler Carruthb6766f02011-03-27 01:50:55 +00004298 if (Arg *A = Args.getLastArg(
4299 options::OPT_fdiagnostics_show_note_include_stack,
4300 options::OPT_fno_diagnostics_show_note_include_stack)) {
4301 if (A->getOption().matches(
4302 options::OPT_fdiagnostics_show_note_include_stack))
4303 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4304 else
4305 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4306 }
4307
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004308 // Color diagnostics are the default, unless the terminal doesn't support
4309 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004310 // Support both clang's -f[no-]color-diagnostics and gcc's
4311 // -f[no-]diagnostics-colors[=never|always|auto].
4312 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004313 for (const auto &Arg : Args) {
4314 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004315 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4316 !O.matches(options::OPT_fdiagnostics_color) &&
4317 !O.matches(options::OPT_fno_color_diagnostics) &&
4318 !O.matches(options::OPT_fno_diagnostics_color) &&
4319 !O.matches(options::OPT_fdiagnostics_color_EQ))
4320 continue;
4321
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004322 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004323 if (O.matches(options::OPT_fcolor_diagnostics) ||
4324 O.matches(options::OPT_fdiagnostics_color)) {
4325 ShowColors = Colors_On;
4326 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4327 O.matches(options::OPT_fno_diagnostics_color)) {
4328 ShowColors = Colors_Off;
4329 } else {
4330 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004331 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004332 if (value == "always")
4333 ShowColors = Colors_On;
4334 else if (value == "never")
4335 ShowColors = Colors_Off;
4336 else if (value == "auto")
4337 ShowColors = Colors_Auto;
4338 else
4339 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4340 << ("-fdiagnostics-color=" + value).str();
4341 }
4342 }
4343 if (ShowColors == Colors_On ||
4344 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004345 CmdArgs.push_back("-fcolor-diagnostics");
4346
Nico Rieck7857d462013-09-11 00:38:02 +00004347 if (Args.hasArg(options::OPT_fansi_escape_codes))
4348 CmdArgs.push_back("-fansi-escape-codes");
4349
Daniel Dunbardb097022009-06-08 21:13:54 +00004350 if (!Args.hasFlag(options::OPT_fshow_source_location,
4351 options::OPT_fno_show_source_location))
4352 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004353
Douglas Gregor643c9222011-05-21 17:07:29 +00004354 if (!Args.hasFlag(options::OPT_fshow_column,
4355 options::OPT_fno_show_column,
4356 true))
4357 CmdArgs.push_back("-fno-show-column");
4358
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004359 if (!Args.hasFlag(options::OPT_fspell_checking,
4360 options::OPT_fno_spell_checking))
4361 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004362
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004363
Chad Rosierc8e56e82012-12-05 21:08:21 +00004364 // -fno-asm-blocks is default.
4365 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4366 false))
4367 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004368
Steven Wucb0d13f2015-01-16 23:05:28 +00004369 // -fgnu-inline-asm is default.
4370 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4371 options::OPT_fno_gnu_inline_asm, true))
4372 CmdArgs.push_back("-fno-gnu-inline-asm");
4373
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004374 // Enable vectorization per default according to the optimization level
4375 // selected. For optimization levels that want vectorization we use the alias
4376 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004377 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004378 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004379 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004380 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004381 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004382 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004383
Chad Rosier136d67d2014-04-28 19:30:57 +00004384 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004385 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4386 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004387 options::OPT_fslp_vectorize;
4388 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004389 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004390 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004391
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004392 // -fno-slp-vectorize-aggressive is default.
4393 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004394 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004395 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004396
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004397 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4398 A->render(Args, CmdArgs);
4399
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004400 // -fdollars-in-identifiers default varies depending on platform and
4401 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004402 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004403 options::OPT_fno_dollars_in_identifiers)) {
4404 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004405 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004406 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004407 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004408 }
4409
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004410 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4411 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004412 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004413 options::OPT_fno_unit_at_a_time)) {
4414 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004415 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004416 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004417
Eli Friedman055c9702011-11-02 01:53:16 +00004418 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4419 options::OPT_fno_apple_pragma_pack, false))
4420 CmdArgs.push_back("-fapple-pragma-pack");
4421
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004422 // le32-specific flags:
4423 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4424 // by default.
4425 if (getToolChain().getArch() == llvm::Triple::le32) {
4426 CmdArgs.push_back("-fno-math-builtin");
4427 }
4428
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004429 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004430 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004431 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004432#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004433 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004434 (getToolChain().getArch() == llvm::Triple::arm ||
4435 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004436 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4437 CmdArgs.push_back("-fno-builtin-strcat");
4438 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4439 CmdArgs.push_back("-fno-builtin-strcpy");
4440 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004441#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004442
Justin Bognera88f0122014-06-20 22:59:50 +00004443 // Enable rewrite includes if the user's asked for it or if we're generating
4444 // diagnostics.
4445 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4446 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004447 if (Args.hasFlag(options::OPT_frewrite_includes,
4448 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004449 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004450 CmdArgs.push_back("-frewrite-includes");
4451
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004452 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004453 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004454 options::OPT_traditional_cpp)) {
4455 if (isa<PreprocessJobAction>(JA))
4456 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004457 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004458 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004459 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004460
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004461 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004462 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004463
4464 // Handle serialized diagnostics.
4465 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4466 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004467 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004468 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004469
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004470 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4471 CmdArgs.push_back("-fretain-comments-from-system-headers");
4472
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004473 // Forward -fcomment-block-commands to -cc1.
4474 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004475 // Forward -fparse-all-comments to -cc1.
4476 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004477
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004478 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4479 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004480 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004481 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004482 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4483 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004484 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004485
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004486 // We translate this by hand to the -cc1 argument, since nightly test uses
4487 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004488 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004489 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004490 OptDisabled = true;
4491 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004492 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004493 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004494
Bob Wilson23a55f12014-12-21 07:00:00 +00004495 // With -save-temps, we want to save the unoptimized bitcode output from the
4496 // CompileJobAction, so disable optimizations if they are not already
4497 // disabled.
4498 if (Args.hasArg(options::OPT_save_temps) && !OptDisabled &&
4499 isa<CompileJobAction>(JA))
4500 CmdArgs.push_back("-disable-llvm-optzns");
4501
Daniel Dunbard67a3222009-03-30 06:36:42 +00004502 if (Output.getType() == types::TY_Dependencies) {
4503 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004504 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004505 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004506 CmdArgs.push_back(Output.getFilename());
4507 } else {
4508 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004509 }
4510
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004511 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004512 addDashXForInput(Args, II, CmdArgs);
4513
Daniel Dunbarb440f562010-08-02 02:38:21 +00004514 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004515 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004516 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004517 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004518 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004519
Chris Lattnere9d7d782009-11-03 19:50:27 +00004520 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4521
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004522 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004523
4524 // Optionally embed the -cc1 level arguments into the debug info, for build
4525 // analysis.
4526 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004527 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004528 for (const auto &Arg : Args)
4529 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004530
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004531 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004532 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004533 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004534 SmallString<128> EscapedArg;
4535 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004536 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004537 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004538 }
4539 CmdArgs.push_back("-dwarf-debug-flags");
4540 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4541 }
4542
Eric Christopherd3804002013-02-22 20:12:52 +00004543 // Add the split debug info name to the command lines here so we
4544 // can propagate it to the backend.
4545 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004546 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004547 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4548 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004549 const char *SplitDwarfOut;
4550 if (SplitDwarf) {
4551 CmdArgs.push_back("-split-dwarf-file");
4552 SplitDwarfOut = SplitDebugName(Args, Inputs);
4553 CmdArgs.push_back(SplitDwarfOut);
4554 }
4555
4556 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004557 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004558 Output.getType() == types::TY_Object &&
4559 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004560 auto CLCommand =
4561 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4562 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4563 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004564 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004565 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004566 }
4567
Daniel Dunbar17731772009-03-23 19:03:36 +00004568
Eric Christopherf1545832013-02-22 23:50:16 +00004569 // Handle the debug info splitting at object creation time if we're
4570 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004571 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004572 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004573 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004574
Roman Divacky178e01602011-02-10 16:52:03 +00004575 if (Arg *A = Args.getLastArg(options::OPT_pg))
4576 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004577 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004578 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004579
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004580 // Claim some arguments which clang supports automatically.
4581
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004582 // -fpch-preprocess is used with gcc to add a special marker in the output to
4583 // include the PCH file. Clang's PTH solution is completely transparent, so we
4584 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004585 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004586
Daniel Dunbar17731772009-03-23 19:03:36 +00004587 // Claim some arguments which clang doesn't support, but we don't
4588 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004589 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4590 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004591
Rafael Espindolab0092d72013-09-04 19:37:35 +00004592 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004593 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004594}
4595
John McCall5fb5df92012-06-20 06:18:46 +00004596/// Add options related to the Objective-C runtime/ABI.
4597///
4598/// Returns true if the runtime is non-fragile.
4599ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4600 ArgStringList &cmdArgs,
4601 RewriteKind rewriteKind) const {
4602 // Look for the controlling runtime option.
4603 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4604 options::OPT_fgnu_runtime,
4605 options::OPT_fobjc_runtime_EQ);
4606
4607 // Just forward -fobjc-runtime= to the frontend. This supercedes
4608 // options about fragility.
4609 if (runtimeArg &&
4610 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4611 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004612 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004613 if (runtime.tryParse(value)) {
4614 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4615 << value;
4616 }
4617
4618 runtimeArg->render(args, cmdArgs);
4619 return runtime;
4620 }
4621
4622 // Otherwise, we'll need the ABI "version". Version numbers are
4623 // slightly confusing for historical reasons:
4624 // 1 - Traditional "fragile" ABI
4625 // 2 - Non-fragile ABI, version 1
4626 // 3 - Non-fragile ABI, version 2
4627 unsigned objcABIVersion = 1;
4628 // If -fobjc-abi-version= is present, use that to set the version.
4629 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004630 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004631 if (value == "1")
4632 objcABIVersion = 1;
4633 else if (value == "2")
4634 objcABIVersion = 2;
4635 else if (value == "3")
4636 objcABIVersion = 3;
4637 else
4638 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4639 << value;
4640 } else {
4641 // Otherwise, determine if we are using the non-fragile ABI.
4642 bool nonFragileABIIsDefault =
4643 (rewriteKind == RK_NonFragile ||
4644 (rewriteKind == RK_None &&
4645 getToolChain().IsObjCNonFragileABIDefault()));
4646 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4647 options::OPT_fno_objc_nonfragile_abi,
4648 nonFragileABIIsDefault)) {
4649 // Determine the non-fragile ABI version to use.
4650#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4651 unsigned nonFragileABIVersion = 1;
4652#else
4653 unsigned nonFragileABIVersion = 2;
4654#endif
4655
4656 if (Arg *abiArg = args.getLastArg(
4657 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004658 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004659 if (value == "1")
4660 nonFragileABIVersion = 1;
4661 else if (value == "2")
4662 nonFragileABIVersion = 2;
4663 else
4664 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4665 << value;
4666 }
4667
4668 objcABIVersion = 1 + nonFragileABIVersion;
4669 } else {
4670 objcABIVersion = 1;
4671 }
4672 }
4673
4674 // We don't actually care about the ABI version other than whether
4675 // it's non-fragile.
4676 bool isNonFragile = objcABIVersion != 1;
4677
4678 // If we have no runtime argument, ask the toolchain for its default runtime.
4679 // However, the rewriter only really supports the Mac runtime, so assume that.
4680 ObjCRuntime runtime;
4681 if (!runtimeArg) {
4682 switch (rewriteKind) {
4683 case RK_None:
4684 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4685 break;
4686 case RK_Fragile:
4687 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4688 break;
4689 case RK_NonFragile:
4690 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4691 break;
4692 }
4693
4694 // -fnext-runtime
4695 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4696 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004697 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004698 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4699
4700 // Otherwise, build for a generic macosx port.
4701 } else {
4702 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4703 }
4704
4705 // -fgnu-runtime
4706 } else {
4707 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004708 // Legacy behaviour is to target the gnustep runtime if we are i
4709 // non-fragile mode or the GCC runtime in fragile mode.
4710 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004711 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004712 else
4713 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004714 }
4715
4716 cmdArgs.push_back(args.MakeArgString(
4717 "-fobjc-runtime=" + runtime.getAsString()));
4718 return runtime;
4719}
4720
Reid Klecknerc542d372014-06-27 17:02:02 +00004721static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4722 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4723 I += HaveDash;
4724 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004725}
Reid Klecknerc542d372014-06-27 17:02:02 +00004726
4727struct EHFlags {
4728 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4729 bool Synch;
4730 bool Asynch;
4731 bool NoExceptC;
4732};
4733
4734/// /EH controls whether to run destructor cleanups when exceptions are
4735/// thrown. There are three modifiers:
4736/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4737/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4738/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4739/// - c: Assume that extern "C" functions are implicitly noexcept. This
4740/// modifier is an optimization, so we ignore it for now.
4741/// The default is /EHs-c-, meaning cleanups are disabled.
4742static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4743 EHFlags EH;
4744 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4745 for (auto EHVal : EHArgs) {
4746 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4747 switch (EHVal[I]) {
4748 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4749 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4750 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4751 default: break;
4752 }
4753 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4754 break;
4755 }
4756 }
4757 return EH;
4758}
4759
Hans Wennborg75958c42013-08-08 00:17:41 +00004760void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4761 unsigned RTOptionID = options::OPT__SLASH_MT;
4762
Hans Wennborgf1a74252013-09-10 20:18:04 +00004763 if (Args.hasArg(options::OPT__SLASH_LDd))
4764 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4765 // but defining _DEBUG is sticky.
4766 RTOptionID = options::OPT__SLASH_MTd;
4767
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004768 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004769 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004770
Hans Wennborg75958c42013-08-08 00:17:41 +00004771 switch(RTOptionID) {
4772 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004773 if (Args.hasArg(options::OPT__SLASH_LDd))
4774 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004775 CmdArgs.push_back("-D_MT");
4776 CmdArgs.push_back("-D_DLL");
4777 CmdArgs.push_back("--dependent-lib=msvcrt");
4778 break;
4779 case options::OPT__SLASH_MDd:
4780 CmdArgs.push_back("-D_DEBUG");
4781 CmdArgs.push_back("-D_MT");
4782 CmdArgs.push_back("-D_DLL");
4783 CmdArgs.push_back("--dependent-lib=msvcrtd");
4784 break;
4785 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004786 if (Args.hasArg(options::OPT__SLASH_LDd))
4787 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004788 CmdArgs.push_back("-D_MT");
4789 CmdArgs.push_back("--dependent-lib=libcmt");
4790 break;
4791 case options::OPT__SLASH_MTd:
4792 CmdArgs.push_back("-D_DEBUG");
4793 CmdArgs.push_back("-D_MT");
4794 CmdArgs.push_back("--dependent-lib=libcmtd");
4795 break;
4796 default:
4797 llvm_unreachable("Unexpected option ID.");
4798 }
4799
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004800 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4801 // users want. The /Za flag to cl.exe turns this off, but it's not
4802 // implemented in clang.
4803 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004804
Hans Wennborg8858a032014-07-21 23:42:07 +00004805 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4806 // would produce interleaved output, so ignore /showIncludes in such cases.
4807 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4808 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4809 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004810
David Majnemerf6072342014-07-01 22:24:56 +00004811 // This controls whether or not we emit RTTI data for polymorphic types.
4812 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4813 /*default=*/false))
4814 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004815
Reid Klecknerc542d372014-06-27 17:02:02 +00004816 const Driver &D = getToolChain().getDriver();
4817 EHFlags EH = parseClangCLEHFlags(D, Args);
4818 // FIXME: Do something with NoExceptC.
Reid Klecknerab80f182015-01-30 01:04:16 +00004819 if (EH.Synch || EH.Asynch)
Reid Klecknerc542d372014-06-27 17:02:02 +00004820 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerab80f182015-01-30 01:04:16 +00004821 // Always add -fexceptions to allow SEH __try.
4822 CmdArgs.push_back("-fexceptions");
Reid Klecknerc542d372014-06-27 17:02:02 +00004823
Hans Wennborge50cec32014-06-13 20:59:54 +00004824 // /EP should expand to -E -P.
4825 if (Args.hasArg(options::OPT__SLASH_EP)) {
4826 CmdArgs.push_back("-E");
4827 CmdArgs.push_back("-P");
4828 }
4829
David Majnemer86c318f2014-02-11 21:05:00 +00004830 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4831 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4832 if (MostGeneralArg && BestCaseArg)
4833 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4834 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4835
4836 if (MostGeneralArg) {
4837 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4838 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4839 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4840
4841 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4842 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4843 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4844 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4845 << FirstConflict->getAsString(Args)
4846 << SecondConflict->getAsString(Args);
4847
4848 if (SingleArg)
4849 CmdArgs.push_back("-fms-memptr-rep=single");
4850 else if (MultipleArg)
4851 CmdArgs.push_back("-fms-memptr-rep=multiple");
4852 else
4853 CmdArgs.push_back("-fms-memptr-rep=virtual");
4854 }
4855
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004856 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4857 A->render(Args, CmdArgs);
4858
Hans Wennborg81f74482013-09-10 01:07:07 +00004859 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4860 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004861 if (Args.hasArg(options::OPT__SLASH_fallback))
4862 CmdArgs.push_back("msvc-fallback");
4863 else
4864 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004865 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004866}
4867
Hans Wennborg1da044a2014-06-26 19:59:02 +00004868visualstudio::Compile *Clang::getCLFallback() const {
4869 if (!CLFallback)
4870 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4871 return CLFallback.get();
4872}
4873
Daniel Sanders7f933f42015-01-30 17:35:23 +00004874void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
4875 ArgStringList &CmdArgs) const {
4876 StringRef CPUName;
4877 StringRef ABIName;
4878 const llvm::Triple &Triple = getToolChain().getTriple();
4879 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4880
4881 CmdArgs.push_back("-target-abi");
4882 CmdArgs.push_back(ABIName.data());
4883}
4884
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004885void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004886 const InputInfo &Output,
4887 const InputInfoList &Inputs,
4888 const ArgList &Args,
4889 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004890 ArgStringList CmdArgs;
4891
4892 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4893 const InputInfo &Input = Inputs[0];
4894
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004895 // Don't warn about "clang -w -c foo.s"
4896 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004897 // and "clang -emit-llvm -c foo.s"
4898 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004899
Rafael Espindola577637a2015-01-03 00:06:04 +00004900 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00004901
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004902 // Invoke ourselves in -cc1as mode.
4903 //
4904 // FIXME: Implement custom jobs for internal actions.
4905 CmdArgs.push_back("-cc1as");
4906
4907 // Add the "effective" target triple.
4908 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004909 std::string TripleStr =
4910 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004911 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4912
4913 // Set the output mode, we currently only expect to be used as a real
4914 // assembler.
4915 CmdArgs.push_back("-filetype");
4916 CmdArgs.push_back("obj");
4917
Eric Christopher45f2e712012-12-18 00:31:10 +00004918 // Set the main file name, so that debug info works even with
4919 // -save-temps or preprocessed assembly.
4920 CmdArgs.push_back("-main-file-name");
4921 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4922
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004923 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004924 const llvm::Triple &Triple = getToolChain().getTriple();
4925 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004926 if (!CPU.empty()) {
4927 CmdArgs.push_back("-target-cpu");
4928 CmdArgs.push_back(Args.MakeArgString(CPU));
4929 }
4930
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004931 // Add the target features
4932 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004933 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004934
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004935 // Ignore explicit -force_cpusubtype_ALL option.
4936 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004937
Eric Christopherfc3ee562012-01-10 00:38:01 +00004938 // Determine the original source input.
4939 const Action *SourceAction = &JA;
4940 while (SourceAction->getKind() != Action::InputClass) {
4941 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4942 SourceAction = SourceAction->getInputs()[0];
4943 }
4944
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004945 // Forward -g and handle debug info related flags, assuming we are dealing
4946 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004947 if (SourceAction->getType() == types::TY_Asm ||
4948 SourceAction->getType() == types::TY_PP_Asm) {
4949 Args.ClaimAllArgs(options::OPT_g_Group);
4950 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4951 if (!A->getOption().matches(options::OPT_g0))
4952 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004953
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004954 if (Args.hasArg(options::OPT_gdwarf_2))
4955 CmdArgs.push_back("-gdwarf-2");
4956 if (Args.hasArg(options::OPT_gdwarf_3))
4957 CmdArgs.push_back("-gdwarf-3");
4958 if (Args.hasArg(options::OPT_gdwarf_4))
4959 CmdArgs.push_back("-gdwarf-4");
4960
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004961 // Add the -fdebug-compilation-dir flag if needed.
4962 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004963
4964 // Set the AT_producer to the clang version when using the integrated
4965 // assembler on assembly source files.
4966 CmdArgs.push_back("-dwarf-debug-producer");
4967 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004968 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004969
4970 // Optionally embed the -cc1as level arguments into the debug info, for build
4971 // analysis.
4972 if (getToolChain().UseDwarfDebugFlags()) {
4973 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004974 for (const auto &Arg : Args)
4975 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004976
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004977 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004978 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4979 Flags += Exec;
4980 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004981 SmallString<128> EscapedArg;
4982 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00004983 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004984 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00004985 }
4986 CmdArgs.push_back("-dwarf-debug-flags");
4987 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4988 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004989
4990 // FIXME: Add -static support, once we have it.
4991
Daniel Sanders7f933f42015-01-30 17:35:23 +00004992 // Add target specific flags.
4993 switch(getToolChain().getArch()) {
4994 default:
4995 break;
4996
4997 case llvm::Triple::mips:
4998 case llvm::Triple::mipsel:
4999 case llvm::Triple::mips64:
5000 case llvm::Triple::mips64el:
5001 AddMIPSTargetArgs(Args, CmdArgs);
5002 break;
5003 }
5004
David Blaikie372d9502014-01-17 03:17:40 +00005005 // Consume all the warning flags. Usually this would be handled more
5006 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5007 // doesn't handle that so rather than warning about unused flags that are
5008 // actually used, we'll lie by omission instead.
5009 // FIXME: Stop lying and consume only the appropriate driver flags
5010 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5011 ie = Args.filtered_end();
5012 it != ie; ++it)
5013 (*it)->claim();
5014
David Blaikie9260ed62013-07-25 21:19:01 +00005015 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5016 getToolChain().getDriver());
5017
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005018 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005019
5020 assert(Output.isFilename() && "Unexpected lipo output.");
5021 CmdArgs.push_back("-o");
5022 CmdArgs.push_back(Output.getFilename());
5023
Daniel Dunbarb440f562010-08-02 02:38:21 +00005024 assert(Input.isFilename() && "Invalid input.");
5025 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005026
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005027 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005028 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005029
5030 // Handle the debug info splitting at object creation time if we're
5031 // creating an object.
5032 // TODO: Currently only works on linux with newer objcopy.
5033 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005034 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005035 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5036 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005037}
5038
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005039void GnuTool::anchor() {}
5040
Daniel Dunbara3246a02009-03-18 08:07:30 +00005041void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005042 const InputInfo &Output,
5043 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005044 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005045 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005046 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005047 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005049 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005050 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005051 // Don't forward any -g arguments to assembly steps.
5052 if (isa<AssembleJobAction>(JA) &&
5053 A->getOption().matches(options::OPT_g_Group))
5054 continue;
5055
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005056 // Don't forward any -W arguments to assembly and link steps.
5057 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5058 A->getOption().matches(options::OPT_W_Group))
5059 continue;
5060
Daniel Dunbar2da02722009-03-19 07:55:12 +00005061 // It is unfortunate that we have to claim here, as this means
5062 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005063 // platforms using a generic gcc, even if we are just using gcc
5064 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005065 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005066 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005067 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005068 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005069
Daniel Dunbar4e295052010-01-25 22:35:08 +00005070 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005071
5072 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005073 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005074 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005075 CmdArgs.push_back(
5076 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005077 }
5078
Daniel Dunbar5716d872009-05-02 21:41:52 +00005079 // Try to force gcc to match the tool chain we want, if we recognize
5080 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005081 //
5082 // FIXME: The triple class should directly provide the information we want
5083 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005084 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005085 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005086 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005087 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5088 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005089 CmdArgs.push_back("-m64");
5090
Daniel Dunbarb440f562010-08-02 02:38:21 +00005091 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005092 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005093 CmdArgs.push_back(Output.getFilename());
5094 } else {
5095 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005096 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005097 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005098
Tony Linthicum76329bf2011-12-12 21:14:55 +00005099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5100 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005101
5102 // Only pass -x if gcc will understand it; otherwise hope gcc
5103 // understands the suffix correctly. The main use case this would go
5104 // wrong in is for linker inputs if they happened to have an odd
5105 // suffix; really the only way to get this to happen is a command
5106 // like '-x foobar a.c' which will treat a.c like a linker input.
5107 //
5108 // FIXME: For the linker case specifically, can we safely convert
5109 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005110 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005111 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005112 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5113 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005114 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005115 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005116 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005117 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005118 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005119 else if (II.getType() == types::TY_ModuleFile)
5120 D.Diag(diag::err_drv_no_module_support)
5121 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005122
Daniel Dunbara3246a02009-03-18 08:07:30 +00005123 if (types::canTypeBeUserSpecified(II.getType())) {
5124 CmdArgs.push_back("-x");
5125 CmdArgs.push_back(types::getTypeName(II.getType()));
5126 }
5127
Daniel Dunbarb440f562010-08-02 02:38:21 +00005128 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005129 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005130 else {
5131 const Arg &A = II.getInputArg();
5132
5133 // Reverse translate some rewritten options.
5134 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5135 CmdArgs.push_back("-lstdc++");
5136 continue;
5137 }
5138
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005139 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005140 A.render(Args, CmdArgs);
5141 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005142 }
5143
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005144 const std::string customGCCName = D.getCCCGenericGCCName();
5145 const char *GCCName;
5146 if (!customGCCName.empty())
5147 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005148 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005149 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005150 } else
5151 GCCName = "gcc";
5152
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005153 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005154 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005155 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005156}
5157
Daniel Dunbar4e295052010-01-25 22:35:08 +00005158void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5159 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005160 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005161}
5162
Daniel Dunbar4e295052010-01-25 22:35:08 +00005163void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5164 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005165 const Driver &D = getToolChain().getDriver();
5166
Eric Christophercc7ff502015-01-29 00:56:17 +00005167 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005168 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005169 case types::TY_LLVM_IR:
5170 case types::TY_LTO_IR:
5171 case types::TY_LLVM_BC:
5172 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005173 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005174 break;
5175 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005176 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005177 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005178 case types::TY_Nothing:
5179 CmdArgs.push_back("-fsyntax-only");
5180 break;
5181 default:
5182 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005183 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005184}
5185
Daniel Dunbar4e295052010-01-25 22:35:08 +00005186void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5187 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005188 // The types are (hopefully) good enough.
5189}
5190
Tony Linthicum76329bf2011-12-12 21:14:55 +00005191// Hexagon tools start.
5192void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5193 ArgStringList &CmdArgs) const {
5194
5195}
5196void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5197 const InputInfo &Output,
5198 const InputInfoList &Inputs,
5199 const ArgList &Args,
5200 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005201 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005202
5203 const Driver &D = getToolChain().getDriver();
5204 ArgStringList CmdArgs;
5205
5206 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005207 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005208 CmdArgs.push_back(Args.MakeArgString(MarchString));
5209
5210 RenderExtraToolArgs(JA, CmdArgs);
5211
5212 if (Output.isFilename()) {
5213 CmdArgs.push_back("-o");
5214 CmdArgs.push_back(Output.getFilename());
5215 } else {
5216 assert(Output.isNothing() && "Unexpected output");
5217 CmdArgs.push_back("-fsyntax-only");
5218 }
5219
Matthew Curtise8f80a12012-12-06 17:49:03 +00005220 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5221 if (!SmallDataThreshold.empty())
5222 CmdArgs.push_back(
5223 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005224
Matthew Curtise5df3812012-12-07 17:23:04 +00005225 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5226 options::OPT_Xassembler);
5227
Tony Linthicum76329bf2011-12-12 21:14:55 +00005228 // Only pass -x if gcc will understand it; otherwise hope gcc
5229 // understands the suffix correctly. The main use case this would go
5230 // wrong in is for linker inputs if they happened to have an odd
5231 // suffix; really the only way to get this to happen is a command
5232 // like '-x foobar a.c' which will treat a.c like a linker input.
5233 //
5234 // FIXME: For the linker case specifically, can we safely convert
5235 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005236 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005237 // Don't try to pass LLVM or AST inputs to a generic gcc.
5238 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5239 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5240 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5241 << getToolChain().getTripleString();
5242 else if (II.getType() == types::TY_AST)
5243 D.Diag(clang::diag::err_drv_no_ast_support)
5244 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005245 else if (II.getType() == types::TY_ModuleFile)
5246 D.Diag(diag::err_drv_no_module_support)
5247 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005248
5249 if (II.isFilename())
5250 CmdArgs.push_back(II.getFilename());
5251 else
5252 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5253 II.getInputArg().render(Args, CmdArgs);
5254 }
5255
5256 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005257 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005258 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005259}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005260
Tony Linthicum76329bf2011-12-12 21:14:55 +00005261void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5262 ArgStringList &CmdArgs) const {
5263 // The types are (hopefully) good enough.
5264}
5265
5266void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5267 const InputInfo &Output,
5268 const InputInfoList &Inputs,
5269 const ArgList &Args,
5270 const char *LinkingOutput) const {
5271
Matthew Curtise689b052012-12-06 15:46:07 +00005272 const toolchains::Hexagon_TC& ToolChain =
5273 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5274 const Driver &D = ToolChain.getDriver();
5275
Tony Linthicum76329bf2011-12-12 21:14:55 +00005276 ArgStringList CmdArgs;
5277
Matthew Curtise689b052012-12-06 15:46:07 +00005278 //----------------------------------------------------------------------------
5279 //
5280 //----------------------------------------------------------------------------
5281 bool hasStaticArg = Args.hasArg(options::OPT_static);
5282 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005283 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005284 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5285 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5286 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5287 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005288
Matthew Curtise689b052012-12-06 15:46:07 +00005289 //----------------------------------------------------------------------------
5290 // Silence warnings for various options
5291 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005292
Matthew Curtise689b052012-12-06 15:46:07 +00005293 Args.ClaimAllArgs(options::OPT_g_Group);
5294 Args.ClaimAllArgs(options::OPT_emit_llvm);
5295 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5296 // handled somewhere else.
5297 Args.ClaimAllArgs(options::OPT_static_libgcc);
5298
5299 //----------------------------------------------------------------------------
5300 //
5301 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005302 for (const auto &Opt : ToolChain.ExtraOpts)
5303 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005304
Matthew Curtisf10a5952012-12-06 14:16:43 +00005305 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5306 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005307
Matthew Curtise689b052012-12-06 15:46:07 +00005308 if (buildingLib) {
5309 CmdArgs.push_back("-shared");
5310 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5311 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005312 }
5313
Matthew Curtise689b052012-12-06 15:46:07 +00005314 if (hasStaticArg)
5315 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005316
Matthew Curtise8f80a12012-12-06 17:49:03 +00005317 if (buildPIE && !buildingLib)
5318 CmdArgs.push_back("-pie");
5319
5320 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5321 if (!SmallDataThreshold.empty()) {
5322 CmdArgs.push_back(
5323 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5324 }
5325
Matthew Curtise689b052012-12-06 15:46:07 +00005326 //----------------------------------------------------------------------------
5327 //
5328 //----------------------------------------------------------------------------
5329 CmdArgs.push_back("-o");
5330 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005331
Matthew Curtise689b052012-12-06 15:46:07 +00005332 const std::string MarchSuffix = "/" + MarchString;
5333 const std::string G0Suffix = "/G0";
5334 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005335 const std::string RootDir =
5336 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005337 const std::string StartFilesDir = RootDir
5338 + "hexagon/lib"
5339 + (buildingLib
5340 ? MarchG0Suffix : MarchSuffix);
5341
5342 //----------------------------------------------------------------------------
5343 // moslib
5344 //----------------------------------------------------------------------------
5345 std::vector<std::string> oslibs;
5346 bool hasStandalone= false;
5347
5348 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5349 ie = Args.filtered_end(); it != ie; ++it) {
5350 (*it)->claim();
5351 oslibs.push_back((*it)->getValue());
5352 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005353 }
Matthew Curtise689b052012-12-06 15:46:07 +00005354 if (oslibs.empty()) {
5355 oslibs.push_back("standalone");
5356 hasStandalone = true;
5357 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005358
Matthew Curtise689b052012-12-06 15:46:07 +00005359 //----------------------------------------------------------------------------
5360 // Start Files
5361 //----------------------------------------------------------------------------
5362 if (incStdLib && incStartFiles) {
5363
5364 if (!buildingLib) {
5365 if (hasStandalone) {
5366 CmdArgs.push_back(
5367 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5368 }
5369 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5370 }
5371 std::string initObj = useShared ? "/initS.o" : "/init.o";
5372 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5373 }
5374
5375 //----------------------------------------------------------------------------
5376 // Library Search Paths
5377 //----------------------------------------------------------------------------
5378 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005379 for (const auto &LibPath : LibPaths)
5380 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005381
5382 //----------------------------------------------------------------------------
5383 //
5384 //----------------------------------------------------------------------------
5385 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5386 Args.AddAllArgs(CmdArgs, options::OPT_e);
5387 Args.AddAllArgs(CmdArgs, options::OPT_s);
5388 Args.AddAllArgs(CmdArgs, options::OPT_t);
5389 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5390
5391 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5392
5393 //----------------------------------------------------------------------------
5394 // Libraries
5395 //----------------------------------------------------------------------------
5396 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005397 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005398 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5399 CmdArgs.push_back("-lm");
5400 }
5401
5402 CmdArgs.push_back("--start-group");
5403
5404 if (!buildingLib) {
5405 for(std::vector<std::string>::iterator i = oslibs.begin(),
5406 e = oslibs.end(); i != e; ++i)
5407 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5408 CmdArgs.push_back("-lc");
5409 }
5410 CmdArgs.push_back("-lgcc");
5411
5412 CmdArgs.push_back("--end-group");
5413 }
5414
5415 //----------------------------------------------------------------------------
5416 // End files
5417 //----------------------------------------------------------------------------
5418 if (incStdLib && incStartFiles) {
5419 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5420 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5421 }
5422
5423 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005424 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5425 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005426}
5427// Hexagon tools end.
5428
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005429/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005430const char *arm::getARMCPUForMArch(const ArgList &Args,
5431 const llvm::Triple &Triple) {
5432 StringRef MArch;
5433 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5434 // Otherwise, if we have -march= choose the base CPU for that arch.
5435 MArch = A->getValue();
5436 } else {
5437 // Otherwise, use the Arch from the triple.
5438 MArch = Triple.getArchName();
5439 }
5440
5441 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005442 if (MArch == "native") {
5443 std::string CPU = llvm::sys::getHostCPUName();
5444 if (CPU != "generic") {
5445 // Translate the native cpu into the architecture. The switch below will
5446 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005447 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005448 }
5449 }
5450
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005451 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005452}
5453
5454/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005455StringRef arm::getARMTargetCPU(const ArgList &Args,
5456 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005457 // FIXME: Warn on inconsistent use of -mcpu and -march.
5458 // If we have -mcpu=, use that.
5459 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5460 StringRef MCPU = A->getValue();
5461 // Handle -mcpu=native.
5462 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005463 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005464 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005465 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005466 }
5467
5468 return getARMCPUForMArch(Args, Triple);
5469}
5470
5471/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5472/// CPU.
5473//
5474// FIXME: This is redundant with -mcpu, why does LLVM use this.
5475// FIXME: tblgen this, or kill it!
5476const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5477 return llvm::StringSwitch<const char *>(CPU)
5478 .Case("strongarm", "v4")
5479 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5480 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5481 .Cases("arm920", "arm920t", "arm922t", "v4t")
5482 .Cases("arm940t", "ep9312","v4t")
5483 .Cases("arm10tdmi", "arm1020t", "v5")
5484 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5485 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5486 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5487 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5488 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5489 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005490 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005491 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005492 .Cases("cortex-r4", "cortex-r5", "v7r")
5493 .Case("cortex-m0", "v6m")
5494 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005495 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005496 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005497 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005498 .Cases("cortex-a53", "cortex-a57", "v8")
5499 .Default("");
5500}
5501
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005502void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5503 if (Args.hasArg(options::OPT_r))
5504 return;
5505
5506 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5507 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5508 .Cases("v4", "v4t", "v5", "v5e", nullptr)
5509 .Cases("v6", "v6t2", nullptr)
5510 .Default("--be8");
5511
5512 if (LinkFlag)
5513 CmdArgs.push_back(LinkFlag);
5514}
5515
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005516bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5517 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5518 return A && (A->getValue() == StringRef(Value));
5519}
5520
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005521bool mips::isUCLibc(const ArgList &Args) {
5522 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005523 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005524}
5525
Daniel Sanders2bf13662014-07-10 14:40:57 +00005526bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005527 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5528 return llvm::StringSwitch<bool>(NaNArg->getValue())
5529 .Case("2008", true)
5530 .Case("legacy", false)
5531 .Default(false);
5532
5533 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005534 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5535 .Cases("mips32r6", "mips64r6", true)
5536 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005537
5538 return false;
5539}
5540
Daniel Sanders379d44b2014-07-16 11:52:23 +00005541bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5542 StringRef ABIName) {
5543 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005544 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005545 return false;
5546
5547 if (ABIName != "32")
5548 return false;
5549
5550 return llvm::StringSwitch<bool>(CPUName)
5551 .Cases("mips2", "mips3", "mips4", "mips5", true)
5552 .Cases("mips32", "mips32r2", true)
5553 .Cases("mips64", "mips64r2", true)
5554 .Default(false);
5555}
5556
Tim Northover157d9112014-01-16 08:48:16 +00005557llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005558 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5559 // archs which Darwin doesn't use.
5560
5561 // The matching this routine does is fairly pointless, since it is neither the
5562 // complete architecture list, nor a reasonable subset. The problem is that
5563 // historically the driver driver accepts this and also ties its -march=
5564 // handling to the architecture name, so we need to be careful before removing
5565 // support for it.
5566
5567 // This code must be kept in sync with Clang's Darwin specific argument
5568 // translation.
5569
5570 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5571 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5572 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5573 .Case("ppc64", llvm::Triple::ppc64)
5574 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5575 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5576 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005577 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005578 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005579 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005580 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005581 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005582 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005583 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005584 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005585 .Case("nvptx", llvm::Triple::nvptx)
5586 .Case("nvptx64", llvm::Triple::nvptx64)
5587 .Case("amdil", llvm::Triple::amdil)
5588 .Case("spir", llvm::Triple::spir)
5589 .Default(llvm::Triple::UnknownArch);
5590}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005591
Tim Northover157d9112014-01-16 08:48:16 +00005592void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5593 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5594 T.setArch(Arch);
5595
5596 if (Str == "x86_64h")
5597 T.setArchName(Str);
5598 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5599 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005600 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005601 }
5602}
5603
Bob Wilsondecc03e2012-11-23 06:14:39 +00005604const char *Clang::getBaseInputName(const ArgList &Args,
5605 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005606 return Args.MakeArgString(
5607 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005608}
5609
Bob Wilsondecc03e2012-11-23 06:14:39 +00005610const char *Clang::getBaseInputStem(const ArgList &Args,
5611 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005612 const char *Str = getBaseInputName(Args, Inputs);
5613
Chris Lattner906bb902011-01-16 08:14:11 +00005614 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005615 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005616
5617 return Str;
5618}
5619
Bob Wilsondecc03e2012-11-23 06:14:39 +00005620const char *Clang::getDependencyFileName(const ArgList &Args,
5621 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005622 // FIXME: Think about this more.
5623 std::string Res;
5624
5625 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005626 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005627 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005628 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005629 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005630 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005631 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005632}
5633
Daniel Dunbarbe220842009-03-20 16:06:39 +00005634void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005635 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005636 const InputInfoList &Inputs,
5637 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005638 const char *LinkingOutput) const {
5639 ArgStringList CmdArgs;
5640
5641 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5642 const InputInfo &Input = Inputs[0];
5643
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005644 // Determine the original source input.
5645 const Action *SourceAction = &JA;
5646 while (SourceAction->getKind() != Action::InputClass) {
5647 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5648 SourceAction = SourceAction->getInputs()[0];
5649 }
5650
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005651 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005652 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005653 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5654 // FIXME: at run-time detect assembler capabilities or rely on version
5655 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005656 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005657 const llvm::Triple &T(getToolChain().getTriple());
5658 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005659 CmdArgs.push_back("-Q");
5660 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005661
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005662 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005663 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005664 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005665 if (Args.hasArg(options::OPT_gstabs))
5666 CmdArgs.push_back("--gstabs");
5667 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005668 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005669 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005670
Daniel Dunbarbe220842009-03-20 16:06:39 +00005671 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005672 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005673
Daniel Dunbar6d484762010-07-22 01:47:22 +00005674 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005675 if (getToolChain().getArch() == llvm::Triple::x86 ||
5676 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005677 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5678 CmdArgs.push_back("-force_cpusubtype_ALL");
5679
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005680 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005681 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005682 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005683 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005684 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005685 CmdArgs.push_back("-static");
5686
Daniel Dunbarbe220842009-03-20 16:06:39 +00005687 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5688 options::OPT_Xassembler);
5689
5690 assert(Output.isFilename() && "Unexpected lipo output.");
5691 CmdArgs.push_back("-o");
5692 CmdArgs.push_back(Output.getFilename());
5693
Daniel Dunbarb440f562010-08-02 02:38:21 +00005694 assert(Input.isFilename() && "Invalid input.");
5695 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005696
5697 // asm_final spec is empty.
5698
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005699 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005700 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005702}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005703
Tim Northover157d9112014-01-16 08:48:16 +00005704void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005705
Tim Northover157d9112014-01-16 08:48:16 +00005706void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5707 ArgStringList &CmdArgs) const {
5708 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005709
Daniel Dunbarc1964212009-03-26 16:23:12 +00005710 // Derived from darwin_arch spec.
5711 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005712 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005713
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005714 // FIXME: Is this needed anymore?
5715 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005716 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005717}
5718
Bill Wendling3b2000f2012-10-02 18:02:50 +00005719bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5720 // We only need to generate a temp path for LTO if we aren't compiling object
5721 // files. When compiling source files, we run 'dsymutil' after linking. We
5722 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005723 for (const auto &Input : Inputs)
5724 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005725 return true;
5726
5727 return false;
5728}
5729
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005730void darwin::Link::AddLinkArgs(Compilation &C,
5731 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005732 ArgStringList &CmdArgs,
5733 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005734 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005735 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005736
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005737 unsigned Version[3] = { 0, 0, 0 };
5738 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5739 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005740 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005741 Version[1], Version[2], HadExtra) ||
5742 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005743 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005744 << A->getAsString(Args);
5745 }
5746
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005747 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005748 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005749 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5750 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005751
Bob Wilson3d27dad2013-08-02 22:25:34 +00005752 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5753 CmdArgs.push_back("-export_dynamic");
5754
Bill Wendling313b6bf2012-11-16 23:03:00 +00005755 // If we are using LTO, then automatically create a temporary file path for
5756 // the linker to use, so that it's lifetime will extend past a possible
5757 // dsymutil step.
5758 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5759 const char *TmpPath = C.getArgs().MakeArgString(
5760 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5761 C.addTempFile(TmpPath);
5762 CmdArgs.push_back("-object_path_lto");
5763 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005764 }
5765
Daniel Dunbarc1964212009-03-26 16:23:12 +00005766 // Derived from the "link" spec.
5767 Args.AddAllArgs(CmdArgs, options::OPT_static);
5768 if (!Args.hasArg(options::OPT_static))
5769 CmdArgs.push_back("-dynamic");
5770 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5771 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5772 // here. How do we wish to handle such things?
5773 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005774
Daniel Dunbarc1964212009-03-26 16:23:12 +00005775 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005776 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005777 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005778 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005779
5780 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5781 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5782 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5783
5784 Arg *A;
5785 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5786 (A = Args.getLastArg(options::OPT_current__version)) ||
5787 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005788 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005789 << A->getAsString(Args) << "-dynamiclib";
5790
5791 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5792 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5793 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5794 } else {
5795 CmdArgs.push_back("-dylib");
5796
5797 Arg *A;
5798 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5799 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5800 (A = Args.getLastArg(options::OPT_client__name)) ||
5801 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5802 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5803 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005804 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005805 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005806
Daniel Dunbarc1964212009-03-26 16:23:12 +00005807 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5808 "-dylib_compatibility_version");
5809 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5810 "-dylib_current_version");
5811
Tim Northover157d9112014-01-16 08:48:16 +00005812 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005813
5814 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5815 "-dylib_install_name");
5816 }
5817
5818 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5819 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5820 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005821 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005822 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005823 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5824 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5825 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5826 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5827 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5828 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005829 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005830 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5831 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5832 Args.AddAllArgs(CmdArgs, options::OPT_init);
5833
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005834 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005835 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005836
Daniel Dunbarc1964212009-03-26 16:23:12 +00005837 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5838 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5839 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5840 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5841 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005842
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005843 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5844 options::OPT_fno_pie,
5845 options::OPT_fno_PIE)) {
5846 if (A->getOption().matches(options::OPT_fpie) ||
5847 A->getOption().matches(options::OPT_fPIE))
5848 CmdArgs.push_back("-pie");
5849 else
5850 CmdArgs.push_back("-no_pie");
5851 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005852
5853 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5854 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5855 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5856 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5857 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5858 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5859 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5860 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5861 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5862 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5863 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5864 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5865 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5866 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5867 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5868 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005869
Daniel Dunbar84384642011-05-02 21:03:47 +00005870 // Give --sysroot= preference, over the Apple specific behavior to also use
5871 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005872 StringRef sysroot = C.getSysRoot();
5873 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005874 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005875 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005876 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5877 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005878 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005879 }
5880
Daniel Dunbarc1964212009-03-26 16:23:12 +00005881 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5882 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5883 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5884 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5885 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005886 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005887 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5888 Args.AddAllArgs(CmdArgs, options::OPT_y);
5889 Args.AddLastArg(CmdArgs, options::OPT_w);
5890 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5891 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5892 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5893 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5894 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5895 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5896 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5897 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5898 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5899 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5900 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5901 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5902}
5903
Alexey Bataev186b28a2014-03-06 05:43:53 +00005904enum LibOpenMP {
5905 LibUnknown,
5906 LibGOMP,
5907 LibIOMP5
5908};
5909
Daniel Dunbarc1964212009-03-26 16:23:12 +00005910void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005911 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005912 const InputInfoList &Inputs,
5913 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005914 const char *LinkingOutput) const {
5915 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005916
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005917 // If the number of arguments surpasses the system limits, we will encode the
5918 // input files in a separate file, shortening the command line. To this end,
5919 // build a list of input file names that can be passed via a file with the
5920 // -filelist linker option.
5921 llvm::opt::ArgStringList InputFileList;
5922
Daniel Dunbarc1964212009-03-26 16:23:12 +00005923 // The logic here is derived from gcc's behavior; most of which
5924 // comes from specs (starting with link_command). Consult gcc for
5925 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005926 ArgStringList CmdArgs;
5927
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005928 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5929 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5930 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005931 for (const auto &Arg : Args)
5932 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005933 const char *Exec =
5934 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5935 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005936 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005937 return;
5938 }
5939
Daniel Dunbarc1964212009-03-26 16:23:12 +00005940 // I'm not sure why this particular decomposition exists in gcc, but
5941 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005942 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005943
Daniel Dunbarc1964212009-03-26 16:23:12 +00005944 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5945 Args.AddAllArgs(CmdArgs, options::OPT_s);
5946 Args.AddAllArgs(CmdArgs, options::OPT_t);
5947 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5948 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005949 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005950 Args.AddAllArgs(CmdArgs, options::OPT_r);
5951
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005952 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5953 // members of static archive libraries which implement Objective-C classes or
5954 // categories.
5955 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5956 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005957
Daniel Dunbarc1964212009-03-26 16:23:12 +00005958 CmdArgs.push_back("-o");
5959 CmdArgs.push_back(Output.getFilename());
5960
Chad Rosier06fd3c62012-05-16 23:45:12 +00005961 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005962 !Args.hasArg(options::OPT_nostartfiles))
5963 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005964
5965 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005966
Alexey Bataev186b28a2014-03-06 05:43:53 +00005967 LibOpenMP UsedOpenMPLib = LibUnknown;
5968 if (Args.hasArg(options::OPT_fopenmp)) {
5969 UsedOpenMPLib = LibGOMP;
5970 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5971 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5972 .Case("libgomp", LibGOMP)
5973 .Case("libiomp5", LibIOMP5)
5974 .Default(LibUnknown);
5975 if (UsedOpenMPLib == LibUnknown)
5976 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5977 << A->getOption().getName() << A->getValue();
5978 }
5979 switch (UsedOpenMPLib) {
5980 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005981 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005982 break;
5983 case LibIOMP5:
5984 CmdArgs.push_back("-liomp5");
5985 break;
5986 case LibUnknown:
5987 break;
5988 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005989
Douglas Gregor9295df02012-05-15 21:00:27 +00005990 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005991 // Build the input file for -filelist (list of linker input files) in case we
5992 // need it later
5993 for (const auto &II : Inputs) {
5994 if (!II.isFilename()) {
5995 // This is a linker input argument.
5996 // We cannot mix input arguments and file names in a -filelist input, thus
5997 // we prematurely stop our list (remaining files shall be passed as
5998 // arguments).
5999 if (InputFileList.size() > 0)
6000 break;
6001
6002 continue;
6003 }
6004
6005 InputFileList.push_back(II.getFilename());
6006 }
6007
Bob Wilson16d93952012-05-15 18:57:39 +00006008 if (isObjCRuntimeLinked(Args) &&
6009 !Args.hasArg(options::OPT_nostdlib) &&
6010 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006011 // We use arclite library for both ARC and subscripting support.
6012 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6013
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006014 CmdArgs.push_back("-framework");
6015 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006016 // Link libobj.
6017 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006018 }
John McCall31168b02011-06-15 23:02:42 +00006019
Daniel Dunbarc1964212009-03-26 16:23:12 +00006020 if (LinkingOutput) {
6021 CmdArgs.push_back("-arch_multiple");
6022 CmdArgs.push_back("-final_output");
6023 CmdArgs.push_back(LinkingOutput);
6024 }
6025
Daniel Dunbarc1964212009-03-26 16:23:12 +00006026 if (Args.hasArg(options::OPT_fnested_functions))
6027 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006028
Daniel Dunbarc1964212009-03-26 16:23:12 +00006029 if (!Args.hasArg(options::OPT_nostdlib) &&
6030 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006031 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006032 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006033
Daniel Dunbarc1964212009-03-26 16:23:12 +00006034 // link_ssp spec is empty.
6035
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006036 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006037 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006038 }
6039
Chad Rosier06fd3c62012-05-16 23:45:12 +00006040 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006041 !Args.hasArg(options::OPT_nostartfiles)) {
6042 // endfile_spec is empty.
6043 }
6044
6045 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6046 Args.AddAllArgs(CmdArgs, options::OPT_F);
6047
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006048 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006049 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006050 std::unique_ptr<Command> Cmd =
6051 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6052 Cmd->setInputFileList(std::move(InputFileList));
6053 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006054}
6055
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006056void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006057 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006058 const InputInfoList &Inputs,
6059 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006060 const char *LinkingOutput) const {
6061 ArgStringList CmdArgs;
6062
6063 CmdArgs.push_back("-create");
6064 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006065
6066 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006067 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006068
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006069 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006070 assert(II.isFilename() && "Unexpected lipo input.");
6071 CmdArgs.push_back(II.getFilename());
6072 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006073
6074 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006075 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006076}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006077
Daniel Dunbar88299622010-06-04 18:28:36 +00006078void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006079 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006080 const InputInfoList &Inputs,
6081 const ArgList &Args,
6082 const char *LinkingOutput) const {
6083 ArgStringList CmdArgs;
6084
Daniel Dunbareb86b042011-05-09 17:23:16 +00006085 CmdArgs.push_back("-o");
6086 CmdArgs.push_back(Output.getFilename());
6087
Daniel Dunbar88299622010-06-04 18:28:36 +00006088 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6089 const InputInfo &Input = Inputs[0];
6090 assert(Input.isFilename() && "Unexpected dsymutil input.");
6091 CmdArgs.push_back(Input.getFilename());
6092
Daniel Dunbar88299622010-06-04 18:28:36 +00006093 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006094 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006095 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006096}
6097
Eric Christopher551ef452011-08-23 17:56:55 +00006098void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006099 const InputInfo &Output,
6100 const InputInfoList &Inputs,
6101 const ArgList &Args,
6102 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006103 ArgStringList CmdArgs;
6104 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006105 CmdArgs.push_back("--debug-info");
6106 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006107 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006108
6109 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6110 const InputInfo &Input = Inputs[0];
6111 assert(Input.isFilename() && "Unexpected verify input");
6112
6113 // Grabbing the output of the earlier dsymutil run.
6114 CmdArgs.push_back(Input.getFilename());
6115
6116 const char *Exec =
6117 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006118 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006119}
6120
David Chisnallf571cde2012-02-15 13:39:01 +00006121void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6122 const InputInfo &Output,
6123 const InputInfoList &Inputs,
6124 const ArgList &Args,
6125 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006126 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006127 ArgStringList CmdArgs;
6128
6129 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6130 options::OPT_Xassembler);
6131
6132 CmdArgs.push_back("-o");
6133 CmdArgs.push_back(Output.getFilename());
6134
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006135 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006136 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006137
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006138 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006139 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006140}
6141
David Chisnallf571cde2012-02-15 13:39:01 +00006142void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6143 const InputInfo &Output,
6144 const InputInfoList &Inputs,
6145 const ArgList &Args,
6146 const char *LinkingOutput) const {
6147 // FIXME: Find a real GCC, don't hard-code versions here
6148 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6149 const llvm::Triple &T = getToolChain().getTriple();
6150 std::string LibPath = "/usr/lib/";
6151 llvm::Triple::ArchType Arch = T.getArch();
6152 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006153 case llvm::Triple::x86:
6154 GCCLibPath +=
6155 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6156 break;
6157 case llvm::Triple::x86_64:
6158 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6159 GCCLibPath += "/4.5.2/amd64/";
6160 LibPath += "amd64/";
6161 break;
6162 default:
6163 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006164 }
6165
6166 ArgStringList CmdArgs;
6167
David Chisnall272a0712012-02-29 15:06:12 +00006168 // Demangle C++ names in errors
6169 CmdArgs.push_back("-C");
6170
David Chisnallf571cde2012-02-15 13:39:01 +00006171 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6172 (!Args.hasArg(options::OPT_shared))) {
6173 CmdArgs.push_back("-e");
6174 CmdArgs.push_back("_start");
6175 }
6176
6177 if (Args.hasArg(options::OPT_static)) {
6178 CmdArgs.push_back("-Bstatic");
6179 CmdArgs.push_back("-dn");
6180 } else {
6181 CmdArgs.push_back("-Bdynamic");
6182 if (Args.hasArg(options::OPT_shared)) {
6183 CmdArgs.push_back("-shared");
6184 } else {
6185 CmdArgs.push_back("--dynamic-linker");
6186 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6187 }
6188 }
6189
6190 if (Output.isFilename()) {
6191 CmdArgs.push_back("-o");
6192 CmdArgs.push_back(Output.getFilename());
6193 } else {
6194 assert(Output.isNothing() && "Invalid output.");
6195 }
6196
6197 if (!Args.hasArg(options::OPT_nostdlib) &&
6198 !Args.hasArg(options::OPT_nostartfiles)) {
6199 if (!Args.hasArg(options::OPT_shared)) {
6200 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6201 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006202 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006203 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6204 } else {
6205 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006206 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6207 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006208 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006209 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006210 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006211 }
6212
6213 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6214
6215 Args.AddAllArgs(CmdArgs, options::OPT_L);
6216 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6217 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006218 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006219
6220 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6221
6222 if (!Args.hasArg(options::OPT_nostdlib) &&
6223 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006224 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006225 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006226 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006227 if (!Args.hasArg(options::OPT_shared)) {
6228 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006229 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006230 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006231 }
David Chisnallf571cde2012-02-15 13:39:01 +00006232 }
6233
6234 if (!Args.hasArg(options::OPT_nostdlib) &&
6235 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006236 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006237 }
David Chisnall96de9932012-02-16 16:00:47 +00006238 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006239
Alexey Samsonov7811d192014-02-20 13:57:37 +00006240 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006241
6242 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006243 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006244 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006245}
6246
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006247void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006248 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006249 const InputInfoList &Inputs,
6250 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006251 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006252 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006253 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006254 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006255
Rafael Espindolacc126272014-02-28 01:55:21 +00006256 switch (getToolChain().getArch()) {
6257 case llvm::Triple::x86:
6258 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6259 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006260 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006261 break;
6262
6263 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006264 CmdArgs.push_back("-mppc");
6265 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006266 break;
6267
6268 case llvm::Triple::sparc:
6269 CmdArgs.push_back("-32");
6270 NeedsKPIC = true;
6271 break;
6272
6273 case llvm::Triple::sparcv9:
6274 CmdArgs.push_back("-64");
6275 CmdArgs.push_back("-Av9a");
6276 NeedsKPIC = true;
6277 break;
6278
6279 case llvm::Triple::mips64:
6280 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006281 StringRef CPUName;
6282 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006283 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006284
6285 CmdArgs.push_back("-mabi");
6286 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6287
6288 if (getToolChain().getArch() == llvm::Triple::mips64)
6289 CmdArgs.push_back("-EB");
6290 else
6291 CmdArgs.push_back("-EL");
6292
Rafael Espindolacc126272014-02-28 01:55:21 +00006293 NeedsKPIC = true;
6294 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006295 }
6296
Rafael Espindolacc126272014-02-28 01:55:21 +00006297 default:
6298 break;
6299 }
6300
6301 if (NeedsKPIC)
6302 addAssemblerKPIC(Args, CmdArgs);
6303
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006304 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6305 options::OPT_Xassembler);
6306
6307 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006308 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006309
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006310 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006311 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006312
6313 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006314 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006315 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006316}
6317
6318void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006319 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006320 const InputInfoList &Inputs,
6321 const ArgList &Args,
6322 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006323 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006324 ArgStringList CmdArgs;
6325
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006326 // Silence warning for "clang -g foo.o -o foo"
6327 Args.ClaimAllArgs(options::OPT_g_Group);
6328 // and "clang -emit-llvm foo.o -o foo"
6329 Args.ClaimAllArgs(options::OPT_emit_llvm);
6330 // and for "clang -w foo.o -o foo". Other warning options are already
6331 // handled somewhere else.
6332 Args.ClaimAllArgs(options::OPT_w);
6333
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006334 if (getToolChain().getArch() == llvm::Triple::mips64)
6335 CmdArgs.push_back("-EB");
6336 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6337 CmdArgs.push_back("-EL");
6338
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006339 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006340 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006341 CmdArgs.push_back("-e");
6342 CmdArgs.push_back("__start");
6343 }
6344
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006345 if (Args.hasArg(options::OPT_static)) {
6346 CmdArgs.push_back("-Bstatic");
6347 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006348 if (Args.hasArg(options::OPT_rdynamic))
6349 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006350 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006351 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006352 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006353 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006354 } else {
6355 CmdArgs.push_back("-dynamic-linker");
6356 CmdArgs.push_back("/usr/libexec/ld.so");
6357 }
6358 }
6359
Rafael Espindola044f7832013-06-05 04:28:55 +00006360 if (Args.hasArg(options::OPT_nopie))
6361 CmdArgs.push_back("-nopie");
6362
Daniel Dunbarb440f562010-08-02 02:38:21 +00006363 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006364 CmdArgs.push_back("-o");
6365 CmdArgs.push_back(Output.getFilename());
6366 } else {
6367 assert(Output.isNothing() && "Invalid output.");
6368 }
6369
6370 if (!Args.hasArg(options::OPT_nostdlib) &&
6371 !Args.hasArg(options::OPT_nostartfiles)) {
6372 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006373 if (Args.hasArg(options::OPT_pg))
6374 CmdArgs.push_back(Args.MakeArgString(
6375 getToolChain().GetFilePath("gcrt0.o")));
6376 else
6377 CmdArgs.push_back(Args.MakeArgString(
6378 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006379 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006380 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006381 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006382 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006383 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006384 }
6385 }
6386
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006387 std::string Triple = getToolChain().getTripleString();
6388 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006389 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006390 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006391 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006392
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006393 Args.AddAllArgs(CmdArgs, options::OPT_L);
6394 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6395 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006396 Args.AddAllArgs(CmdArgs, options::OPT_s);
6397 Args.AddAllArgs(CmdArgs, options::OPT_t);
6398 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6399 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006400
Daniel Dunbar54423b22010-09-17 00:24:54 +00006401 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006402
6403 if (!Args.hasArg(options::OPT_nostdlib) &&
6404 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006405 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006406 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006407 if (Args.hasArg(options::OPT_pg))
6408 CmdArgs.push_back("-lm_p");
6409 else
6410 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006411 }
6412
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006413 // FIXME: For some reason GCC passes -lgcc before adding
6414 // the default system libraries. Just mimic this for now.
6415 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006416
Eric Christopher17674ec2012-09-13 06:32:34 +00006417 if (Args.hasArg(options::OPT_pthread)) {
6418 if (!Args.hasArg(options::OPT_shared) &&
6419 Args.hasArg(options::OPT_pg))
6420 CmdArgs.push_back("-lpthread_p");
6421 else
6422 CmdArgs.push_back("-lpthread");
6423 }
6424
Chandler Carruth45661652011-12-17 22:32:42 +00006425 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006426 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006427 CmdArgs.push_back("-lc_p");
6428 else
6429 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006430 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006431
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006432 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006433 }
6434
6435 if (!Args.hasArg(options::OPT_nostdlib) &&
6436 !Args.hasArg(options::OPT_nostartfiles)) {
6437 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006438 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006439 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006440 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006441 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006442 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006443 }
6444
6445 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006446 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006447 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006448}
Ed Schoutene33194b2009-04-02 19:13:12 +00006449
Eli Friedman9fa28852012-08-08 23:57:20 +00006450void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6451 const InputInfo &Output,
6452 const InputInfoList &Inputs,
6453 const ArgList &Args,
6454 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006455 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006456 ArgStringList CmdArgs;
6457
6458 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6459 options::OPT_Xassembler);
6460
6461 CmdArgs.push_back("-o");
6462 CmdArgs.push_back(Output.getFilename());
6463
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006464 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006465 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006466
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006467 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006468 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006469}
6470
6471void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6472 const InputInfo &Output,
6473 const InputInfoList &Inputs,
6474 const ArgList &Args,
6475 const char *LinkingOutput) const {
6476 const Driver &D = getToolChain().getDriver();
6477 ArgStringList CmdArgs;
6478
6479 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6480 (!Args.hasArg(options::OPT_shared))) {
6481 CmdArgs.push_back("-e");
6482 CmdArgs.push_back("__start");
6483 }
6484
6485 if (Args.hasArg(options::OPT_static)) {
6486 CmdArgs.push_back("-Bstatic");
6487 } else {
6488 if (Args.hasArg(options::OPT_rdynamic))
6489 CmdArgs.push_back("-export-dynamic");
6490 CmdArgs.push_back("--eh-frame-hdr");
6491 CmdArgs.push_back("-Bdynamic");
6492 if (Args.hasArg(options::OPT_shared)) {
6493 CmdArgs.push_back("-shared");
6494 } else {
6495 CmdArgs.push_back("-dynamic-linker");
6496 CmdArgs.push_back("/usr/libexec/ld.so");
6497 }
6498 }
6499
6500 if (Output.isFilename()) {
6501 CmdArgs.push_back("-o");
6502 CmdArgs.push_back(Output.getFilename());
6503 } else {
6504 assert(Output.isNothing() && "Invalid output.");
6505 }
6506
6507 if (!Args.hasArg(options::OPT_nostdlib) &&
6508 !Args.hasArg(options::OPT_nostartfiles)) {
6509 if (!Args.hasArg(options::OPT_shared)) {
6510 if (Args.hasArg(options::OPT_pg))
6511 CmdArgs.push_back(Args.MakeArgString(
6512 getToolChain().GetFilePath("gcrt0.o")));
6513 else
6514 CmdArgs.push_back(Args.MakeArgString(
6515 getToolChain().GetFilePath("crt0.o")));
6516 CmdArgs.push_back(Args.MakeArgString(
6517 getToolChain().GetFilePath("crtbegin.o")));
6518 } else {
6519 CmdArgs.push_back(Args.MakeArgString(
6520 getToolChain().GetFilePath("crtbeginS.o")));
6521 }
6522 }
6523
6524 Args.AddAllArgs(CmdArgs, options::OPT_L);
6525 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6526 Args.AddAllArgs(CmdArgs, options::OPT_e);
6527
6528 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6529
6530 if (!Args.hasArg(options::OPT_nostdlib) &&
6531 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006532 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006533 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6534 if (Args.hasArg(options::OPT_pg))
6535 CmdArgs.push_back("-lm_p");
6536 else
6537 CmdArgs.push_back("-lm");
6538 }
6539
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006540 if (Args.hasArg(options::OPT_pthread)) {
6541 if (!Args.hasArg(options::OPT_shared) &&
6542 Args.hasArg(options::OPT_pg))
6543 CmdArgs.push_back("-lpthread_p");
6544 else
6545 CmdArgs.push_back("-lpthread");
6546 }
6547
Eli Friedman9fa28852012-08-08 23:57:20 +00006548 if (!Args.hasArg(options::OPT_shared)) {
6549 if (Args.hasArg(options::OPT_pg))
6550 CmdArgs.push_back("-lc_p");
6551 else
6552 CmdArgs.push_back("-lc");
6553 }
6554
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006555 StringRef MyArch;
6556 switch (getToolChain().getTriple().getArch()) {
6557 case llvm::Triple::arm:
6558 MyArch = "arm";
6559 break;
6560 case llvm::Triple::x86:
6561 MyArch = "i386";
6562 break;
6563 case llvm::Triple::x86_64:
6564 MyArch = "amd64";
6565 break;
6566 default:
6567 llvm_unreachable("Unsupported architecture");
6568 }
6569 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006570 }
6571
6572 if (!Args.hasArg(options::OPT_nostdlib) &&
6573 !Args.hasArg(options::OPT_nostartfiles)) {
6574 if (!Args.hasArg(options::OPT_shared))
6575 CmdArgs.push_back(Args.MakeArgString(
6576 getToolChain().GetFilePath("crtend.o")));
6577 else
6578 CmdArgs.push_back(Args.MakeArgString(
6579 getToolChain().GetFilePath("crtendS.o")));
6580 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006581
6582 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006583 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006584 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006585}
6586
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006587void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006588 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006589 const InputInfoList &Inputs,
6590 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006591 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006592 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006593 ArgStringList CmdArgs;
6594
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006595 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6596 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006597 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006598 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006599 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006600 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006601 else if (getToolChain().getArch() == llvm::Triple::mips ||
6602 getToolChain().getArch() == llvm::Triple::mipsel ||
6603 getToolChain().getArch() == llvm::Triple::mips64 ||
6604 getToolChain().getArch() == llvm::Triple::mips64el) {
6605 StringRef CPUName;
6606 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006607 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006608
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006609 CmdArgs.push_back("-march");
6610 CmdArgs.push_back(CPUName.data());
6611
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006612 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006613 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006614
6615 if (getToolChain().getArch() == llvm::Triple::mips ||
6616 getToolChain().getArch() == llvm::Triple::mips64)
6617 CmdArgs.push_back("-EB");
6618 else
6619 CmdArgs.push_back("-EL");
6620
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006621 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006622 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006623 getToolChain().getArch() == llvm::Triple::armeb ||
6624 getToolChain().getArch() == llvm::Triple::thumb ||
6625 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006626 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006627 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006628 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6629
6630 if (FloatABI == "hard") {
6631 CmdArgs.push_back("-mfpu=vfp");
6632 } else {
6633 CmdArgs.push_back("-mfpu=softvfp");
6634 }
6635
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006636 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006637 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006638 case llvm::Triple::GNUEABI:
6639 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006640 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006641 break;
6642
6643 default:
6644 CmdArgs.push_back("-matpcs");
6645 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006646 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006647 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006648 if (getToolChain().getArch() == llvm::Triple::sparc)
6649 CmdArgs.push_back("-Av8plusa");
6650 else
6651 CmdArgs.push_back("-Av9a");
6652
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006653 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006654 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006655
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006656 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6657 options::OPT_Xassembler);
6658
6659 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006660 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006661
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006662 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006663 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006664
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006665 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006666 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006667}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006668
6669void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006670 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006671 const InputInfoList &Inputs,
6672 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006673 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006674 const toolchains::FreeBSD& ToolChain =
6675 static_cast<const toolchains::FreeBSD&>(getToolChain());
6676 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006677 const bool IsPIE =
6678 !Args.hasArg(options::OPT_shared) &&
6679 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006680 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006681
6682 // Silence warning for "clang -g foo.o -o foo"
6683 Args.ClaimAllArgs(options::OPT_g_Group);
6684 // and "clang -emit-llvm foo.o -o foo"
6685 Args.ClaimAllArgs(options::OPT_emit_llvm);
6686 // and for "clang -w foo.o -o foo". Other warning options are already
6687 // handled somewhere else.
6688 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006689
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006690 if (!D.SysRoot.empty())
6691 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6692
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006693 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006694 CmdArgs.push_back("-pie");
6695
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006696 if (Args.hasArg(options::OPT_static)) {
6697 CmdArgs.push_back("-Bstatic");
6698 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006699 if (Args.hasArg(options::OPT_rdynamic))
6700 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006701 CmdArgs.push_back("--eh-frame-hdr");
6702 if (Args.hasArg(options::OPT_shared)) {
6703 CmdArgs.push_back("-Bshareable");
6704 } else {
6705 CmdArgs.push_back("-dynamic-linker");
6706 CmdArgs.push_back("/libexec/ld-elf.so.1");
6707 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006708 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6709 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006710 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6711 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6712 CmdArgs.push_back("--hash-style=both");
6713 }
6714 }
6715 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006716 }
6717
6718 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6719 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006720 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006721 CmdArgs.push_back("-m");
6722 CmdArgs.push_back("elf_i386_fbsd");
6723 }
6724
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006725 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006726 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006727 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006728 }
6729
Daniel Dunbarb440f562010-08-02 02:38:21 +00006730 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006731 CmdArgs.push_back("-o");
6732 CmdArgs.push_back(Output.getFilename());
6733 } else {
6734 assert(Output.isNothing() && "Invalid output.");
6735 }
6736
6737 if (!Args.hasArg(options::OPT_nostdlib) &&
6738 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006739 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006740 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006741 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006742 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006743 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006744 crt1 = "Scrt1.o";
6745 else
6746 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006747 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006748 if (crt1)
6749 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6750
6751 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6752
Craig Topper92fc2df2014-05-17 16:56:41 +00006753 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006754 if (Args.hasArg(options::OPT_static))
6755 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006756 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006757 crtbegin = "crtbeginS.o";
6758 else
6759 crtbegin = "crtbegin.o";
6760
6761 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006762 }
6763
6764 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006765 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006766 for (const auto &Path : Paths)
6767 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006768 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6769 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006770 Args.AddAllArgs(CmdArgs, options::OPT_s);
6771 Args.AddAllArgs(CmdArgs, options::OPT_t);
6772 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6773 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006774
Alp Tokerce365ca2013-12-02 12:43:03 +00006775 if (D.IsUsingLTO(Args))
6776 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006777
Alexey Samsonov52550342014-09-15 19:58:40 +00006778 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006779 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006780
6781 if (!Args.hasArg(options::OPT_nostdlib) &&
6782 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006783 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006784 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006785 if (Args.hasArg(options::OPT_pg))
6786 CmdArgs.push_back("-lm_p");
6787 else
6788 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006789 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006790 if (NeedsSanitizerDeps)
6791 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006792 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6793 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006794 if (Args.hasArg(options::OPT_pg))
6795 CmdArgs.push_back("-lgcc_p");
6796 else
6797 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006798 if (Args.hasArg(options::OPT_static)) {
6799 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006800 } else if (Args.hasArg(options::OPT_pg)) {
6801 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006802 } else {
6803 CmdArgs.push_back("--as-needed");
6804 CmdArgs.push_back("-lgcc_s");
6805 CmdArgs.push_back("--no-as-needed");
6806 }
6807
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006808 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006809 if (Args.hasArg(options::OPT_pg))
6810 CmdArgs.push_back("-lpthread_p");
6811 else
6812 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006813 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006814
Roman Divacky66f22762011-02-10 16:59:40 +00006815 if (Args.hasArg(options::OPT_pg)) {
6816 if (Args.hasArg(options::OPT_shared))
6817 CmdArgs.push_back("-lc");
6818 else
6819 CmdArgs.push_back("-lc_p");
6820 CmdArgs.push_back("-lgcc_p");
6821 } else {
6822 CmdArgs.push_back("-lc");
6823 CmdArgs.push_back("-lgcc");
6824 }
6825
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006826 if (Args.hasArg(options::OPT_static)) {
6827 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006828 } else if (Args.hasArg(options::OPT_pg)) {
6829 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006830 } else {
6831 CmdArgs.push_back("--as-needed");
6832 CmdArgs.push_back("-lgcc_s");
6833 CmdArgs.push_back("--no-as-needed");
6834 }
6835 }
6836
6837 if (!Args.hasArg(options::OPT_nostdlib) &&
6838 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006839 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006840 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006841 else
6842 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006843 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006844 }
6845
Alexey Samsonov7811d192014-02-20 13:57:37 +00006846 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006847
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006848 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006849 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006850 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006851}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006852
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006853void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6854 const InputInfo &Output,
6855 const InputInfoList &Inputs,
6856 const ArgList &Args,
6857 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006858 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006859 ArgStringList CmdArgs;
6860
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006861 // GNU as needs different flags for creating the correct output format
6862 // on architectures with different ABIs or optional feature sets.
6863 switch (getToolChain().getArch()) {
6864 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006865 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006866 break;
6867 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006868 case llvm::Triple::armeb:
6869 case llvm::Triple::thumb:
6870 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006871 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006872 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006873 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006874 }
6875
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006876 case llvm::Triple::mips:
6877 case llvm::Triple::mipsel:
6878 case llvm::Triple::mips64:
6879 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006880 StringRef CPUName;
6881 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006882 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006883
6884 CmdArgs.push_back("-march");
6885 CmdArgs.push_back(CPUName.data());
6886
6887 CmdArgs.push_back("-mabi");
6888 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6889
6890 if (getToolChain().getArch() == llvm::Triple::mips ||
6891 getToolChain().getArch() == llvm::Triple::mips64)
6892 CmdArgs.push_back("-EB");
6893 else
6894 CmdArgs.push_back("-EL");
6895
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006896 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006897 break;
6898 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006899
6900 case llvm::Triple::sparc:
6901 CmdArgs.push_back("-32");
6902 addAssemblerKPIC(Args, CmdArgs);
6903 break;
6904
6905 case llvm::Triple::sparcv9:
6906 CmdArgs.push_back("-64");
6907 CmdArgs.push_back("-Av9");
6908 addAssemblerKPIC(Args, CmdArgs);
6909 break;
6910
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006911 default:
6912 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006913 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006914
6915 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6916 options::OPT_Xassembler);
6917
6918 CmdArgs.push_back("-o");
6919 CmdArgs.push_back(Output.getFilename());
6920
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006921 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006922 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006923
David Chisnallddbd68f2011-09-27 22:03:18 +00006924 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006925 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006926}
6927
6928void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6929 const InputInfo &Output,
6930 const InputInfoList &Inputs,
6931 const ArgList &Args,
6932 const char *LinkingOutput) const {
6933 const Driver &D = getToolChain().getDriver();
6934 ArgStringList CmdArgs;
6935
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006936 if (!D.SysRoot.empty())
6937 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6938
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006939 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006940 if (Args.hasArg(options::OPT_static)) {
6941 CmdArgs.push_back("-Bstatic");
6942 } else {
6943 if (Args.hasArg(options::OPT_rdynamic))
6944 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006945 if (Args.hasArg(options::OPT_shared)) {
6946 CmdArgs.push_back("-Bshareable");
6947 } else {
6948 CmdArgs.push_back("-dynamic-linker");
6949 CmdArgs.push_back("/libexec/ld.elf_so");
6950 }
6951 }
6952
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006953 // Many NetBSD architectures support more than one ABI.
6954 // Determine the correct emulation for ld.
6955 switch (getToolChain().getArch()) {
6956 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006957 CmdArgs.push_back("-m");
6958 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006959 break;
6960 case llvm::Triple::arm:
6961 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006962 CmdArgs.push_back("-m");
6963 switch (getToolChain().getTriple().getEnvironment()) {
6964 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006965 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006966 CmdArgs.push_back("armelf_nbsd_eabi");
6967 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006968 case llvm::Triple::EABIHF:
6969 case llvm::Triple::GNUEABIHF:
6970 CmdArgs.push_back("armelf_nbsd_eabihf");
6971 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006972 default:
6973 CmdArgs.push_back("armelf_nbsd");
6974 break;
6975 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006976 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006977 case llvm::Triple::armeb:
6978 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006979 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006980 CmdArgs.push_back("-m");
6981 switch (getToolChain().getTriple().getEnvironment()) {
6982 case llvm::Triple::EABI:
6983 case llvm::Triple::GNUEABI:
6984 CmdArgs.push_back("armelfb_nbsd_eabi");
6985 break;
6986 case llvm::Triple::EABIHF:
6987 case llvm::Triple::GNUEABIHF:
6988 CmdArgs.push_back("armelfb_nbsd_eabihf");
6989 break;
6990 default:
6991 CmdArgs.push_back("armelfb_nbsd");
6992 break;
6993 }
6994 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006995 case llvm::Triple::mips64:
6996 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006997 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006998 CmdArgs.push_back("-m");
6999 if (getToolChain().getArch() == llvm::Triple::mips64)
7000 CmdArgs.push_back("elf32btsmip");
7001 else
7002 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007003 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007004 CmdArgs.push_back("-m");
7005 if (getToolChain().getArch() == llvm::Triple::mips64)
7006 CmdArgs.push_back("elf64btsmip");
7007 else
7008 CmdArgs.push_back("elf64ltsmip");
7009 }
7010 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007011 case llvm::Triple::ppc:
7012 CmdArgs.push_back("-m");
7013 CmdArgs.push_back("elf32ppc_nbsd");
7014 break;
7015
7016 case llvm::Triple::ppc64:
7017 case llvm::Triple::ppc64le:
7018 CmdArgs.push_back("-m");
7019 CmdArgs.push_back("elf64ppc");
7020 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007021
7022 case llvm::Triple::sparc:
7023 CmdArgs.push_back("-m");
7024 CmdArgs.push_back("elf32_sparc");
7025 break;
7026
7027 case llvm::Triple::sparcv9:
7028 CmdArgs.push_back("-m");
7029 CmdArgs.push_back("elf64_sparc");
7030 break;
7031
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007032 default:
7033 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007034 }
7035
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007036 if (Output.isFilename()) {
7037 CmdArgs.push_back("-o");
7038 CmdArgs.push_back(Output.getFilename());
7039 } else {
7040 assert(Output.isNothing() && "Invalid output.");
7041 }
7042
7043 if (!Args.hasArg(options::OPT_nostdlib) &&
7044 !Args.hasArg(options::OPT_nostartfiles)) {
7045 if (!Args.hasArg(options::OPT_shared)) {
7046 CmdArgs.push_back(Args.MakeArgString(
7047 getToolChain().GetFilePath("crt0.o")));
7048 CmdArgs.push_back(Args.MakeArgString(
7049 getToolChain().GetFilePath("crti.o")));
7050 CmdArgs.push_back(Args.MakeArgString(
7051 getToolChain().GetFilePath("crtbegin.o")));
7052 } else {
7053 CmdArgs.push_back(Args.MakeArgString(
7054 getToolChain().GetFilePath("crti.o")));
7055 CmdArgs.push_back(Args.MakeArgString(
7056 getToolChain().GetFilePath("crtbeginS.o")));
7057 }
7058 }
7059
7060 Args.AddAllArgs(CmdArgs, options::OPT_L);
7061 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7062 Args.AddAllArgs(CmdArgs, options::OPT_e);
7063 Args.AddAllArgs(CmdArgs, options::OPT_s);
7064 Args.AddAllArgs(CmdArgs, options::OPT_t);
7065 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7066 Args.AddAllArgs(CmdArgs, options::OPT_r);
7067
7068 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7069
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007070 unsigned Major, Minor, Micro;
7071 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7072 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007073 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007074 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007075 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007076 case llvm::Triple::arm:
7077 case llvm::Triple::armeb:
7078 case llvm::Triple::thumb:
7079 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007080 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007081 case llvm::Triple::ppc64:
7082 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007083 case llvm::Triple::x86:
7084 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007085 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007086 break;
7087 default:
7088 break;
7089 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007090 }
7091
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007092 if (!Args.hasArg(options::OPT_nostdlib) &&
7093 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007094 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007095 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7096 CmdArgs.push_back("-lm");
7097 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007098 if (Args.hasArg(options::OPT_pthread))
7099 CmdArgs.push_back("-lpthread");
7100 CmdArgs.push_back("-lc");
7101
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007102 if (useLibgcc) {
7103 if (Args.hasArg(options::OPT_static)) {
7104 // libgcc_eh depends on libc, so resolve as much as possible,
7105 // pull in any new requirements from libc and then get the rest
7106 // of libgcc.
7107 CmdArgs.push_back("-lgcc_eh");
7108 CmdArgs.push_back("-lc");
7109 CmdArgs.push_back("-lgcc");
7110 } else {
7111 CmdArgs.push_back("-lgcc");
7112 CmdArgs.push_back("--as-needed");
7113 CmdArgs.push_back("-lgcc_s");
7114 CmdArgs.push_back("--no-as-needed");
7115 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007116 }
7117 }
7118
7119 if (!Args.hasArg(options::OPT_nostdlib) &&
7120 !Args.hasArg(options::OPT_nostartfiles)) {
7121 if (!Args.hasArg(options::OPT_shared))
7122 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7123 "crtend.o")));
7124 else
7125 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7126 "crtendS.o")));
7127 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7128 "crtn.o")));
7129 }
7130
Alexey Samsonov7811d192014-02-20 13:57:37 +00007131 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007132
Logan Chieneb9162f2014-06-26 14:23:45 +00007133 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007134 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007135}
7136
Thomas Schwinge4e555262013-03-28 19:04:25 +00007137void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7138 const InputInfo &Output,
7139 const InputInfoList &Inputs,
7140 const ArgList &Args,
7141 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007142 claimNoWarnArgs(Args);
7143
Rafael Espindola92b00932010-08-10 00:25:48 +00007144 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007145 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007146
7147 // Add --32/--64 to make sure we get the format we want.
7148 // This is incomplete
7149 if (getToolChain().getArch() == llvm::Triple::x86) {
7150 CmdArgs.push_back("--32");
7151 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007152 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7153 CmdArgs.push_back("--x32");
7154 else
7155 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007156 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7157 CmdArgs.push_back("-a32");
7158 CmdArgs.push_back("-mppc");
7159 CmdArgs.push_back("-many");
7160 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7161 CmdArgs.push_back("-a64");
7162 CmdArgs.push_back("-mppc64");
7163 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007164 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7165 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007166 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007167 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007168 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007169 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7170 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007171 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007172 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007173 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7174 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007175 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007176 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007177 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7178 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007179 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007180 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7181 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007182 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7183 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007184 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007185
Tim Northover9c7e0352013-12-12 11:55:52 +00007186 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7187 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007188 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007189
7190 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007191
7192 // FIXME: remove krait check when GNU tools support krait cpu
7193 // for now replace it with -march=armv7-a to avoid a lower
7194 // march from being picked in the absence of a cpu flag.
7195 Arg *A;
7196 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7197 StringRef(A->getValue()) == "krait")
7198 CmdArgs.push_back("-march=armv7-a");
7199 else
7200 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007201 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007202 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7203 getToolChain().getArch() == llvm::Triple::mipsel ||
7204 getToolChain().getArch() == llvm::Triple::mips64 ||
7205 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007206 StringRef CPUName;
7207 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007208 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007209 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007210
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007211 CmdArgs.push_back("-march");
7212 CmdArgs.push_back(CPUName.data());
7213
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007214 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007215 CmdArgs.push_back(ABIName.data());
7216
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007217 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7218 // or -mshared (not implemented) is in effect.
7219 bool IsPicOrPie = false;
7220 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7221 options::OPT_fpic, options::OPT_fno_pic,
7222 options::OPT_fPIE, options::OPT_fno_PIE,
7223 options::OPT_fpie, options::OPT_fno_pie)) {
7224 if (A->getOption().matches(options::OPT_fPIC) ||
7225 A->getOption().matches(options::OPT_fpic) ||
7226 A->getOption().matches(options::OPT_fPIE) ||
7227 A->getOption().matches(options::OPT_fpie))
7228 IsPicOrPie = true;
7229 }
7230 if (!IsPicOrPie)
7231 CmdArgs.push_back("-mno-shared");
7232
Daniel Sanders379d44b2014-07-16 11:52:23 +00007233 // LLVM doesn't support -mplt yet and acts as if it is always given.
7234 // However, -mplt has no effect with the N64 ABI.
7235 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007236
7237 if (getToolChain().getArch() == llvm::Triple::mips ||
7238 getToolChain().getArch() == llvm::Triple::mips64)
7239 CmdArgs.push_back("-EB");
7240 else
7241 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007242
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007243 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7244 if (StringRef(A->getValue()) == "2008")
7245 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7246 }
7247
Daniel Sanders379d44b2014-07-16 11:52:23 +00007248 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7249 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7250 options::OPT_mfp64)) {
7251 A->claim();
7252 A->render(Args, CmdArgs);
7253 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7254 ABIName))
7255 CmdArgs.push_back("-mfpxx");
7256
7257 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7258 // -mno-mips16 is actually -no-mips16.
7259 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7260 options::OPT_mno_mips16)) {
7261 if (A->getOption().matches(options::OPT_mips16)) {
7262 A->claim();
7263 A->render(Args, CmdArgs);
7264 } else {
7265 A->claim();
7266 CmdArgs.push_back("-no-mips16");
7267 }
7268 }
7269
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007270 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7271 options::OPT_mno_micromips);
7272 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7273 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7274
Simon Atanasyanbd986632013-11-26 11:58:04 +00007275 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7276 // Do not use AddLastArg because not all versions of MIPS assembler
7277 // support -mmsa / -mno-msa options.
7278 if (A->getOption().matches(options::OPT_mmsa))
7279 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7280 }
7281
Daniel Sanders379d44b2014-07-16 11:52:23 +00007282 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7283 options::OPT_msoft_float);
7284
7285 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7286 options::OPT_mno_odd_spreg);
7287
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007288 NeedsKPIC = true;
7289 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7290 // Always pass an -march option, since our default of z10 is later
7291 // than the GNU assembler's default.
7292 StringRef CPUName = getSystemZTargetCPU(Args);
7293 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7294 }
7295
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007296 if (NeedsKPIC)
7297 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007298
7299 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7300 options::OPT_Xassembler);
7301
7302 CmdArgs.push_back("-o");
7303 CmdArgs.push_back(Output.getFilename());
7304
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007305 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007306 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007307
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007308 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007309 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007310
7311 // Handle the debug info splitting at object creation time if we're
7312 // creating an object.
7313 // TODO: Currently only works on linux with newer objcopy.
7314 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007315 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007316 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7317 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007318}
7319
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007320static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007321 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007322 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007323 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7324 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007325 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007326 CmdArgs.push_back("-lgcc");
7327
Logan Chien3d3373c2012-11-19 12:04:11 +00007328 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007329 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007330 CmdArgs.push_back("-lgcc");
7331 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007332 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007333 CmdArgs.push_back("--as-needed");
7334 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007335 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007336 CmdArgs.push_back("--no-as-needed");
7337 }
7338
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007339 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007340 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007341 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007342 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007343
7344 // According to Android ABI, we have to link with libdl if we are
7345 // linking with non-static libgcc.
7346 //
7347 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7348 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7349 if (isAndroid && !StaticLibgcc)
7350 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007351}
7352
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007353static std::string getLinuxDynamicLinker(const ArgList &Args,
7354 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007355 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7356 if (ToolChain.getTriple().isArch64Bit())
7357 return "/system/bin/linker64";
7358 else
7359 return "/system/bin/linker";
7360 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7361 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007362 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007363 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007364 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007365 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007366 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007367 else if (ToolChain.getArch() == llvm::Triple::arm ||
7368 ToolChain.getArch() == llvm::Triple::thumb) {
7369 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7370 return "/lib/ld-linux-armhf.so.3";
7371 else
7372 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007373 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7374 ToolChain.getArch() == llvm::Triple::thumbeb) {
7375 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7376 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7377 else
7378 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007379 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007380 ToolChain.getArch() == llvm::Triple::mipsel ||
7381 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007382 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007383 StringRef CPUName;
7384 StringRef ABIName;
7385 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7386 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7387
7388 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7389 .Case("o32", "/lib")
7390 .Case("n32", "/lib32")
7391 .Case("n64", "/lib64")
7392 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007393 StringRef LibName;
7394 if (mips::isUCLibc(Args))
7395 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7396 else
7397 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007398
7399 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007400 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7401 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007402 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7403 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7404 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007405 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007406 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7407 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7408 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007409 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007410 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7411 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007412 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7413 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007414 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7415 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7416 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007417 else
7418 return "/lib64/ld-linux-x86-64.so.2";
7419}
7420
Renato Golinc4b49242014-02-13 10:01:16 +00007421static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007422 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007423 // Make use of compiler-rt if --rtlib option is used
7424 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7425
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007426 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007427 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007428 switch (TC.getTriple().getOS()) {
7429 default: llvm_unreachable("unsupported OS");
7430 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007431 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007432 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007433 break;
7434 }
Renato Golinc4b49242014-02-13 10:01:16 +00007435 break;
7436 case ToolChain::RLT_Libgcc:
7437 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7438 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007439 }
7440}
7441
Rafael Espindola1e085772014-08-15 17:14:35 +00007442static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7443 switch (T.getArch()) {
7444 case llvm::Triple::x86:
7445 return "elf_i386";
7446 case llvm::Triple::aarch64:
7447 return "aarch64linux";
7448 case llvm::Triple::aarch64_be:
7449 return "aarch64_be_linux";
7450 case llvm::Triple::arm:
7451 case llvm::Triple::thumb:
7452 return "armelf_linux_eabi";
7453 case llvm::Triple::armeb:
7454 case llvm::Triple::thumbeb:
7455 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7456 case llvm::Triple::ppc:
7457 return "elf32ppclinux";
7458 case llvm::Triple::ppc64:
7459 return "elf64ppc";
7460 case llvm::Triple::ppc64le:
7461 return "elf64lppc";
7462 case llvm::Triple::sparc:
7463 return "elf32_sparc";
7464 case llvm::Triple::sparcv9:
7465 return "elf64_sparc";
7466 case llvm::Triple::mips:
7467 return "elf32btsmip";
7468 case llvm::Triple::mipsel:
7469 return "elf32ltsmip";
7470 case llvm::Triple::mips64:
7471 if (mips::hasMipsAbiArg(Args, "n32"))
7472 return "elf32btsmipn32";
7473 return "elf64btsmip";
7474 case llvm::Triple::mips64el:
7475 if (mips::hasMipsAbiArg(Args, "n32"))
7476 return "elf32ltsmipn32";
7477 return "elf64ltsmip";
7478 case llvm::Triple::systemz:
7479 return "elf64_s390";
7480 case llvm::Triple::x86_64:
7481 if (T.getEnvironment() == llvm::Triple::GNUX32)
7482 return "elf32_x86_64";
7483 return "elf_x86_64";
7484 default:
7485 llvm_unreachable("Unexpected arch");
7486 }
7487}
7488
Thomas Schwinge4e555262013-03-28 19:04:25 +00007489void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7490 const InputInfo &Output,
7491 const InputInfoList &Inputs,
7492 const ArgList &Args,
7493 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007494 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007495 static_cast<const toolchains::Linux&>(getToolChain());
7496 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007497 const bool isAndroid =
7498 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007499 const bool IsPIE =
7500 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007501 !Args.hasArg(options::OPT_static) &&
7502 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7503 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007504 // Cannot use isPIEDefault here since otherwise
7505 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007506 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007507
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007508 ArgStringList CmdArgs;
7509
Rafael Espindolad1002f62010-11-15 18:28:16 +00007510 // Silence warning for "clang -g foo.o -o foo"
7511 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007512 // and "clang -emit-llvm foo.o -o foo"
7513 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007514 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007515 // handled somewhere else.
7516 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007517
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007518 if (!D.SysRoot.empty())
7519 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007520
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007521 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007522 CmdArgs.push_back("-pie");
7523
Rafael Espindola1c76c592010-11-07 22:57:16 +00007524 if (Args.hasArg(options::OPT_rdynamic))
7525 CmdArgs.push_back("-export-dynamic");
7526
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007527 if (Args.hasArg(options::OPT_s))
7528 CmdArgs.push_back("-s");
7529
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007530 if (ToolChain.getArch() == llvm::Triple::armeb ||
7531 ToolChain.getArch() == llvm::Triple::thumbeb)
7532 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7533
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007534 for (const auto &Opt : ToolChain.ExtraOpts)
7535 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007536
7537 if (!Args.hasArg(options::OPT_static)) {
7538 CmdArgs.push_back("--eh-frame-hdr");
7539 }
7540
7541 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007542 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007543
7544 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007545 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007546 ToolChain.getArch() == llvm::Triple::armeb ||
7547 ToolChain.getArch() == llvm::Triple::thumb ||
7548 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007549 CmdArgs.push_back("-Bstatic");
7550 else
7551 CmdArgs.push_back("-static");
7552 } else if (Args.hasArg(options::OPT_shared)) {
7553 CmdArgs.push_back("-shared");
7554 }
7555
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007556 if (ToolChain.getArch() == llvm::Triple::arm ||
7557 ToolChain.getArch() == llvm::Triple::armeb ||
7558 ToolChain.getArch() == llvm::Triple::thumb ||
7559 ToolChain.getArch() == llvm::Triple::thumbeb ||
7560 (!Args.hasArg(options::OPT_static) &&
7561 !Args.hasArg(options::OPT_shared))) {
7562 CmdArgs.push_back("-dynamic-linker");
7563 CmdArgs.push_back(Args.MakeArgString(
7564 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7565 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007566
Ulrich Weigandf32a1ac2015-01-29 19:08:51 +00007567 // Work around a bug in GNU ld (and gold) linker versions up to 2.25
7568 // that may mis-optimize code generated by this version of clang/LLVM
7569 // to access general-dynamic or local-dynamic TLS variables.
7570 if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7571 ToolChain.getArch() == llvm::Triple::ppc64le)
7572 CmdArgs.push_back("--no-tls-optimize");
7573
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007574 CmdArgs.push_back("-o");
7575 CmdArgs.push_back(Output.getFilename());
7576
Rafael Espindola81937ec2010-12-01 01:52:43 +00007577 if (!Args.hasArg(options::OPT_nostdlib) &&
7578 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007579 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007580 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007581 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007582 if (Args.hasArg(options::OPT_pg))
7583 crt1 = "gcrt1.o";
7584 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007585 crt1 = "Scrt1.o";
7586 else
7587 crt1 = "crt1.o";
7588 }
7589 if (crt1)
7590 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007591
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007592 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7593 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007594
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007595 const char *crtbegin;
7596 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007597 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007598 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007599 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007600 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007601 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007602 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007603 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007604 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007605
7606 // Add crtfastmath.o if available and fast math is enabled.
7607 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007608 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007609
7610 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007611 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007612
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007613 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007614
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007615 for (const auto &Path : Paths)
7616 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007617
Alp Tokerce365ca2013-12-02 12:43:03 +00007618 if (D.IsUsingLTO(Args))
7619 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007620
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007621 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7622 CmdArgs.push_back("--no-demangle");
7623
Alexey Samsonov52550342014-09-15 19:58:40 +00007624 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007625 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007626 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007627 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007628
Hans Wennborg70850d82013-07-18 20:29:38 +00007629 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007630 !Args.hasArg(options::OPT_nostdlib) &&
7631 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007632 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7633 !Args.hasArg(options::OPT_static);
7634 if (OnlyLibstdcxxStatic)
7635 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007636 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007637 if (OnlyLibstdcxxStatic)
7638 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007639 CmdArgs.push_back("-lm");
7640 }
7641
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007642 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007643 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7644 if (Args.hasArg(options::OPT_static))
7645 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007646
Alexey Samsonov52550342014-09-15 19:58:40 +00007647 if (NeedsSanitizerDeps)
7648 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7649
Alexey Bataev186b28a2014-03-06 05:43:53 +00007650 LibOpenMP UsedOpenMPLib = LibUnknown;
7651 if (Args.hasArg(options::OPT_fopenmp)) {
7652 UsedOpenMPLib = LibGOMP;
7653 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7654 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7655 .Case("libgomp", LibGOMP)
7656 .Case("libiomp5", LibIOMP5)
7657 .Default(LibUnknown);
7658 if (UsedOpenMPLib == LibUnknown)
7659 D.Diag(diag::err_drv_unsupported_option_argument)
7660 << A->getOption().getName() << A->getValue();
7661 }
7662 switch (UsedOpenMPLib) {
7663 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007664 CmdArgs.push_back("-lgomp");
7665
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007666 // FIXME: Exclude this for platforms with libgomp that don't require
7667 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007668 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007669 break;
7670 case LibIOMP5:
7671 CmdArgs.push_back("-liomp5");
7672 break;
7673 case LibUnknown:
7674 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007675 }
Renato Golinc4b49242014-02-13 10:01:16 +00007676 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007677
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007678 if ((Args.hasArg(options::OPT_pthread) ||
7679 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7680 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007681 CmdArgs.push_back("-lpthread");
7682
7683 CmdArgs.push_back("-lc");
7684
7685 if (Args.hasArg(options::OPT_static))
7686 CmdArgs.push_back("--end-group");
7687 else
Renato Golinc4b49242014-02-13 10:01:16 +00007688 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007689 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007690
Rafael Espindola81937ec2010-12-01 01:52:43 +00007691 if (!Args.hasArg(options::OPT_nostartfiles)) {
7692 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007693 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007694 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007695 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007696 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007697 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007698 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007699
Rafael Espindola81937ec2010-12-01 01:52:43 +00007700 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007701 if (!isAndroid)
7702 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007703 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007704 }
7705
David Blaikiec11bf802014-09-04 16:04:28 +00007706 C.addCommand(
7707 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007708}
7709
Chris Lattner3e2ee142010-07-07 16:01:42 +00007710void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007711 const InputInfo &Output,
7712 const InputInfoList &Inputs,
7713 const ArgList &Args,
7714 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007715 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007716 ArgStringList CmdArgs;
7717
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007718 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007719
7720 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007721 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007722
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007723 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007724 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007725
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007726 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007728}
7729
7730void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007731 const InputInfo &Output,
7732 const InputInfoList &Inputs,
7733 const ArgList &Args,
7734 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007735 const Driver &D = getToolChain().getDriver();
7736 ArgStringList CmdArgs;
7737
Daniel Dunbarb440f562010-08-02 02:38:21 +00007738 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007739 CmdArgs.push_back("-o");
7740 CmdArgs.push_back(Output.getFilename());
7741 } else {
7742 assert(Output.isNothing() && "Invalid output.");
7743 }
7744
7745 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007746 !Args.hasArg(options::OPT_nostartfiles)) {
7747 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7748 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7749 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7750 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7751 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007752
7753 Args.AddAllArgs(CmdArgs, options::OPT_L);
7754 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7755 Args.AddAllArgs(CmdArgs, options::OPT_e);
7756
Daniel Dunbar54423b22010-09-17 00:24:54 +00007757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007758
Alexey Samsonov7811d192014-02-20 13:57:37 +00007759 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007760
Chris Lattner3e2ee142010-07-07 16:01:42 +00007761 if (!Args.hasArg(options::OPT_nostdlib) &&
7762 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007763 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007764 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007765 CmdArgs.push_back("-lm");
7766 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007767 }
7768
7769 if (!Args.hasArg(options::OPT_nostdlib) &&
7770 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007771 if (Args.hasArg(options::OPT_pthread))
7772 CmdArgs.push_back("-lpthread");
7773 CmdArgs.push_back("-lc");
7774 CmdArgs.push_back("-lCompilerRT-Generic");
7775 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7776 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007777 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007778 }
7779
Logan Chieneb9162f2014-06-26 14:23:45 +00007780 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007781 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007782}
7783
Daniel Dunbarcc912342009-05-02 18:28:39 +00007784/// DragonFly Tools
7785
7786// For now, DragonFly Assemble does just about the same as for
7787// FreeBSD, but this may change soon.
7788void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007789 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007790 const InputInfoList &Inputs,
7791 const ArgList &Args,
7792 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007793 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007794 ArgStringList CmdArgs;
7795
7796 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7797 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007798 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007799 CmdArgs.push_back("--32");
7800
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007801 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007802
7803 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007804 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007805
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007806 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007807 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007808
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007809 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007810 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007811}
7812
7813void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007814 const InputInfo &Output,
7815 const InputInfoList &Inputs,
7816 const ArgList &Args,
7817 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007818 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007819 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007820 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007821
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007822 if (!D.SysRoot.empty())
7823 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7824
John McCall65b8da02013-04-11 22:55:55 +00007825 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007826 if (Args.hasArg(options::OPT_static)) {
7827 CmdArgs.push_back("-Bstatic");
7828 } else {
John McCall65b8da02013-04-11 22:55:55 +00007829 if (Args.hasArg(options::OPT_rdynamic))
7830 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007831 if (Args.hasArg(options::OPT_shared))
7832 CmdArgs.push_back("-Bshareable");
7833 else {
7834 CmdArgs.push_back("-dynamic-linker");
7835 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7836 }
John McCall65b8da02013-04-11 22:55:55 +00007837 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007838 }
7839
7840 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7841 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007842 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007843 CmdArgs.push_back("-m");
7844 CmdArgs.push_back("elf_i386");
7845 }
7846
Daniel Dunbarb440f562010-08-02 02:38:21 +00007847 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007848 CmdArgs.push_back("-o");
7849 CmdArgs.push_back(Output.getFilename());
7850 } else {
7851 assert(Output.isNothing() && "Invalid output.");
7852 }
7853
7854 if (!Args.hasArg(options::OPT_nostdlib) &&
7855 !Args.hasArg(options::OPT_nostartfiles)) {
7856 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007857 if (Args.hasArg(options::OPT_pg))
7858 CmdArgs.push_back(Args.MakeArgString(
7859 getToolChain().GetFilePath("gcrt1.o")));
7860 else {
7861 if (Args.hasArg(options::OPT_pie))
7862 CmdArgs.push_back(Args.MakeArgString(
7863 getToolChain().GetFilePath("Scrt1.o")));
7864 else
7865 CmdArgs.push_back(Args.MakeArgString(
7866 getToolChain().GetFilePath("crt1.o")));
7867 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007868 }
John McCall65b8da02013-04-11 22:55:55 +00007869 CmdArgs.push_back(Args.MakeArgString(
7870 getToolChain().GetFilePath("crti.o")));
7871 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7872 CmdArgs.push_back(Args.MakeArgString(
7873 getToolChain().GetFilePath("crtbeginS.o")));
7874 else
7875 CmdArgs.push_back(Args.MakeArgString(
7876 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007877 }
7878
7879 Args.AddAllArgs(CmdArgs, options::OPT_L);
7880 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7881 Args.AddAllArgs(CmdArgs, options::OPT_e);
7882
Daniel Dunbar54423b22010-09-17 00:24:54 +00007883 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007884
7885 if (!Args.hasArg(options::OPT_nostdlib) &&
7886 !Args.hasArg(options::OPT_nodefaultlibs)) {
7887 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7888 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007889 if (UseGCC47)
7890 CmdArgs.push_back("-L/usr/lib/gcc47");
7891 else
7892 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007893
7894 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007895 if (UseGCC47) {
7896 CmdArgs.push_back("-rpath");
7897 CmdArgs.push_back("/usr/lib/gcc47");
7898 } else {
7899 CmdArgs.push_back("-rpath");
7900 CmdArgs.push_back("/usr/lib/gcc44");
7901 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007902 }
7903
Hans Wennborg70850d82013-07-18 20:29:38 +00007904 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007905 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007906 CmdArgs.push_back("-lm");
7907 }
7908
Daniel Dunbarcc912342009-05-02 18:28:39 +00007909 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007910 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007911
7912 if (!Args.hasArg(options::OPT_nolibc)) {
7913 CmdArgs.push_back("-lc");
7914 }
7915
John McCall65b8da02013-04-11 22:55:55 +00007916 if (UseGCC47) {
7917 if (Args.hasArg(options::OPT_static) ||
7918 Args.hasArg(options::OPT_static_libgcc)) {
7919 CmdArgs.push_back("-lgcc");
7920 CmdArgs.push_back("-lgcc_eh");
7921 } else {
7922 if (Args.hasArg(options::OPT_shared_libgcc)) {
7923 CmdArgs.push_back("-lgcc_pic");
7924 if (!Args.hasArg(options::OPT_shared))
7925 CmdArgs.push_back("-lgcc");
7926 } else {
7927 CmdArgs.push_back("-lgcc");
7928 CmdArgs.push_back("--as-needed");
7929 CmdArgs.push_back("-lgcc_pic");
7930 CmdArgs.push_back("--no-as-needed");
7931 }
7932 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007933 } else {
John McCall65b8da02013-04-11 22:55:55 +00007934 if (Args.hasArg(options::OPT_shared)) {
7935 CmdArgs.push_back("-lgcc_pic");
7936 } else {
7937 CmdArgs.push_back("-lgcc");
7938 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007939 }
7940 }
7941
7942 if (!Args.hasArg(options::OPT_nostdlib) &&
7943 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007944 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007945 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007946 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007947 else
7948 CmdArgs.push_back(Args.MakeArgString(
7949 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007950 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007951 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007952 }
7953
Alexey Samsonov7811d192014-02-20 13:57:37 +00007954 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007955
Logan Chieneb9162f2014-06-26 14:23:45 +00007956 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007957 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007958}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007959
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00007960// Try to find Exe from a Visual Studio distribution. This first tries to find
7961// an installed copy of Visual Studio and, failing that, looks in the PATH,
7962// making sure that whatever executable that's found is not a same-named exe
7963// from clang itself to prevent clang from falling back to itself.
7964static std::string FindVisualStudioExecutable(const ToolChain &TC,
7965 const char *Exe,
7966 const char *ClangProgramPath) {
7967 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
7968 std::string visualStudioBinDir;
7969 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
7970 visualStudioBinDir)) {
7971 SmallString<128> FilePath(visualStudioBinDir);
7972 llvm::sys::path::append(FilePath, Exe);
7973 if (llvm::sys::fs::can_execute(FilePath.c_str()))
7974 return FilePath.str();
7975 }
7976
7977 return Exe;
7978}
7979
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007980void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7981 const InputInfo &Output,
7982 const InputInfoList &Inputs,
7983 const ArgList &Args,
7984 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007985 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00007986 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007987
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00007988 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
7989 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007990 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7991 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007992
7993 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00007994 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007995 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007996
Zachary Turner10d75b22014-10-22 20:40:43 +00007997 if (!llvm::sys::Process::GetEnv("LIB")) {
7998 // If the VC environment hasn't been configured (perhaps because the user
7999 // did not run vcvarsall), try to build a consistent link environment. If
8000 // the environment variable is set however, assume the user knows what he's
8001 // doing.
8002 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008003 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008004 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8005 SmallString<128> LibDir(VisualStudioDir);
8006 llvm::sys::path::append(LibDir, "VC", "lib");
8007 switch (MSVC.getArch()) {
8008 case llvm::Triple::x86:
8009 // x86 just puts the libraries directly in lib
8010 break;
8011 case llvm::Triple::x86_64:
8012 llvm::sys::path::append(LibDir, "amd64");
8013 break;
8014 case llvm::Triple::arm:
8015 llvm::sys::path::append(LibDir, "arm");
8016 break;
8017 default:
8018 break;
8019 }
8020 CmdArgs.push_back(
8021 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8022 }
8023
8024 std::string WindowsSdkLibPath;
8025 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8026 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8027 WindowsSdkLibPath.c_str()));
8028 }
8029
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008030 CmdArgs.push_back("-nologo");
8031
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008032 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008033 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008034
Hans Wennborgf1a74252013-09-10 20:18:04 +00008035 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008036 if (DLL) {
8037 CmdArgs.push_back(Args.MakeArgString("-dll"));
8038
8039 SmallString<128> ImplibName(Output.getFilename());
8040 llvm::sys::path::replace_extension(ImplibName, "lib");
8041 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
8042 ImplibName.str()));
8043 }
8044
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008045 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008046 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008047 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008048 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008049 static const char *CompilerRTComponents[] = {
8050 "asan_dynamic",
8051 "asan_dynamic_runtime_thunk",
8052 };
8053 for (const auto &Component : CompilerRTComponents)
8054 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008055 // Make sure the dynamic runtime thunk is not optimized out at link time
8056 // to ensure proper SEH handling.
8057 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008058 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008059 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008060 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008061 static const char *CompilerRTComponents[] = {
8062 "asan",
8063 "asan_cxx",
8064 };
8065 for (const auto &Component : CompilerRTComponents)
8066 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008067 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008068 }
8069
Hans Wennborg2e274592013-08-13 23:38:57 +00008070 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008071
Reid Kleckner337188f2014-09-16 19:22:00 +00008072 // Add filenames, libraries, and other linker inputs.
8073 for (const auto &Input : Inputs) {
8074 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008075 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008076 continue;
8077 }
8078
8079 const Arg &A = Input.getInputArg();
8080
8081 // Render -l options differently for the MSVC linker.
8082 if (A.getOption().matches(options::OPT_l)) {
8083 StringRef Lib = A.getValue();
8084 const char *LinkLibArg;
8085 if (Lib.endswith(".lib"))
8086 LinkLibArg = Args.MakeArgString(Lib);
8087 else
8088 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8089 CmdArgs.push_back(LinkLibArg);
8090 continue;
8091 }
8092
8093 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8094 // or -L. Render it, even if MSVC doesn't understand it.
8095 A.renderAsInput(Args, CmdArgs);
8096 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008097
Zachary Turner719f58c2014-12-01 23:06:47 +00008098 // We need to special case some linker paths. In the case of lld, we need to
8099 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8100 // linker, we need to use a special search algorithm.
8101 llvm::SmallString<128> linkPath;
8102 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8103 if (Linker.equals_lower("lld"))
8104 Linker = "lld-link";
8105
8106 if (Linker.equals_lower("link")) {
8107 // If we're using the MSVC linker, it's not sufficient to just use link
8108 // from the program PATH, because other environments like GnuWin32 install
8109 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008110 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008111 C.getDriver().getClangProgramPath());
8112 } else {
8113 linkPath = Linker;
8114 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008115 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008116 }
8117
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008118 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008119 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008120}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008121
8122void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8123 const InputInfo &Output,
8124 const InputInfoList &Inputs,
8125 const ArgList &Args,
8126 const char *LinkingOutput) const {
8127 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8128}
8129
David Blaikiec11bf802014-09-04 16:04:28 +00008130std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8131 Compilation &C, const JobAction &JA, const InputInfo &Output,
8132 const InputInfoList &Inputs, const ArgList &Args,
8133 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008134 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008135 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008136 CmdArgs.push_back("/c"); // Compile only.
8137 CmdArgs.push_back("/W0"); // No warnings.
8138
8139 // The goal is to be able to invoke this tool correctly based on
8140 // any flag accepted by clang-cl.
8141
8142 // These are spelled the same way in clang and cl.exe,.
8143 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8144 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008145
8146 // Optimization level.
8147 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8148 if (A->getOption().getID() == options::OPT_O0) {
8149 CmdArgs.push_back("/Od");
8150 } else {
8151 StringRef OptLevel = A->getValue();
8152 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8153 A->render(Args, CmdArgs);
8154 else if (OptLevel == "3")
8155 CmdArgs.push_back("/Ox");
8156 }
8157 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008158
8159 // Flags for which clang-cl have an alias.
8160 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8161
David Majnemerf6072342014-07-01 22:24:56 +00008162 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8163 /*default=*/false))
8164 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008165 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8166 options::OPT_fno_function_sections))
8167 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8168 ? "/Gy"
8169 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008170 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8171 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008172 CmdArgs.push_back(
8173 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008174 if (Args.hasArg(options::OPT_fsyntax_only))
8175 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008176 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8177 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008178
Hans Wennborg260ff402013-09-27 17:54:18 +00008179 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008180 for (const auto &Include : Includes)
8181 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008182
Hans Wennborg87cfa712013-09-19 20:32:16 +00008183 // Flags that can simply be passed through.
8184 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8185 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008186 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008187
8188 // The order of these flags is relevant, so pick the last one.
8189 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8190 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8191 A->render(Args, CmdArgs);
8192
8193
8194 // Input filename.
8195 assert(Inputs.size() == 1);
8196 const InputInfo &II = Inputs[0];
8197 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8198 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8199 if (II.isFilename())
8200 CmdArgs.push_back(II.getFilename());
8201 else
8202 II.getInputArg().renderAsInput(Args, CmdArgs);
8203
8204 // Output filename.
8205 assert(Output.getType() == types::TY_Object);
8206 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8207 Output.getFilename());
8208 CmdArgs.push_back(Fo);
8209
Hans Wennborg188382e2013-09-20 18:16:35 +00008210 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008211 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8212 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008213 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8214 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008215}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008216
8217
8218/// XCore Tools
8219// We pass assemble and link construction to the xcc tool.
8220
8221void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8222 const InputInfo &Output,
8223 const InputInfoList &Inputs,
8224 const ArgList &Args,
8225 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008226 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008227 ArgStringList CmdArgs;
8228
8229 CmdArgs.push_back("-o");
8230 CmdArgs.push_back(Output.getFilename());
8231
8232 CmdArgs.push_back("-c");
8233
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008234 if (Args.hasArg(options::OPT_v))
8235 CmdArgs.push_back("-v");
8236
Robert Lytton894d25c2014-05-02 09:33:25 +00008237 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8238 if (!A->getOption().matches(options::OPT_g0))
8239 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008240
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008241 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8242 false))
8243 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008244
8245 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8246 options::OPT_Xassembler);
8247
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008248 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008249 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008250
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008251 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008252 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008253}
8254
8255void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8256 const InputInfo &Output,
8257 const InputInfoList &Inputs,
8258 const ArgList &Args,
8259 const char *LinkingOutput) const {
8260 ArgStringList CmdArgs;
8261
8262 if (Output.isFilename()) {
8263 CmdArgs.push_back("-o");
8264 CmdArgs.push_back(Output.getFilename());
8265 } else {
8266 assert(Output.isNothing() && "Invalid output.");
8267 }
8268
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008269 if (Args.hasArg(options::OPT_v))
8270 CmdArgs.push_back("-v");
8271
David Majnemer8de68642014-12-05 08:11:58 +00008272 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008273 CmdArgs.push_back("-fexceptions");
8274
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008275 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8276
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008277 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008279}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008280
8281void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8282 const InputInfo &Output,
8283 const InputInfoList &Inputs,
8284 const ArgList &Args,
8285 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008286 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008287 const auto &TC =
8288 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8289 ArgStringList CmdArgs;
8290 const char *Exec;
8291
8292 switch (TC.getArch()) {
8293 default: llvm_unreachable("unsupported architecture");
8294 case llvm::Triple::arm:
8295 case llvm::Triple::thumb:
8296 break;
8297 case llvm::Triple::x86:
8298 CmdArgs.push_back("--32");
8299 break;
8300 case llvm::Triple::x86_64:
8301 CmdArgs.push_back("--64");
8302 break;
8303 }
8304
8305 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8306
8307 CmdArgs.push_back("-o");
8308 CmdArgs.push_back(Output.getFilename());
8309
8310 for (const auto &Input : Inputs)
8311 CmdArgs.push_back(Input.getFilename());
8312
8313 const std::string Assembler = TC.GetProgramPath("as");
8314 Exec = Args.MakeArgString(Assembler);
8315
8316 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8317}
8318
8319void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8320 const InputInfo &Output,
8321 const InputInfoList &Inputs,
8322 const ArgList &Args,
8323 const char *LinkingOutput) const {
8324 const auto &TC =
8325 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8326 const llvm::Triple &T = TC.getTriple();
8327 const Driver &D = TC.getDriver();
8328 SmallString<128> EntryPoint;
8329 ArgStringList CmdArgs;
8330 const char *Exec;
8331
8332 // Silence warning for "clang -g foo.o -o foo"
8333 Args.ClaimAllArgs(options::OPT_g_Group);
8334 // and "clang -emit-llvm foo.o -o foo"
8335 Args.ClaimAllArgs(options::OPT_emit_llvm);
8336 // and for "clang -w foo.o -o foo"
8337 Args.ClaimAllArgs(options::OPT_w);
8338 // Other warning options are already handled somewhere else.
8339
8340 if (!D.SysRoot.empty())
8341 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8342
8343 if (Args.hasArg(options::OPT_pie))
8344 CmdArgs.push_back("-pie");
8345 if (Args.hasArg(options::OPT_rdynamic))
8346 CmdArgs.push_back("-export-dynamic");
8347 if (Args.hasArg(options::OPT_s))
8348 CmdArgs.push_back("--strip-all");
8349
8350 CmdArgs.push_back("-m");
8351 switch (TC.getArch()) {
8352 default: llvm_unreachable("unsupported architecture");
8353 case llvm::Triple::arm:
8354 case llvm::Triple::thumb:
8355 // FIXME: this is incorrect for WinCE
8356 CmdArgs.push_back("thumb2pe");
8357 break;
8358 case llvm::Triple::x86:
8359 CmdArgs.push_back("i386pe");
8360 EntryPoint.append("_");
8361 break;
8362 case llvm::Triple::x86_64:
8363 CmdArgs.push_back("i386pep");
8364 break;
8365 }
8366
8367 if (Args.hasArg(options::OPT_shared)) {
8368 switch (T.getArch()) {
8369 default: llvm_unreachable("unsupported architecture");
8370 case llvm::Triple::arm:
8371 case llvm::Triple::thumb:
8372 case llvm::Triple::x86_64:
8373 EntryPoint.append("_DllMainCRTStartup");
8374 break;
8375 case llvm::Triple::x86:
8376 EntryPoint.append("_DllMainCRTStartup@12");
8377 break;
8378 }
8379
8380 CmdArgs.push_back("-shared");
8381 CmdArgs.push_back("-Bdynamic");
8382
8383 CmdArgs.push_back("--enable-auto-image-base");
8384
8385 CmdArgs.push_back("--entry");
8386 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8387 } else {
8388 EntryPoint.append("mainCRTStartup");
8389
8390 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8391 : "-Bdynamic");
8392
8393 if (!Args.hasArg(options::OPT_nostdlib) &&
8394 !Args.hasArg(options::OPT_nostartfiles)) {
8395 CmdArgs.push_back("--entry");
8396 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8397 }
8398
8399 // FIXME: handle subsystem
8400 }
8401
8402 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008403 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008404
8405 CmdArgs.push_back("-o");
8406 CmdArgs.push_back(Output.getFilename());
8407
8408 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8409 SmallString<261> ImpLib(Output.getFilename());
8410 llvm::sys::path::replace_extension(ImpLib, ".lib");
8411
8412 CmdArgs.push_back("--out-implib");
8413 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8414 }
8415
8416 if (!Args.hasArg(options::OPT_nostdlib) &&
8417 !Args.hasArg(options::OPT_nostartfiles)) {
8418 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8419 const char *CRTBegin;
8420
8421 CRTBegin =
8422 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8423 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8424 }
8425
8426 Args.AddAllArgs(CmdArgs, options::OPT_L);
8427
8428 const auto &Paths = TC.getFilePaths();
8429 for (const auto &Path : Paths)
8430 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8431
8432 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8433
8434 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8435 !Args.hasArg(options::OPT_nodefaultlibs)) {
8436 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8437 !Args.hasArg(options::OPT_static);
8438 if (StaticCXX)
8439 CmdArgs.push_back("-Bstatic");
8440 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8441 if (StaticCXX)
8442 CmdArgs.push_back("-Bdynamic");
8443 }
8444
8445 if (!Args.hasArg(options::OPT_nostdlib)) {
8446 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8447 // TODO handle /MT[d] /MD[d]
8448 CmdArgs.push_back("-lmsvcrt");
8449 AddRunTimeLibs(TC, D, CmdArgs, Args);
8450 }
8451 }
8452
8453 const std::string Linker = TC.GetProgramPath("ld");
8454 Exec = Args.MakeArgString(Linker);
8455
8456 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8457}