blob: 7e30273110514c53616e4345c52aac85f6029fef [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") {
593 Features.push_back("+vfpv3");
594 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000595 } else if (FPU == "neon-vfpv4") {
596 Features.push_back("+neon");
597 Features.push_back("+vfpv4");
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.
Craig Topper92fc2df2014-05-17 16:56:41 +0000768 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000770 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000771 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000772 // The backend is hardwired to assume AAPCS for M-class processors, ensure
773 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000774 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000775 (Triple.getOS() == llvm::Triple::UnknownOS &&
776 Triple.getObjectFormat() == llvm::Triple::MachO) ||
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:
798 if (Triple.getOS() == llvm::Triple::NetBSD)
799 ABIName = "apcs-gnu";
800 else
801 ABIName = "aapcs";
802 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 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000961}
962
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000963// Get CPU and ABI names. They are not independent
964// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000965void mips::getMipsCPUAndABI(const ArgList &Args,
966 const llvm::Triple &Triple,
967 StringRef &CPUName,
968 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000969 const char *DefMips32CPU = "mips32r2";
970 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000971
Daniel Sanders2bf13662014-07-10 14:40:57 +0000972 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
973 // default for mips64(el)?-img-linux-gnu.
974 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
975 Triple.getEnvironment() == llvm::Triple::GNU) {
976 DefMips32CPU = "mips32r6";
977 DefMips64CPU = "mips64r6";
978 }
979
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000980 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000981 options::OPT_mcpu_EQ))
982 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000983
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000984 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000985 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000986 // Convert a GNU style Mips ABI name to the name
987 // accepted by LLVM Mips backend.
988 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
989 .Case("32", "o32")
990 .Case("64", "n64")
991 .Default(ABIName);
992 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000993
994 // Setup default CPU and ABI names.
995 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000996 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000997 default:
998 llvm_unreachable("Unexpected triple arch name");
999 case llvm::Triple::mips:
1000 case llvm::Triple::mipsel:
1001 CPUName = DefMips32CPU;
1002 break;
1003 case llvm::Triple::mips64:
1004 case llvm::Triple::mips64el:
1005 CPUName = DefMips64CPU;
1006 break;
1007 }
1008 }
1009
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001010 if (ABIName.empty()) {
1011 // Deduce ABI name from the target triple.
1012 if (Triple.getArch() == llvm::Triple::mips ||
1013 Triple.getArch() == llvm::Triple::mipsel)
1014 ABIName = "o32";
1015 else
1016 ABIName = "n64";
1017 }
1018
1019 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001020 // Deduce CPU name from ABI name.
1021 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001022 .Cases("o32", "eabi", DefMips32CPU)
1023 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001024 .Default("");
1025 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001026
1027 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001028}
1029
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001030// Convert ABI name to the GNU tools acceptable variant.
1031static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1032 return llvm::StringSwitch<llvm::StringRef>(ABI)
1033 .Case("o32", "32")
1034 .Case("n64", "64")
1035 .Default(ABI);
1036}
1037
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001038// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1039// and -mfloat-abi=.
1040static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001041 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001042 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001043 options::OPT_mhard_float,
1044 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001045 if (A->getOption().matches(options::OPT_msoft_float))
1046 FloatABI = "soft";
1047 else if (A->getOption().matches(options::OPT_mhard_float))
1048 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001049 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001050 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001051 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001052 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001053 FloatABI = "hard";
1054 }
1055 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001056 }
1057
1058 // If unspecified, choose the default based on the platform.
1059 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001060 // Assume "hard", because it's a default value used by gcc.
1061 // When we start to recognize specific target MIPS processors,
1062 // we will be able to select the default more correctly.
1063 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001064 }
1065
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001066 return FloatABI;
1067}
1068
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001069static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001070 std::vector<const char *> &Features,
1071 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001072 StringRef FeatureName) {
1073 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001074 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001075 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001076 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001077 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001078 }
1079}
1080
Daniel Sanders379d44b2014-07-16 11:52:23 +00001081static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1082 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001083 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001084 StringRef CPUName;
1085 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001086 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001087 ABIName = getGnuCompatibleMipsABIName(ABIName);
1088
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001089 // Always override the backend's default ABI.
Aaron Ballman9eef74232014-07-17 13:28:50 +00001090 std::string ABIFeature = llvm::StringSwitch<StringRef>(ABIName)
1091 .Case("32", "+o32")
1092 .Case("n32", "+n32")
1093 .Case("64", "+n64")
1094 .Case("eabi", "+eabi")
1095 .Default(("+" + ABIName).str());
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001096 Features.push_back("-o32");
1097 Features.push_back("-n64");
1098 Features.push_back(Args.MakeArgString(ABIFeature));
1099
Daniel Sandersfeb61302014-08-08 15:47:17 +00001100 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1101 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001102
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001103 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001104 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001105 // FIXME: Note, this is a hack. We need to pass the selected float
1106 // mode to the MipsTargetInfoBase to define appropriate macros there.
1107 // Now it is the only method.
1108 Features.push_back("+soft-float");
1109 }
1110
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001111 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001112 StringRef Val = StringRef(A->getValue());
1113 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001114 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001115 else if (Val == "legacy")
1116 Features.push_back("-nan2008");
1117 else
1118 D.Diag(diag::err_drv_unsupported_option_argument)
1119 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001120 }
1121
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001122 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1123 options::OPT_mdouble_float, "single-float");
1124 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1125 "mips16");
1126 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1127 options::OPT_mno_micromips, "micromips");
1128 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1129 "dsp");
1130 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1131 "dspr2");
1132 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1133 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001134
1135 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1136 // pass -mfpxx
1137 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1138 options::OPT_mfp64)) {
1139 if (A->getOption().matches(options::OPT_mfp32))
1140 Features.push_back(Args.MakeArgString("-fp64"));
1141 else if (A->getOption().matches(options::OPT_mfpxx)) {
1142 Features.push_back(Args.MakeArgString("+fpxx"));
1143 Features.push_back(Args.MakeArgString("+nooddspreg"));
1144 } else
1145 Features.push_back(Args.MakeArgString("+fp64"));
1146 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001147 Features.push_back(Args.MakeArgString("+fpxx"));
1148 Features.push_back(Args.MakeArgString("+nooddspreg"));
1149 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001150
Daniel Sanders28e5d392014-07-10 10:39:51 +00001151 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1152 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001153}
1154
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001155void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001156 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001157 const Driver &D = getToolChain().getDriver();
1158 StringRef CPUName;
1159 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001160 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001161 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001162
1163 CmdArgs.push_back("-target-abi");
1164 CmdArgs.push_back(ABIName.data());
1165
1166 StringRef FloatABI = getMipsFloatABI(D, Args);
1167
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001168 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001169 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001170 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001171 CmdArgs.push_back("-mfloat-abi");
1172 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001173 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001174 else {
1175 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001176 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001177 CmdArgs.push_back("-mfloat-abi");
1178 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001179 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001180
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001181 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1182 if (A->getOption().matches(options::OPT_mxgot)) {
1183 CmdArgs.push_back("-mllvm");
1184 CmdArgs.push_back("-mxgot");
1185 }
1186 }
1187
Simon Atanasyanc580b322013-05-11 06:33:44 +00001188 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1189 options::OPT_mno_ldc1_sdc1)) {
1190 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1191 CmdArgs.push_back("-mllvm");
1192 CmdArgs.push_back("-mno-ldc1-sdc1");
1193 }
1194 }
1195
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001196 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1197 options::OPT_mno_check_zero_division)) {
1198 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1199 CmdArgs.push_back("-mllvm");
1200 CmdArgs.push_back("-mno-check-zero-division");
1201 }
1202 }
1203
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001204 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001205 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001206 CmdArgs.push_back("-mllvm");
1207 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1208 A->claim();
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210}
1211
Hal Finkel8eb59282012-06-11 22:35:19 +00001212/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1213static std::string getPPCTargetCPU(const ArgList &Args) {
1214 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001215 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001216
1217 if (CPUName == "native") {
1218 std::string CPU = llvm::sys::getHostCPUName();
1219 if (!CPU.empty() && CPU != "generic")
1220 return CPU;
1221 else
1222 return "";
1223 }
1224
1225 return llvm::StringSwitch<const char *>(CPUName)
1226 .Case("common", "generic")
1227 .Case("440", "440")
1228 .Case("440fp", "440")
1229 .Case("450", "450")
1230 .Case("601", "601")
1231 .Case("602", "602")
1232 .Case("603", "603")
1233 .Case("603e", "603e")
1234 .Case("603ev", "603ev")
1235 .Case("604", "604")
1236 .Case("604e", "604e")
1237 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001238 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001239 .Case("G3", "g3")
1240 .Case("7400", "7400")
1241 .Case("G4", "g4")
1242 .Case("7450", "7450")
1243 .Case("G4+", "g4+")
1244 .Case("750", "750")
1245 .Case("970", "970")
1246 .Case("G5", "g5")
1247 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001248 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001249 .Case("e500mc", "e500mc")
1250 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001251 .Case("power3", "pwr3")
1252 .Case("power4", "pwr4")
1253 .Case("power5", "pwr5")
1254 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001255 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001256 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001257 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001258 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001259 .Case("pwr3", "pwr3")
1260 .Case("pwr4", "pwr4")
1261 .Case("pwr5", "pwr5")
1262 .Case("pwr5x", "pwr5x")
1263 .Case("pwr6", "pwr6")
1264 .Case("pwr6x", "pwr6x")
1265 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001266 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001267 .Case("powerpc", "ppc")
1268 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001269 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001270 .Default("");
1271 }
1272
1273 return "";
1274}
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276static void getPPCTargetFeatures(const ArgList &Args,
1277 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001278 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1279 ie = Args.filtered_end();
1280 it != ie; ++it) {
1281 StringRef Name = (*it)->getOption().getName();
1282 (*it)->claim();
1283
1284 // Skip over "-m".
1285 assert(Name.startswith("m") && "Invalid feature name.");
1286 Name = Name.substr(1);
1287
1288 bool IsNegative = Name.startswith("no-");
1289 if (IsNegative)
1290 Name = Name.substr(3);
1291
1292 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1293 // pass the correct option to the backend while calling the frontend
1294 // option the same.
1295 // TODO: Change the LLVM backend option maybe?
1296 if (Name == "mfcrf")
1297 Name = "mfocrf";
1298
1299 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1300 }
1301
1302 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 AddTargetFeature(Args, Features, options::OPT_faltivec,
1304 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001305}
1306
Ulrich Weigand8afad612014-07-28 13:17:52 +00001307void Clang::AddPPCTargetArgs(const ArgList &Args,
1308 ArgStringList &CmdArgs) const {
1309 // Select the ABI to use.
1310 const char *ABIName = nullptr;
1311 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1312 ABIName = A->getValue();
1313 } else if (getToolChain().getTriple().isOSLinux())
1314 switch(getToolChain().getArch()) {
1315 case llvm::Triple::ppc64:
1316 ABIName = "elfv1";
1317 break;
1318 case llvm::Triple::ppc64le:
1319 ABIName = "elfv2";
1320 break;
1321 default:
1322 break;
1323 }
1324
1325 if (ABIName) {
1326 CmdArgs.push_back("-target-abi");
1327 CmdArgs.push_back(ABIName);
1328 }
1329}
1330
1331bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1332 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1333 return A && (A->getValue() == StringRef(Value));
1334}
1335
Tom Stellard6674c702013-04-01 20:56:53 +00001336/// Get the (LLVM) name of the R600 gpu we are targeting.
1337static std::string getR600TargetGPU(const ArgList &Args) {
1338 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001339 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001340 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001341 .Cases("rv630", "rv635", "r600")
1342 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001343 .Case("rv740", "rv770")
1344 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001345 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001346 .Case("hemlock", "cypress")
1347 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001348 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001349 }
1350 return "";
1351}
1352
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001353static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001354 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001355 bool SoftFloatABI = true;
1356 if (Arg *A =
1357 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1358 if (A->getOption().matches(options::OPT_mhard_float))
1359 SoftFloatABI = false;
1360 }
1361 if (SoftFloatABI)
1362 Features.push_back("+soft-float");
1363}
1364
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001365void Clang::AddSparcTargetArgs(const ArgList &Args,
1366 ArgStringList &CmdArgs) const {
1367 const Driver &D = getToolChain().getDriver();
1368
Brad Smith10cd0f42014-07-11 20:12:08 +00001369 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001370 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001371 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1372 options::OPT_mhard_float)) {
1373 if (A->getOption().matches(options::OPT_msoft_float))
1374 FloatABI = "soft";
1375 else if (A->getOption().matches(options::OPT_mhard_float))
1376 FloatABI = "hard";
1377 }
1378
1379 // If unspecified, choose the default based on the platform.
1380 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001381 // Assume "soft", but warn the user we are guessing.
1382 FloatABI = "soft";
1383 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001384 }
1385
1386 if (FloatABI == "soft") {
1387 // Floating point operations and argument passing are soft.
1388 //
1389 // FIXME: This changes CPP defines, we need -target-soft-float.
1390 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001391 } else {
1392 assert(FloatABI == "hard" && "Invalid float abi!");
1393 CmdArgs.push_back("-mhard-float");
1394 }
1395}
1396
Richard Sandiford4652d892013-07-19 16:51:51 +00001397static const char *getSystemZTargetCPU(const ArgList &Args) {
1398 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1399 return A->getValue();
1400 return "z10";
1401}
1402
Chandler Carruth953fb082013-01-13 11:46:33 +00001403static const char *getX86TargetCPU(const ArgList &Args,
1404 const llvm::Triple &Triple) {
1405 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001406 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001407 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001408 return "core-avx2";
1409
Chandler Carruth953fb082013-01-13 11:46:33 +00001410 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001411 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001412
1413 // FIXME: Reject attempts to use -march=native unless the target matches
1414 // the host.
1415 //
1416 // FIXME: We should also incorporate the detected target features for use
1417 // with -native.
1418 std::string CPU = llvm::sys::getHostCPUName();
1419 if (!CPU.empty() && CPU != "generic")
1420 return Args.MakeArgString(CPU);
1421 }
1422
1423 // Select the default CPU if none was given (or detection failed).
1424
1425 if (Triple.getArch() != llvm::Triple::x86_64 &&
1426 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001427 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001428
1429 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1430
1431 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001432 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001433 if (Triple.getArchName() == "x86_64h")
1434 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001435 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001436 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001437
Alexey Bataev286d1b92014-01-31 04:07:13 +00001438 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001439 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001440 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001441
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001442 // Everything else goes to x86-64 in 64-bit mode.
1443 if (Is64Bit)
1444 return "x86-64";
1445
1446 switch (Triple.getOS()) {
1447 case llvm::Triple::FreeBSD:
1448 case llvm::Triple::NetBSD:
1449 case llvm::Triple::OpenBSD:
1450 return "i486";
1451 case llvm::Triple::Haiku:
1452 return "i586";
1453 case llvm::Triple::Bitrig:
1454 return "i686";
1455 default:
1456 // Fallback to p4.
1457 return "pentium4";
1458 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001459}
1460
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001461static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1462 switch(T.getArch()) {
1463 default:
1464 return "";
1465
Amara Emerson703da2e2013-10-31 09:32:33 +00001466 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001467 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001468 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001469
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001470 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001471 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001472 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001473 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001474 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001475
1476 case llvm::Triple::mips:
1477 case llvm::Triple::mipsel:
1478 case llvm::Triple::mips64:
1479 case llvm::Triple::mips64el: {
1480 StringRef CPUName;
1481 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001482 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001483 return CPUName;
1484 }
1485
1486 case llvm::Triple::ppc:
1487 case llvm::Triple::ppc64:
1488 case llvm::Triple::ppc64le: {
1489 std::string TargetCPUName = getPPCTargetCPU(Args);
1490 // LLVM may default to generating code for the native CPU,
1491 // but, like gcc, we default to a more generic option for
1492 // each architecture. (except on Darwin)
1493 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1494 if (T.getArch() == llvm::Triple::ppc64)
1495 TargetCPUName = "ppc64";
1496 else if (T.getArch() == llvm::Triple::ppc64le)
1497 TargetCPUName = "ppc64le";
1498 else
1499 TargetCPUName = "ppc";
1500 }
1501 return TargetCPUName;
1502 }
1503
1504 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001505 case llvm::Triple::sparcv9:
1506 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001507 return A->getValue();
1508 return "";
1509
1510 case llvm::Triple::x86:
1511 case llvm::Triple::x86_64:
1512 return getX86TargetCPU(Args, T);
1513
1514 case llvm::Triple::hexagon:
1515 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1516
1517 case llvm::Triple::systemz:
1518 return getSystemZTargetCPU(Args);
1519
1520 case llvm::Triple::r600:
1521 return getR600TargetGPU(Args);
1522 }
1523}
1524
Alp Tokerce365ca2013-12-02 12:43:03 +00001525static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1526 ArgStringList &CmdArgs) {
1527 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1528 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1529 // forward.
1530 CmdArgs.push_back("-plugin");
1531 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1532 CmdArgs.push_back(Args.MakeArgString(Plugin));
1533
1534 // Try to pass driver level flags relevant to LTO code generation down to
1535 // the plugin.
1536
1537 // Handle flags for selecting CPU variants.
1538 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1539 if (!CPU.empty())
1540 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1541}
1542
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001543static void getX86TargetFeatures(const Driver & D,
1544 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001545 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001546 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001547 if (Triple.getArchName() == "x86_64h") {
1548 // x86_64h implies quite a few of the more modern subtarget features
1549 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1550 Features.push_back("-rdrnd");
1551 Features.push_back("-aes");
1552 Features.push_back("-pclmul");
1553 Features.push_back("-rtm");
1554 Features.push_back("-hle");
1555 Features.push_back("-fsgsbase");
1556 }
1557
Alexey Volkov54ff0802014-06-25 12:15:36 +00001558 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001559 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001560 if (Triple.getArch() == llvm::Triple::x86_64) {
1561 Features.push_back("+sse4.2");
1562 Features.push_back("+popcnt");
1563 } else
1564 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001565 }
1566
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001567 // Set features according to the -arch flag on MSVC
1568 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1569 StringRef Arch = A->getValue();
1570 bool ArchUsed = false;
1571 // First, look for flags that are shared in x86 and x86-64.
1572 if (Triple.getArch() == llvm::Triple::x86_64 ||
1573 Triple.getArch() == llvm::Triple::x86) {
1574 if (Arch == "AVX" || Arch == "AVX2") {
1575 ArchUsed = true;
1576 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1577 }
1578 }
1579 // Then, look for x86-specific flags.
1580 if (Triple.getArch() == llvm::Triple::x86) {
1581 if (Arch == "IA32") {
1582 ArchUsed = true;
1583 } else if (Arch == "SSE" || Arch == "SSE2") {
1584 ArchUsed = true;
1585 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1586 }
1587 }
1588 if (!ArchUsed)
1589 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1590 }
1591
Jim Grosbach82eee262013-11-16 00:53:35 +00001592 // Now add any that the user explicitly requested on the command line,
1593 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001594 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1595 ie = Args.filtered_end();
1596 it != ie; ++it) {
1597 StringRef Name = (*it)->getOption().getName();
1598 (*it)->claim();
1599
1600 // Skip over "-m".
1601 assert(Name.startswith("m") && "Invalid feature name.");
1602 Name = Name.substr(1);
1603
1604 bool IsNegative = Name.startswith("no-");
1605 if (IsNegative)
1606 Name = Name.substr(3);
1607
1608 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1609 }
1610}
1611
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001612void Clang::AddX86TargetArgs(const ArgList &Args,
1613 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001614 if (!Args.hasFlag(options::OPT_mred_zone,
1615 options::OPT_mno_red_zone,
1616 true) ||
1617 Args.hasArg(options::OPT_mkernel) ||
1618 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001619 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001620
Bob Wilson2616e2e2013-02-10 16:01:41 +00001621 // Default to avoid implicit floating-point for kernel/kext code, but allow
1622 // that to be overridden with -mno-soft-float.
1623 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1624 Args.hasArg(options::OPT_fapple_kext));
1625 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1626 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001627 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001628 options::OPT_mno_implicit_float)) {
1629 const Option &O = A->getOption();
1630 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1631 O.matches(options::OPT_msoft_float));
1632 }
1633 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001634 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001635
1636 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1637 StringRef Value = A->getValue();
1638 if (Value == "intel" || Value == "att") {
1639 CmdArgs.push_back("-mllvm");
1640 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1641 } else {
1642 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1643 << A->getOption().getName() << Value;
1644 }
1645 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001646}
1647
Matthew Curtise8f80a12012-12-06 17:49:03 +00001648static inline bool HasPICArg(const ArgList &Args) {
1649 return Args.hasArg(options::OPT_fPIC)
1650 || Args.hasArg(options::OPT_fpic);
1651}
1652
1653static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1654 return Args.getLastArg(options::OPT_G,
1655 options::OPT_G_EQ,
1656 options::OPT_msmall_data_threshold_EQ);
1657}
1658
1659static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1660 std::string value;
1661 if (HasPICArg(Args))
1662 value = "0";
1663 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1664 value = A->getValue();
1665 A->claim();
1666 }
1667 return value;
1668}
1669
Tony Linthicum76329bf2011-12-12 21:14:55 +00001670void Clang::AddHexagonTargetArgs(const ArgList &Args,
1671 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001672 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001673 CmdArgs.push_back("-mqdsp6-compat");
1674 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001675
Matthew Curtise8f80a12012-12-06 17:49:03 +00001676 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1677 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001678 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001679 CmdArgs.push_back(Args.MakeArgString(
1680 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001681 }
1682
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001683 if (!Args.hasArg(options::OPT_fno_short_enums))
1684 CmdArgs.push_back("-fshort-enums");
1685 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1686 CmdArgs.push_back ("-mllvm");
1687 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1688 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001689 CmdArgs.push_back ("-mllvm");
1690 CmdArgs.push_back ("-machine-sink-split=0");
1691}
1692
Kevin Qin110db6f2014-07-18 07:03:22 +00001693// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001694static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001695 std::vector<const char *> &Features) {
1696 SmallVector<StringRef, 8> Split;
1697 text.split(Split, StringRef("+"), -1, false);
1698
1699 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1700 const char *result = llvm::StringSwitch<const char *>(Split[I])
1701 .Case("fp", "+fp-armv8")
1702 .Case("simd", "+neon")
1703 .Case("crc", "+crc")
1704 .Case("crypto", "+crypto")
1705 .Case("nofp", "-fp-armv8")
1706 .Case("nosimd", "-neon")
1707 .Case("nocrc", "-crc")
1708 .Case("nocrypto", "-crypto")
1709 .Default(nullptr);
1710 if (result)
1711 Features.push_back(result);
1712 else if (Split[I] == "neon" || Split[I] == "noneon")
1713 D.Diag(diag::err_drv_no_neon_modifier);
1714 else
1715 return false;
1716 }
1717 return true;
1718}
1719
1720// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1721// decode CPU and feature.
1722static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1723 std::vector<const char *> &Features) {
1724 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1725 CPU = Split.first;
1726 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1727 Features.push_back("+neon");
1728 Features.push_back("+crc");
1729 Features.push_back("+crypto");
1730 } else if (CPU == "generic") {
1731 Features.push_back("+neon");
1732 } else {
1733 return false;
1734 }
1735
1736 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1737 return false;
1738
1739 return true;
1740}
1741
1742static bool
1743getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1744 const ArgList &Args,
1745 std::vector<const char *> &Features) {
1746 std::pair<StringRef, StringRef> Split = March.split("+");
1747 if (Split.first != "armv8-a")
1748 return false;
1749
1750 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1751 return false;
1752
1753 return true;
1754}
1755
1756static bool
1757getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1758 const ArgList &Args,
1759 std::vector<const char *> &Features) {
1760 StringRef CPU;
1761 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1762 return false;
1763
1764 return true;
1765}
1766
1767static bool
1768getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1769 const ArgList &Args,
1770 std::vector<const char *> &Features) {
1771 // Handle CPU name is 'native'.
1772 if (Mtune == "native")
1773 Mtune = llvm::sys::getHostCPUName();
1774 if (Mtune == "cyclone") {
1775 Features.push_back("+zcm");
1776 Features.push_back("+zcz");
1777 }
1778 return true;
1779}
1780
1781static bool
1782getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1783 const ArgList &Args,
1784 std::vector<const char *> &Features) {
1785 StringRef CPU;
1786 std::vector<const char *> DecodedFeature;
1787 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1788 return false;
1789
1790 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1791}
1792
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001793static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1794 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001795 Arg *A;
1796 bool success = true;
1797 // Enable NEON by default.
1798 Features.push_back("+neon");
1799 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1800 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1801 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1802 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001803 else if (Args.hasArg(options::OPT_arch))
1804 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1805 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001806
1807 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1808 success =
1809 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1810 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1811 success =
1812 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001813 else if (Args.hasArg(options::OPT_arch))
1814 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1815 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001816
1817 if (!success)
1818 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001819
1820 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1821 Features.push_back("-fp-armv8");
1822 Features.push_back("-crypto");
1823 Features.push_back("-neon");
1824 }
Bradley Smith418c5932014-05-02 15:17:51 +00001825
1826 // En/disable crc
1827 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1828 options::OPT_mnocrc)) {
1829 if (A->getOption().matches(options::OPT_mcrc))
1830 Features.push_back("+crc");
1831 else
1832 Features.push_back("-crc");
1833 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001834}
1835
1836static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001837 const ArgList &Args, ArgStringList &CmdArgs,
1838 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001839 std::vector<const char *> Features;
1840 switch (Triple.getArch()) {
1841 default:
1842 break;
1843 case llvm::Triple::mips:
1844 case llvm::Triple::mipsel:
1845 case llvm::Triple::mips64:
1846 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001847 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001848 break;
1849
1850 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001851 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001852 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001853 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001854 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001855 break;
1856
1857 case llvm::Triple::ppc:
1858 case llvm::Triple::ppc64:
1859 case llvm::Triple::ppc64le:
1860 getPPCTargetFeatures(Args, Features);
1861 break;
1862 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001863 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001864 getSparcTargetFeatures(Args, Features);
1865 break;
1866 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001867 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001868 getAArch64TargetFeatures(D, Args, Features);
1869 break;
1870 case llvm::Triple::x86:
1871 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001872 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001873 break;
1874 }
Rafael Espindola43964802013-08-21 17:34:32 +00001875
1876 // Find the last of each feature.
1877 llvm::StringMap<unsigned> LastOpt;
1878 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1879 const char *Name = Features[I];
1880 assert(Name[0] == '-' || Name[0] == '+');
1881 LastOpt[Name + 1] = I;
1882 }
1883
1884 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1885 // If this feature was overridden, ignore it.
1886 const char *Name = Features[I];
1887 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1888 assert(LastI != LastOpt.end());
1889 unsigned Last = LastI->second;
1890 if (Last != I)
1891 continue;
1892
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001893 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001894 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001895 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001896}
1897
Eric Christopher84fbdb42011-08-19 00:30:14 +00001898static bool
John McCall5fb5df92012-06-20 06:18:46 +00001899shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001900 const llvm::Triple &Triple) {
1901 // We use the zero-cost exception tables for Objective-C if the non-fragile
1902 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1903 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001904 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001905 return true;
1906
Bob Wilson83e723a2013-12-05 19:38:42 +00001907 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001908 return false;
1909
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001910 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001911 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001912 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001913}
1914
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001915namespace {
1916 struct ExceptionSettings {
1917 bool ExceptionsEnabled;
1918 bool ShouldUseExceptionTables;
1919 ExceptionSettings() : ExceptionsEnabled(false),
1920 ShouldUseExceptionTables(false) {}
1921 };
1922} // end anonymous namespace.
1923
Nico Webere8e53112014-05-11 01:04:02 +00001924// exceptionSettings() exists to share the logic between -cc1 and linker
1925// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001926static ExceptionSettings exceptionSettings(const ArgList &Args,
1927 const llvm::Triple &Triple) {
1928 ExceptionSettings ES;
1929
1930 // Are exceptions enabled by default?
1931 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1932
1933 // This keeps track of whether exceptions were explicitly turned on or off.
1934 bool DidHaveExplicitExceptionFlag = false;
1935
1936 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1937 options::OPT_fno_exceptions)) {
1938 if (A->getOption().matches(options::OPT_fexceptions))
1939 ES.ExceptionsEnabled = true;
1940 else
1941 ES.ExceptionsEnabled = false;
1942
1943 DidHaveExplicitExceptionFlag = true;
1944 }
1945
1946 // Exception tables and cleanups can be enabled with -fexceptions even if the
1947 // language itself doesn't support exceptions.
1948 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1949 ES.ShouldUseExceptionTables = true;
1950
1951 return ES;
1952}
1953
Anders Carlssone96ab552011-02-28 02:27:16 +00001954/// addExceptionArgs - Adds exception related arguments to the driver command
1955/// arguments. There's a master flag, -fexceptions and also language specific
1956/// flags to enable/disable C++ and Objective-C exceptions.
1957/// This makes it possible to for example disable C++ exceptions but enable
1958/// Objective-C exceptions.
1959static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1960 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001961 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001962 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001963 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001964 if (KernelOrKext) {
1965 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1966 // arguments now to avoid warnings about unused arguments.
1967 Args.ClaimAllArgs(options::OPT_fexceptions);
1968 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1969 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1970 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1971 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1972 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001973 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001974 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001975
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001976 // Gather the exception settings from the command line arguments.
1977 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001978
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001979 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1980 // is not necessarily sensible, but follows GCC.
1981 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001982 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001983 options::OPT_fno_objc_exceptions,
1984 true)) {
1985 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001986
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001987 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001988 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001989 }
1990
1991 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001992 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001993
Eric Christopher84fbdb42011-08-19 00:30:14 +00001994 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1995 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001996 options::OPT_fexceptions,
1997 options::OPT_fno_exceptions)) {
1998 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1999 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00002000 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00002001 CXXExceptionsEnabled = false;
2002 }
2003
2004 if (CXXExceptionsEnabled) {
2005 CmdArgs.push_back("-fcxx-exceptions");
2006
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002007 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002008 }
2009 }
2010
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002011 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00002012 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002013}
2014
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002015static bool ShouldDisableAutolink(const ArgList &Args,
2016 const ToolChain &TC) {
2017 bool Default = true;
2018 if (TC.getTriple().isOSDarwin()) {
2019 // The native darwin assembler doesn't support the linker_option directives,
2020 // so we disable them if we think the .s file will be passed to it.
2021 Default = TC.useIntegratedAs();
2022 }
2023 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2024 Default);
2025}
2026
Ted Kremenek62093662013-03-12 17:02:12 +00002027static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2028 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002029 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2030 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002031 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002032 return !UseDwarfDirectory;
2033}
2034
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002035/// \brief Check whether the given input tree contains any compilation actions.
2036static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002037 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002038 return true;
2039
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002040 for (const auto &Act : *A)
2041 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002042 return true;
2043
2044 return false;
2045}
2046
2047/// \brief Check if -relax-all should be passed to the internal assembler.
2048/// This is done by default when compiling non-assembler source with -O0.
2049static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2050 bool RelaxDefault = true;
2051
2052 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2053 RelaxDefault = A->getOption().matches(options::OPT_O0);
2054
2055 if (RelaxDefault) {
2056 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002057 for (const auto &Act : C.getActions()) {
2058 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002059 RelaxDefault = true;
2060 break;
2061 }
2062 }
2063 }
2064
2065 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2066 RelaxDefault);
2067}
2068
David Blaikie9260ed62013-07-25 21:19:01 +00002069static void CollectArgsForIntegratedAssembler(Compilation &C,
2070 const ArgList &Args,
2071 ArgStringList &CmdArgs,
2072 const Driver &D) {
2073 if (UseRelaxAll(C, Args))
2074 CmdArgs.push_back("-mrelax-all");
2075
David Peixottodfb66142013-11-14 22:52:58 +00002076 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002077 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002078 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2079 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2080 // arg after parsing the '-I' arg.
2081 bool TakeNextArg = false;
2082
David Blaikie9260ed62013-07-25 21:19:01 +00002083 // When using an integrated assembler, translate -Wa, and -Xassembler
2084 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002085 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002086 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2087 options::OPT_Xassembler),
2088 ie = Args.filtered_end(); it != ie; ++it) {
2089 const Arg *A = *it;
2090 A->claim();
2091
2092 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2093 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002094 if (TakeNextArg) {
2095 CmdArgs.push_back(Value.data());
2096 TakeNextArg = false;
2097 continue;
2098 }
David Blaikie9260ed62013-07-25 21:19:01 +00002099
2100 if (Value == "-force_cpusubtype_ALL") {
2101 // Do nothing, this is the default and we don't support anything else.
2102 } else if (Value == "-L") {
2103 CmdArgs.push_back("-msave-temp-labels");
2104 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002105 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002106 } else if (Value == "--noexecstack") {
2107 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002108 } else if (Value == "-compress-debug-sections" ||
2109 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002110 CompressDebugSections = true;
2111 } else if (Value == "-nocompress-debug-sections" ||
2112 Value == "--nocompress-debug-sections") {
2113 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002114 } else if (Value.startswith("-I")) {
2115 CmdArgs.push_back(Value.data());
2116 // We need to consume the next argument if the current arg is a plain
2117 // -I. The next arg will be the include directory.
2118 if (Value == "-I")
2119 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002120 } else if (Value.startswith("-gdwarf-")) {
2121 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002122 } else {
2123 D.Diag(diag::err_drv_unsupported_option_argument)
2124 << A->getOption().getName() << Value;
2125 }
2126 }
2127 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002128 if (CompressDebugSections) {
2129 if (llvm::zlib::isAvailable())
2130 CmdArgs.push_back("-compress-debug-sections");
2131 else
2132 D.Diag(diag::warn_debug_compression_unavailable);
2133 }
David Blaikie9260ed62013-07-25 21:19:01 +00002134}
2135
Renato Goline807c122014-01-31 11:47:28 +00002136// Until ARM libraries are build separately, we have them all in one library
2137static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002138 if (TC.getArch() == llvm::Triple::arm ||
2139 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002140 return "arm";
2141 else
2142 return TC.getArchName();
2143}
2144
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002145static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2146 // The runtimes are located in the OS-specific resource directory.
2147 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002148 const llvm::Triple &Triple = TC.getTriple();
2149 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
2150 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
2151 "freebsd" : TC.getOS();
2152 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002153 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002154}
2155
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002156// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002157// FIXME: Make sure we can also emit shared objects if they're requested
2158// and available, check for possible errors, etc.
2159static void addClangRTLinux(
2160 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002161 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002162 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2163 getArchNameForCompilerRTLib(TC) +
2164 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00002165
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002166 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00002167 CmdArgs.push_back("-lgcc_s");
2168 if (TC.getDriver().CCCIsCXX())
2169 CmdArgs.push_back("-lgcc_eh");
2170}
2171
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002172static void addClangRTWindows(const ToolChain &TC, const ArgList &Args,
2173 ArgStringList &CmdArgs) {
2174 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
2175 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2176 getArchNameForCompilerRTLib(TC) + ".lib");
2177 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
2178}
2179
Alexey Samsonov7811d192014-02-20 13:57:37 +00002180static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00002181 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002182 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2183 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002184 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002185 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002186 Args.hasArg(options::OPT_fcreate_profile) ||
2187 Args.hasArg(options::OPT_coverage)))
2188 return;
2189
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002190 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
Alexey Samsonovcbbd2fd2014-11-14 00:16:26 +00002191 llvm::sys::path::append(LibProfile, Twine("libclang_rt.profile-") +
2192 getArchNameForCompilerRTLib(TC) +
2193 ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00002194
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00002195 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00002196}
2197
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002198static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
Craig Topperbf3e3272014-08-30 16:55:52 +00002199 StringRef Sanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002200 bool Shared) {
2201 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
2202 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
2203 const char *EnvSuffix =
2204 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002205 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
2206 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002207 Twine("libclang_rt.") + Sanitizer + "-" +
2208 getArchNameForCompilerRTLib(TC) + EnvSuffix +
2209 (Shared ? ".so" : ".a"));
2210 return LibSanitizer;
2211}
2212
Alexey Samsonov52550342014-09-15 19:58:40 +00002213static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2214 ArgStringList &CmdArgs, StringRef Sanitizer,
2215 bool IsShared) {
2216 SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, IsShared);
2217 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002218 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002219 if (!IsShared)
2220 CmdArgs.push_back("-whole-archive");
2221 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
2222 if (!IsShared)
2223 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002224}
2225
Alexey Samsonov52550342014-09-15 19:58:40 +00002226// Tries to use a file with the list of dynamic symbols that need to be exported
2227// from the runtime library. Returns true if the file was found.
2228static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2229 ArgStringList &CmdArgs,
2230 StringRef Sanitizer) {
2231 SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, false);
2232 if (llvm::sys::fs::exists(LibSanitizer + ".syms")) {
2233 CmdArgs.push_back(
2234 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2235 return true;
2236 }
2237 return false;
2238}
2239
2240static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2241 ArgStringList &CmdArgs) {
2242 // Force linking against the system libraries sanitizers depends on
2243 // (see PR15823 why this is necessary).
2244 CmdArgs.push_back("--no-as-needed");
2245 CmdArgs.push_back("-lpthread");
2246 CmdArgs.push_back("-lrt");
2247 CmdArgs.push_back("-lm");
2248 // There's no libdl on FreeBSD.
2249 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2250 CmdArgs.push_back("-ldl");
2251}
2252
2253static void
2254collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2255 SmallVectorImpl<StringRef> &SharedRuntimes,
2256 SmallVectorImpl<StringRef> &StaticRuntimes,
2257 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2258 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2259 // Collect shared runtimes.
2260 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2261 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002262 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002263
Alexey Samsonov52550342014-09-15 19:58:40 +00002264 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002265 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002266 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2267 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002268 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002269 }
2270 if (SanArgs.needsAsanRt()) {
2271 if (SanArgs.needsSharedAsanRt()) {
2272 HelperStaticRuntimes.push_back("asan-preinit");
2273 } else {
2274 StaticRuntimes.push_back("asan");
2275 if (SanArgs.linkCXXRuntimes())
2276 StaticRuntimes.push_back("asan_cxx");
2277 }
2278 }
2279 if (SanArgs.needsDfsanRt())
2280 StaticRuntimes.push_back("dfsan");
2281 if (SanArgs.needsLsanRt())
2282 StaticRuntimes.push_back("lsan");
2283 if (SanArgs.needsMsanRt())
2284 StaticRuntimes.push_back("msan");
2285 if (SanArgs.needsTsanRt())
2286 StaticRuntimes.push_back("tsan");
2287 // WARNING: UBSan should always go last.
2288 if (SanArgs.needsUbsanRt()) {
2289 // If UBSan is not combined with another sanitizer, we need to pull in
2290 // sanitizer_common explicitly.
2291 if (StaticRuntimes.empty())
2292 HelperStaticRuntimes.push_back("san");
2293 StaticRuntimes.push_back("ubsan");
2294 if (SanArgs.linkCXXRuntimes())
2295 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002296 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002297}
2298
Alexey Samsonov52550342014-09-15 19:58:40 +00002299// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2300// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2301static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002302 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002303 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2304 HelperStaticRuntimes;
2305 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2306 HelperStaticRuntimes);
2307 for (auto RT : SharedRuntimes)
2308 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2309 for (auto RT : HelperStaticRuntimes)
2310 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2311 bool AddExportDynamic = false;
2312 for (auto RT : StaticRuntimes) {
2313 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2314 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2315 }
2316 // If there is a static runtime with no dynamic list, force all the symbols
2317 // to be dynamic to be sure we export sanitizer interface functions.
2318 if (AddExportDynamic)
2319 CmdArgs.push_back("-export-dynamic");
2320 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002321}
2322
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002323static bool shouldUseFramePointerForTarget(const ArgList &Args,
2324 const llvm::Triple &Triple) {
2325 switch (Triple.getArch()) {
2326 // Don't use a frame pointer on linux if optimizing for certain targets.
2327 case llvm::Triple::mips64:
2328 case llvm::Triple::mips64el:
2329 case llvm::Triple::mips:
2330 case llvm::Triple::mipsel:
2331 case llvm::Triple::systemz:
2332 case llvm::Triple::x86:
2333 case llvm::Triple::x86_64:
2334 if (Triple.isOSLinux())
2335 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2336 if (!A->getOption().matches(options::OPT_O0))
2337 return false;
2338 return true;
2339 case llvm::Triple::xcore:
2340 return false;
2341 default:
2342 return true;
2343 }
2344}
2345
Rafael Espindola224dd632011-12-14 21:02:23 +00002346static bool shouldUseFramePointer(const ArgList &Args,
2347 const llvm::Triple &Triple) {
2348 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2349 options::OPT_fomit_frame_pointer))
2350 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2351
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002352 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002353}
2354
Eric Christopherb7d97e92013-04-03 01:58:53 +00002355static bool shouldUseLeafFramePointer(const ArgList &Args,
2356 const llvm::Triple &Triple) {
2357 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2358 options::OPT_momit_leaf_frame_pointer))
2359 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2360
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002361 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002362}
2363
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002364/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002365static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002366 SmallString<128> cwd;
2367 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002368 CmdArgs.push_back("-fdebug-compilation-dir");
2369 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002370 }
2371}
2372
Eric Christopherd3804002013-02-22 20:12:52 +00002373static const char *SplitDebugName(const ArgList &Args,
2374 const InputInfoList &Inputs) {
2375 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2376 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2377 SmallString<128> T(FinalOutput->getValue());
2378 llvm::sys::path::replace_extension(T, "dwo");
2379 return Args.MakeArgString(T);
2380 } else {
2381 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002382 SmallString<128> T(
2383 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002384 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2385 llvm::sys::path::replace_extension(F, "dwo");
2386 T += F;
2387 return Args.MakeArgString(F);
2388 }
2389}
2390
2391static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2392 const Tool &T, const JobAction &JA,
2393 const ArgList &Args, const InputInfo &Output,
2394 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002395 ArgStringList ExtractArgs;
2396 ExtractArgs.push_back("--extract-dwo");
2397
2398 ArgStringList StripArgs;
2399 StripArgs.push_back("--strip-dwo");
2400
2401 // Grabbing the output of the earlier compile step.
2402 StripArgs.push_back(Output.getFilename());
2403 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002404 ExtractArgs.push_back(OutFile);
2405
2406 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002407 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002408
2409 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002410 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002411
2412 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002413 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002414}
2415
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002416/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002417/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2418static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002419 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002420 if (A->getOption().matches(options::OPT_O4) ||
2421 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002422 return true;
2423
2424 if (A->getOption().matches(options::OPT_O0))
2425 return false;
2426
2427 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2428
Rafael Espindola91780de2013-08-26 14:05:41 +00002429 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002430 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002431 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002432 return true;
2433
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002434 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002435 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002436 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002437
2438 unsigned OptLevel = 0;
2439 if (S.getAsInteger(10, OptLevel))
2440 return false;
2441
2442 return OptLevel > 1;
2443 }
2444
2445 return false;
2446}
2447
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002448/// Add -x lang to \p CmdArgs for \p Input.
2449static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2450 ArgStringList &CmdArgs) {
2451 // When using -verify-pch, we don't want to provide the type
2452 // 'precompiled-header' if it was inferred from the file extension
2453 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2454 return;
2455
2456 CmdArgs.push_back("-x");
2457 if (Args.hasArg(options::OPT_rewrite_objc))
2458 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2459 else
2460 CmdArgs.push_back(types::getTypeName(Input.getType()));
2461}
2462
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002463static std::string getMSCompatibilityVersion(const char *VersionStr) {
2464 unsigned Version;
2465 if (StringRef(VersionStr).getAsInteger(10, Version))
2466 return "0";
2467
2468 if (Version < 100)
2469 return llvm::utostr_32(Version) + ".0";
2470
2471 if (Version < 10000)
2472 return llvm::utostr_32(Version / 100) + "." +
2473 llvm::utostr_32(Version % 100);
2474
2475 unsigned Build = 0, Factor = 1;
2476 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2477 Build = Build + (Version % 10) * Factor;
2478 return llvm::utostr_32(Version / 100) + "." +
2479 llvm::utostr_32(Version % 100) + "." +
2480 llvm::utostr_32(Build);
2481}
2482
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002483void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002484 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002485 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002486 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002487 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002488 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2489 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002490 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002491 ArgStringList CmdArgs;
2492
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002493 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002494 bool IsWindowsCygnus =
2495 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002496 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2497
Daniel Dunbare521a892009-03-31 20:53:55 +00002498 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2499
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002500 // Invoke ourselves in -cc1 mode.
2501 //
2502 // FIXME: Implement custom jobs for internal actions.
2503 CmdArgs.push_back("-cc1");
2504
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002505 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002506 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002507 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002508 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002509
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002510 const llvm::Triple TT(TripleStr);
2511 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2512 TT.getArch() == llvm::Triple::thumb)) {
2513 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2514 unsigned Version;
2515 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2516 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002517 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2518 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002519 }
2520
Tim Northover336f1892014-03-29 13:16:12 +00002521 // Push all default warning arguments that are specific to
2522 // the given target. These come before user provided warning options
2523 // are provided.
2524 getToolChain().addClangWarningOptions(CmdArgs);
2525
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002526 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002527 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002528
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002529 if (isa<AnalyzeJobAction>(JA)) {
2530 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2531 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002532 } else if (isa<MigrateJobAction>(JA)) {
2533 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002534 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002535 if (Output.getType() == types::TY_Dependencies)
2536 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002537 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002538 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002539 if (Args.hasArg(options::OPT_rewrite_objc) &&
2540 !Args.hasArg(options::OPT_g_Group))
2541 CmdArgs.push_back("-P");
2542 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002543 } else if (isa<AssembleJobAction>(JA)) {
2544 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002545
David Blaikie9260ed62013-07-25 21:19:01 +00002546 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002547
2548 // Also ignore explicit -force_cpusubtype_ALL option.
2549 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002550 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002551 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002552 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002553
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002554 if (JA.getType() == types::TY_Nothing)
2555 CmdArgs.push_back("-fsyntax-only");
2556 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002557 CmdArgs.push_back("-emit-pch");
2558 else
2559 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002560 } else if (isa<VerifyPCHJobAction>(JA)) {
2561 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002562 } else {
2563 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002564
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002565 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002566 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002567 } else if (JA.getType() == types::TY_LLVM_IR ||
2568 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002569 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002570 } else if (JA.getType() == types::TY_LLVM_BC ||
2571 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002572 CmdArgs.push_back("-emit-llvm-bc");
2573 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002574 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002575 } else if (JA.getType() == types::TY_AST) {
2576 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002577 } else if (JA.getType() == types::TY_ModuleFile) {
2578 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002579 } else if (JA.getType() == types::TY_RewrittenObjC) {
2580 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002581 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002582 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2583 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002584 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002585 } else {
2586 assert(JA.getType() == types::TY_PP_Asm &&
2587 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002588 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002589 }
2590
Justin Bognera88f0122014-06-20 22:59:50 +00002591 // We normally speed up the clang process a bit by skipping destructors at
2592 // exit, but when we're generating diagnostics we can rely on some of the
2593 // cleanup.
2594 if (!C.isForDiagnostics())
2595 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002596
John McCallbb79b5f2010-02-13 03:50:24 +00002597 // Disable the verification pass in -asserts builds.
2598#ifdef NDEBUG
2599 CmdArgs.push_back("-disable-llvm-verifier");
2600#endif
2601
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002602 // Set the main file name, so that debug info works even with
2603 // -save-temps.
2604 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002605 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002606
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002607 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002608 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002609 if (Args.hasArg(options::OPT_static))
2610 CmdArgs.push_back("-static-define");
2611
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002612 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002613 // Enable region store model by default.
2614 CmdArgs.push_back("-analyzer-store=region");
2615
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002616 // Treat blocks as analysis entry points.
2617 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2618
Ted Kremenek49c79792011-03-24 00:28:47 +00002619 CmdArgs.push_back("-analyzer-eagerly-assume");
2620
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002621 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002622 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002623 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002624
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002625 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002626 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002627
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002628 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002629 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002630
2631 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002632
Jordan Rose10ad0812013-04-05 17:55:07 +00002633 if (types::isCXX(Inputs[0].getType()))
2634 CmdArgs.push_back("-analyzer-checker=cplusplus");
2635
Nico Webere8e53112014-05-11 01:04:02 +00002636 // Enable the following experimental checkers for testing.
2637 CmdArgs.push_back(
2638 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002639 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2640 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2641 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2642 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2643 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002644 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002645
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002646 // Set the output format. The default is plist, for (lame) historical
2647 // reasons.
2648 CmdArgs.push_back("-analyzer-output");
2649 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002650 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002651 else
2652 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002653
Ted Kremenekfe449a22010-03-22 22:32:05 +00002654 // Disable the presentation of standard compiler warnings when
2655 // using --analyze. We only want to show static analyzer diagnostics
2656 // or frontend errors.
2657 CmdArgs.push_back("-w");
2658
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002659 // Add -Xanalyzer arguments when running as analyzer.
2660 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002661 }
2662
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002663 CheckCodeGenerationOptions(D, Args);
2664
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002665 bool PIE = getToolChain().isPIEDefault();
2666 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002667 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002668
Alexey Bataev40e75222014-01-28 06:30:35 +00002669 // Android-specific defaults for PIC/PIE
2670 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2671 switch (getToolChain().getTriple().getArch()) {
2672 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002673 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002674 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002675 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002676 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002677 case llvm::Triple::mips:
2678 case llvm::Triple::mipsel:
2679 case llvm::Triple::mips64:
2680 case llvm::Triple::mips64el:
2681 PIC = true; // "-fpic"
2682 break;
2683
2684 case llvm::Triple::x86:
2685 case llvm::Triple::x86_64:
2686 PIC = true; // "-fPIC"
2687 IsPICLevelTwo = true;
2688 break;
2689
2690 default:
2691 break;
2692 }
2693 }
2694
Brad Smith5b05db82014-06-24 19:51:29 +00002695 // OpenBSD-specific defaults for PIE
2696 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2697 switch (getToolChain().getTriple().getArch()) {
2698 case llvm::Triple::mips64:
2699 case llvm::Triple::mips64el:
2700 case llvm::Triple::sparc:
2701 case llvm::Triple::x86:
2702 case llvm::Triple::x86_64:
2703 IsPICLevelTwo = false; // "-fpie"
2704 break;
2705
2706 case llvm::Triple::ppc:
2707 case llvm::Triple::sparcv9:
2708 IsPICLevelTwo = true; // "-fPIE"
2709 break;
2710
2711 default:
2712 break;
2713 }
2714 }
2715
Alexey Samsonov090301e2013-04-09 12:28:19 +00002716 // For the PIC and PIE flag options, this logic is different from the
2717 // legacy logic in very old versions of GCC, as that logic was just
2718 // a bug no one had ever fixed. This logic is both more rational and
2719 // consistent with GCC's new logic now that the bugs are fixed. The last
2720 // argument relating to either PIC or PIE wins, and no other argument is
2721 // used. If the last argument is any flavor of the '-fno-...' arguments,
2722 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2723 // at the same level.
2724 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2725 options::OPT_fpic, options::OPT_fno_pic,
2726 options::OPT_fPIE, options::OPT_fno_PIE,
2727 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002728 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2729 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002730 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002731 if (LastPICArg) {
2732 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002733 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2734 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2735 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2736 PIC = PIE || O.matches(options::OPT_fPIC) ||
2737 O.matches(options::OPT_fpic);
2738 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2739 O.matches(options::OPT_fPIC);
2740 } else {
2741 PIE = PIC = false;
2742 }
2743 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002744 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002745
Nick Lewycky609dd662013-10-11 03:33:53 +00002746 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002747 // specified while enabling PIC enabled level 1 PIC, just force it back to
2748 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2749 // informal testing).
2750 if (PIC && getToolChain().getTriple().isOSDarwin())
2751 IsPICLevelTwo |= getToolChain().isPICDefault();
2752
Chandler Carruthc0c04552012-04-08 16:40:35 +00002753 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2754 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002755 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002756 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002757 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002758 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002759 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002760 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002761
Chandler Carruth76a943b2012-11-19 03:52:03 +00002762 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2763 // This is a very special mode. It trumps the other modes, almost no one
2764 // uses it, and it isn't even valid on any OS but Darwin.
2765 if (!getToolChain().getTriple().isOSDarwin())
2766 D.Diag(diag::err_drv_unsupported_opt_for_target)
2767 << A->getSpelling() << getToolChain().getTriple().str();
2768
2769 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2770
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002771 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002772 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002773
Chandler Carruth76a943b2012-11-19 03:52:03 +00002774 // Only a forced PIC mode can cause the actual compile to have PIC defines
2775 // etc., no flags are sufficient. This behavior was selected to closely
2776 // match that of llvm-gcc and Apple GCC before that.
2777 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2778 CmdArgs.push_back("-pic-level");
2779 CmdArgs.push_back("2");
2780 }
2781 } else {
2782 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2783 // handled in Clang's IRGen by the -pie-level flag.
2784 CmdArgs.push_back("-mrelocation-model");
2785 CmdArgs.push_back(PIC ? "pic" : "static");
2786
2787 if (PIC) {
2788 CmdArgs.push_back("-pic-level");
2789 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2790 if (PIE) {
2791 CmdArgs.push_back("-pie-level");
2792 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2793 }
2794 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002795 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002796
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002797 CmdArgs.push_back("-mthread-model");
2798 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2799 CmdArgs.push_back(A->getValue());
2800 else
2801 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2802
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002803 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2804 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002805 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002806
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002807 // LLVM Code Generator Options.
2808
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002809 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2810 StringRef v = A->getValue();
2811 CmdArgs.push_back("-mllvm");
2812 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2813 A->claim();
2814 }
2815
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002816 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2817 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002818 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002819 }
2820
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002821 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2822 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002823 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002824 D.Diag(diag::err_drv_unsupported_opt_for_target)
2825 << A->getSpelling() << getToolChain().getTriple().str();
2826 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2827 CmdArgs.push_back("-fpcc-struct-return");
2828 } else {
2829 assert(A->getOption().matches(options::OPT_freg_struct_return));
2830 CmdArgs.push_back("-freg-struct-return");
2831 }
2832 }
2833
Roman Divacky65b88cd2011-03-01 17:40:53 +00002834 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2835 CmdArgs.push_back("-mrtd");
2836
Rafael Espindola224dd632011-12-14 21:02:23 +00002837 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002838 CmdArgs.push_back("-mdisable-fp-elim");
2839 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2840 options::OPT_fno_zero_initialized_in_bss))
2841 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002842
2843 bool OFastEnabled = isOptimizationLevelFast(Args);
2844 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2845 // enabled. This alias option is being used to simplify the hasFlag logic.
2846 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2847 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002848 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2849 // doesn't do any TBAA.
2850 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002851 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002852 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002853 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002854 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2855 options::OPT_fno_struct_path_tbaa))
2856 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002857 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2858 false))
2859 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002860 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2861 options::OPT_fno_optimize_sibling_calls))
2862 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002863
Eric Christopher006208c2013-04-04 06:29:47 +00002864 // Handle segmented stacks.
2865 if (Args.hasArg(options::OPT_fsplit_stack))
2866 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002867
2868 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2869 // This alias option is being used to simplify the getLastArg logic.
2870 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2871 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002872
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002873 // Handle various floating point optimization flags, mapping them to the
2874 // appropriate LLVM code generation flags. The pattern for all of these is to
2875 // default off the codegen optimizations, and if any flag enables them and no
2876 // flag disables them after the flag enabling them, enable the codegen
2877 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002878 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002879 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002880 options::OPT_ffinite_math_only,
2881 options::OPT_fno_finite_math_only,
2882 options::OPT_fhonor_infinities,
2883 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002884 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2885 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002886 A->getOption().getID() != options::OPT_fhonor_infinities)
2887 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002888 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002889 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002890 options::OPT_ffinite_math_only,
2891 options::OPT_fno_finite_math_only,
2892 options::OPT_fhonor_nans,
2893 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002894 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2895 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002896 A->getOption().getID() != options::OPT_fhonor_nans)
2897 CmdArgs.push_back("-menable-no-nans");
2898
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002899 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2900 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002901 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002902 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002903 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002904 options::OPT_fno_math_errno)) {
2905 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2906 // However, turning *off* -ffast_math merely restores the toolchain default
2907 // (which may be false).
2908 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2909 A->getOption().getID() == options::OPT_ffast_math ||
2910 A->getOption().getID() == options::OPT_Ofast)
2911 MathErrno = false;
2912 else if (A->getOption().getID() == options::OPT_fmath_errno)
2913 MathErrno = true;
2914 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002915 if (MathErrno)
2916 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002917
2918 // There are several flags which require disabling very specific
2919 // optimizations. Any of these being disabled forces us to turn off the
2920 // entire set of LLVM optimizations, so collect them through all the flag
2921 // madness.
2922 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002923 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002924 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002925 options::OPT_funsafe_math_optimizations,
2926 options::OPT_fno_unsafe_math_optimizations,
2927 options::OPT_fassociative_math,
2928 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002929 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2930 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002931 A->getOption().getID() != options::OPT_fno_associative_math)
2932 AssociativeMath = true;
2933 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002934 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002935 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002936 options::OPT_funsafe_math_optimizations,
2937 options::OPT_fno_unsafe_math_optimizations,
2938 options::OPT_freciprocal_math,
2939 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002940 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2941 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002942 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2943 ReciprocalMath = true;
2944 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002945 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002946 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002947 options::OPT_funsafe_math_optimizations,
2948 options::OPT_fno_unsafe_math_optimizations,
2949 options::OPT_fsigned_zeros,
2950 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002951 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2952 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002953 A->getOption().getID() != options::OPT_fsigned_zeros)
2954 SignedZeros = false;
2955 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002956 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002957 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002958 options::OPT_funsafe_math_optimizations,
2959 options::OPT_fno_unsafe_math_optimizations,
2960 options::OPT_ftrapping_math,
2961 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002962 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2963 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002964 A->getOption().getID() != options::OPT_ftrapping_math)
2965 TrappingMath = false;
2966 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2967 !TrappingMath)
2968 CmdArgs.push_back("-menable-unsafe-fp-math");
2969
Lang Hamesaa53b932012-07-06 00:59:19 +00002970
2971 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002972 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002973 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002974 options::OPT_ffp_contract)) {
2975 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002976 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002977 if (Val == "fast" || Val == "on" || Val == "off") {
2978 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2979 } else {
2980 D.Diag(diag::err_drv_unsupported_option_argument)
2981 << A->getOption().getName() << Val;
2982 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002983 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2984 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002985 // If fast-math is set then set the fp-contract mode to fast.
2986 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2987 }
2988 }
2989
Bob Wilson6a039162012-07-19 03:52:53 +00002990 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2991 // and if we find them, tell the frontend to provide the appropriate
2992 // preprocessor macros. This is distinct from enabling any optimizations as
2993 // these options induce language changes which must survive serialization
2994 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002995 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2996 options::OPT_fno_fast_math))
2997 if (!A->getOption().matches(options::OPT_fno_fast_math))
2998 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002999 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3000 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003001 if (A->getOption().matches(options::OPT_ffinite_math_only))
3002 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003003
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003004 // Decide whether to use verbose asm. Verbose assembly is the default on
3005 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003006 bool IsIntegratedAssemblerDefault =
3007 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003008 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003009 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003010 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003011 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003012
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003013 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003014 IsIntegratedAssemblerDefault))
3015 CmdArgs.push_back("-no-integrated-as");
3016
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003017 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3018 CmdArgs.push_back("-mdebug-pass");
3019 CmdArgs.push_back("Structure");
3020 }
3021 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3022 CmdArgs.push_back("-mdebug-pass");
3023 CmdArgs.push_back("Arguments");
3024 }
3025
John McCall8517abc2010-02-19 02:45:38 +00003026 // Enable -mconstructor-aliases except on darwin, where we have to
3027 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003028 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003029 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003030
John McCall7ef5cb32011-03-18 02:56:14 +00003031 // Darwin's kernel doesn't support guard variables; just die if we
3032 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003033 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003034 CmdArgs.push_back("-fforbid-guard-variables");
3035
Douglas Gregordbe39272011-02-01 15:15:22 +00003036 if (Args.hasArg(options::OPT_mms_bitfields)) {
3037 CmdArgs.push_back("-mms-bitfields");
3038 }
John McCall8517abc2010-02-19 02:45:38 +00003039
Daniel Dunbar306945d2009-09-16 06:17:29 +00003040 // This is a coarse approximation of what llvm-gcc actually does, both
3041 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3042 // complicated ways.
3043 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003044 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3045 options::OPT_fno_asynchronous_unwind_tables,
3046 (getToolChain().IsUnwindTablesDefault() ||
3047 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3048 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003049 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3050 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003051 CmdArgs.push_back("-munwind-tables");
3052
Chandler Carruth05fb5852012-11-21 23:40:23 +00003053 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003054
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003055 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3056 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003057 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003058 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003059
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003060 // FIXME: Handle -mtune=.
3061 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003062
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003063 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003064 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003065 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003066 }
3067
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003068 // Add the target cpu
3069 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3070 llvm::Triple ETriple(ETripleStr);
3071 std::string CPU = getCPUName(Args, ETriple);
3072 if (!CPU.empty()) {
3073 CmdArgs.push_back("-target-cpu");
3074 CmdArgs.push_back(Args.MakeArgString(CPU));
3075 }
3076
Rafael Espindolaeb265472013-08-21 21:59:03 +00003077 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3078 CmdArgs.push_back("-mfpmath");
3079 CmdArgs.push_back(A->getValue());
3080 }
3081
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003082 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003083 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003084
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003085 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003086 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003087 default:
3088 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003089
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003090 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003091 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003092 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003093 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003094 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003095 break;
3096
Tim Northover573cbee2014-05-24 12:52:07 +00003097 case llvm::Triple::aarch64:
3098 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003099 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003100 break;
3101
Eric Christopher0b26a612010-03-02 02:41:08 +00003102 case llvm::Triple::mips:
3103 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003104 case llvm::Triple::mips64:
3105 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003106 AddMIPSTargetArgs(Args, CmdArgs);
3107 break;
3108
Ulrich Weigand8afad612014-07-28 13:17:52 +00003109 case llvm::Triple::ppc:
3110 case llvm::Triple::ppc64:
3111 case llvm::Triple::ppc64le:
3112 AddPPCTargetArgs(Args, CmdArgs);
3113 break;
3114
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003115 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003116 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003117 AddSparcTargetArgs(Args, CmdArgs);
3118 break;
3119
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003120 case llvm::Triple::x86:
3121 case llvm::Triple::x86_64:
3122 AddX86TargetArgs(Args, CmdArgs);
3123 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003124
3125 case llvm::Triple::hexagon:
3126 AddHexagonTargetArgs(Args, CmdArgs);
3127 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003128 }
3129
Hans Wennborg75958c42013-08-08 00:17:41 +00003130 // Add clang-cl arguments.
3131 if (getToolChain().getDriver().IsCLMode())
3132 AddClangCLArgs(Args, CmdArgs);
3133
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003134 // Pass the linker version in use.
3135 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3136 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003137 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003138 }
3139
Eric Christopherb7d97e92013-04-03 01:58:53 +00003140 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003141 CmdArgs.push_back("-momit-leaf-frame-pointer");
3142
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003143 // Explicitly error on some things we know we don't support and can't just
3144 // ignore.
3145 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003146 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3147 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003148 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003149 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003150 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003151 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3152 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003153 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003154 << Unsupported->getOption().getName();
3155 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003156 }
3157
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003158 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003159 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003160 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003161 CmdArgs.push_back("-header-include-file");
3162 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3163 D.CCPrintHeadersFilename : "-");
3164 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003165 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003166 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003167
Chad Rosierbe10f982011-08-02 17:58:04 +00003168 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003169 CmdArgs.push_back("-diagnostic-log-file");
3170 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3171 D.CCLogDiagnosticsFilename : "-");
3172 }
3173
Manman Ren17bdb0f2013-11-20 20:22:14 +00003174 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3175 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003176 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003177 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003178 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3179 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003180 // FIXME: we should support specifying dwarf version with
3181 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003182 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003183 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003184 const llvm::Triple &Triple = getToolChain().getTriple();
3185 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003186 Triple.getOS() == llvm::Triple::FreeBSD ||
3187 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003188 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003189 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003190 CmdArgs.push_back("-gdwarf-2");
3191 else if (A->getOption().matches(options::OPT_gdwarf_3))
3192 CmdArgs.push_back("-gdwarf-3");
3193 else if (A->getOption().matches(options::OPT_gdwarf_4))
3194 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003195 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003196 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003197 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003198 const llvm::Triple &Triple = getToolChain().getTriple();
3199 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003200 Triple.getOS() == llvm::Triple::FreeBSD ||
3201 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003202 CmdArgs.push_back("-gdwarf-2");
3203 else
3204 CmdArgs.push_back("-g");
3205 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003206 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003207
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003208 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3209 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003210 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3211 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003212 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003213
Eric Christopher138c32b2013-09-13 22:37:55 +00003214 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003215 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3216 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003217 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003218 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003219 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003220 CmdArgs.push_back("-g");
3221 CmdArgs.push_back("-backend-option");
3222 CmdArgs.push_back("-split-dwarf=Enable");
3223 }
3224
Eric Christopher138c32b2013-09-13 22:37:55 +00003225 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3226 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3227 CmdArgs.push_back("-backend-option");
3228 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3229 }
Eric Christophereec89c22013-06-18 00:03:50 +00003230
Eric Christopher0d403d22014-02-14 01:27:03 +00003231 // -gdwarf-aranges turns on the emission of the aranges section in the
3232 // backend.
3233 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3234 CmdArgs.push_back("-backend-option");
3235 CmdArgs.push_back("-generate-arange-section");
3236 }
3237
David Blaikief36d9ba2014-01-27 18:52:43 +00003238 if (Args.hasFlag(options::OPT_fdebug_types_section,
3239 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003240 CmdArgs.push_back("-backend-option");
3241 CmdArgs.push_back("-generate-type-units");
3242 }
Eric Christophereec89c22013-06-18 00:03:50 +00003243
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003244 if (Args.hasFlag(options::OPT_ffunction_sections,
3245 options::OPT_fno_function_sections, false)) {
3246 CmdArgs.push_back("-ffunction-sections");
3247 }
3248
3249 if (Args.hasFlag(options::OPT_fdata_sections,
3250 options::OPT_fno_data_sections, false)) {
3251 CmdArgs.push_back("-fdata-sections");
3252 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003253
Chris Lattner3c77a352010-06-22 00:03:40 +00003254 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3255
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003256 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3257 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3258 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3259 D.Diag(diag::err_drv_argument_not_allowed_with)
3260 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3261
3262 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3263
3264 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3265 A->render(Args, CmdArgs);
3266 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3267 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3268
Nick Lewycky207bce32011-04-21 23:44:07 +00003269 if (Args.hasArg(options::OPT_ftest_coverage) ||
3270 Args.hasArg(options::OPT_coverage))
3271 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003272 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3273 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003274 Args.hasArg(options::OPT_coverage))
3275 CmdArgs.push_back("-femit-coverage-data");
3276
Alex Lorenzee024992014-08-04 18:41:51 +00003277 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3278 !Args.hasArg(options::OPT_fprofile_instr_generate))
3279 D.Diag(diag::err_drv_argument_only_allowed_with)
3280 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3281
3282 if (Args.hasArg(options::OPT_fcoverage_mapping))
3283 CmdArgs.push_back("-fcoverage-mapping");
3284
Nick Lewycky480cb992011-05-04 20:46:58 +00003285 if (C.getArgs().hasArg(options::OPT_c) ||
3286 C.getArgs().hasArg(options::OPT_S)) {
3287 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003288 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003289 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003290 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003291 CoverageFilename = FinalOutput->getValue();
3292 } else {
3293 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3294 }
Nick Lewycky737a4522013-03-07 08:28:53 +00003295 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003296 SmallString<128> Pwd;
3297 if (!llvm::sys::fs::current_path(Pwd)) {
3298 llvm::sys::path::append(Pwd, CoverageFilename.str());
3299 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003300 }
3301 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003302 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003303 }
3304 }
3305
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003306 // Pass options for controlling the default header search paths.
3307 if (Args.hasArg(options::OPT_nostdinc)) {
3308 CmdArgs.push_back("-nostdsysteminc");
3309 CmdArgs.push_back("-nobuiltininc");
3310 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003311 if (Args.hasArg(options::OPT_nostdlibinc))
3312 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003313 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3314 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3315 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003316
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003317 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003318 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003319 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003320
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003321 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3322
Ted Kremenekf7639e12012-03-06 20:06:33 +00003323 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003324 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003325 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003326 options::OPT_ccc_arcmt_modify,
3327 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003328 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003329 switch (A->getOption().getID()) {
3330 default:
3331 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003332 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003333 CmdArgs.push_back("-arcmt-check");
3334 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003335 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003336 CmdArgs.push_back("-arcmt-modify");
3337 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003338 case options::OPT_ccc_arcmt_migrate:
3339 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003340 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003341 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003342
3343 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3344 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003345 break;
John McCalld70fb982011-06-15 23:25:17 +00003346 }
3347 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003348 } else {
3349 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3350 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3351 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003352 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003353
Ted Kremenekf7639e12012-03-06 20:06:33 +00003354 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3355 if (ARCMTEnabled) {
3356 D.Diag(diag::err_drv_argument_not_allowed_with)
3357 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3358 }
3359 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003360 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003361
3362 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003363 options::OPT_objcmt_migrate_subscripting,
3364 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003365 // None specified, means enable them all.
3366 CmdArgs.push_back("-objcmt-migrate-literals");
3367 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003368 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003369 } else {
3370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003373 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003374 } else {
3375 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3376 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3377 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3378 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3379 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3380 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3381 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3382 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3383 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3384 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3385 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3386 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3387 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003388 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003389 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003390 }
3391
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003392 // Add preprocessing options like -I, -D, etc. if we are using the
3393 // preprocessor.
3394 //
3395 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003396 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003397 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003398
Rafael Espindolaa7431922011-07-21 23:40:37 +00003399 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3400 // that "The compiler can only warn and ignore the option if not recognized".
3401 // When building with ccache, it will pass -D options to clang even on
3402 // preprocessed inputs and configure concludes that -fPIC is not supported.
3403 Args.ClaimAllArgs(options::OPT_D);
3404
Alp Toker7874bdc2013-11-15 20:40:58 +00003405 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003406 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3407 if (A->getOption().matches(options::OPT_O4)) {
3408 CmdArgs.push_back("-O3");
3409 D.Diag(diag::warn_O4_is_O3);
3410 } else {
3411 A->render(Args, CmdArgs);
3412 }
3413 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003414
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003415 // Warn about ignored options to clang.
3416 for (arg_iterator it = Args.filtered_begin(
3417 options::OPT_clang_ignored_gcc_optimization_f_Group),
3418 ie = Args.filtered_end(); it != ie; ++it) {
3419 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3420 }
3421
Chad Rosier86b82082012-12-12 20:06:31 +00003422 // Don't warn about unused -flto. This can happen when we're preprocessing or
3423 // precompiling.
3424 Args.ClaimAllArgs(options::OPT_flto);
3425
Richard Smith3be1cb22014-08-07 00:24:21 +00003426 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003427 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003428 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3429 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003430 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003431 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003432
3433 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003434 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003435 //
3436 // If a std is supplied, only add -trigraphs if it follows the
3437 // option.
3438 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3439 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003440 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003441 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003442 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003443 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003444 else
3445 Std->render(Args, CmdArgs);
3446
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003447 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3448 options::OPT_trigraphs))
3449 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003450 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003451 } else {
3452 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003453 //
3454 // FIXME: Clang doesn't correctly handle -std= when the input language
3455 // doesn't match. For the time being just ignore this for C++ inputs;
3456 // eventually we want to do all the standard defaulting here instead of
3457 // splitting it between the driver and clang -cc1.
3458 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003459 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3460 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003461 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003462 CmdArgs.push_back("-std=c++11");
3463
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003464 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003465 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003466
Richard Smith282b4492013-09-04 22:50:31 +00003467 // GCC's behavior for -Wwrite-strings is a bit strange:
3468 // * In C, this "warning flag" changes the types of string literals from
3469 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3470 // for the discarded qualifier.
3471 // * In C++, this is just a normal warning flag.
3472 //
3473 // Implementing this warning correctly in C is hard, so we follow GCC's
3474 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3475 // a non-const char* in C, rather than using this crude hack.
3476 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003477 // FIXME: This should behave just like a warning flag, and thus should also
3478 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3479 Arg *WriteStrings =
3480 Args.getLastArg(options::OPT_Wwrite_strings,
3481 options::OPT_Wno_write_strings, options::OPT_w);
3482 if (WriteStrings &&
3483 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003484 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003485 }
3486
Chandler Carruth61fbf622011-04-23 09:27:53 +00003487 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003488 // during C++ compilation, which it is by default. GCC keeps this define even
3489 // in the presence of '-w', match this behavior bug-for-bug.
3490 if (types::isCXX(InputType) &&
3491 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3492 true)) {
3493 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003494 }
3495
Chandler Carruthe0391482010-05-22 02:21:53 +00003496 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3497 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3498 if (Asm->getOption().matches(options::OPT_fasm))
3499 CmdArgs.push_back("-fgnu-keywords");
3500 else
3501 CmdArgs.push_back("-fno-gnu-keywords");
3502 }
3503
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003504 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3505 CmdArgs.push_back("-fno-dwarf-directory-asm");
3506
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003507 if (ShouldDisableAutolink(Args, getToolChain()))
3508 CmdArgs.push_back("-fno-autolink");
3509
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003510 // Add in -fdebug-compilation-dir if necessary.
3511 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003512
Richard Smith9a568822011-11-21 19:36:32 +00003513 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3514 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003515 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003516 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003517 }
3518
Richard Smith79c927b2013-11-06 19:31:51 +00003519 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3520 CmdArgs.push_back("-foperator-arrow-depth");
3521 CmdArgs.push_back(A->getValue());
3522 }
3523
Richard Smith9a568822011-11-21 19:36:32 +00003524 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3525 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003526 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003527 }
3528
Richard Smitha3d3bd22013-05-08 02:12:03 +00003529 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3530 CmdArgs.push_back("-fconstexpr-steps");
3531 CmdArgs.push_back(A->getValue());
3532 }
3533
Richard Smithb3a14522013-02-22 01:59:51 +00003534 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3535 CmdArgs.push_back("-fbracket-depth");
3536 CmdArgs.push_back(A->getValue());
3537 }
3538
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003539 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3540 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003541 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003542 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003543 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3544 } else
3545 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003546 }
3547
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003548
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003549 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003550 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003551
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003552 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3553 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003554 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003555 }
David Chisnall5778fce2009-08-31 16:41:57 +00003556
Chris Lattnere23003d2010-01-09 21:54:33 +00003557 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3558 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003559 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003560 }
3561
Chris Lattnerb35583d2010-04-07 20:49:23 +00003562 CmdArgs.push_back("-ferror-limit");
3563 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003564 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003565 else
3566 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003567
Chandler Carrutha77a7272010-05-06 04:55:18 +00003568 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3569 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003570 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003571 }
3572
3573 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3574 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003575 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003576 }
3577
Richard Smithf6f003a2011-12-16 19:06:07 +00003578 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3579 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003580 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003581 }
3582
Daniel Dunbar2c978472009-11-04 06:24:47 +00003583 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003584 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003585 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003586 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003587 } else {
3588 // If -fmessage-length=N was not specified, determine whether this is a
3589 // terminal and, if so, implicitly define -fmessage-length appropriately.
3590 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003591 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003592 }
3593
John McCallb4a99d32013-02-19 01:57:35 +00003594 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3595 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3596 options::OPT_fvisibility_ms_compat)) {
3597 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3598 CmdArgs.push_back("-fvisibility");
3599 CmdArgs.push_back(A->getValue());
3600 } else {
3601 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3602 CmdArgs.push_back("-fvisibility");
3603 CmdArgs.push_back("hidden");
3604 CmdArgs.push_back("-ftype-visibility");
3605 CmdArgs.push_back("default");
3606 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003607 }
3608
Douglas Gregor08329632010-06-15 17:05:35 +00003609 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003610
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003611 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3612
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003613 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003614 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3615 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003616 CmdArgs.push_back("-ffreestanding");
3617
Daniel Dunbare357d562009-12-03 18:42:11 +00003618 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003619 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003620 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003621 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3622 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003623 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003624 // AltiVec language extensions aren't relevant for assembling.
3625 if (!isa<PreprocessJobAction>(JA) ||
3626 Output.getType() != types::TY_PP_Asm)
3627 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003628 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3629 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003630
Peter Collingbourne32701642013-11-01 18:16:25 +00003631 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3632 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003633
Eric Christopher459d2712013-02-19 06:16:53 +00003634 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003635 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003636 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003637 getToolChain().getArch() == llvm::Triple::ppc64 ||
3638 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003639 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003640 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003641
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003642 if (getToolChain().SupportsProfiling())
3643 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003644
3645 // -flax-vector-conversions is default.
3646 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3647 options::OPT_fno_lax_vector_conversions))
3648 CmdArgs.push_back("-fno-lax-vector-conversions");
3649
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003650 if (Args.getLastArg(options::OPT_fapple_kext))
3651 CmdArgs.push_back("-fapple-kext");
3652
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003653 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003654 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003655 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003656 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3657 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003658
3659 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3660 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003661 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003662 }
3663
Bob Wilson14adb362012-02-03 06:27:22 +00003664 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003665
Chandler Carruth6e501032011-03-27 00:04:55 +00003666 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3667 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3668 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3669 options::OPT_fno_wrapv)) {
3670 if (A->getOption().matches(options::OPT_fwrapv))
3671 CmdArgs.push_back("-fwrapv");
3672 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3673 options::OPT_fno_strict_overflow)) {
3674 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3675 CmdArgs.push_back("-fwrapv");
3676 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003677
3678 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3679 options::OPT_fno_reroll_loops))
3680 if (A->getOption().matches(options::OPT_freroll_loops))
3681 CmdArgs.push_back("-freroll-loops");
3682
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003683 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003684 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3685 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003687 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3688
Mahesha S6a682be42012-10-27 07:47:56 +00003689
Daniel Dunbar4930e332009-11-17 08:07:36 +00003690 // -stack-protector=0 is default.
3691 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003692 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3693 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003694 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003695 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003696 if (A->getOption().matches(options::OPT_fstack_protector)) {
3697 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3698 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3699 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003700 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003701 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003702 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003703 } else {
3704 StackProtectorLevel =
3705 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3706 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003707 if (StackProtectorLevel) {
3708 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003709 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003710 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003711
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003712 // --param ssp-buffer-size=
3713 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3714 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003715 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003716 if (Str.startswith("ssp-buffer-size=")) {
3717 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003718 CmdArgs.push_back("-stack-protector-buffer-size");
3719 // FIXME: Verify the argument is a valid integer.
3720 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003721 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003722 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003723 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003724 }
3725
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003726 // Translate -mstackrealign
3727 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3728 false)) {
3729 CmdArgs.push_back("-backend-option");
3730 CmdArgs.push_back("-force-align-stack");
3731 }
3732 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3733 false)) {
3734 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3735 }
3736
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003737 if (Args.hasArg(options::OPT_mstack_alignment)) {
3738 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3739 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003740 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003741
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003742 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3743 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3744 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3745
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003746 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3747 options::OPT_mno_restrict_it)) {
3748 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3749 CmdArgs.push_back("-backend-option");
3750 CmdArgs.push_back("-arm-restrict-it");
3751 } else {
3752 CmdArgs.push_back("-backend-option");
3753 CmdArgs.push_back("-arm-no-restrict-it");
3754 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003755 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3756 TT.getArch() == llvm::Triple::thumb)) {
3757 // Windows on ARM expects restricted IT blocks
3758 CmdArgs.push_back("-backend-option");
3759 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003760 }
3761
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003762 if (TT.getArch() == llvm::Triple::arm ||
3763 TT.getArch() == llvm::Triple::thumb) {
3764 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3765 options::OPT_mno_long_calls)) {
3766 if (A->getOption().matches(options::OPT_mlong_calls)) {
3767 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003768 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003769 }
3770 }
3771 }
3772
Daniel Dunbard18049a2009-04-07 21:16:11 +00003773 // Forward -f options with positive and negative forms; we translate
3774 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003775 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3776 StringRef fname = A->getValue();
3777 if (!llvm::sys::fs::exists(fname))
3778 D.Diag(diag::err_drv_no_such_file) << fname;
3779 else
3780 A->render(Args, CmdArgs);
3781 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003782
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003783 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003784 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003785 CmdArgs.push_back("-fapple-kext");
3786 if (!Args.hasArg(options::OPT_fbuiltin))
3787 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003788 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003789 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003790 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003791 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003792 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003793
Nuno Lopes13c88c72009-12-16 16:59:22 +00003794 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3795 options::OPT_fno_assume_sane_operator_new))
3796 CmdArgs.push_back("-fno-assume-sane-operator-new");
3797
Daniel Dunbar4930e332009-11-17 08:07:36 +00003798 // -fblocks=0 is default.
3799 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003800 getToolChain().IsBlocksDefault()) ||
3801 (Args.hasArg(options::OPT_fgnu_runtime) &&
3802 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3803 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003804 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003805
3806 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3807 !getToolChain().hasBlocksRuntime())
3808 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003809 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003810
Richard Smithffb65082014-09-30 23:10:19 +00003811 // -fmodules enables modules (off by default).
3812 // Users can pass -fno-cxx-modules to turn off modules support for
3813 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003814 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003815 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3816 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3817 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003818 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003819 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003820 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003821 HaveModules = true;
3822 }
3823 }
3824
Daniel Jasper07e6c402013-08-05 20:26:17 +00003825 // -fmodule-maps enables module map processing (off by default) for header
3826 // checking. It is implied by -fmodules.
3827 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3828 false)) {
3829 CmdArgs.push_back("-fmodule-maps");
3830 }
3831
Daniel Jasperac42b752013-10-21 06:34:34 +00003832 // -fmodules-decluse checks that modules used are declared so (off by
3833 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003834 if (Args.hasFlag(options::OPT_fmodules_decluse,
3835 options::OPT_fno_modules_decluse,
3836 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003837 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003838 }
3839
Daniel Jasper962b38e2014-04-11 11:47:45 +00003840 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3841 // all #included headers are part of modules.
3842 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3843 options::OPT_fno_modules_strict_decluse,
3844 false)) {
3845 CmdArgs.push_back("-fmodules-strict-decluse");
3846 }
3847
Daniel Jasperac42b752013-10-21 06:34:34 +00003848 // -fmodule-name specifies the module that is currently being built (or
3849 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00003850 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00003851
Richard Smith9887d792014-10-17 01:42:53 +00003852 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00003853 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00003854 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00003855
Richard Smithe842a472014-10-22 02:05:46 +00003856 // -fmodule-file can be used to specify files containing precompiled modules.
3857 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
3858
3859 // -fmodule-cache-path specifies where our implicitly-built module files
3860 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00003861 SmallString<128> ModuleCachePath;
3862 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3863 ModuleCachePath = A->getValue();
3864 if (HaveModules) {
3865 if (C.isForDiagnostics()) {
3866 // When generating crash reports, we want to emit the modules along with
3867 // the reproduction sources, so we ignore any provided module path.
3868 ModuleCachePath = Output.getFilename();
3869 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3870 llvm::sys::path::append(ModuleCachePath, "modules");
3871 } else if (ModuleCachePath.empty()) {
3872 // No module path was provided: use the default.
3873 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3874 ModuleCachePath);
3875 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3876 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3877 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003878 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003879 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3880 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3881 }
3882
3883 // When building modules and generating crashdumps, we need to dump a module
3884 // dependency VFS alongside the output.
3885 if (HaveModules && C.isForDiagnostics()) {
3886 SmallString<128> VFSDir(Output.getFilename());
3887 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00003888 // Add the cache directory as a temp so the crash diagnostics pick it up.
3889 C.addTempFile(Args.MakeArgString(VFSDir));
3890
Justin Bognera88f0122014-06-20 22:59:50 +00003891 llvm::sys::path::append(VFSDir, "vfs");
3892 CmdArgs.push_back("-module-dependency-dir");
3893 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003894 }
3895
Richard Smith9887d792014-10-17 01:42:53 +00003896 if (HaveModules)
3897 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003898
Douglas Gregor35b04d62013-02-07 19:01:24 +00003899 // Pass through all -fmodules-ignore-macro arguments.
3900 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003901 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3902 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003903
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003904 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3905
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003906 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3907 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3908 D.Diag(diag::err_drv_argument_not_allowed_with)
3909 << A->getAsString(Args) << "-fbuild-session-timestamp";
3910
3911 llvm::sys::fs::file_status Status;
3912 if (llvm::sys::fs::status(A->getValue(), Status))
3913 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003914 char TimeStamp[48];
3915 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3916 (uint64_t)Status.getLastModificationTime().toEpochTime());
3917 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003918 }
3919
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003920 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003921 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3922 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003923 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3924
3925 Args.AddLastArg(CmdArgs,
3926 options::OPT_fmodules_validate_once_per_build_session);
3927 }
3928
Ben Langmuirdcf73862014-03-12 00:06:17 +00003929 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3930
John McCalldfea9982010-04-09 19:12:06 +00003931 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003932 if (Args.hasFlag(options::OPT_fno_access_control,
3933 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003934 false))
John McCall3155f572010-04-09 19:03:51 +00003935 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003936
Anders Carlssond470fef2010-11-21 00:09:52 +00003937 // -felide-constructors is the default.
3938 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3939 options::OPT_felide_constructors,
3940 false))
3941 CmdArgs.push_back("-fno-elide-constructors");
3942
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003943 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003944 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003945 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003946 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003947
Richard Smith52be6192012-11-05 22:04:41 +00003948 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003949 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003950 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003951 Args.getLastArg(options::OPT_mkernel,
3952 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003953 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003954 D.Diag(diag::err_drv_argument_not_allowed_with)
3955 << "-fsanitize=vptr" << NoRttiArg;
3956 }
3957 }
3958
Tony Linthicum76329bf2011-12-12 21:14:55 +00003959 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003960 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003961 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003962 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003963 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003964 CmdArgs.push_back("-fshort-enums");
3965
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003966 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003967 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003968 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003969 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003970
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003971 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003972 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003973 options::OPT_fno_threadsafe_statics))
3974 CmdArgs.push_back("-fno-threadsafe-statics");
3975
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003976 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003977 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3978 options::OPT_fno_use_cxa_atexit,
3979 !IsWindowsCygnus && !IsWindowsGNU &&
3980 getToolChain().getArch() != llvm::Triple::hexagon &&
3981 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003982 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003983 CmdArgs.push_back("-fno-use-cxa-atexit");
3984
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003985 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003986 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003987 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003988 CmdArgs.push_back("-fms-extensions");
3989
Francois Pichet1b4f1632011-09-17 04:32:15 +00003990 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003991 if (Args.hasFlag(options::OPT_fms_compatibility,
3992 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003993 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3994 options::OPT_fno_ms_extensions,
3995 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003996 CmdArgs.push_back("-fms-compatibility");
3997
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003998 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003999 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004000 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4001 Args.hasArg(options::OPT_fms_compatibility_version)) {
4002 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4003 const Arg *MSCompatibilityVersion =
4004 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004005
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004006 if (MSCVersion && MSCompatibilityVersion)
4007 D.Diag(diag::err_drv_argument_not_allowed_with)
4008 << MSCVersion->getAsString(Args)
4009 << MSCompatibilityVersion->getAsString(Args);
4010
4011 std::string Ver;
4012 if (MSCompatibilityVersion)
4013 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4014 else if (MSCVersion)
4015 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4016
4017 if (Ver.empty())
4018 CmdArgs.push_back("-fms-compatibility-version=17.00");
4019 else
4020 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4021 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004022
Eric Christopher5ecce122013-02-18 00:38:31 +00004023 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004024 if (Args.hasFlag(options::OPT_fborland_extensions,
4025 options::OPT_fno_borland_extensions, false))
4026 CmdArgs.push_back("-fborland-extensions");
4027
Francois Pichet02744872011-09-01 16:38:08 +00004028 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4029 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004030 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004031 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004032 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004033
Chandler Carruthe03aa552010-04-17 20:17:31 +00004034 // -fgnu-keywords default varies depending on language; only pass if
4035 // specified.
4036 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004037 options::OPT_fno_gnu_keywords))
4038 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004039
Rafael Espindola922a6242011-06-02 17:30:53 +00004040 if (Args.hasFlag(options::OPT_fgnu89_inline,
4041 options::OPT_fno_gnu89_inline,
4042 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004043 CmdArgs.push_back("-fgnu89-inline");
4044
Chad Rosier9c76d242012-03-15 22:31:42 +00004045 if (Args.hasArg(options::OPT_fno_inline))
4046 CmdArgs.push_back("-fno-inline");
4047
Chad Rosier64d6be92012-03-06 21:17:19 +00004048 if (Args.hasArg(options::OPT_fno_inline_functions))
4049 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004050
John McCall5fb5df92012-06-20 06:18:46 +00004051 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004052
John McCall5fb5df92012-06-20 06:18:46 +00004053 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004054 // legacy is the default. Except for deployment taget of 10.5,
4055 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4056 // gets ignored silently.
4057 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004058 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4059 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004060 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004061 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004062 if (getToolChain().UseObjCMixedDispatch())
4063 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4064 else
4065 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4066 }
4067 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004068
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004069 // When ObjectiveC legacy runtime is in effect on MacOSX,
4070 // turn on the option to do Array/Dictionary subscripting
4071 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004072 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4073 getToolChain().getTriple().isMacOSX() &&
4074 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4075 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004076 objcRuntime.isNeXTFamily())
4077 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4078
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004079 // -fencode-extended-block-signature=1 is default.
4080 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4081 CmdArgs.push_back("-fencode-extended-block-signature");
4082 }
4083
John McCall24fc0de2011-07-06 00:26:06 +00004084 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4085 // NOTE: This logic is duplicated in ToolChains.cpp.
4086 bool ARC = isObjCAutoRefCount(Args);
4087 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004088 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004089
John McCall24fc0de2011-07-06 00:26:06 +00004090 CmdArgs.push_back("-fobjc-arc");
4091
Chandler Carruth491db322011-11-04 07:34:47 +00004092 // FIXME: It seems like this entire block, and several around it should be
4093 // wrapped in isObjC, but for now we just use it here as this is where it
4094 // was being used previously.
4095 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4096 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4097 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4098 else
4099 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4100 }
4101
John McCall24fc0de2011-07-06 00:26:06 +00004102 // Allow the user to enable full exceptions code emission.
4103 // We define off for Objective-CC, on for Objective-C++.
4104 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4105 options::OPT_fno_objc_arc_exceptions,
4106 /*default*/ types::isCXX(InputType)))
4107 CmdArgs.push_back("-fobjc-arc-exceptions");
4108 }
4109
4110 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4111 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004112 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004113 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004114
John McCall24fc0de2011-07-06 00:26:06 +00004115 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4116 // takes precedence.
4117 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4118 if (!GCArg)
4119 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4120 if (GCArg) {
4121 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004122 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004123 << GCArg->getAsString(Args);
4124 } else if (getToolChain().SupportsObjCGC()) {
4125 GCArg->render(Args, CmdArgs);
4126 } else {
4127 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004128 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004129 << GCArg->getAsString(Args);
4130 }
4131 }
4132
Reid Klecknerc542d372014-06-27 17:02:02 +00004133 // Handle GCC-style exception args.
4134 if (!C.getDriver().IsCLMode())
4135 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4136 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004137
4138 if (getToolChain().UseSjLjExceptions())
4139 CmdArgs.push_back("-fsjlj-exceptions");
4140
4141 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004142 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4143 options::OPT_fno_assume_sane_operator_new))
4144 CmdArgs.push_back("-fno-assume-sane-operator-new");
4145
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004146 // -fconstant-cfstrings is default, and may be subject to argument translation
4147 // on Darwin.
4148 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4149 options::OPT_fno_constant_cfstrings) ||
4150 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4151 options::OPT_mno_constant_cfstrings))
4152 CmdArgs.push_back("-fno-constant-cfstrings");
4153
John Thompsoned4e2952009-11-05 20:14:16 +00004154 // -fshort-wchar default varies depending on platform; only
4155 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004156 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4157 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004158 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004159
Hans Wennborg28c96312013-07-31 23:39:13 +00004160 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004161 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004162 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004163 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004164 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004165
Daniel Dunbar096ed292011-10-05 21:04:55 +00004166 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4167 // -fno-pack-struct doesn't apply to -fpack-struct=.
4168 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004169 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004170 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004171 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004172 } else if (Args.hasFlag(options::OPT_fpack_struct,
4173 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004174 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004175 }
4176
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004177 // Handle -fmax-type-align=N and -fno-type-align
4178 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4179 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4180 if (!SkipMaxTypeAlign) {
4181 std::string MaxTypeAlignStr = "-fmax-type-align=";
4182 MaxTypeAlignStr += A->getValue();
4183 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4184 }
4185 } else if (getToolChain().getTriple().isOSDarwin()) {
4186 if (!SkipMaxTypeAlign) {
4187 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4188 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4189 }
4190 }
4191
Robert Lytton0e076492013-08-13 09:43:10 +00004192 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004193 if (!Args.hasArg(options::OPT_fcommon))
4194 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004195 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004196 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004197
Daniel Dunbard18049a2009-04-07 21:16:11 +00004198 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004199 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004200 CmdArgs.push_back("-fno-common");
4201
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004202 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004203 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004204 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004205 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004206 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004207 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4208
Daniel Dunbar6358d682010-10-15 22:30:42 +00004209 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4210 if (!Args.hasFlag(options::OPT_ffor_scope,
4211 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004212 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004213 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4214
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004215 // -finput_charset=UTF-8 is default. Reject others
4216 if (Arg *inputCharset = Args.getLastArg(
4217 options::OPT_finput_charset_EQ)) {
4218 StringRef value = inputCharset->getValue();
4219 if (value != "UTF-8")
4220 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4221 }
4222
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004223 // -fexec_charset=UTF-8 is default. Reject others
4224 if (Arg *execCharset = Args.getLastArg(
4225 options::OPT_fexec_charset_EQ)) {
4226 StringRef value = execCharset->getValue();
4227 if (value != "UTF-8")
4228 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4229 }
4230
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004231 // -fcaret-diagnostics is default.
4232 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4233 options::OPT_fno_caret_diagnostics, true))
4234 CmdArgs.push_back("-fno-caret-diagnostics");
4235
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004236 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004237 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004238 options::OPT_fno_diagnostics_fixit_info))
4239 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004240
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004241 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004242 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004243 options::OPT_fno_diagnostics_show_option))
4244 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004245
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004246 if (const Arg *A =
4247 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4248 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004249 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004250 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004251
Douglas Gregor643c9222011-05-21 17:07:29 +00004252 if (const Arg *A =
4253 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4254 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004255 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004256 }
4257
Chandler Carruthb6766f02011-03-27 01:50:55 +00004258 if (Arg *A = Args.getLastArg(
4259 options::OPT_fdiagnostics_show_note_include_stack,
4260 options::OPT_fno_diagnostics_show_note_include_stack)) {
4261 if (A->getOption().matches(
4262 options::OPT_fdiagnostics_show_note_include_stack))
4263 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4264 else
4265 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4266 }
4267
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004268 // Color diagnostics are the default, unless the terminal doesn't support
4269 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004270 // Support both clang's -f[no-]color-diagnostics and gcc's
4271 // -f[no-]diagnostics-colors[=never|always|auto].
4272 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004273 for (const auto &Arg : Args) {
4274 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004275 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4276 !O.matches(options::OPT_fdiagnostics_color) &&
4277 !O.matches(options::OPT_fno_color_diagnostics) &&
4278 !O.matches(options::OPT_fno_diagnostics_color) &&
4279 !O.matches(options::OPT_fdiagnostics_color_EQ))
4280 continue;
4281
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004282 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004283 if (O.matches(options::OPT_fcolor_diagnostics) ||
4284 O.matches(options::OPT_fdiagnostics_color)) {
4285 ShowColors = Colors_On;
4286 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4287 O.matches(options::OPT_fno_diagnostics_color)) {
4288 ShowColors = Colors_Off;
4289 } else {
4290 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004291 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004292 if (value == "always")
4293 ShowColors = Colors_On;
4294 else if (value == "never")
4295 ShowColors = Colors_Off;
4296 else if (value == "auto")
4297 ShowColors = Colors_Auto;
4298 else
4299 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4300 << ("-fdiagnostics-color=" + value).str();
4301 }
4302 }
4303 if (ShowColors == Colors_On ||
4304 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004305 CmdArgs.push_back("-fcolor-diagnostics");
4306
Nico Rieck7857d462013-09-11 00:38:02 +00004307 if (Args.hasArg(options::OPT_fansi_escape_codes))
4308 CmdArgs.push_back("-fansi-escape-codes");
4309
Daniel Dunbardb097022009-06-08 21:13:54 +00004310 if (!Args.hasFlag(options::OPT_fshow_source_location,
4311 options::OPT_fno_show_source_location))
4312 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004313
Douglas Gregor643c9222011-05-21 17:07:29 +00004314 if (!Args.hasFlag(options::OPT_fshow_column,
4315 options::OPT_fno_show_column,
4316 true))
4317 CmdArgs.push_back("-fno-show-column");
4318
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004319 if (!Args.hasFlag(options::OPT_fspell_checking,
4320 options::OPT_fno_spell_checking))
4321 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004322
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004323
Chad Rosierc8e56e82012-12-05 21:08:21 +00004324 // -fno-asm-blocks is default.
4325 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4326 false))
4327 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004328
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004329 // Enable vectorization per default according to the optimization level
4330 // selected. For optimization levels that want vectorization we use the alias
4331 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004332 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004333 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004334 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004335 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004336 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004337 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004338
Chad Rosier136d67d2014-04-28 19:30:57 +00004339 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004340 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4341 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004342 options::OPT_fslp_vectorize;
4343 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004344 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004345 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004346
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004347 // -fno-slp-vectorize-aggressive is default.
4348 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004349 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004350 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004351
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004352 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4353 A->render(Args, CmdArgs);
4354
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004355 // -fdollars-in-identifiers default varies depending on platform and
4356 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004357 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004358 options::OPT_fno_dollars_in_identifiers)) {
4359 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004360 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004361 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004362 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004363 }
4364
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004365 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4366 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004367 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004368 options::OPT_fno_unit_at_a_time)) {
4369 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004370 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004371 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004372
Eli Friedman055c9702011-11-02 01:53:16 +00004373 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4374 options::OPT_fno_apple_pragma_pack, false))
4375 CmdArgs.push_back("-fapple-pragma-pack");
4376
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004377 // le32-specific flags:
4378 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4379 // by default.
4380 if (getToolChain().getArch() == llvm::Triple::le32) {
4381 CmdArgs.push_back("-fno-math-builtin");
4382 }
4383
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004384 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004385 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004386 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004387#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004388 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004389 (getToolChain().getArch() == llvm::Triple::arm ||
4390 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004391 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4392 CmdArgs.push_back("-fno-builtin-strcat");
4393 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4394 CmdArgs.push_back("-fno-builtin-strcpy");
4395 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004396#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004397
Justin Bognera88f0122014-06-20 22:59:50 +00004398 // Enable rewrite includes if the user's asked for it or if we're generating
4399 // diagnostics.
4400 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4401 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004402 if (Args.hasFlag(options::OPT_frewrite_includes,
4403 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004404 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004405 CmdArgs.push_back("-frewrite-includes");
4406
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004407 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004408 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004409 options::OPT_traditional_cpp)) {
4410 if (isa<PreprocessJobAction>(JA))
4411 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004412 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004413 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004414 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004415
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004416 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004417 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004418
4419 // Handle serialized diagnostics.
4420 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4421 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004422 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004423 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004424
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004425 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4426 CmdArgs.push_back("-fretain-comments-from-system-headers");
4427
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004428 // Forward -fcomment-block-commands to -cc1.
4429 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004430 // Forward -fparse-all-comments to -cc1.
4431 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004432
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004433 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4434 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004435 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004436 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4437 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004438 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004439
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004440 // We translate this by hand to the -cc1 argument, since nightly test uses
4441 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004442 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004443 CmdArgs.push_back("-disable-llvm-optzns");
4444 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004445 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004446 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004447
Daniel Dunbard67a3222009-03-30 06:36:42 +00004448 if (Output.getType() == types::TY_Dependencies) {
4449 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004450 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004451 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004452 CmdArgs.push_back(Output.getFilename());
4453 } else {
4454 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004455 }
4456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004457 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004458 addDashXForInput(Args, II, CmdArgs);
4459
Daniel Dunbarb440f562010-08-02 02:38:21 +00004460 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004461 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004462 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004463 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004464 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004465
Chris Lattnere9d7d782009-11-03 19:50:27 +00004466 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4467
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004468 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004469
4470 // Optionally embed the -cc1 level arguments into the debug info, for build
4471 // analysis.
4472 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004473 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004474 for (const auto &Arg : Args)
4475 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004476
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004477 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004478 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004479 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004480 SmallString<128> EscapedArg;
4481 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004482 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004483 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004484 }
4485 CmdArgs.push_back("-dwarf-debug-flags");
4486 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4487 }
4488
Eric Christopherd3804002013-02-22 20:12:52 +00004489 // Add the split debug info name to the command lines here so we
4490 // can propagate it to the backend.
4491 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004492 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004493 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004494 const char *SplitDwarfOut;
4495 if (SplitDwarf) {
4496 CmdArgs.push_back("-split-dwarf-file");
4497 SplitDwarfOut = SplitDebugName(Args, Inputs);
4498 CmdArgs.push_back(SplitDwarfOut);
4499 }
4500
4501 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004502 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004503 Output.getType() == types::TY_Object &&
4504 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004505 auto CLCommand =
4506 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4507 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4508 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004509 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004510 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004511 }
4512
Daniel Dunbar17731772009-03-23 19:03:36 +00004513
Eric Christopherf1545832013-02-22 23:50:16 +00004514 // Handle the debug info splitting at object creation time if we're
4515 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004516 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004517 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004518 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004519
Roman Divacky178e01602011-02-10 16:52:03 +00004520 if (Arg *A = Args.getLastArg(options::OPT_pg))
4521 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004522 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004523 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004524
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004525 // Claim some arguments which clang supports automatically.
4526
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004527 // -fpch-preprocess is used with gcc to add a special marker in the output to
4528 // include the PCH file. Clang's PTH solution is completely transparent, so we
4529 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004530 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004531
Daniel Dunbar17731772009-03-23 19:03:36 +00004532 // Claim some arguments which clang doesn't support, but we don't
4533 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004534 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4535 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004536
Rafael Espindolab0092d72013-09-04 19:37:35 +00004537 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004538 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004539}
4540
John McCall5fb5df92012-06-20 06:18:46 +00004541/// Add options related to the Objective-C runtime/ABI.
4542///
4543/// Returns true if the runtime is non-fragile.
4544ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4545 ArgStringList &cmdArgs,
4546 RewriteKind rewriteKind) const {
4547 // Look for the controlling runtime option.
4548 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4549 options::OPT_fgnu_runtime,
4550 options::OPT_fobjc_runtime_EQ);
4551
4552 // Just forward -fobjc-runtime= to the frontend. This supercedes
4553 // options about fragility.
4554 if (runtimeArg &&
4555 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4556 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004557 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004558 if (runtime.tryParse(value)) {
4559 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4560 << value;
4561 }
4562
4563 runtimeArg->render(args, cmdArgs);
4564 return runtime;
4565 }
4566
4567 // Otherwise, we'll need the ABI "version". Version numbers are
4568 // slightly confusing for historical reasons:
4569 // 1 - Traditional "fragile" ABI
4570 // 2 - Non-fragile ABI, version 1
4571 // 3 - Non-fragile ABI, version 2
4572 unsigned objcABIVersion = 1;
4573 // If -fobjc-abi-version= is present, use that to set the version.
4574 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004575 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004576 if (value == "1")
4577 objcABIVersion = 1;
4578 else if (value == "2")
4579 objcABIVersion = 2;
4580 else if (value == "3")
4581 objcABIVersion = 3;
4582 else
4583 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4584 << value;
4585 } else {
4586 // Otherwise, determine if we are using the non-fragile ABI.
4587 bool nonFragileABIIsDefault =
4588 (rewriteKind == RK_NonFragile ||
4589 (rewriteKind == RK_None &&
4590 getToolChain().IsObjCNonFragileABIDefault()));
4591 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4592 options::OPT_fno_objc_nonfragile_abi,
4593 nonFragileABIIsDefault)) {
4594 // Determine the non-fragile ABI version to use.
4595#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4596 unsigned nonFragileABIVersion = 1;
4597#else
4598 unsigned nonFragileABIVersion = 2;
4599#endif
4600
4601 if (Arg *abiArg = args.getLastArg(
4602 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004603 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004604 if (value == "1")
4605 nonFragileABIVersion = 1;
4606 else if (value == "2")
4607 nonFragileABIVersion = 2;
4608 else
4609 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4610 << value;
4611 }
4612
4613 objcABIVersion = 1 + nonFragileABIVersion;
4614 } else {
4615 objcABIVersion = 1;
4616 }
4617 }
4618
4619 // We don't actually care about the ABI version other than whether
4620 // it's non-fragile.
4621 bool isNonFragile = objcABIVersion != 1;
4622
4623 // If we have no runtime argument, ask the toolchain for its default runtime.
4624 // However, the rewriter only really supports the Mac runtime, so assume that.
4625 ObjCRuntime runtime;
4626 if (!runtimeArg) {
4627 switch (rewriteKind) {
4628 case RK_None:
4629 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4630 break;
4631 case RK_Fragile:
4632 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4633 break;
4634 case RK_NonFragile:
4635 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4636 break;
4637 }
4638
4639 // -fnext-runtime
4640 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4641 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004642 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004643 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4644
4645 // Otherwise, build for a generic macosx port.
4646 } else {
4647 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4648 }
4649
4650 // -fgnu-runtime
4651 } else {
4652 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004653 // Legacy behaviour is to target the gnustep runtime if we are i
4654 // non-fragile mode or the GCC runtime in fragile mode.
4655 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004656 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004657 else
4658 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004659 }
4660
4661 cmdArgs.push_back(args.MakeArgString(
4662 "-fobjc-runtime=" + runtime.getAsString()));
4663 return runtime;
4664}
4665
Reid Klecknerc542d372014-06-27 17:02:02 +00004666static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4667 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4668 I += HaveDash;
4669 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004670}
Reid Klecknerc542d372014-06-27 17:02:02 +00004671
4672struct EHFlags {
4673 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4674 bool Synch;
4675 bool Asynch;
4676 bool NoExceptC;
4677};
4678
4679/// /EH controls whether to run destructor cleanups when exceptions are
4680/// thrown. There are three modifiers:
4681/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4682/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4683/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4684/// - c: Assume that extern "C" functions are implicitly noexcept. This
4685/// modifier is an optimization, so we ignore it for now.
4686/// The default is /EHs-c-, meaning cleanups are disabled.
4687static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4688 EHFlags EH;
4689 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4690 for (auto EHVal : EHArgs) {
4691 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4692 switch (EHVal[I]) {
4693 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4694 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4695 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4696 default: break;
4697 }
4698 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4699 break;
4700 }
4701 }
4702 return EH;
4703}
4704
Hans Wennborg75958c42013-08-08 00:17:41 +00004705void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4706 unsigned RTOptionID = options::OPT__SLASH_MT;
4707
Hans Wennborgf1a74252013-09-10 20:18:04 +00004708 if (Args.hasArg(options::OPT__SLASH_LDd))
4709 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4710 // but defining _DEBUG is sticky.
4711 RTOptionID = options::OPT__SLASH_MTd;
4712
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004713 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004714 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004715
Hans Wennborg75958c42013-08-08 00:17:41 +00004716 switch(RTOptionID) {
4717 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004718 if (Args.hasArg(options::OPT__SLASH_LDd))
4719 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004720 CmdArgs.push_back("-D_MT");
4721 CmdArgs.push_back("-D_DLL");
4722 CmdArgs.push_back("--dependent-lib=msvcrt");
4723 break;
4724 case options::OPT__SLASH_MDd:
4725 CmdArgs.push_back("-D_DEBUG");
4726 CmdArgs.push_back("-D_MT");
4727 CmdArgs.push_back("-D_DLL");
4728 CmdArgs.push_back("--dependent-lib=msvcrtd");
4729 break;
4730 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004731 if (Args.hasArg(options::OPT__SLASH_LDd))
4732 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004733 CmdArgs.push_back("-D_MT");
4734 CmdArgs.push_back("--dependent-lib=libcmt");
4735 break;
4736 case options::OPT__SLASH_MTd:
4737 CmdArgs.push_back("-D_DEBUG");
4738 CmdArgs.push_back("-D_MT");
4739 CmdArgs.push_back("--dependent-lib=libcmtd");
4740 break;
4741 default:
4742 llvm_unreachable("Unexpected option ID.");
4743 }
4744
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004745 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4746 // users want. The /Za flag to cl.exe turns this off, but it's not
4747 // implemented in clang.
4748 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004749
Hans Wennborg8858a032014-07-21 23:42:07 +00004750 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4751 // would produce interleaved output, so ignore /showIncludes in such cases.
4752 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4753 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4754 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004755
David Majnemerf6072342014-07-01 22:24:56 +00004756 // This controls whether or not we emit RTTI data for polymorphic types.
4757 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4758 /*default=*/false))
4759 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004760
Reid Klecknerc542d372014-06-27 17:02:02 +00004761 const Driver &D = getToolChain().getDriver();
4762 EHFlags EH = parseClangCLEHFlags(D, Args);
4763 // FIXME: Do something with NoExceptC.
4764 if (EH.Synch || EH.Asynch) {
4765 CmdArgs.push_back("-fexceptions");
4766 CmdArgs.push_back("-fcxx-exceptions");
4767 }
4768
Hans Wennborge50cec32014-06-13 20:59:54 +00004769 // /EP should expand to -E -P.
4770 if (Args.hasArg(options::OPT__SLASH_EP)) {
4771 CmdArgs.push_back("-E");
4772 CmdArgs.push_back("-P");
4773 }
4774
David Majnemer86c318f2014-02-11 21:05:00 +00004775 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4776 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4777 if (MostGeneralArg && BestCaseArg)
4778 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4779 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4780
4781 if (MostGeneralArg) {
4782 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4783 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4784 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4785
4786 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4787 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4788 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4789 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4790 << FirstConflict->getAsString(Args)
4791 << SecondConflict->getAsString(Args);
4792
4793 if (SingleArg)
4794 CmdArgs.push_back("-fms-memptr-rep=single");
4795 else if (MultipleArg)
4796 CmdArgs.push_back("-fms-memptr-rep=multiple");
4797 else
4798 CmdArgs.push_back("-fms-memptr-rep=virtual");
4799 }
4800
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004801 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4802 A->render(Args, CmdArgs);
4803
Hans Wennborg81f74482013-09-10 01:07:07 +00004804 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4805 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004806 if (Args.hasArg(options::OPT__SLASH_fallback))
4807 CmdArgs.push_back("msvc-fallback");
4808 else
4809 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004810 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004811}
4812
Hans Wennborg1da044a2014-06-26 19:59:02 +00004813visualstudio::Compile *Clang::getCLFallback() const {
4814 if (!CLFallback)
4815 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4816 return CLFallback.get();
4817}
4818
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004819void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004820 const InputInfo &Output,
4821 const InputInfoList &Inputs,
4822 const ArgList &Args,
4823 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004824 ArgStringList CmdArgs;
4825
4826 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4827 const InputInfo &Input = Inputs[0];
4828
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004829 // Don't warn about "clang -w -c foo.s"
4830 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004831 // and "clang -emit-llvm -c foo.s"
4832 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004833
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004834 // Invoke ourselves in -cc1as mode.
4835 //
4836 // FIXME: Implement custom jobs for internal actions.
4837 CmdArgs.push_back("-cc1as");
4838
4839 // Add the "effective" target triple.
4840 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004841 std::string TripleStr =
4842 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004843 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4844
4845 // Set the output mode, we currently only expect to be used as a real
4846 // assembler.
4847 CmdArgs.push_back("-filetype");
4848 CmdArgs.push_back("obj");
4849
Eric Christopher45f2e712012-12-18 00:31:10 +00004850 // Set the main file name, so that debug info works even with
4851 // -save-temps or preprocessed assembly.
4852 CmdArgs.push_back("-main-file-name");
4853 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4854
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004855 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004856 const llvm::Triple &Triple = getToolChain().getTriple();
4857 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004858 if (!CPU.empty()) {
4859 CmdArgs.push_back("-target-cpu");
4860 CmdArgs.push_back(Args.MakeArgString(CPU));
4861 }
4862
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004863 // Add the target features
4864 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004865 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004866
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004867 // Ignore explicit -force_cpusubtype_ALL option.
4868 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004869
Eric Christopherfc3ee562012-01-10 00:38:01 +00004870 // Determine the original source input.
4871 const Action *SourceAction = &JA;
4872 while (SourceAction->getKind() != Action::InputClass) {
4873 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4874 SourceAction = SourceAction->getInputs()[0];
4875 }
4876
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004877 // Forward -g and handle debug info related flags, assuming we are dealing
4878 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004879 if (SourceAction->getType() == types::TY_Asm ||
4880 SourceAction->getType() == types::TY_PP_Asm) {
4881 Args.ClaimAllArgs(options::OPT_g_Group);
4882 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4883 if (!A->getOption().matches(options::OPT_g0))
4884 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004885
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004886 if (Args.hasArg(options::OPT_gdwarf_2))
4887 CmdArgs.push_back("-gdwarf-2");
4888 if (Args.hasArg(options::OPT_gdwarf_3))
4889 CmdArgs.push_back("-gdwarf-3");
4890 if (Args.hasArg(options::OPT_gdwarf_4))
4891 CmdArgs.push_back("-gdwarf-4");
4892
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004893 // Add the -fdebug-compilation-dir flag if needed.
4894 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004895
4896 // Set the AT_producer to the clang version when using the integrated
4897 // assembler on assembly source files.
4898 CmdArgs.push_back("-dwarf-debug-producer");
4899 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004900 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004901
4902 // Optionally embed the -cc1as level arguments into the debug info, for build
4903 // analysis.
4904 if (getToolChain().UseDwarfDebugFlags()) {
4905 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004906 for (const auto &Arg : Args)
4907 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004908
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004909 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004910 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4911 Flags += Exec;
4912 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004913 SmallString<128> EscapedArg;
4914 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00004915 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004916 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00004917 }
4918 CmdArgs.push_back("-dwarf-debug-flags");
4919 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4920 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004921
4922 // FIXME: Add -static support, once we have it.
4923
David Blaikie372d9502014-01-17 03:17:40 +00004924 // Consume all the warning flags. Usually this would be handled more
4925 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4926 // doesn't handle that so rather than warning about unused flags that are
4927 // actually used, we'll lie by omission instead.
4928 // FIXME: Stop lying and consume only the appropriate driver flags
4929 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4930 ie = Args.filtered_end();
4931 it != ie; ++it)
4932 (*it)->claim();
4933
David Blaikie9260ed62013-07-25 21:19:01 +00004934 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4935 getToolChain().getDriver());
4936
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004937 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004938
4939 assert(Output.isFilename() && "Unexpected lipo output.");
4940 CmdArgs.push_back("-o");
4941 CmdArgs.push_back(Output.getFilename());
4942
Daniel Dunbarb440f562010-08-02 02:38:21 +00004943 assert(Input.isFilename() && "Invalid input.");
4944 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004945
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004946 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00004947 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004948
4949 // Handle the debug info splitting at object creation time if we're
4950 // creating an object.
4951 // TODO: Currently only works on linux with newer objcopy.
4952 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004953 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004954 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4955 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004956}
4957
Reid Kleckner0290c9c2014-09-15 17:45:39 +00004958void GnuTool::anchor() {}
4959
Daniel Dunbara3246a02009-03-18 08:07:30 +00004960void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004961 const InputInfo &Output,
4962 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004963 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004964 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004965 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004966 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004967
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004968 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004969 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004970 // Don't forward any -g arguments to assembly steps.
4971 if (isa<AssembleJobAction>(JA) &&
4972 A->getOption().matches(options::OPT_g_Group))
4973 continue;
4974
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004975 // Don't forward any -W arguments to assembly and link steps.
4976 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4977 A->getOption().matches(options::OPT_W_Group))
4978 continue;
4979
Daniel Dunbar2da02722009-03-19 07:55:12 +00004980 // It is unfortunate that we have to claim here, as this means
4981 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004982 // platforms using a generic gcc, even if we are just using gcc
4983 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004984 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004985 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004986 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004987 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004988
Daniel Dunbar4e295052010-01-25 22:35:08 +00004989 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004990
4991 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004992 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004993 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00004994 CmdArgs.push_back(
4995 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004996 }
4997
Daniel Dunbar5716d872009-05-02 21:41:52 +00004998 // Try to force gcc to match the tool chain we want, if we recognize
4999 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005000 //
5001 // FIXME: The triple class should directly provide the information we want
5002 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005003 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005004 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005005 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005006 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5007 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005008 CmdArgs.push_back("-m64");
5009
Daniel Dunbarb440f562010-08-02 02:38:21 +00005010 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005011 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005012 CmdArgs.push_back(Output.getFilename());
5013 } else {
5014 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005015 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005016 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005017
Tony Linthicum76329bf2011-12-12 21:14:55 +00005018 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5019 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005020
5021 // Only pass -x if gcc will understand it; otherwise hope gcc
5022 // understands the suffix correctly. The main use case this would go
5023 // wrong in is for linker inputs if they happened to have an odd
5024 // suffix; really the only way to get this to happen is a command
5025 // like '-x foobar a.c' which will treat a.c like a linker input.
5026 //
5027 // FIXME: For the linker case specifically, can we safely convert
5028 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005029 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005030 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005031 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5032 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005033 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005034 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005035 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005036 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005037 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005038 else if (II.getType() == types::TY_ModuleFile)
5039 D.Diag(diag::err_drv_no_module_support)
5040 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005041
Daniel Dunbara3246a02009-03-18 08:07:30 +00005042 if (types::canTypeBeUserSpecified(II.getType())) {
5043 CmdArgs.push_back("-x");
5044 CmdArgs.push_back(types::getTypeName(II.getType()));
5045 }
5046
Daniel Dunbarb440f562010-08-02 02:38:21 +00005047 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005048 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005049 else {
5050 const Arg &A = II.getInputArg();
5051
5052 // Reverse translate some rewritten options.
5053 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5054 CmdArgs.push_back("-lstdc++");
5055 continue;
5056 }
5057
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005058 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005059 A.render(Args, CmdArgs);
5060 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005061 }
5062
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005063 const std::string customGCCName = D.getCCCGenericGCCName();
5064 const char *GCCName;
5065 if (!customGCCName.empty())
5066 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005067 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005068 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005069 } else
5070 GCCName = "gcc";
5071
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005072 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005073 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005074 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005075}
5076
Daniel Dunbar4e295052010-01-25 22:35:08 +00005077void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5078 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005079 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005080}
5081
Daniel Dunbar4e295052010-01-25 22:35:08 +00005082void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5083 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005084 const Driver &D = getToolChain().getDriver();
5085
Daniel Dunbar4e295052010-01-25 22:35:08 +00005086 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005087 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
5088 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00005089 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005090 else {
5091 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005092 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005093 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005094
Daniel Dunbar4e295052010-01-25 22:35:08 +00005095 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005096 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005097}
5098
Daniel Dunbar4e295052010-01-25 22:35:08 +00005099void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5100 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005101 // The types are (hopefully) good enough.
5102}
5103
Tony Linthicum76329bf2011-12-12 21:14:55 +00005104// Hexagon tools start.
5105void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5106 ArgStringList &CmdArgs) const {
5107
5108}
5109void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5110 const InputInfo &Output,
5111 const InputInfoList &Inputs,
5112 const ArgList &Args,
5113 const char *LinkingOutput) const {
5114
5115 const Driver &D = getToolChain().getDriver();
5116 ArgStringList CmdArgs;
5117
5118 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005119 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005120 CmdArgs.push_back(Args.MakeArgString(MarchString));
5121
5122 RenderExtraToolArgs(JA, CmdArgs);
5123
5124 if (Output.isFilename()) {
5125 CmdArgs.push_back("-o");
5126 CmdArgs.push_back(Output.getFilename());
5127 } else {
5128 assert(Output.isNothing() && "Unexpected output");
5129 CmdArgs.push_back("-fsyntax-only");
5130 }
5131
Matthew Curtise8f80a12012-12-06 17:49:03 +00005132 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5133 if (!SmallDataThreshold.empty())
5134 CmdArgs.push_back(
5135 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005136
Matthew Curtise5df3812012-12-07 17:23:04 +00005137 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5138 options::OPT_Xassembler);
5139
Tony Linthicum76329bf2011-12-12 21:14:55 +00005140 // Only pass -x if gcc will understand it; otherwise hope gcc
5141 // understands the suffix correctly. The main use case this would go
5142 // wrong in is for linker inputs if they happened to have an odd
5143 // suffix; really the only way to get this to happen is a command
5144 // like '-x foobar a.c' which will treat a.c like a linker input.
5145 //
5146 // FIXME: For the linker case specifically, can we safely convert
5147 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005148 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005149 // Don't try to pass LLVM or AST inputs to a generic gcc.
5150 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5151 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5152 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5153 << getToolChain().getTripleString();
5154 else if (II.getType() == types::TY_AST)
5155 D.Diag(clang::diag::err_drv_no_ast_support)
5156 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005157 else if (II.getType() == types::TY_ModuleFile)
5158 D.Diag(diag::err_drv_no_module_support)
5159 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005160
5161 if (II.isFilename())
5162 CmdArgs.push_back(II.getFilename());
5163 else
5164 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5165 II.getInputArg().render(Args, CmdArgs);
5166 }
5167
5168 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005169 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005170 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005171}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005172
Tony Linthicum76329bf2011-12-12 21:14:55 +00005173void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5174 ArgStringList &CmdArgs) const {
5175 // The types are (hopefully) good enough.
5176}
5177
5178void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5179 const InputInfo &Output,
5180 const InputInfoList &Inputs,
5181 const ArgList &Args,
5182 const char *LinkingOutput) const {
5183
Matthew Curtise689b052012-12-06 15:46:07 +00005184 const toolchains::Hexagon_TC& ToolChain =
5185 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5186 const Driver &D = ToolChain.getDriver();
5187
Tony Linthicum76329bf2011-12-12 21:14:55 +00005188 ArgStringList CmdArgs;
5189
Matthew Curtise689b052012-12-06 15:46:07 +00005190 //----------------------------------------------------------------------------
5191 //
5192 //----------------------------------------------------------------------------
5193 bool hasStaticArg = Args.hasArg(options::OPT_static);
5194 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005195 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005196 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5197 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5198 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5199 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005200
Matthew Curtise689b052012-12-06 15:46:07 +00005201 //----------------------------------------------------------------------------
5202 // Silence warnings for various options
5203 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005204
Matthew Curtise689b052012-12-06 15:46:07 +00005205 Args.ClaimAllArgs(options::OPT_g_Group);
5206 Args.ClaimAllArgs(options::OPT_emit_llvm);
5207 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5208 // handled somewhere else.
5209 Args.ClaimAllArgs(options::OPT_static_libgcc);
5210
5211 //----------------------------------------------------------------------------
5212 //
5213 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005214 for (const auto &Opt : ToolChain.ExtraOpts)
5215 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005216
Matthew Curtisf10a5952012-12-06 14:16:43 +00005217 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5218 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005219
Matthew Curtise689b052012-12-06 15:46:07 +00005220 if (buildingLib) {
5221 CmdArgs.push_back("-shared");
5222 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5223 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005224 }
5225
Matthew Curtise689b052012-12-06 15:46:07 +00005226 if (hasStaticArg)
5227 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005228
Matthew Curtise8f80a12012-12-06 17:49:03 +00005229 if (buildPIE && !buildingLib)
5230 CmdArgs.push_back("-pie");
5231
5232 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5233 if (!SmallDataThreshold.empty()) {
5234 CmdArgs.push_back(
5235 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5236 }
5237
Matthew Curtise689b052012-12-06 15:46:07 +00005238 //----------------------------------------------------------------------------
5239 //
5240 //----------------------------------------------------------------------------
5241 CmdArgs.push_back("-o");
5242 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005243
Matthew Curtise689b052012-12-06 15:46:07 +00005244 const std::string MarchSuffix = "/" + MarchString;
5245 const std::string G0Suffix = "/G0";
5246 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005247 const std::string RootDir =
5248 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005249 const std::string StartFilesDir = RootDir
5250 + "hexagon/lib"
5251 + (buildingLib
5252 ? MarchG0Suffix : MarchSuffix);
5253
5254 //----------------------------------------------------------------------------
5255 // moslib
5256 //----------------------------------------------------------------------------
5257 std::vector<std::string> oslibs;
5258 bool hasStandalone= false;
5259
5260 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5261 ie = Args.filtered_end(); it != ie; ++it) {
5262 (*it)->claim();
5263 oslibs.push_back((*it)->getValue());
5264 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005265 }
Matthew Curtise689b052012-12-06 15:46:07 +00005266 if (oslibs.empty()) {
5267 oslibs.push_back("standalone");
5268 hasStandalone = true;
5269 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005270
Matthew Curtise689b052012-12-06 15:46:07 +00005271 //----------------------------------------------------------------------------
5272 // Start Files
5273 //----------------------------------------------------------------------------
5274 if (incStdLib && incStartFiles) {
5275
5276 if (!buildingLib) {
5277 if (hasStandalone) {
5278 CmdArgs.push_back(
5279 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5280 }
5281 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5282 }
5283 std::string initObj = useShared ? "/initS.o" : "/init.o";
5284 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5285 }
5286
5287 //----------------------------------------------------------------------------
5288 // Library Search Paths
5289 //----------------------------------------------------------------------------
5290 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005291 for (const auto &LibPath : LibPaths)
5292 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005293
5294 //----------------------------------------------------------------------------
5295 //
5296 //----------------------------------------------------------------------------
5297 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5298 Args.AddAllArgs(CmdArgs, options::OPT_e);
5299 Args.AddAllArgs(CmdArgs, options::OPT_s);
5300 Args.AddAllArgs(CmdArgs, options::OPT_t);
5301 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5302
5303 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5304
5305 //----------------------------------------------------------------------------
5306 // Libraries
5307 //----------------------------------------------------------------------------
5308 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005309 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005310 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5311 CmdArgs.push_back("-lm");
5312 }
5313
5314 CmdArgs.push_back("--start-group");
5315
5316 if (!buildingLib) {
5317 for(std::vector<std::string>::iterator i = oslibs.begin(),
5318 e = oslibs.end(); i != e; ++i)
5319 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5320 CmdArgs.push_back("-lc");
5321 }
5322 CmdArgs.push_back("-lgcc");
5323
5324 CmdArgs.push_back("--end-group");
5325 }
5326
5327 //----------------------------------------------------------------------------
5328 // End files
5329 //----------------------------------------------------------------------------
5330 if (incStdLib && incStartFiles) {
5331 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5332 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5333 }
5334
5335 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005336 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5337 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005338}
5339// Hexagon tools end.
5340
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005341/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005342const char *arm::getARMCPUForMArch(const ArgList &Args,
5343 const llvm::Triple &Triple) {
5344 StringRef MArch;
5345 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5346 // Otherwise, if we have -march= choose the base CPU for that arch.
5347 MArch = A->getValue();
5348 } else {
5349 // Otherwise, use the Arch from the triple.
5350 MArch = Triple.getArchName();
5351 }
5352
5353 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005354 if (MArch == "native") {
5355 std::string CPU = llvm::sys::getHostCPUName();
5356 if (CPU != "generic") {
5357 // Translate the native cpu into the architecture. The switch below will
5358 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005359 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005360 }
5361 }
5362
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005363 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005364}
5365
5366/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005367StringRef arm::getARMTargetCPU(const ArgList &Args,
5368 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005369 // FIXME: Warn on inconsistent use of -mcpu and -march.
5370 // If we have -mcpu=, use that.
5371 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5372 StringRef MCPU = A->getValue();
5373 // Handle -mcpu=native.
5374 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005375 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005376 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005377 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005378 }
5379
5380 return getARMCPUForMArch(Args, Triple);
5381}
5382
5383/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5384/// CPU.
5385//
5386// FIXME: This is redundant with -mcpu, why does LLVM use this.
5387// FIXME: tblgen this, or kill it!
5388const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5389 return llvm::StringSwitch<const char *>(CPU)
5390 .Case("strongarm", "v4")
5391 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5392 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5393 .Cases("arm920", "arm920t", "arm922t", "v4t")
5394 .Cases("arm940t", "ep9312","v4t")
5395 .Cases("arm10tdmi", "arm1020t", "v5")
5396 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5397 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5398 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5399 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5400 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5401 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005402 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005403 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005404 .Cases("cortex-r4", "cortex-r5", "v7r")
5405 .Case("cortex-m0", "v6m")
5406 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005407 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005408 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005409 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005410 .Cases("cortex-a53", "cortex-a57", "v8")
5411 .Default("");
5412}
5413
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005414bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5415 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5416 return A && (A->getValue() == StringRef(Value));
5417}
5418
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005419bool mips::isUCLibc(const ArgList &Args) {
5420 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005421 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005422}
5423
Daniel Sanders2bf13662014-07-10 14:40:57 +00005424bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005425 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5426 return llvm::StringSwitch<bool>(NaNArg->getValue())
5427 .Case("2008", true)
5428 .Case("legacy", false)
5429 .Default(false);
5430
5431 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005432 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5433 .Cases("mips32r6", "mips64r6", true)
5434 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005435
5436 return false;
5437}
5438
Daniel Sanders379d44b2014-07-16 11:52:23 +00005439bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5440 StringRef ABIName) {
5441 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005442 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005443 return false;
5444
5445 if (ABIName != "32")
5446 return false;
5447
5448 return llvm::StringSwitch<bool>(CPUName)
5449 .Cases("mips2", "mips3", "mips4", "mips5", true)
5450 .Cases("mips32", "mips32r2", true)
5451 .Cases("mips64", "mips64r2", true)
5452 .Default(false);
5453}
5454
Tim Northover157d9112014-01-16 08:48:16 +00005455llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005456 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5457 // archs which Darwin doesn't use.
5458
5459 // The matching this routine does is fairly pointless, since it is neither the
5460 // complete architecture list, nor a reasonable subset. The problem is that
5461 // historically the driver driver accepts this and also ties its -march=
5462 // handling to the architecture name, so we need to be careful before removing
5463 // support for it.
5464
5465 // This code must be kept in sync with Clang's Darwin specific argument
5466 // translation.
5467
5468 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5469 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5470 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5471 .Case("ppc64", llvm::Triple::ppc64)
5472 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5473 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5474 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005475 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005476 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005477 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005478 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005479 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005480 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005481 .Case("r600", llvm::Triple::r600)
5482 .Case("nvptx", llvm::Triple::nvptx)
5483 .Case("nvptx64", llvm::Triple::nvptx64)
5484 .Case("amdil", llvm::Triple::amdil)
5485 .Case("spir", llvm::Triple::spir)
5486 .Default(llvm::Triple::UnknownArch);
5487}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005488
Tim Northover157d9112014-01-16 08:48:16 +00005489void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5490 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5491 T.setArch(Arch);
5492
5493 if (Str == "x86_64h")
5494 T.setArchName(Str);
5495 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5496 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005497 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005498 }
5499}
5500
Bob Wilsondecc03e2012-11-23 06:14:39 +00005501const char *Clang::getBaseInputName(const ArgList &Args,
5502 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005503 return Args.MakeArgString(
5504 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005505}
5506
Bob Wilsondecc03e2012-11-23 06:14:39 +00005507const char *Clang::getBaseInputStem(const ArgList &Args,
5508 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005509 const char *Str = getBaseInputName(Args, Inputs);
5510
Chris Lattner906bb902011-01-16 08:14:11 +00005511 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005512 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005513
5514 return Str;
5515}
5516
Bob Wilsondecc03e2012-11-23 06:14:39 +00005517const char *Clang::getDependencyFileName(const ArgList &Args,
5518 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005519 // FIXME: Think about this more.
5520 std::string Res;
5521
5522 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005523 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005524 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005525 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005526 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005527 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005528 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005529}
5530
Daniel Dunbarbe220842009-03-20 16:06:39 +00005531void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005532 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005533 const InputInfoList &Inputs,
5534 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005535 const char *LinkingOutput) const {
5536 ArgStringList CmdArgs;
5537
5538 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5539 const InputInfo &Input = Inputs[0];
5540
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005541 // Determine the original source input.
5542 const Action *SourceAction = &JA;
5543 while (SourceAction->getKind() != Action::InputClass) {
5544 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5545 SourceAction = SourceAction->getInputs()[0];
5546 }
5547
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005548 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005549 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005550 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5551 // FIXME: at run-time detect assembler capabilities or rely on version
5552 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005553 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005554 const llvm::Triple &T(getToolChain().getTriple());
5555 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005556 CmdArgs.push_back("-Q");
5557 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005558
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005559 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005560 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005561 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005562 if (Args.hasArg(options::OPT_gstabs))
5563 CmdArgs.push_back("--gstabs");
5564 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005565 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005566 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005567
Daniel Dunbarbe220842009-03-20 16:06:39 +00005568 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005569 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005570
Daniel Dunbar6d484762010-07-22 01:47:22 +00005571 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005572 if (getToolChain().getArch() == llvm::Triple::x86 ||
5573 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005574 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5575 CmdArgs.push_back("-force_cpusubtype_ALL");
5576
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005577 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005578 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005579 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005580 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005581 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005582 CmdArgs.push_back("-static");
5583
Daniel Dunbarbe220842009-03-20 16:06:39 +00005584 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5585 options::OPT_Xassembler);
5586
5587 assert(Output.isFilename() && "Unexpected lipo output.");
5588 CmdArgs.push_back("-o");
5589 CmdArgs.push_back(Output.getFilename());
5590
Daniel Dunbarb440f562010-08-02 02:38:21 +00005591 assert(Input.isFilename() && "Invalid input.");
5592 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005593
5594 // asm_final spec is empty.
5595
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005596 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005597 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005598 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005599}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005600
Tim Northover157d9112014-01-16 08:48:16 +00005601void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005602
Tim Northover157d9112014-01-16 08:48:16 +00005603void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5604 ArgStringList &CmdArgs) const {
5605 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005606
Daniel Dunbarc1964212009-03-26 16:23:12 +00005607 // Derived from darwin_arch spec.
5608 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005609 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005610
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005611 // FIXME: Is this needed anymore?
5612 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005613 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005614}
5615
Bill Wendling3b2000f2012-10-02 18:02:50 +00005616bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5617 // We only need to generate a temp path for LTO if we aren't compiling object
5618 // files. When compiling source files, we run 'dsymutil' after linking. We
5619 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005620 for (const auto &Input : Inputs)
5621 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005622 return true;
5623
5624 return false;
5625}
5626
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005627void darwin::Link::AddLinkArgs(Compilation &C,
5628 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005629 ArgStringList &CmdArgs,
5630 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005631 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005632 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005633
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005634 unsigned Version[3] = { 0, 0, 0 };
5635 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5636 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005637 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005638 Version[1], Version[2], HadExtra) ||
5639 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005640 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005641 << A->getAsString(Args);
5642 }
5643
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005644 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005645 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005646 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5647 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005648
Bob Wilson3d27dad2013-08-02 22:25:34 +00005649 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5650 CmdArgs.push_back("-export_dynamic");
5651
Bill Wendling313b6bf2012-11-16 23:03:00 +00005652 // If we are using LTO, then automatically create a temporary file path for
5653 // the linker to use, so that it's lifetime will extend past a possible
5654 // dsymutil step.
5655 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5656 const char *TmpPath = C.getArgs().MakeArgString(
5657 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5658 C.addTempFile(TmpPath);
5659 CmdArgs.push_back("-object_path_lto");
5660 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005661 }
5662
Daniel Dunbarc1964212009-03-26 16:23:12 +00005663 // Derived from the "link" spec.
5664 Args.AddAllArgs(CmdArgs, options::OPT_static);
5665 if (!Args.hasArg(options::OPT_static))
5666 CmdArgs.push_back("-dynamic");
5667 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5668 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5669 // here. How do we wish to handle such things?
5670 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005671
Daniel Dunbarc1964212009-03-26 16:23:12 +00005672 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005673 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005674 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005675 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005676
5677 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5678 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5679 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5680
5681 Arg *A;
5682 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5683 (A = Args.getLastArg(options::OPT_current__version)) ||
5684 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005685 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005686 << A->getAsString(Args) << "-dynamiclib";
5687
5688 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5689 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5690 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5691 } else {
5692 CmdArgs.push_back("-dylib");
5693
5694 Arg *A;
5695 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5696 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5697 (A = Args.getLastArg(options::OPT_client__name)) ||
5698 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5699 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5700 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005701 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005702 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005703
Daniel Dunbarc1964212009-03-26 16:23:12 +00005704 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5705 "-dylib_compatibility_version");
5706 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5707 "-dylib_current_version");
5708
Tim Northover157d9112014-01-16 08:48:16 +00005709 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005710
5711 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5712 "-dylib_install_name");
5713 }
5714
5715 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5716 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5717 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005718 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005719 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005720 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5721 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5722 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5723 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5724 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5725 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005726 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005727 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5728 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5729 Args.AddAllArgs(CmdArgs, options::OPT_init);
5730
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005731 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005732 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005733
Daniel Dunbarc1964212009-03-26 16:23:12 +00005734 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5735 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5736 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5737 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5738 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005739
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005740 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5741 options::OPT_fno_pie,
5742 options::OPT_fno_PIE)) {
5743 if (A->getOption().matches(options::OPT_fpie) ||
5744 A->getOption().matches(options::OPT_fPIE))
5745 CmdArgs.push_back("-pie");
5746 else
5747 CmdArgs.push_back("-no_pie");
5748 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005749
5750 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5751 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5752 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5753 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5754 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5755 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5756 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5757 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5758 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5759 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5760 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5761 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5762 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5763 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5764 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5765 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005766
Daniel Dunbar84384642011-05-02 21:03:47 +00005767 // Give --sysroot= preference, over the Apple specific behavior to also use
5768 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005769 StringRef sysroot = C.getSysRoot();
5770 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005771 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005772 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005773 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5774 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005775 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005776 }
5777
Daniel Dunbarc1964212009-03-26 16:23:12 +00005778 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5779 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5780 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5781 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5782 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005783 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005784 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5785 Args.AddAllArgs(CmdArgs, options::OPT_y);
5786 Args.AddLastArg(CmdArgs, options::OPT_w);
5787 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5788 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5789 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5790 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5791 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5792 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5793 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5794 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5795 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5796 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5797 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5798 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5799}
5800
Alexey Bataev186b28a2014-03-06 05:43:53 +00005801enum LibOpenMP {
5802 LibUnknown,
5803 LibGOMP,
5804 LibIOMP5
5805};
5806
Daniel Dunbarc1964212009-03-26 16:23:12 +00005807void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005808 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005809 const InputInfoList &Inputs,
5810 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005811 const char *LinkingOutput) const {
5812 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005813
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005814 // If the number of arguments surpasses the system limits, we will encode the
5815 // input files in a separate file, shortening the command line. To this end,
5816 // build a list of input file names that can be passed via a file with the
5817 // -filelist linker option.
5818 llvm::opt::ArgStringList InputFileList;
5819
Daniel Dunbarc1964212009-03-26 16:23:12 +00005820 // The logic here is derived from gcc's behavior; most of which
5821 // comes from specs (starting with link_command). Consult gcc for
5822 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005823 ArgStringList CmdArgs;
5824
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005825 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5826 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5827 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005828 for (const auto &Arg : Args)
5829 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005830 const char *Exec =
5831 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5832 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005833 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005834 return;
5835 }
5836
Daniel Dunbarc1964212009-03-26 16:23:12 +00005837 // I'm not sure why this particular decomposition exists in gcc, but
5838 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005839 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005840
Daniel Dunbarc1964212009-03-26 16:23:12 +00005841 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5842 Args.AddAllArgs(CmdArgs, options::OPT_s);
5843 Args.AddAllArgs(CmdArgs, options::OPT_t);
5844 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5845 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005846 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005847 Args.AddAllArgs(CmdArgs, options::OPT_r);
5848
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005849 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5850 // members of static archive libraries which implement Objective-C classes or
5851 // categories.
5852 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5853 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005854
Daniel Dunbarc1964212009-03-26 16:23:12 +00005855 CmdArgs.push_back("-o");
5856 CmdArgs.push_back(Output.getFilename());
5857
Chad Rosier06fd3c62012-05-16 23:45:12 +00005858 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005859 !Args.hasArg(options::OPT_nostartfiles))
5860 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005861
5862 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005863
Alexey Bataev186b28a2014-03-06 05:43:53 +00005864 LibOpenMP UsedOpenMPLib = LibUnknown;
5865 if (Args.hasArg(options::OPT_fopenmp)) {
5866 UsedOpenMPLib = LibGOMP;
5867 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5868 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5869 .Case("libgomp", LibGOMP)
5870 .Case("libiomp5", LibIOMP5)
5871 .Default(LibUnknown);
5872 if (UsedOpenMPLib == LibUnknown)
5873 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5874 << A->getOption().getName() << A->getValue();
5875 }
5876 switch (UsedOpenMPLib) {
5877 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005878 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005879 break;
5880 case LibIOMP5:
5881 CmdArgs.push_back("-liomp5");
5882 break;
5883 case LibUnknown:
5884 break;
5885 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005886
Douglas Gregor9295df02012-05-15 21:00:27 +00005887 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005888 // Build the input file for -filelist (list of linker input files) in case we
5889 // need it later
5890 for (const auto &II : Inputs) {
5891 if (!II.isFilename()) {
5892 // This is a linker input argument.
5893 // We cannot mix input arguments and file names in a -filelist input, thus
5894 // we prematurely stop our list (remaining files shall be passed as
5895 // arguments).
5896 if (InputFileList.size() > 0)
5897 break;
5898
5899 continue;
5900 }
5901
5902 InputFileList.push_back(II.getFilename());
5903 }
5904
Bob Wilson16d93952012-05-15 18:57:39 +00005905 if (isObjCRuntimeLinked(Args) &&
5906 !Args.hasArg(options::OPT_nostdlib) &&
5907 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005908 // We use arclite library for both ARC and subscripting support.
5909 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5910
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005911 CmdArgs.push_back("-framework");
5912 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005913 // Link libobj.
5914 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005915 }
John McCall31168b02011-06-15 23:02:42 +00005916
Daniel Dunbarc1964212009-03-26 16:23:12 +00005917 if (LinkingOutput) {
5918 CmdArgs.push_back("-arch_multiple");
5919 CmdArgs.push_back("-final_output");
5920 CmdArgs.push_back(LinkingOutput);
5921 }
5922
Daniel Dunbarc1964212009-03-26 16:23:12 +00005923 if (Args.hasArg(options::OPT_fnested_functions))
5924 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005925
Daniel Dunbarc1964212009-03-26 16:23:12 +00005926 if (!Args.hasArg(options::OPT_nostdlib) &&
5927 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005928 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005929 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005930
Daniel Dunbarc1964212009-03-26 16:23:12 +00005931 // link_ssp spec is empty.
5932
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005933 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005934 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005935 }
5936
Chad Rosier06fd3c62012-05-16 23:45:12 +00005937 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005938 !Args.hasArg(options::OPT_nostartfiles)) {
5939 // endfile_spec is empty.
5940 }
5941
5942 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5943 Args.AddAllArgs(CmdArgs, options::OPT_F);
5944
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005945 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00005946 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005947 std::unique_ptr<Command> Cmd =
5948 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
5949 Cmd->setInputFileList(std::move(InputFileList));
5950 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005951}
5952
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005953void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005954 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005955 const InputInfoList &Inputs,
5956 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005957 const char *LinkingOutput) const {
5958 ArgStringList CmdArgs;
5959
5960 CmdArgs.push_back("-create");
5961 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005962
5963 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005964 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005965
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005966 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005967 assert(II.isFilename() && "Unexpected lipo input.");
5968 CmdArgs.push_back(II.getFilename());
5969 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005970
5971 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00005972 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005973}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005974
Daniel Dunbar88299622010-06-04 18:28:36 +00005975void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005976 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005977 const InputInfoList &Inputs,
5978 const ArgList &Args,
5979 const char *LinkingOutput) const {
5980 ArgStringList CmdArgs;
5981
Daniel Dunbareb86b042011-05-09 17:23:16 +00005982 CmdArgs.push_back("-o");
5983 CmdArgs.push_back(Output.getFilename());
5984
Daniel Dunbar88299622010-06-04 18:28:36 +00005985 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5986 const InputInfo &Input = Inputs[0];
5987 assert(Input.isFilename() && "Unexpected dsymutil input.");
5988 CmdArgs.push_back(Input.getFilename());
5989
Daniel Dunbar88299622010-06-04 18:28:36 +00005990 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005991 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00005992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005993}
5994
Eric Christopher551ef452011-08-23 17:56:55 +00005995void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005996 const InputInfo &Output,
5997 const InputInfoList &Inputs,
5998 const ArgList &Args,
5999 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006000 ArgStringList CmdArgs;
6001 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006002 CmdArgs.push_back("--debug-info");
6003 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006004 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006005
6006 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6007 const InputInfo &Input = Inputs[0];
6008 assert(Input.isFilename() && "Unexpected verify input");
6009
6010 // Grabbing the output of the earlier dsymutil run.
6011 CmdArgs.push_back(Input.getFilename());
6012
6013 const char *Exec =
6014 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006015 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006016}
6017
David Chisnallf571cde2012-02-15 13:39:01 +00006018void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6019 const InputInfo &Output,
6020 const InputInfoList &Inputs,
6021 const ArgList &Args,
6022 const char *LinkingOutput) const {
6023 ArgStringList CmdArgs;
6024
6025 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6026 options::OPT_Xassembler);
6027
6028 CmdArgs.push_back("-o");
6029 CmdArgs.push_back(Output.getFilename());
6030
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006031 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006032 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006033
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006034 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006035 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006036}
6037
David Chisnallf571cde2012-02-15 13:39:01 +00006038void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6039 const InputInfo &Output,
6040 const InputInfoList &Inputs,
6041 const ArgList &Args,
6042 const char *LinkingOutput) const {
6043 // FIXME: Find a real GCC, don't hard-code versions here
6044 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6045 const llvm::Triple &T = getToolChain().getTriple();
6046 std::string LibPath = "/usr/lib/";
6047 llvm::Triple::ArchType Arch = T.getArch();
6048 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006049 case llvm::Triple::x86:
6050 GCCLibPath +=
6051 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6052 break;
6053 case llvm::Triple::x86_64:
6054 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6055 GCCLibPath += "/4.5.2/amd64/";
6056 LibPath += "amd64/";
6057 break;
6058 default:
6059 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006060 }
6061
6062 ArgStringList CmdArgs;
6063
David Chisnall272a0712012-02-29 15:06:12 +00006064 // Demangle C++ names in errors
6065 CmdArgs.push_back("-C");
6066
David Chisnallf571cde2012-02-15 13:39:01 +00006067 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6068 (!Args.hasArg(options::OPT_shared))) {
6069 CmdArgs.push_back("-e");
6070 CmdArgs.push_back("_start");
6071 }
6072
6073 if (Args.hasArg(options::OPT_static)) {
6074 CmdArgs.push_back("-Bstatic");
6075 CmdArgs.push_back("-dn");
6076 } else {
6077 CmdArgs.push_back("-Bdynamic");
6078 if (Args.hasArg(options::OPT_shared)) {
6079 CmdArgs.push_back("-shared");
6080 } else {
6081 CmdArgs.push_back("--dynamic-linker");
6082 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6083 }
6084 }
6085
6086 if (Output.isFilename()) {
6087 CmdArgs.push_back("-o");
6088 CmdArgs.push_back(Output.getFilename());
6089 } else {
6090 assert(Output.isNothing() && "Invalid output.");
6091 }
6092
6093 if (!Args.hasArg(options::OPT_nostdlib) &&
6094 !Args.hasArg(options::OPT_nostartfiles)) {
6095 if (!Args.hasArg(options::OPT_shared)) {
6096 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6097 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006098 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006099 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6100 } else {
6101 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006102 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6103 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006104 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006105 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006106 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006107 }
6108
6109 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6110
6111 Args.AddAllArgs(CmdArgs, options::OPT_L);
6112 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6113 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006114 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006115
6116 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6117
6118 if (!Args.hasArg(options::OPT_nostdlib) &&
6119 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006120 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006121 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006122 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006123 if (!Args.hasArg(options::OPT_shared)) {
6124 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006125 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006126 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006127 }
David Chisnallf571cde2012-02-15 13:39:01 +00006128 }
6129
6130 if (!Args.hasArg(options::OPT_nostdlib) &&
6131 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006132 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006133 }
David Chisnall96de9932012-02-16 16:00:47 +00006134 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006135
Alexey Samsonov7811d192014-02-20 13:57:37 +00006136 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006137
6138 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006139 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006140 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006141}
6142
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006143void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006144 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006145 const InputInfoList &Inputs,
6146 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006147 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006148 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006149 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006150
Rafael Espindolacc126272014-02-28 01:55:21 +00006151 switch (getToolChain().getArch()) {
6152 case llvm::Triple::x86:
6153 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6154 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006155 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006156 break;
6157
6158 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006159 CmdArgs.push_back("-mppc");
6160 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006161 break;
6162
6163 case llvm::Triple::sparc:
6164 CmdArgs.push_back("-32");
6165 NeedsKPIC = true;
6166 break;
6167
6168 case llvm::Triple::sparcv9:
6169 CmdArgs.push_back("-64");
6170 CmdArgs.push_back("-Av9a");
6171 NeedsKPIC = true;
6172 break;
6173
6174 case llvm::Triple::mips64:
6175 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006176 StringRef CPUName;
6177 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006178 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006179
6180 CmdArgs.push_back("-mabi");
6181 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6182
6183 if (getToolChain().getArch() == llvm::Triple::mips64)
6184 CmdArgs.push_back("-EB");
6185 else
6186 CmdArgs.push_back("-EL");
6187
Rafael Espindolacc126272014-02-28 01:55:21 +00006188 NeedsKPIC = true;
6189 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006190 }
6191
Rafael Espindolacc126272014-02-28 01:55:21 +00006192 default:
6193 break;
6194 }
6195
6196 if (NeedsKPIC)
6197 addAssemblerKPIC(Args, CmdArgs);
6198
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006199 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6200 options::OPT_Xassembler);
6201
6202 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006203 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006205 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006206 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006207
6208 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006209 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006210 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006211}
6212
6213void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006214 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006215 const InputInfoList &Inputs,
6216 const ArgList &Args,
6217 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006218 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006219 ArgStringList CmdArgs;
6220
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006221 // Silence warning for "clang -g foo.o -o foo"
6222 Args.ClaimAllArgs(options::OPT_g_Group);
6223 // and "clang -emit-llvm foo.o -o foo"
6224 Args.ClaimAllArgs(options::OPT_emit_llvm);
6225 // and for "clang -w foo.o -o foo". Other warning options are already
6226 // handled somewhere else.
6227 Args.ClaimAllArgs(options::OPT_w);
6228
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006229 if (getToolChain().getArch() == llvm::Triple::mips64)
6230 CmdArgs.push_back("-EB");
6231 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6232 CmdArgs.push_back("-EL");
6233
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006234 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006235 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006236 CmdArgs.push_back("-e");
6237 CmdArgs.push_back("__start");
6238 }
6239
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006240 if (Args.hasArg(options::OPT_static)) {
6241 CmdArgs.push_back("-Bstatic");
6242 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006243 if (Args.hasArg(options::OPT_rdynamic))
6244 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006245 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006246 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006247 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006248 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006249 } else {
6250 CmdArgs.push_back("-dynamic-linker");
6251 CmdArgs.push_back("/usr/libexec/ld.so");
6252 }
6253 }
6254
Rafael Espindola044f7832013-06-05 04:28:55 +00006255 if (Args.hasArg(options::OPT_nopie))
6256 CmdArgs.push_back("-nopie");
6257
Daniel Dunbarb440f562010-08-02 02:38:21 +00006258 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006259 CmdArgs.push_back("-o");
6260 CmdArgs.push_back(Output.getFilename());
6261 } else {
6262 assert(Output.isNothing() && "Invalid output.");
6263 }
6264
6265 if (!Args.hasArg(options::OPT_nostdlib) &&
6266 !Args.hasArg(options::OPT_nostartfiles)) {
6267 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006268 if (Args.hasArg(options::OPT_pg))
6269 CmdArgs.push_back(Args.MakeArgString(
6270 getToolChain().GetFilePath("gcrt0.o")));
6271 else
6272 CmdArgs.push_back(Args.MakeArgString(
6273 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006274 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006275 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006276 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006277 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006278 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006279 }
6280 }
6281
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006282 std::string Triple = getToolChain().getTripleString();
6283 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006284 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006285 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006286 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006287
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006288 Args.AddAllArgs(CmdArgs, options::OPT_L);
6289 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6290 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006291 Args.AddAllArgs(CmdArgs, options::OPT_s);
6292 Args.AddAllArgs(CmdArgs, options::OPT_t);
6293 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6294 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006295
Daniel Dunbar54423b22010-09-17 00:24:54 +00006296 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006297
6298 if (!Args.hasArg(options::OPT_nostdlib) &&
6299 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006300 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006301 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006302 if (Args.hasArg(options::OPT_pg))
6303 CmdArgs.push_back("-lm_p");
6304 else
6305 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006306 }
6307
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006308 // FIXME: For some reason GCC passes -lgcc before adding
6309 // the default system libraries. Just mimic this for now.
6310 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006311
Eric Christopher17674ec2012-09-13 06:32:34 +00006312 if (Args.hasArg(options::OPT_pthread)) {
6313 if (!Args.hasArg(options::OPT_shared) &&
6314 Args.hasArg(options::OPT_pg))
6315 CmdArgs.push_back("-lpthread_p");
6316 else
6317 CmdArgs.push_back("-lpthread");
6318 }
6319
Chandler Carruth45661652011-12-17 22:32:42 +00006320 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006321 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006322 CmdArgs.push_back("-lc_p");
6323 else
6324 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006325 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006326
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006327 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006328 }
6329
6330 if (!Args.hasArg(options::OPT_nostdlib) &&
6331 !Args.hasArg(options::OPT_nostartfiles)) {
6332 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006333 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006334 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006335 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006336 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006337 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006338 }
6339
6340 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006341 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006342 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006343}
Ed Schoutene33194b2009-04-02 19:13:12 +00006344
Eli Friedman9fa28852012-08-08 23:57:20 +00006345void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6346 const InputInfo &Output,
6347 const InputInfoList &Inputs,
6348 const ArgList &Args,
6349 const char *LinkingOutput) const {
6350 ArgStringList CmdArgs;
6351
6352 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6353 options::OPT_Xassembler);
6354
6355 CmdArgs.push_back("-o");
6356 CmdArgs.push_back(Output.getFilename());
6357
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006358 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006359 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006360
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006361 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006362 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006363}
6364
6365void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6366 const InputInfo &Output,
6367 const InputInfoList &Inputs,
6368 const ArgList &Args,
6369 const char *LinkingOutput) const {
6370 const Driver &D = getToolChain().getDriver();
6371 ArgStringList CmdArgs;
6372
6373 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6374 (!Args.hasArg(options::OPT_shared))) {
6375 CmdArgs.push_back("-e");
6376 CmdArgs.push_back("__start");
6377 }
6378
6379 if (Args.hasArg(options::OPT_static)) {
6380 CmdArgs.push_back("-Bstatic");
6381 } else {
6382 if (Args.hasArg(options::OPT_rdynamic))
6383 CmdArgs.push_back("-export-dynamic");
6384 CmdArgs.push_back("--eh-frame-hdr");
6385 CmdArgs.push_back("-Bdynamic");
6386 if (Args.hasArg(options::OPT_shared)) {
6387 CmdArgs.push_back("-shared");
6388 } else {
6389 CmdArgs.push_back("-dynamic-linker");
6390 CmdArgs.push_back("/usr/libexec/ld.so");
6391 }
6392 }
6393
6394 if (Output.isFilename()) {
6395 CmdArgs.push_back("-o");
6396 CmdArgs.push_back(Output.getFilename());
6397 } else {
6398 assert(Output.isNothing() && "Invalid output.");
6399 }
6400
6401 if (!Args.hasArg(options::OPT_nostdlib) &&
6402 !Args.hasArg(options::OPT_nostartfiles)) {
6403 if (!Args.hasArg(options::OPT_shared)) {
6404 if (Args.hasArg(options::OPT_pg))
6405 CmdArgs.push_back(Args.MakeArgString(
6406 getToolChain().GetFilePath("gcrt0.o")));
6407 else
6408 CmdArgs.push_back(Args.MakeArgString(
6409 getToolChain().GetFilePath("crt0.o")));
6410 CmdArgs.push_back(Args.MakeArgString(
6411 getToolChain().GetFilePath("crtbegin.o")));
6412 } else {
6413 CmdArgs.push_back(Args.MakeArgString(
6414 getToolChain().GetFilePath("crtbeginS.o")));
6415 }
6416 }
6417
6418 Args.AddAllArgs(CmdArgs, options::OPT_L);
6419 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6420 Args.AddAllArgs(CmdArgs, options::OPT_e);
6421
6422 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6423
6424 if (!Args.hasArg(options::OPT_nostdlib) &&
6425 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006426 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006427 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6428 if (Args.hasArg(options::OPT_pg))
6429 CmdArgs.push_back("-lm_p");
6430 else
6431 CmdArgs.push_back("-lm");
6432 }
6433
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006434 if (Args.hasArg(options::OPT_pthread)) {
6435 if (!Args.hasArg(options::OPT_shared) &&
6436 Args.hasArg(options::OPT_pg))
6437 CmdArgs.push_back("-lpthread_p");
6438 else
6439 CmdArgs.push_back("-lpthread");
6440 }
6441
Eli Friedman9fa28852012-08-08 23:57:20 +00006442 if (!Args.hasArg(options::OPT_shared)) {
6443 if (Args.hasArg(options::OPT_pg))
6444 CmdArgs.push_back("-lc_p");
6445 else
6446 CmdArgs.push_back("-lc");
6447 }
6448
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006449 StringRef MyArch;
6450 switch (getToolChain().getTriple().getArch()) {
6451 case llvm::Triple::arm:
6452 MyArch = "arm";
6453 break;
6454 case llvm::Triple::x86:
6455 MyArch = "i386";
6456 break;
6457 case llvm::Triple::x86_64:
6458 MyArch = "amd64";
6459 break;
6460 default:
6461 llvm_unreachable("Unsupported architecture");
6462 }
6463 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006464 }
6465
6466 if (!Args.hasArg(options::OPT_nostdlib) &&
6467 !Args.hasArg(options::OPT_nostartfiles)) {
6468 if (!Args.hasArg(options::OPT_shared))
6469 CmdArgs.push_back(Args.MakeArgString(
6470 getToolChain().GetFilePath("crtend.o")));
6471 else
6472 CmdArgs.push_back(Args.MakeArgString(
6473 getToolChain().GetFilePath("crtendS.o")));
6474 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006475
6476 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006477 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006478 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006479}
6480
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006481void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006482 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006483 const InputInfoList &Inputs,
6484 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006485 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006486 ArgStringList CmdArgs;
6487
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006488 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6489 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006490 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006491 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006492 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006493 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006494 else if (getToolChain().getArch() == llvm::Triple::mips ||
6495 getToolChain().getArch() == llvm::Triple::mipsel ||
6496 getToolChain().getArch() == llvm::Triple::mips64 ||
6497 getToolChain().getArch() == llvm::Triple::mips64el) {
6498 StringRef CPUName;
6499 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006500 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006501
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006502 CmdArgs.push_back("-march");
6503 CmdArgs.push_back(CPUName.data());
6504
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006505 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006506 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006507
6508 if (getToolChain().getArch() == llvm::Triple::mips ||
6509 getToolChain().getArch() == llvm::Triple::mips64)
6510 CmdArgs.push_back("-EB");
6511 else
6512 CmdArgs.push_back("-EL");
6513
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006514 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006515 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006516 getToolChain().getArch() == llvm::Triple::armeb ||
6517 getToolChain().getArch() == llvm::Triple::thumb ||
6518 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006519 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006520 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006521 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6522
6523 if (FloatABI == "hard") {
6524 CmdArgs.push_back("-mfpu=vfp");
6525 } else {
6526 CmdArgs.push_back("-mfpu=softvfp");
6527 }
6528
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006529 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006530 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006531 case llvm::Triple::GNUEABI:
6532 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006533 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006534 break;
6535
6536 default:
6537 CmdArgs.push_back("-matpcs");
6538 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006539 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006540 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006541 if (getToolChain().getArch() == llvm::Triple::sparc)
6542 CmdArgs.push_back("-Av8plusa");
6543 else
6544 CmdArgs.push_back("-Av9a");
6545
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006546 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006547 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006548
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006549 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6550 options::OPT_Xassembler);
6551
6552 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006553 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006554
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006555 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006556 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006557
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006558 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006559 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006560}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006561
6562void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006563 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006564 const InputInfoList &Inputs,
6565 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006566 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006567 const toolchains::FreeBSD& ToolChain =
6568 static_cast<const toolchains::FreeBSD&>(getToolChain());
6569 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006570 const bool IsPIE =
6571 !Args.hasArg(options::OPT_shared) &&
6572 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006573 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006574
6575 // Silence warning for "clang -g foo.o -o foo"
6576 Args.ClaimAllArgs(options::OPT_g_Group);
6577 // and "clang -emit-llvm foo.o -o foo"
6578 Args.ClaimAllArgs(options::OPT_emit_llvm);
6579 // and for "clang -w foo.o -o foo". Other warning options are already
6580 // handled somewhere else.
6581 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006582
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006583 if (!D.SysRoot.empty())
6584 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6585
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006586 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006587 CmdArgs.push_back("-pie");
6588
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006589 if (Args.hasArg(options::OPT_static)) {
6590 CmdArgs.push_back("-Bstatic");
6591 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006592 if (Args.hasArg(options::OPT_rdynamic))
6593 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006594 CmdArgs.push_back("--eh-frame-hdr");
6595 if (Args.hasArg(options::OPT_shared)) {
6596 CmdArgs.push_back("-Bshareable");
6597 } else {
6598 CmdArgs.push_back("-dynamic-linker");
6599 CmdArgs.push_back("/libexec/ld-elf.so.1");
6600 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006601 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6602 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006603 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6604 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6605 CmdArgs.push_back("--hash-style=both");
6606 }
6607 }
6608 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006609 }
6610
6611 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6612 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006613 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006614 CmdArgs.push_back("-m");
6615 CmdArgs.push_back("elf_i386_fbsd");
6616 }
6617
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006618 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006619 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006620 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006621 }
6622
Daniel Dunbarb440f562010-08-02 02:38:21 +00006623 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006624 CmdArgs.push_back("-o");
6625 CmdArgs.push_back(Output.getFilename());
6626 } else {
6627 assert(Output.isNothing() && "Invalid output.");
6628 }
6629
6630 if (!Args.hasArg(options::OPT_nostdlib) &&
6631 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006632 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006633 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006634 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006635 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006636 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006637 crt1 = "Scrt1.o";
6638 else
6639 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006640 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006641 if (crt1)
6642 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6643
6644 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6645
Craig Topper92fc2df2014-05-17 16:56:41 +00006646 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006647 if (Args.hasArg(options::OPT_static))
6648 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006649 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006650 crtbegin = "crtbeginS.o";
6651 else
6652 crtbegin = "crtbegin.o";
6653
6654 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006655 }
6656
6657 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006658 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006659 for (const auto &Path : Paths)
6660 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006661 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6662 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006663 Args.AddAllArgs(CmdArgs, options::OPT_s);
6664 Args.AddAllArgs(CmdArgs, options::OPT_t);
6665 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6666 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006667
Alp Tokerce365ca2013-12-02 12:43:03 +00006668 if (D.IsUsingLTO(Args))
6669 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006670
Alexey Samsonov52550342014-09-15 19:58:40 +00006671 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006672 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006673
6674 if (!Args.hasArg(options::OPT_nostdlib) &&
6675 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006676 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006677 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006678 if (Args.hasArg(options::OPT_pg))
6679 CmdArgs.push_back("-lm_p");
6680 else
6681 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006682 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006683 if (NeedsSanitizerDeps)
6684 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006685 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6686 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006687 if (Args.hasArg(options::OPT_pg))
6688 CmdArgs.push_back("-lgcc_p");
6689 else
6690 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006691 if (Args.hasArg(options::OPT_static)) {
6692 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006693 } else if (Args.hasArg(options::OPT_pg)) {
6694 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006695 } else {
6696 CmdArgs.push_back("--as-needed");
6697 CmdArgs.push_back("-lgcc_s");
6698 CmdArgs.push_back("--no-as-needed");
6699 }
6700
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006701 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006702 if (Args.hasArg(options::OPT_pg))
6703 CmdArgs.push_back("-lpthread_p");
6704 else
6705 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006706 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006707
Roman Divacky66f22762011-02-10 16:59:40 +00006708 if (Args.hasArg(options::OPT_pg)) {
6709 if (Args.hasArg(options::OPT_shared))
6710 CmdArgs.push_back("-lc");
6711 else
6712 CmdArgs.push_back("-lc_p");
6713 CmdArgs.push_back("-lgcc_p");
6714 } else {
6715 CmdArgs.push_back("-lc");
6716 CmdArgs.push_back("-lgcc");
6717 }
6718
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006719 if (Args.hasArg(options::OPT_static)) {
6720 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006721 } else if (Args.hasArg(options::OPT_pg)) {
6722 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006723 } else {
6724 CmdArgs.push_back("--as-needed");
6725 CmdArgs.push_back("-lgcc_s");
6726 CmdArgs.push_back("--no-as-needed");
6727 }
6728 }
6729
6730 if (!Args.hasArg(options::OPT_nostdlib) &&
6731 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006732 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006733 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006734 else
6735 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006736 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006737 }
6738
Alexey Samsonov7811d192014-02-20 13:57:37 +00006739 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006740
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006741 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006742 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006743 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006744}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006745
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006746void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6747 const InputInfo &Output,
6748 const InputInfoList &Inputs,
6749 const ArgList &Args,
6750 const char *LinkingOutput) const {
6751 ArgStringList CmdArgs;
6752
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006753 // GNU as needs different flags for creating the correct output format
6754 // on architectures with different ABIs or optional feature sets.
6755 switch (getToolChain().getArch()) {
6756 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006757 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006758 break;
6759 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006760 case llvm::Triple::armeb:
6761 case llvm::Triple::thumb:
6762 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006763 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006764 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006765 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006766 }
6767
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006768 case llvm::Triple::mips:
6769 case llvm::Triple::mipsel:
6770 case llvm::Triple::mips64:
6771 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006772 StringRef CPUName;
6773 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006774 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006775
6776 CmdArgs.push_back("-march");
6777 CmdArgs.push_back(CPUName.data());
6778
6779 CmdArgs.push_back("-mabi");
6780 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6781
6782 if (getToolChain().getArch() == llvm::Triple::mips ||
6783 getToolChain().getArch() == llvm::Triple::mips64)
6784 CmdArgs.push_back("-EB");
6785 else
6786 CmdArgs.push_back("-EL");
6787
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006788 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006789 break;
6790 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006791
6792 case llvm::Triple::sparc:
6793 CmdArgs.push_back("-32");
6794 addAssemblerKPIC(Args, CmdArgs);
6795 break;
6796
6797 case llvm::Triple::sparcv9:
6798 CmdArgs.push_back("-64");
6799 CmdArgs.push_back("-Av9");
6800 addAssemblerKPIC(Args, CmdArgs);
6801 break;
6802
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006803 default:
6804 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006805 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006806
6807 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6808 options::OPT_Xassembler);
6809
6810 CmdArgs.push_back("-o");
6811 CmdArgs.push_back(Output.getFilename());
6812
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006813 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006814 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006815
David Chisnallddbd68f2011-09-27 22:03:18 +00006816 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006817 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006818}
6819
6820void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6821 const InputInfo &Output,
6822 const InputInfoList &Inputs,
6823 const ArgList &Args,
6824 const char *LinkingOutput) const {
6825 const Driver &D = getToolChain().getDriver();
6826 ArgStringList CmdArgs;
6827
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006828 if (!D.SysRoot.empty())
6829 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6830
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006831 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006832 if (Args.hasArg(options::OPT_static)) {
6833 CmdArgs.push_back("-Bstatic");
6834 } else {
6835 if (Args.hasArg(options::OPT_rdynamic))
6836 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006837 if (Args.hasArg(options::OPT_shared)) {
6838 CmdArgs.push_back("-Bshareable");
6839 } else {
6840 CmdArgs.push_back("-dynamic-linker");
6841 CmdArgs.push_back("/libexec/ld.elf_so");
6842 }
6843 }
6844
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006845 // Many NetBSD architectures support more than one ABI.
6846 // Determine the correct emulation for ld.
6847 switch (getToolChain().getArch()) {
6848 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006849 CmdArgs.push_back("-m");
6850 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006851 break;
6852 case llvm::Triple::arm:
6853 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006854 CmdArgs.push_back("-m");
6855 switch (getToolChain().getTriple().getEnvironment()) {
6856 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006857 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006858 CmdArgs.push_back("armelf_nbsd_eabi");
6859 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006860 case llvm::Triple::EABIHF:
6861 case llvm::Triple::GNUEABIHF:
6862 CmdArgs.push_back("armelf_nbsd_eabihf");
6863 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006864 default:
6865 CmdArgs.push_back("armelf_nbsd");
6866 break;
6867 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006868 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006869 case llvm::Triple::armeb:
6870 case llvm::Triple::thumbeb:
6871 CmdArgs.push_back("-m");
6872 switch (getToolChain().getTriple().getEnvironment()) {
6873 case llvm::Triple::EABI:
6874 case llvm::Triple::GNUEABI:
6875 CmdArgs.push_back("armelfb_nbsd_eabi");
6876 break;
6877 case llvm::Triple::EABIHF:
6878 case llvm::Triple::GNUEABIHF:
6879 CmdArgs.push_back("armelfb_nbsd_eabihf");
6880 break;
6881 default:
6882 CmdArgs.push_back("armelfb_nbsd");
6883 break;
6884 }
6885 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006886 case llvm::Triple::mips64:
6887 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006888 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006889 CmdArgs.push_back("-m");
6890 if (getToolChain().getArch() == llvm::Triple::mips64)
6891 CmdArgs.push_back("elf32btsmip");
6892 else
6893 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006894 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006895 CmdArgs.push_back("-m");
6896 if (getToolChain().getArch() == llvm::Triple::mips64)
6897 CmdArgs.push_back("elf64btsmip");
6898 else
6899 CmdArgs.push_back("elf64ltsmip");
6900 }
6901 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00006902 case llvm::Triple::ppc:
6903 CmdArgs.push_back("-m");
6904 CmdArgs.push_back("elf32ppc_nbsd");
6905 break;
6906
6907 case llvm::Triple::ppc64:
6908 case llvm::Triple::ppc64le:
6909 CmdArgs.push_back("-m");
6910 CmdArgs.push_back("elf64ppc");
6911 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006912
6913 case llvm::Triple::sparc:
6914 CmdArgs.push_back("-m");
6915 CmdArgs.push_back("elf32_sparc");
6916 break;
6917
6918 case llvm::Triple::sparcv9:
6919 CmdArgs.push_back("-m");
6920 CmdArgs.push_back("elf64_sparc");
6921 break;
6922
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006923 default:
6924 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006925 }
6926
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006927 if (Output.isFilename()) {
6928 CmdArgs.push_back("-o");
6929 CmdArgs.push_back(Output.getFilename());
6930 } else {
6931 assert(Output.isNothing() && "Invalid output.");
6932 }
6933
6934 if (!Args.hasArg(options::OPT_nostdlib) &&
6935 !Args.hasArg(options::OPT_nostartfiles)) {
6936 if (!Args.hasArg(options::OPT_shared)) {
6937 CmdArgs.push_back(Args.MakeArgString(
6938 getToolChain().GetFilePath("crt0.o")));
6939 CmdArgs.push_back(Args.MakeArgString(
6940 getToolChain().GetFilePath("crti.o")));
6941 CmdArgs.push_back(Args.MakeArgString(
6942 getToolChain().GetFilePath("crtbegin.o")));
6943 } else {
6944 CmdArgs.push_back(Args.MakeArgString(
6945 getToolChain().GetFilePath("crti.o")));
6946 CmdArgs.push_back(Args.MakeArgString(
6947 getToolChain().GetFilePath("crtbeginS.o")));
6948 }
6949 }
6950
6951 Args.AddAllArgs(CmdArgs, options::OPT_L);
6952 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6953 Args.AddAllArgs(CmdArgs, options::OPT_e);
6954 Args.AddAllArgs(CmdArgs, options::OPT_s);
6955 Args.AddAllArgs(CmdArgs, options::OPT_t);
6956 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6957 Args.AddAllArgs(CmdArgs, options::OPT_r);
6958
6959 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6960
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006961 unsigned Major, Minor, Micro;
6962 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6963 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006964 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006965 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00006966 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006967 case llvm::Triple::arm:
6968 case llvm::Triple::armeb:
6969 case llvm::Triple::thumb:
6970 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006971 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00006972 case llvm::Triple::ppc64:
6973 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006974 case llvm::Triple::x86:
6975 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006976 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006977 break;
6978 default:
6979 break;
6980 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006981 }
6982
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006983 if (!Args.hasArg(options::OPT_nostdlib) &&
6984 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006985 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006986 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6987 CmdArgs.push_back("-lm");
6988 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006989 if (Args.hasArg(options::OPT_pthread))
6990 CmdArgs.push_back("-lpthread");
6991 CmdArgs.push_back("-lc");
6992
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006993 if (useLibgcc) {
6994 if (Args.hasArg(options::OPT_static)) {
6995 // libgcc_eh depends on libc, so resolve as much as possible,
6996 // pull in any new requirements from libc and then get the rest
6997 // of libgcc.
6998 CmdArgs.push_back("-lgcc_eh");
6999 CmdArgs.push_back("-lc");
7000 CmdArgs.push_back("-lgcc");
7001 } else {
7002 CmdArgs.push_back("-lgcc");
7003 CmdArgs.push_back("--as-needed");
7004 CmdArgs.push_back("-lgcc_s");
7005 CmdArgs.push_back("--no-as-needed");
7006 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007007 }
7008 }
7009
7010 if (!Args.hasArg(options::OPT_nostdlib) &&
7011 !Args.hasArg(options::OPT_nostartfiles)) {
7012 if (!Args.hasArg(options::OPT_shared))
7013 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7014 "crtend.o")));
7015 else
7016 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7017 "crtendS.o")));
7018 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7019 "crtn.o")));
7020 }
7021
Alexey Samsonov7811d192014-02-20 13:57:37 +00007022 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007023
Logan Chieneb9162f2014-06-26 14:23:45 +00007024 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007025 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007026}
7027
Thomas Schwinge4e555262013-03-28 19:04:25 +00007028void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7029 const InputInfo &Output,
7030 const InputInfoList &Inputs,
7031 const ArgList &Args,
7032 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00007033 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007034 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007035
7036 // Add --32/--64 to make sure we get the format we want.
7037 // This is incomplete
7038 if (getToolChain().getArch() == llvm::Triple::x86) {
7039 CmdArgs.push_back("--32");
7040 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007041 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7042 CmdArgs.push_back("--x32");
7043 else
7044 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007045 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7046 CmdArgs.push_back("-a32");
7047 CmdArgs.push_back("-mppc");
7048 CmdArgs.push_back("-many");
7049 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7050 CmdArgs.push_back("-a64");
7051 CmdArgs.push_back("-mppc64");
7052 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007053 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7054 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007055 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007056 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007057 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007058 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7059 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007060 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007061 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007062 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7063 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007064 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007065 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007066 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7067 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007068 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007069 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7070 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007071 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7072 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007073 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007074
Tim Northover9c7e0352013-12-12 11:55:52 +00007075 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7076 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007077 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007078
7079 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007080
7081 // FIXME: remove krait check when GNU tools support krait cpu
7082 // for now replace it with -march=armv7-a to avoid a lower
7083 // march from being picked in the absence of a cpu flag.
7084 Arg *A;
7085 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7086 StringRef(A->getValue()) == "krait")
7087 CmdArgs.push_back("-march=armv7-a");
7088 else
7089 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007090 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007091 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7092 getToolChain().getArch() == llvm::Triple::mipsel ||
7093 getToolChain().getArch() == llvm::Triple::mips64 ||
7094 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007095 StringRef CPUName;
7096 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007097 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007098 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007099
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007100 CmdArgs.push_back("-march");
7101 CmdArgs.push_back(CPUName.data());
7102
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007103 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007104 CmdArgs.push_back(ABIName.data());
7105
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007106 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7107 // or -mshared (not implemented) is in effect.
7108 bool IsPicOrPie = false;
7109 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7110 options::OPT_fpic, options::OPT_fno_pic,
7111 options::OPT_fPIE, options::OPT_fno_PIE,
7112 options::OPT_fpie, options::OPT_fno_pie)) {
7113 if (A->getOption().matches(options::OPT_fPIC) ||
7114 A->getOption().matches(options::OPT_fpic) ||
7115 A->getOption().matches(options::OPT_fPIE) ||
7116 A->getOption().matches(options::OPT_fpie))
7117 IsPicOrPie = true;
7118 }
7119 if (!IsPicOrPie)
7120 CmdArgs.push_back("-mno-shared");
7121
Daniel Sanders379d44b2014-07-16 11:52:23 +00007122 // LLVM doesn't support -mplt yet and acts as if it is always given.
7123 // However, -mplt has no effect with the N64 ABI.
7124 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007125
7126 if (getToolChain().getArch() == llvm::Triple::mips ||
7127 getToolChain().getArch() == llvm::Triple::mips64)
7128 CmdArgs.push_back("-EB");
7129 else
7130 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007131
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007132 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7133 if (StringRef(A->getValue()) == "2008")
7134 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7135 }
7136
Daniel Sanders379d44b2014-07-16 11:52:23 +00007137 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7138 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7139 options::OPT_mfp64)) {
7140 A->claim();
7141 A->render(Args, CmdArgs);
7142 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7143 ABIName))
7144 CmdArgs.push_back("-mfpxx");
7145
7146 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7147 // -mno-mips16 is actually -no-mips16.
7148 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7149 options::OPT_mno_mips16)) {
7150 if (A->getOption().matches(options::OPT_mips16)) {
7151 A->claim();
7152 A->render(Args, CmdArgs);
7153 } else {
7154 A->claim();
7155 CmdArgs.push_back("-no-mips16");
7156 }
7157 }
7158
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007159 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7160 options::OPT_mno_micromips);
7161 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7162 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7163
Simon Atanasyanbd986632013-11-26 11:58:04 +00007164 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7165 // Do not use AddLastArg because not all versions of MIPS assembler
7166 // support -mmsa / -mno-msa options.
7167 if (A->getOption().matches(options::OPT_mmsa))
7168 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7169 }
7170
Daniel Sanders379d44b2014-07-16 11:52:23 +00007171 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7172 options::OPT_msoft_float);
7173
7174 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7175 options::OPT_mno_odd_spreg);
7176
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007177 NeedsKPIC = true;
7178 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7179 // Always pass an -march option, since our default of z10 is later
7180 // than the GNU assembler's default.
7181 StringRef CPUName = getSystemZTargetCPU(Args);
7182 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7183 }
7184
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007185 if (NeedsKPIC)
7186 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007187
7188 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7189 options::OPT_Xassembler);
7190
7191 CmdArgs.push_back("-o");
7192 CmdArgs.push_back(Output.getFilename());
7193
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007194 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007195 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007197 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007198 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007199
7200 // Handle the debug info splitting at object creation time if we're
7201 // creating an object.
7202 // TODO: Currently only works on linux with newer objcopy.
7203 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007204 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007205 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7206 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007207}
7208
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007209static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007210 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007211 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007212 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7213 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007214 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007215 CmdArgs.push_back("-lgcc");
7216
Logan Chien3d3373c2012-11-19 12:04:11 +00007217 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007218 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007219 CmdArgs.push_back("-lgcc");
7220 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007221 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007222 CmdArgs.push_back("--as-needed");
7223 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007224 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007225 CmdArgs.push_back("--no-as-needed");
7226 }
7227
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007228 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007229 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007230 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007231 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007232
7233 // According to Android ABI, we have to link with libdl if we are
7234 // linking with non-static libgcc.
7235 //
7236 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7237 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7238 if (isAndroid && !StaticLibgcc)
7239 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007240}
7241
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007242static std::string getLinuxDynamicLinker(const ArgList &Args,
7243 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007244 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7245 if (ToolChain.getTriple().isArch64Bit())
7246 return "/system/bin/linker64";
7247 else
7248 return "/system/bin/linker";
7249 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7250 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007251 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007252 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007253 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007254 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007255 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007256 else if (ToolChain.getArch() == llvm::Triple::arm ||
7257 ToolChain.getArch() == llvm::Triple::thumb) {
7258 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7259 return "/lib/ld-linux-armhf.so.3";
7260 else
7261 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007262 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7263 ToolChain.getArch() == llvm::Triple::thumbeb) {
7264 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7265 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7266 else
7267 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007268 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007269 ToolChain.getArch() == llvm::Triple::mipsel ||
7270 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007271 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007272 StringRef CPUName;
7273 StringRef ABIName;
7274 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7275 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7276
7277 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7278 .Case("o32", "/lib")
7279 .Case("n32", "/lib32")
7280 .Case("n64", "/lib64")
7281 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007282 StringRef LibName;
7283 if (mips::isUCLibc(Args))
7284 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7285 else
7286 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007287
7288 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007289 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7290 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007291 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7292 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7293 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007294 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007295 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7296 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7297 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007298 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007299 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7300 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007301 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7302 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007303 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7304 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7305 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007306 else
7307 return "/lib64/ld-linux-x86-64.so.2";
7308}
7309
Renato Golinc4b49242014-02-13 10:01:16 +00007310static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7311 ArgStringList &CmdArgs, const ArgList &Args) {
7312 // Make use of compiler-rt if --rtlib option is used
7313 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7314
7315 switch(RLT) {
7316 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007317 switch (TC.getTriple().getOS()) {
7318 default: llvm_unreachable("unsupported OS");
7319 case llvm::Triple::Win32:
7320 addClangRTWindows(TC, Args, CmdArgs);
7321 break;
7322 case llvm::Triple::Linux:
7323 addClangRTLinux(TC, Args, CmdArgs);
7324 break;
7325 }
Renato Golinc4b49242014-02-13 10:01:16 +00007326 break;
7327 case ToolChain::RLT_Libgcc:
7328 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7329 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007330 }
7331}
7332
Rafael Espindola1e085772014-08-15 17:14:35 +00007333static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7334 switch (T.getArch()) {
7335 case llvm::Triple::x86:
7336 return "elf_i386";
7337 case llvm::Triple::aarch64:
7338 return "aarch64linux";
7339 case llvm::Triple::aarch64_be:
7340 return "aarch64_be_linux";
7341 case llvm::Triple::arm:
7342 case llvm::Triple::thumb:
7343 return "armelf_linux_eabi";
7344 case llvm::Triple::armeb:
7345 case llvm::Triple::thumbeb:
7346 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7347 case llvm::Triple::ppc:
7348 return "elf32ppclinux";
7349 case llvm::Triple::ppc64:
7350 return "elf64ppc";
7351 case llvm::Triple::ppc64le:
7352 return "elf64lppc";
7353 case llvm::Triple::sparc:
7354 return "elf32_sparc";
7355 case llvm::Triple::sparcv9:
7356 return "elf64_sparc";
7357 case llvm::Triple::mips:
7358 return "elf32btsmip";
7359 case llvm::Triple::mipsel:
7360 return "elf32ltsmip";
7361 case llvm::Triple::mips64:
7362 if (mips::hasMipsAbiArg(Args, "n32"))
7363 return "elf32btsmipn32";
7364 return "elf64btsmip";
7365 case llvm::Triple::mips64el:
7366 if (mips::hasMipsAbiArg(Args, "n32"))
7367 return "elf32ltsmipn32";
7368 return "elf64ltsmip";
7369 case llvm::Triple::systemz:
7370 return "elf64_s390";
7371 case llvm::Triple::x86_64:
7372 if (T.getEnvironment() == llvm::Triple::GNUX32)
7373 return "elf32_x86_64";
7374 return "elf_x86_64";
7375 default:
7376 llvm_unreachable("Unexpected arch");
7377 }
7378}
7379
Thomas Schwinge4e555262013-03-28 19:04:25 +00007380void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7381 const InputInfo &Output,
7382 const InputInfoList &Inputs,
7383 const ArgList &Args,
7384 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007385 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007386 static_cast<const toolchains::Linux&>(getToolChain());
7387 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007388 const bool isAndroid =
7389 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007390 const bool IsPIE =
7391 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007392 !Args.hasArg(options::OPT_static) &&
7393 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7394 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007395 // Cannot use isPIEDefault here since otherwise
7396 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007397 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007398
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007399 ArgStringList CmdArgs;
7400
Rafael Espindolad1002f62010-11-15 18:28:16 +00007401 // Silence warning for "clang -g foo.o -o foo"
7402 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007403 // and "clang -emit-llvm foo.o -o foo"
7404 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007405 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007406 // handled somewhere else.
7407 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007408
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007409 if (!D.SysRoot.empty())
7410 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007411
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007412 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007413 CmdArgs.push_back("-pie");
7414
Rafael Espindola1c76c592010-11-07 22:57:16 +00007415 if (Args.hasArg(options::OPT_rdynamic))
7416 CmdArgs.push_back("-export-dynamic");
7417
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007418 if (Args.hasArg(options::OPT_s))
7419 CmdArgs.push_back("-s");
7420
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007421 for (const auto &Opt : ToolChain.ExtraOpts)
7422 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007423
7424 if (!Args.hasArg(options::OPT_static)) {
7425 CmdArgs.push_back("--eh-frame-hdr");
7426 }
7427
7428 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007429 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007430
7431 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007432 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007433 ToolChain.getArch() == llvm::Triple::armeb ||
7434 ToolChain.getArch() == llvm::Triple::thumb ||
7435 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007436 CmdArgs.push_back("-Bstatic");
7437 else
7438 CmdArgs.push_back("-static");
7439 } else if (Args.hasArg(options::OPT_shared)) {
7440 CmdArgs.push_back("-shared");
7441 }
7442
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007443 if (ToolChain.getArch() == llvm::Triple::arm ||
7444 ToolChain.getArch() == llvm::Triple::armeb ||
7445 ToolChain.getArch() == llvm::Triple::thumb ||
7446 ToolChain.getArch() == llvm::Triple::thumbeb ||
7447 (!Args.hasArg(options::OPT_static) &&
7448 !Args.hasArg(options::OPT_shared))) {
7449 CmdArgs.push_back("-dynamic-linker");
7450 CmdArgs.push_back(Args.MakeArgString(
7451 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7452 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007453
7454 CmdArgs.push_back("-o");
7455 CmdArgs.push_back(Output.getFilename());
7456
Rafael Espindola81937ec2010-12-01 01:52:43 +00007457 if (!Args.hasArg(options::OPT_nostdlib) &&
7458 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007459 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007460 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007461 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007462 if (Args.hasArg(options::OPT_pg))
7463 crt1 = "gcrt1.o";
7464 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007465 crt1 = "Scrt1.o";
7466 else
7467 crt1 = "crt1.o";
7468 }
7469 if (crt1)
7470 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007471
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007472 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7473 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007474
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007475 const char *crtbegin;
7476 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007477 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007478 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007479 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007480 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007481 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007482 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007483 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007484 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007485
7486 // Add crtfastmath.o if available and fast math is enabled.
7487 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007488 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007489
7490 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007491 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007492
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007493 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007494
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007495 for (const auto &Path : Paths)
7496 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007497
Alp Tokerce365ca2013-12-02 12:43:03 +00007498 if (D.IsUsingLTO(Args))
7499 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007500
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007501 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7502 CmdArgs.push_back("--no-demangle");
7503
Alexey Samsonov52550342014-09-15 19:58:40 +00007504 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007505 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007506 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007507 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007508
Hans Wennborg70850d82013-07-18 20:29:38 +00007509 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007510 !Args.hasArg(options::OPT_nostdlib) &&
7511 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007512 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7513 !Args.hasArg(options::OPT_static);
7514 if (OnlyLibstdcxxStatic)
7515 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007516 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007517 if (OnlyLibstdcxxStatic)
7518 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007519 CmdArgs.push_back("-lm");
7520 }
7521
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007522 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007523 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7524 if (Args.hasArg(options::OPT_static))
7525 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007526
Alexey Samsonov52550342014-09-15 19:58:40 +00007527 if (NeedsSanitizerDeps)
7528 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7529
Alexey Bataev186b28a2014-03-06 05:43:53 +00007530 LibOpenMP UsedOpenMPLib = LibUnknown;
7531 if (Args.hasArg(options::OPT_fopenmp)) {
7532 UsedOpenMPLib = LibGOMP;
7533 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7534 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7535 .Case("libgomp", LibGOMP)
7536 .Case("libiomp5", LibIOMP5)
7537 .Default(LibUnknown);
7538 if (UsedOpenMPLib == LibUnknown)
7539 D.Diag(diag::err_drv_unsupported_option_argument)
7540 << A->getOption().getName() << A->getValue();
7541 }
7542 switch (UsedOpenMPLib) {
7543 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007544 CmdArgs.push_back("-lgomp");
7545
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007546 // FIXME: Exclude this for platforms with libgomp that don't require
7547 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007548 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007549 break;
7550 case LibIOMP5:
7551 CmdArgs.push_back("-liomp5");
7552 break;
7553 case LibUnknown:
7554 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007555 }
Renato Golinc4b49242014-02-13 10:01:16 +00007556 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007557
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007558 if ((Args.hasArg(options::OPT_pthread) ||
7559 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7560 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007561 CmdArgs.push_back("-lpthread");
7562
7563 CmdArgs.push_back("-lc");
7564
7565 if (Args.hasArg(options::OPT_static))
7566 CmdArgs.push_back("--end-group");
7567 else
Renato Golinc4b49242014-02-13 10:01:16 +00007568 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007569 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007570
Rafael Espindola81937ec2010-12-01 01:52:43 +00007571 if (!Args.hasArg(options::OPT_nostartfiles)) {
7572 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007573 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007574 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007575 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007576 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007577 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007578 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007579
Rafael Espindola81937ec2010-12-01 01:52:43 +00007580 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007581 if (!isAndroid)
7582 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007583 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007584 }
7585
David Blaikiec11bf802014-09-04 16:04:28 +00007586 C.addCommand(
7587 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007588}
7589
Chris Lattner3e2ee142010-07-07 16:01:42 +00007590void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007591 const InputInfo &Output,
7592 const InputInfoList &Inputs,
7593 const ArgList &Args,
7594 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007595 ArgStringList CmdArgs;
7596
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007597 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007598
7599 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007600 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007601
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007602 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007603 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007604
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007605 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007606 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007607}
7608
7609void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007610 const InputInfo &Output,
7611 const InputInfoList &Inputs,
7612 const ArgList &Args,
7613 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007614 const Driver &D = getToolChain().getDriver();
7615 ArgStringList CmdArgs;
7616
Daniel Dunbarb440f562010-08-02 02:38:21 +00007617 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007618 CmdArgs.push_back("-o");
7619 CmdArgs.push_back(Output.getFilename());
7620 } else {
7621 assert(Output.isNothing() && "Invalid output.");
7622 }
7623
7624 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007625 !Args.hasArg(options::OPT_nostartfiles)) {
7626 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7627 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7628 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7629 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7630 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007631
7632 Args.AddAllArgs(CmdArgs, options::OPT_L);
7633 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7634 Args.AddAllArgs(CmdArgs, options::OPT_e);
7635
Daniel Dunbar54423b22010-09-17 00:24:54 +00007636 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007637
Alexey Samsonov7811d192014-02-20 13:57:37 +00007638 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007639
Chris Lattner3e2ee142010-07-07 16:01:42 +00007640 if (!Args.hasArg(options::OPT_nostdlib) &&
7641 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007642 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007643 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007644 CmdArgs.push_back("-lm");
7645 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007646 }
7647
7648 if (!Args.hasArg(options::OPT_nostdlib) &&
7649 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007650 if (Args.hasArg(options::OPT_pthread))
7651 CmdArgs.push_back("-lpthread");
7652 CmdArgs.push_back("-lc");
7653 CmdArgs.push_back("-lCompilerRT-Generic");
7654 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7655 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007656 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007657 }
7658
Logan Chieneb9162f2014-06-26 14:23:45 +00007659 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007660 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007661}
7662
Daniel Dunbarcc912342009-05-02 18:28:39 +00007663/// DragonFly Tools
7664
7665// For now, DragonFly Assemble does just about the same as for
7666// FreeBSD, but this may change soon.
7667void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007668 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007669 const InputInfoList &Inputs,
7670 const ArgList &Args,
7671 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007672 ArgStringList CmdArgs;
7673
7674 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7675 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007676 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007677 CmdArgs.push_back("--32");
7678
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007679 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007680
7681 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007682 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007683
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007684 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007685 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007686
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007687 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007688 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007689}
7690
7691void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007692 const InputInfo &Output,
7693 const InputInfoList &Inputs,
7694 const ArgList &Args,
7695 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007696 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007697 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007698 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007699
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007700 if (!D.SysRoot.empty())
7701 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7702
John McCall65b8da02013-04-11 22:55:55 +00007703 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007704 if (Args.hasArg(options::OPT_static)) {
7705 CmdArgs.push_back("-Bstatic");
7706 } else {
John McCall65b8da02013-04-11 22:55:55 +00007707 if (Args.hasArg(options::OPT_rdynamic))
7708 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007709 if (Args.hasArg(options::OPT_shared))
7710 CmdArgs.push_back("-Bshareable");
7711 else {
7712 CmdArgs.push_back("-dynamic-linker");
7713 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7714 }
John McCall65b8da02013-04-11 22:55:55 +00007715 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007716 }
7717
7718 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7719 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007720 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007721 CmdArgs.push_back("-m");
7722 CmdArgs.push_back("elf_i386");
7723 }
7724
Daniel Dunbarb440f562010-08-02 02:38:21 +00007725 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007726 CmdArgs.push_back("-o");
7727 CmdArgs.push_back(Output.getFilename());
7728 } else {
7729 assert(Output.isNothing() && "Invalid output.");
7730 }
7731
7732 if (!Args.hasArg(options::OPT_nostdlib) &&
7733 !Args.hasArg(options::OPT_nostartfiles)) {
7734 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007735 if (Args.hasArg(options::OPT_pg))
7736 CmdArgs.push_back(Args.MakeArgString(
7737 getToolChain().GetFilePath("gcrt1.o")));
7738 else {
7739 if (Args.hasArg(options::OPT_pie))
7740 CmdArgs.push_back(Args.MakeArgString(
7741 getToolChain().GetFilePath("Scrt1.o")));
7742 else
7743 CmdArgs.push_back(Args.MakeArgString(
7744 getToolChain().GetFilePath("crt1.o")));
7745 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007746 }
John McCall65b8da02013-04-11 22:55:55 +00007747 CmdArgs.push_back(Args.MakeArgString(
7748 getToolChain().GetFilePath("crti.o")));
7749 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7750 CmdArgs.push_back(Args.MakeArgString(
7751 getToolChain().GetFilePath("crtbeginS.o")));
7752 else
7753 CmdArgs.push_back(Args.MakeArgString(
7754 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007755 }
7756
7757 Args.AddAllArgs(CmdArgs, options::OPT_L);
7758 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7759 Args.AddAllArgs(CmdArgs, options::OPT_e);
7760
Daniel Dunbar54423b22010-09-17 00:24:54 +00007761 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007762
7763 if (!Args.hasArg(options::OPT_nostdlib) &&
7764 !Args.hasArg(options::OPT_nodefaultlibs)) {
7765 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7766 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007767 if (UseGCC47)
7768 CmdArgs.push_back("-L/usr/lib/gcc47");
7769 else
7770 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007771
7772 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007773 if (UseGCC47) {
7774 CmdArgs.push_back("-rpath");
7775 CmdArgs.push_back("/usr/lib/gcc47");
7776 } else {
7777 CmdArgs.push_back("-rpath");
7778 CmdArgs.push_back("/usr/lib/gcc44");
7779 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007780 }
7781
Hans Wennborg70850d82013-07-18 20:29:38 +00007782 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007783 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007784 CmdArgs.push_back("-lm");
7785 }
7786
Daniel Dunbarcc912342009-05-02 18:28:39 +00007787 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007788 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007789
7790 if (!Args.hasArg(options::OPT_nolibc)) {
7791 CmdArgs.push_back("-lc");
7792 }
7793
John McCall65b8da02013-04-11 22:55:55 +00007794 if (UseGCC47) {
7795 if (Args.hasArg(options::OPT_static) ||
7796 Args.hasArg(options::OPT_static_libgcc)) {
7797 CmdArgs.push_back("-lgcc");
7798 CmdArgs.push_back("-lgcc_eh");
7799 } else {
7800 if (Args.hasArg(options::OPT_shared_libgcc)) {
7801 CmdArgs.push_back("-lgcc_pic");
7802 if (!Args.hasArg(options::OPT_shared))
7803 CmdArgs.push_back("-lgcc");
7804 } else {
7805 CmdArgs.push_back("-lgcc");
7806 CmdArgs.push_back("--as-needed");
7807 CmdArgs.push_back("-lgcc_pic");
7808 CmdArgs.push_back("--no-as-needed");
7809 }
7810 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007811 } else {
John McCall65b8da02013-04-11 22:55:55 +00007812 if (Args.hasArg(options::OPT_shared)) {
7813 CmdArgs.push_back("-lgcc_pic");
7814 } else {
7815 CmdArgs.push_back("-lgcc");
7816 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007817 }
7818 }
7819
7820 if (!Args.hasArg(options::OPT_nostdlib) &&
7821 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007822 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007823 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007824 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007825 else
7826 CmdArgs.push_back(Args.MakeArgString(
7827 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007828 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007829 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007830 }
7831
Alexey Samsonov7811d192014-02-20 13:57:37 +00007832 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007833
Logan Chieneb9162f2014-06-26 14:23:45 +00007834 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007835 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007836}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007837
Alexey Samsonov6424e022014-05-12 20:20:20 +00007838static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7839 ArgStringList &CmdArgs,
Craig Topperbf3e3272014-08-30 16:55:52 +00007840 StringRef RTName) {
Alexey Samsonov6424e022014-05-12 20:20:20 +00007841 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7842 llvm::sys::path::append(LibSanitizer,
7843 Twine("clang_rt.") + RTName + ".lib");
7844 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7845}
7846
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00007847// Try to find Exe from a Visual Studio distribution. This first tries to find
7848// an installed copy of Visual Studio and, failing that, looks in the PATH,
7849// making sure that whatever executable that's found is not a same-named exe
7850// from clang itself to prevent clang from falling back to itself.
7851static std::string FindVisualStudioExecutable(const ToolChain &TC,
7852 const char *Exe,
7853 const char *ClangProgramPath) {
7854 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
7855 std::string visualStudioBinDir;
7856 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
7857 visualStudioBinDir)) {
7858 SmallString<128> FilePath(visualStudioBinDir);
7859 llvm::sys::path::append(FilePath, Exe);
7860 if (llvm::sys::fs::can_execute(FilePath.c_str()))
7861 return FilePath.str();
7862 }
7863
7864 return Exe;
7865}
7866
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007867void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7868 const InputInfo &Output,
7869 const InputInfoList &Inputs,
7870 const ArgList &Args,
7871 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007872 ArgStringList CmdArgs;
7873
7874 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007875 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7876 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007877 } else {
7878 assert(Output.isNothing() && "Invalid output.");
7879 }
7880
7881 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007882 !Args.hasArg(options::OPT_nostartfiles) &&
7883 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007884 CmdArgs.push_back("-defaultlib:libcmt");
7885 }
7886
Zachary Turner10d75b22014-10-22 20:40:43 +00007887 if (!llvm::sys::Process::GetEnv("LIB")) {
7888 // If the VC environment hasn't been configured (perhaps because the user
7889 // did not run vcvarsall), try to build a consistent link environment. If
7890 // the environment variable is set however, assume the user knows what he's
7891 // doing.
7892 std::string VisualStudioDir;
7893 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(getToolChain());
7894 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
7895 SmallString<128> LibDir(VisualStudioDir);
7896 llvm::sys::path::append(LibDir, "VC", "lib");
7897 switch (MSVC.getArch()) {
7898 case llvm::Triple::x86:
7899 // x86 just puts the libraries directly in lib
7900 break;
7901 case llvm::Triple::x86_64:
7902 llvm::sys::path::append(LibDir, "amd64");
7903 break;
7904 case llvm::Triple::arm:
7905 llvm::sys::path::append(LibDir, "arm");
7906 break;
7907 default:
7908 break;
7909 }
7910 CmdArgs.push_back(
7911 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
7912 }
7913
7914 std::string WindowsSdkLibPath;
7915 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
7916 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
7917 WindowsSdkLibPath.c_str()));
7918 }
7919
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007920 CmdArgs.push_back("-nologo");
7921
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007922 if (Args.hasArg(options::OPT_g_Group)) {
7923 CmdArgs.push_back("-debug");
7924 }
7925
Hans Wennborgf1a74252013-09-10 20:18:04 +00007926 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7927
7928 if (DLL) {
7929 CmdArgs.push_back(Args.MakeArgString("-dll"));
7930
7931 SmallString<128> ImplibName(Output.getFilename());
7932 llvm::sys::path::replace_extension(ImplibName, "lib");
7933 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7934 ImplibName.str()));
7935 }
7936
Peter Collingbourne32701642013-11-01 18:16:25 +00007937 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007938 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007939 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007940 // FIXME: Handle 64-bit.
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00007941 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
7942 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_dynamic-i386");
Timur Iskhodzhanov92c06012014-09-12 13:21:02 +00007943 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7944 "asan_dynamic_runtime_thunk-i386");
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00007945 // Make sure the dynamic runtime thunk is not optimized out at link time
7946 // to ensure proper SEH handling.
7947 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00007948 } else if (DLL) {
Alexey Samsonov6424e022014-05-12 20:20:20 +00007949 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7950 "asan_dll_thunk-i386");
7951 } else {
7952 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7953 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7954 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007955 }
7956
Hans Wennborg2e274592013-08-13 23:38:57 +00007957 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007958
Reid Kleckner337188f2014-09-16 19:22:00 +00007959 // Add filenames, libraries, and other linker inputs.
7960 for (const auto &Input : Inputs) {
7961 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007962 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00007963 continue;
7964 }
7965
7966 const Arg &A = Input.getInputArg();
7967
7968 // Render -l options differently for the MSVC linker.
7969 if (A.getOption().matches(options::OPT_l)) {
7970 StringRef Lib = A.getValue();
7971 const char *LinkLibArg;
7972 if (Lib.endswith(".lib"))
7973 LinkLibArg = Args.MakeArgString(Lib);
7974 else
7975 LinkLibArg = Args.MakeArgString(Lib + ".lib");
7976 CmdArgs.push_back(LinkLibArg);
7977 continue;
7978 }
7979
7980 // Otherwise, this is some other kind of linker input option like -Wl, -z,
7981 // or -L. Render it, even if MSVC doesn't understand it.
7982 A.renderAsInput(Args, CmdArgs);
7983 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007984
Zachary Turner719f58c2014-12-01 23:06:47 +00007985 // We need to special case some linker paths. In the case of lld, we need to
7986 // translate 'lld' into 'lld-link', and in the case of the regular msvc
7987 // linker, we need to use a special search algorithm.
7988 llvm::SmallString<128> linkPath;
7989 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
7990 if (Linker.equals_lower("lld"))
7991 Linker = "lld-link";
7992
7993 if (Linker.equals_lower("link")) {
7994 // If we're using the MSVC linker, it's not sufficient to just use link
7995 // from the program PATH, because other environments like GnuWin32 install
7996 // their own link.exe which may come first.
7997 linkPath = FindVisualStudioExecutable(getToolChain(), "link.exe",
7998 C.getDriver().getClangProgramPath());
7999 } else {
8000 linkPath = Linker;
8001 llvm::sys::path::replace_extension(linkPath, "exe");
8002 linkPath = getToolChain().GetProgramPath(linkPath.c_str());
8003 }
8004
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008005 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008006 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008007}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008008
8009void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8010 const InputInfo &Output,
8011 const InputInfoList &Inputs,
8012 const ArgList &Args,
8013 const char *LinkingOutput) const {
8014 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8015}
8016
David Blaikiec11bf802014-09-04 16:04:28 +00008017std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8018 Compilation &C, const JobAction &JA, const InputInfo &Output,
8019 const InputInfoList &Inputs, const ArgList &Args,
8020 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008021 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008022 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008023 CmdArgs.push_back("/c"); // Compile only.
8024 CmdArgs.push_back("/W0"); // No warnings.
8025
8026 // The goal is to be able to invoke this tool correctly based on
8027 // any flag accepted by clang-cl.
8028
8029 // These are spelled the same way in clang and cl.exe,.
8030 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8031 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008032
8033 // Optimization level.
8034 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8035 if (A->getOption().getID() == options::OPT_O0) {
8036 CmdArgs.push_back("/Od");
8037 } else {
8038 StringRef OptLevel = A->getValue();
8039 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8040 A->render(Args, CmdArgs);
8041 else if (OptLevel == "3")
8042 CmdArgs.push_back("/Ox");
8043 }
8044 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008045
8046 // Flags for which clang-cl have an alias.
8047 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8048
David Majnemerf6072342014-07-01 22:24:56 +00008049 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8050 /*default=*/false))
8051 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008052 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8053 options::OPT_fno_function_sections))
8054 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8055 ? "/Gy"
8056 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008057 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8058 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008059 CmdArgs.push_back(
8060 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008061 if (Args.hasArg(options::OPT_fsyntax_only))
8062 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008063 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8064 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008065
Hans Wennborg260ff402013-09-27 17:54:18 +00008066 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008067 for (const auto &Include : Includes)
8068 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008069
Hans Wennborg87cfa712013-09-19 20:32:16 +00008070 // Flags that can simply be passed through.
8071 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8072 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008073 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008074
8075 // The order of these flags is relevant, so pick the last one.
8076 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8077 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8078 A->render(Args, CmdArgs);
8079
8080
8081 // Input filename.
8082 assert(Inputs.size() == 1);
8083 const InputInfo &II = Inputs[0];
8084 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8085 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8086 if (II.isFilename())
8087 CmdArgs.push_back(II.getFilename());
8088 else
8089 II.getInputArg().renderAsInput(Args, CmdArgs);
8090
8091 // Output filename.
8092 assert(Output.getType() == types::TY_Object);
8093 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8094 Output.getFilename());
8095 CmdArgs.push_back(Fo);
8096
Hans Wennborg188382e2013-09-20 18:16:35 +00008097 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008098 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8099 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008100 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8101 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008102}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008103
8104
8105/// XCore Tools
8106// We pass assemble and link construction to the xcc tool.
8107
8108void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8109 const InputInfo &Output,
8110 const InputInfoList &Inputs,
8111 const ArgList &Args,
8112 const char *LinkingOutput) const {
8113 ArgStringList CmdArgs;
8114
8115 CmdArgs.push_back("-o");
8116 CmdArgs.push_back(Output.getFilename());
8117
8118 CmdArgs.push_back("-c");
8119
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008120 if (Args.hasArg(options::OPT_v))
8121 CmdArgs.push_back("-v");
8122
Robert Lytton894d25c2014-05-02 09:33:25 +00008123 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8124 if (!A->getOption().matches(options::OPT_g0))
8125 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008126
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008127 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8128 false))
8129 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008130
8131 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8132 options::OPT_Xassembler);
8133
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008134 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008135 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008136
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008137 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008138 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008139}
8140
8141void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8142 const InputInfo &Output,
8143 const InputInfoList &Inputs,
8144 const ArgList &Args,
8145 const char *LinkingOutput) const {
8146 ArgStringList CmdArgs;
8147
8148 if (Output.isFilename()) {
8149 CmdArgs.push_back("-o");
8150 CmdArgs.push_back(Output.getFilename());
8151 } else {
8152 assert(Output.isNothing() && "Invalid output.");
8153 }
8154
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008155 if (Args.hasArg(options::OPT_v))
8156 CmdArgs.push_back("-v");
8157
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008158 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
8159 if (EH.ShouldUseExceptionTables)
8160 CmdArgs.push_back("-fexceptions");
8161
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008162 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8163
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008164 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008165 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008166}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008167
8168void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8169 const InputInfo &Output,
8170 const InputInfoList &Inputs,
8171 const ArgList &Args,
8172 const char *LinkingOutput) const {
8173 const auto &TC =
8174 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8175 ArgStringList CmdArgs;
8176 const char *Exec;
8177
8178 switch (TC.getArch()) {
8179 default: llvm_unreachable("unsupported architecture");
8180 case llvm::Triple::arm:
8181 case llvm::Triple::thumb:
8182 break;
8183 case llvm::Triple::x86:
8184 CmdArgs.push_back("--32");
8185 break;
8186 case llvm::Triple::x86_64:
8187 CmdArgs.push_back("--64");
8188 break;
8189 }
8190
8191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8192
8193 CmdArgs.push_back("-o");
8194 CmdArgs.push_back(Output.getFilename());
8195
8196 for (const auto &Input : Inputs)
8197 CmdArgs.push_back(Input.getFilename());
8198
8199 const std::string Assembler = TC.GetProgramPath("as");
8200 Exec = Args.MakeArgString(Assembler);
8201
8202 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8203}
8204
8205void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8206 const InputInfo &Output,
8207 const InputInfoList &Inputs,
8208 const ArgList &Args,
8209 const char *LinkingOutput) const {
8210 const auto &TC =
8211 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8212 const llvm::Triple &T = TC.getTriple();
8213 const Driver &D = TC.getDriver();
8214 SmallString<128> EntryPoint;
8215 ArgStringList CmdArgs;
8216 const char *Exec;
8217
8218 // Silence warning for "clang -g foo.o -o foo"
8219 Args.ClaimAllArgs(options::OPT_g_Group);
8220 // and "clang -emit-llvm foo.o -o foo"
8221 Args.ClaimAllArgs(options::OPT_emit_llvm);
8222 // and for "clang -w foo.o -o foo"
8223 Args.ClaimAllArgs(options::OPT_w);
8224 // Other warning options are already handled somewhere else.
8225
8226 if (!D.SysRoot.empty())
8227 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8228
8229 if (Args.hasArg(options::OPT_pie))
8230 CmdArgs.push_back("-pie");
8231 if (Args.hasArg(options::OPT_rdynamic))
8232 CmdArgs.push_back("-export-dynamic");
8233 if (Args.hasArg(options::OPT_s))
8234 CmdArgs.push_back("--strip-all");
8235
8236 CmdArgs.push_back("-m");
8237 switch (TC.getArch()) {
8238 default: llvm_unreachable("unsupported architecture");
8239 case llvm::Triple::arm:
8240 case llvm::Triple::thumb:
8241 // FIXME: this is incorrect for WinCE
8242 CmdArgs.push_back("thumb2pe");
8243 break;
8244 case llvm::Triple::x86:
8245 CmdArgs.push_back("i386pe");
8246 EntryPoint.append("_");
8247 break;
8248 case llvm::Triple::x86_64:
8249 CmdArgs.push_back("i386pep");
8250 break;
8251 }
8252
8253 if (Args.hasArg(options::OPT_shared)) {
8254 switch (T.getArch()) {
8255 default: llvm_unreachable("unsupported architecture");
8256 case llvm::Triple::arm:
8257 case llvm::Triple::thumb:
8258 case llvm::Triple::x86_64:
8259 EntryPoint.append("_DllMainCRTStartup");
8260 break;
8261 case llvm::Triple::x86:
8262 EntryPoint.append("_DllMainCRTStartup@12");
8263 break;
8264 }
8265
8266 CmdArgs.push_back("-shared");
8267 CmdArgs.push_back("-Bdynamic");
8268
8269 CmdArgs.push_back("--enable-auto-image-base");
8270
8271 CmdArgs.push_back("--entry");
8272 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8273 } else {
8274 EntryPoint.append("mainCRTStartup");
8275
8276 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8277 : "-Bdynamic");
8278
8279 if (!Args.hasArg(options::OPT_nostdlib) &&
8280 !Args.hasArg(options::OPT_nostartfiles)) {
8281 CmdArgs.push_back("--entry");
8282 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8283 }
8284
8285 // FIXME: handle subsystem
8286 }
8287
8288 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008289 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008290
8291 CmdArgs.push_back("-o");
8292 CmdArgs.push_back(Output.getFilename());
8293
8294 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8295 SmallString<261> ImpLib(Output.getFilename());
8296 llvm::sys::path::replace_extension(ImpLib, ".lib");
8297
8298 CmdArgs.push_back("--out-implib");
8299 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8300 }
8301
8302 if (!Args.hasArg(options::OPT_nostdlib) &&
8303 !Args.hasArg(options::OPT_nostartfiles)) {
8304 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8305 const char *CRTBegin;
8306
8307 CRTBegin =
8308 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8309 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8310 }
8311
8312 Args.AddAllArgs(CmdArgs, options::OPT_L);
8313
8314 const auto &Paths = TC.getFilePaths();
8315 for (const auto &Path : Paths)
8316 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8317
8318 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8319
8320 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8321 !Args.hasArg(options::OPT_nodefaultlibs)) {
8322 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8323 !Args.hasArg(options::OPT_static);
8324 if (StaticCXX)
8325 CmdArgs.push_back("-Bstatic");
8326 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8327 if (StaticCXX)
8328 CmdArgs.push_back("-Bdynamic");
8329 }
8330
8331 if (!Args.hasArg(options::OPT_nostdlib)) {
8332 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8333 // TODO handle /MT[d] /MD[d]
8334 CmdArgs.push_back("-lmsvcrt");
8335 AddRunTimeLibs(TC, D, CmdArgs, Args);
8336 }
8337 }
8338
8339 const std::string Linker = TC.GetProgramPath("ld");
8340 Exec = Args.MakeArgString(Linker);
8341
8342 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8343}
8344