blob: 951c6b8d5700d9ee65a6f82988426e361bb1c60b [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"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000035#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000037#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000039#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000040#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000041#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000042#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000043
Ben Langmuir3b7b5402015-02-03 19:28:37 +000044#ifdef LLVM_ON_UNIX
45#include <unistd.h> // For getuid().
46#endif
47
Daniel Dunbar1a093d22009-03-18 06:00:36 +000048using namespace clang::driver;
49using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000050using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000051using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000052
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000053static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
54 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
55 options::OPT_fpic, options::OPT_fno_pic,
56 options::OPT_fPIE, options::OPT_fno_PIE,
57 options::OPT_fpie, options::OPT_fno_pie);
58 if (!LastPICArg)
59 return;
60 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
61 LastPICArg->getOption().matches(options::OPT_fpic) ||
62 LastPICArg->getOption().matches(options::OPT_fPIE) ||
63 LastPICArg->getOption().matches(options::OPT_fpie)) {
64 CmdArgs.push_back("-KPIC");
65 }
66}
67
Daniel Dunbar64198ef2009-09-10 01:21:05 +000068/// CheckPreprocessingOptions - Perform some validation of preprocessing
69/// arguments that is shared with gcc.
70static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000071 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
72 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
73 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000074 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000075 << A->getBaseArg().getAsString(Args)
76 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
77 }
78 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000079}
80
Daniel Dunbar4eadb602009-09-10 01:21:12 +000081/// CheckCodeGenerationOptions - Perform some validation of code generation
82/// arguments that is shared with gcc.
83static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
84 // In gcc, only ARM checks this, but it seems reasonable to check universally.
85 if (Args.hasArg(options::OPT_static))
86 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
87 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000088 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000089 << A->getAsString(Args) << "-static";
90}
91
Bob Wilsond5aad2a2014-11-04 22:28:48 +000092// Add backslashes to escape spaces and other backslashes.
93// This is used for the space-separated argument list specified with
94// the -dwarf-debug-flags option.
95static void EscapeSpacesAndBackslashes(const char *Arg,
96 SmallVectorImpl<char> &Res) {
97 for ( ; *Arg; ++Arg) {
98 switch (*Arg) {
99 default: break;
100 case ' ':
101 case '\\':
102 Res.push_back('\\');
103 break;
104 }
105 Res.push_back(*Arg);
106 }
107}
108
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000109// Quote target names for inclusion in GNU Make dependency files.
110// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111static void QuoteTarget(StringRef Target,
112 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000113 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
114 switch (Target[i]) {
115 case ' ':
116 case '\t':
117 // Escape the preceding backslashes
118 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
119 Res.push_back('\\');
120
121 // Escape the space/tab
122 Res.push_back('\\');
123 break;
124 case '$':
125 Res.push_back('$');
126 break;
127 case '#':
128 Res.push_back('\\');
129 break;
130 default:
131 break;
132 }
133
134 Res.push_back(Target[i]);
135 }
136}
137
Bill Wendlingc0938f32012-03-12 22:10:06 +0000138static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000139 ArgStringList &CmdArgs,
140 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *EnvVar) {
142 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 bool CombinedArg = false;
144
Bill Wendling281ca292012-03-12 21:22:35 +0000145 if (!DirList)
146 return; // Nothing to do.
147
Chad Rosier616e8a52012-10-30 21:42:09 +0000148 StringRef Name(ArgName);
149 if (Name.equals("-I") || Name.equals("-L"))
150 CombinedArg = true;
151
Bill Wendling281ca292012-03-12 21:22:35 +0000152 StringRef Dirs(DirList);
153 if (Dirs.empty()) // Empty string should not add '.'.
154 return;
155
156 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000157 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000158 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000159 if (CombinedArg) {
160 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
161 } else {
162 CmdArgs.push_back(ArgName);
163 CmdArgs.push_back(".");
164 }
Bill Wendling281ca292012-03-12 21:22:35 +0000165 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000166 if (CombinedArg) {
167 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193static void AddLinkerInputs(const ToolChain &TC,
194 const InputInfoList &Inputs, const ArgList &Args,
195 ArgStringList &CmdArgs) {
196 const Driver &D = TC.getDriver();
197
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000198 // Add extra linker input arguments which are not treated as inputs
199 // (constructed via -Xarch_).
200 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000202 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000203 if (!TC.HasNativeLLVMSupport()) {
204 // Don't try to pass LLVM inputs unless we have native support.
205 if (II.getType() == types::TY_LLVM_IR ||
206 II.getType() == types::TY_LTO_IR ||
207 II.getType() == types::TY_LLVM_BC ||
208 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000209 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000210 << TC.getTripleString();
211 }
212
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 // Add filenames immediately.
214 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000215 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000216 continue;
217 }
218
219 // Otherwise, this is a linker input argument.
220 const Arg &A = II.getInputArg();
221
222 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000223 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000224 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000225 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000226 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000227 else if (A.getOption().matches(options::OPT_z)) {
228 // Pass -z prefix for gcc linker compatibility.
229 A.claim();
230 A.render(Args, CmdArgs);
231 } else {
232 A.renderAsInput(Args, CmdArgs);
233 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000234 }
Bill Wendling281ca292012-03-12 21:22:35 +0000235
236 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000237 // and only supported on native toolchains.
238 if (!TC.isCrossCompiling())
239 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000240}
241
John McCall31168b02011-06-15 23:02:42 +0000242/// \brief Determine whether Objective-C automated reference counting is
243/// enabled.
244static bool isObjCAutoRefCount(const ArgList &Args) {
245 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
246}
247
Ted Kremeneke65b0862012-03-06 20:05:56 +0000248/// \brief Determine whether we are linking the ObjC runtime.
249static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 if (isObjCAutoRefCount(Args)) {
251 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000252 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000253 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000254 return Args.hasArg(options::OPT_fobjc_link_runtime);
255}
256
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000257static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000258 // Don't forward inputs from the original command line. They are added from
259 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000260 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000261 !O.hasFlag(options::DriverOption) &&
262 !O.hasFlag(options::LinkerInput);
263}
264
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000265void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000267 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000268 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 ArgStringList &CmdArgs,
270 const InputInfo &Output,
271 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000273
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000274 CheckPreprocessingOptions(D, Args);
275
276 Args.AddLastArg(CmdArgs, options::OPT_C);
277 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000278
279 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000280 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 (A = Args.getLastArg(options::OPT_MD)) ||
282 (A = Args.getLastArg(options::OPT_MMD))) {
283 // Determine the output location.
284 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000285 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000286 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000287 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000288 } else if (Output.getType() == types::TY_Dependencies) {
289 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000290 } else if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 DepFile = "-";
293 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000294 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000295 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297 CmdArgs.push_back("-dependency-file");
298 CmdArgs.push_back(DepFile);
299
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
302 const char *DepTarget;
303
304 // If user provided -o, that is the dependency target, except
305 // when we are only generating a dependency file.
306 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
307 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000308 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309 } else {
310 // Otherwise derive from the base input.
311 //
312 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000314 llvm::sys::path::replace_extension(P, "o");
315 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
318 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 QuoteTarget(DepTarget, Quoted);
321 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322 }
323
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000324 if (A->getOption().matches(options::OPT_M) ||
325 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000327 if ((isa<PrecompileJobAction>(JA) &&
328 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
329 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000330 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331 }
332
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000333 if (Args.hasArg(options::OPT_MG)) {
334 if (!A || A->getOption().matches(options::OPT_MD) ||
335 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000336 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000337 CmdArgs.push_back("-MG");
338 }
339
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000340 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342
343 // Convert all -MQ <target> args to -MT <quoted target>
344 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
345 options::OPT_MQ),
346 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000347 const Arg *A = *it;
348 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349
Daniel Dunbara442fd52010-06-11 22:00:13 +0000350 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000351 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000352 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000353 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000354 CmdArgs.push_back(Args.MakeArgString(Quoted));
355
356 // -MT flag - no change
357 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000358 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000359 }
360 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000361
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 // Add -i* options, and automatically translate to
363 // -include-pch/-include-pth for transparent PCH support. It's
364 // wonky, but we include looking for .gch so we can support seamless
365 // replacement into a build system already set up to be generating
366 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000367 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000368 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
369 ie = Args.filtered_end(); it != ie; ++it) {
370 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000371
372 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000373 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
374 RenderedImplicitInclude = true;
375
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000376 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000377 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000379 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000380 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000381 SmallString<128> P(A->getValue());
382 // We want the files to have a name like foo.h.pch. Add a dummy extension
383 // so that replace_extension does the right thing.
384 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000385 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000387 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000388 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000389 }
390
Douglas Gregor111af7d2009-04-18 00:34:01 +0000391 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000392 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000393 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000394 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000395 }
396
Douglas Gregor111af7d2009-04-18 00:34:01 +0000397 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000398 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000399 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000400 FoundPCH = UsePCH;
401 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000402 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
404
405 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000406 if (IsFirstImplicitInclude) {
407 A->claim();
408 if (UsePCH)
409 CmdArgs.push_back("-include-pch");
410 else
411 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000413 continue;
414 } else {
415 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000417 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000418 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000419 }
420 }
421
422 // Not translated, render as usual.
423 A->claim();
424 A->render(Args, CmdArgs);
425 }
426
427 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000428 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
429 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000430
431 // Add -Wp, and -Xassembler if using the preprocessor.
432
433 // FIXME: There is a very unfortunate problem here, some troubled
434 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
435 // really support that we would have to parse and then translate
436 // those options. :(
437 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
438 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000439
440 // -I- is a deprecated GCC feature, reject it.
441 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000442 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000443
444 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
445 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000446 StringRef sysroot = C.getSysRoot();
447 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000448 if (!Args.hasArg(options::OPT_isysroot)) {
449 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000450 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000451 }
452 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000453
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000455 // FIXME: We should probably sink the logic for handling these from the
456 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000457 // CPATH - included following the user specified includes (but prior to
458 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000459 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000460 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000461 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000463 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000464 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000465 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000466 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000467 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000468
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000470 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000471 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000472
473 // Add system include arguments.
474 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000475}
476
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000477// FIXME: Move to target hook.
478static bool isSignedCharDefault(const llvm::Triple &Triple) {
479 switch (Triple.getArch()) {
480 default:
481 return true;
482
Tim Northover9bb857a2013-01-31 12:13:10 +0000483 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000484 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000485 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000486 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000487 case llvm::Triple::thumb:
488 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000489 if (Triple.isOSDarwin() || Triple.isOSWindows())
490 return true;
491 return false;
492
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000493 case llvm::Triple::ppc:
494 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000495 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000496 return true;
497 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000498
Bill Schmidt778d3872013-07-26 01:36:11 +0000499 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000500 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000501 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000502 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000503 }
504}
505
Robert Lytton0e076492013-08-13 09:43:10 +0000506static bool isNoCommonDefault(const llvm::Triple &Triple) {
507 switch (Triple.getArch()) {
508 default:
509 return false;
510
511 case llvm::Triple::xcore:
512 return true;
513 }
514}
515
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000516// Handle -mhwdiv=.
517static void getARMHWDivFeatures(const Driver &D, const Arg *A,
518 const ArgList &Args,
519 std::vector<const char *> &Features) {
520 StringRef HWDiv = A->getValue();
521 if (HWDiv == "arm") {
522 Features.push_back("+hwdiv-arm");
523 Features.push_back("-hwdiv");
524 } else if (HWDiv == "thumb") {
525 Features.push_back("-hwdiv-arm");
526 Features.push_back("+hwdiv");
527 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
528 Features.push_back("+hwdiv-arm");
529 Features.push_back("+hwdiv");
530 } else if (HWDiv == "none") {
531 Features.push_back("-hwdiv-arm");
532 Features.push_back("-hwdiv");
533 } else
534 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
535}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000536
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000537// Handle -mfpu=.
538//
539// FIXME: Centralize feature selection, defaulting shouldn't be also in the
540// frontend target.
541static void getARMFPUFeatures(const Driver &D, const Arg *A,
542 const ArgList &Args,
543 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000544 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000545
546 // Set the target features based on the FPU.
547 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
548 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000549 Features.push_back("-vfp2");
550 Features.push_back("-vfp3");
551 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000552 } else if (FPU == "vfp") {
553 Features.push_back("+vfp2");
554 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000555 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000556 Features.push_back("+vfp3");
557 Features.push_back("+d16");
558 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000559 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000560 Features.push_back("+vfp3");
561 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000562 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
563 Features.push_back("+vfp4");
564 Features.push_back("+d16");
565 Features.push_back("-neon");
566 } else if (FPU == "vfp4" || FPU == "vfpv4") {
567 Features.push_back("+vfp4");
568 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000569 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
570 Features.push_back("+vfp4");
571 Features.push_back("+d16");
572 Features.push_back("+fp-only-sp");
573 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000574 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
575 Features.push_back("+fp-armv8");
576 Features.push_back("+fp-only-sp");
577 Features.push_back("+d16");
578 Features.push_back("-neon");
579 Features.push_back("-crypto");
580 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
581 FPU == "fp5-d16" || FPU == "fpv5-d16") {
582 Features.push_back("+fp-armv8");
583 Features.push_back("+d16");
584 Features.push_back("-neon");
585 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000586 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("-neon");
589 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000590 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000591 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000593 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000594 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000595 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000596 Features.push_back("+neon");
597 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000598 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000599 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000600 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000601 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000602 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000603 } else if (FPU == "neon-vfpv4") {
604 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000605 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000606 } else if (FPU == "none") {
607 Features.push_back("-vfp2");
608 Features.push_back("-vfp3");
609 Features.push_back("-vfp4");
610 Features.push_back("-fp-armv8");
611 Features.push_back("-crypto");
612 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000613 } else
614 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
615}
616
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000617// Select the float ABI as determined by -msoft-float, -mhard-float, and
618// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000619StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000621 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000622 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
623 options::OPT_mhard_float,
624 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000625 if (A->getOption().matches(options::OPT_msoft_float))
626 FloatABI = "soft";
627 else if (A->getOption().matches(options::OPT_mhard_float))
628 FloatABI = "hard";
629 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000630 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000632 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 << A->getAsString(Args);
634 FloatABI = "soft";
635 }
636 }
637 }
638
639 // If unspecified, choose the default based on the platform.
640 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000641 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000642 case llvm::Triple::Darwin:
643 case llvm::Triple::MacOSX:
644 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 // Darwin defaults to "softfp" for v6 and v7.
646 //
647 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000649 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v6") ||
651 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000652 FloatABI = "softfp";
653 else
654 FloatABI = "soft";
655 break;
656 }
657
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000658 // FIXME: this is invalid for WindowsCE
659 case llvm::Triple::Win32:
660 FloatABI = "hard";
661 break;
662
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000663 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000664 switch(Triple.getEnvironment()) {
665 case llvm::Triple::GNUEABIHF:
666 FloatABI = "hard";
667 break;
668 default:
669 // FreeBSD defaults to soft float
670 FloatABI = "soft";
671 break;
672 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000673 break;
674
Daniel Dunbar78485922009-09-10 23:00:09 +0000675 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000676 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000677 case llvm::Triple::GNUEABIHF:
678 FloatABI = "hard";
679 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000680 case llvm::Triple::GNUEABI:
681 FloatABI = "softfp";
682 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000683 case llvm::Triple::EABIHF:
684 FloatABI = "hard";
685 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000686 case llvm::Triple::EABI:
687 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
688 FloatABI = "softfp";
689 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000690 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000691 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000692 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000693 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000694 FloatABI = "softfp";
695 else
696 FloatABI = "soft";
697 break;
698 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000699 default:
700 // Assume "soft", but warn the user we are guessing.
701 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000702 if (Triple.getOS() != llvm::Triple::UnknownOS ||
703 !Triple.isOSBinFormatMachO())
704 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000705 break;
706 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000707 }
708 }
709
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000710 return FloatABI;
711}
712
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000713static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
714 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000715 std::vector<const char *> &Features,
716 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000717 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
718 if (!ForAS) {
719 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
720 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
721 // stripped out by the ARM target. We should probably pass this a new
722 // -target-option, which is handled by the -cc1/-cc1as invocation.
723 //
724 // FIXME2: For consistency, it would be ideal if we set up the target
725 // machine state the same when using the frontend or the assembler. We don't
726 // currently do that for the assembler, we pass the options directly to the
727 // backend and never even instantiate the frontend TargetInfo. If we did,
728 // and used its handleTargetFeatures hook, then we could ensure the
729 // assembler and the frontend behave the same.
730
731 // Use software floating point operations?
732 if (FloatABI == "soft")
733 Features.push_back("+soft-float");
734
735 // Use software floating point argument passing?
736 if (FloatABI != "hard")
737 Features.push_back("+soft-float-abi");
738 }
739
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000740 // Honor -mfpu=.
741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000742 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000743 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
744 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000745
John Brawna95c1a82015-05-08 12:52:18 +0000746 // -march is handled in getARMCPUForMarch by translating it into a CPU name,
747 // but it needs to return an empty string on invalid arguments. We therefore
748 // check and give an error here if the -march is invalid.
749 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
750 if (!Triple.getARMCPUForArch(A->getValue()))
751 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
752
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000753 // Setting -msoft-float effectively disables NEON because of the GCC
754 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000755 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000757 // Also need to explicitly disable features which imply NEON.
758 Features.push_back("-crypto");
759 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000760
Eric Christopher269c2a22015-04-04 03:34:43 +0000761 // En/disable crc code generation.
762 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000763 if (A->getOption().matches(options::OPT_mcrc))
764 Features.push_back("+crc");
765 else
766 Features.push_back("-crc");
767 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000768}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769
770void Clang::AddARMTargetArgs(const ArgList &Args,
771 ArgStringList &CmdArgs,
772 bool KernelOrKext) const {
773 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000774 // Get the effective triple, which takes into account the deployment target.
775 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
776 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000777 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000778
779 // Select the ABI to use.
780 //
781 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000782 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000783 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000784 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000785 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000786 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000787 // The backend is hardwired to assume AAPCS for M-class processors, ensure
788 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000789 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000790 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000791 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000792 ABIName = "aapcs";
793 } else {
794 ABIName = "apcs-gnu";
795 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000796 } else if (Triple.isOSWindows()) {
797 // FIXME: this is invalid for WindowsCE
798 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000799 } else {
800 // Select the default based on the platform.
801 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000802 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000803 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000804 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000805 ABIName = "aapcs-linux";
806 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000807 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 case llvm::Triple::EABI:
809 ABIName = "aapcs";
810 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000811 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000812 if (Triple.getOS() == llvm::Triple::NetBSD)
813 ABIName = "apcs-gnu";
814 else
815 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000816 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817 }
818 }
819 CmdArgs.push_back("-target-abi");
820 CmdArgs.push_back(ABIName);
821
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000823 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000824 if (FloatABI == "soft") {
825 // Floating point operations and argument passing are soft.
826 //
827 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000828 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000829 CmdArgs.push_back("-mfloat-abi");
830 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000831 } else if (FloatABI == "softfp") {
832 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000833 CmdArgs.push_back("-mfloat-abi");
834 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000835 } else {
836 // Floating point operations and argument passing are hard.
837 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000838 CmdArgs.push_back("-mfloat-abi");
839 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000840 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000841
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000842 // Kernel code has more strict alignment requirements.
843 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000844 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000845 CmdArgs.push_back("-backend-option");
846 CmdArgs.push_back("-arm-long-calls");
847 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000848
Daniel Dunbar12100e22011-03-22 16:48:17 +0000849 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000850 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000851
852 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000853 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000854 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000855 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000856
Bob Wilson0874e532014-07-29 00:23:18 +0000857 // -mkernel implies -mstrict-align; don't add the redundant option.
858 if (!KernelOrKext) {
859 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
860 options::OPT_munaligned_access)) {
861 CmdArgs.push_back("-backend-option");
862 if (A->getOption().matches(options::OPT_mno_unaligned_access))
863 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000864 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000865 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000866 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000867 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000868 }
Bob Wilson0874e532014-07-29 00:23:18 +0000869 }
870 }
871
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000872 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000873 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
874 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000875 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000876 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000877 CmdArgs.push_back("-arm-global-merge=false");
878 else
879 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000880 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000881
Bob Wilson9c8af452013-04-11 18:53:25 +0000882 if (!Args.hasFlag(options::OPT_mimplicit_float,
883 options::OPT_mno_implicit_float,
884 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000885 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000886
Logan Chien749763e2014-04-03 13:12:44 +0000887 // llvm does not support reserving registers in general. There is support
888 // for reserving r9 on ARM though (defined as a platform-specific register
889 // in ARM EABI).
890 if (Args.hasArg(options::OPT_ffixed_r9)) {
891 CmdArgs.push_back("-backend-option");
892 CmdArgs.push_back("-arm-reserve-r9");
893 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000894}
895
Tim Northover573cbee2014-05-24 12:52:07 +0000896/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
897/// targeting.
898static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000899 Arg *A;
900 std::string CPU;
901 // If we have -mtune or -mcpu, use that.
902 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
903 CPU = A->getValue();
904 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin9e36fb42015-05-08 14:50:32 +0000905 StringRef Mcpu = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000906 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000907 }
908
Kevin Qin110db6f2014-07-18 07:03:22 +0000909 // Handle CPU name is 'native'.
910 if (CPU == "native")
911 return llvm::sys::getHostCPUName();
912 else if (CPU.size())
913 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000914
James Molloy9b1586b2014-04-17 12:51:17 +0000915 // Make sure we pick "cyclone" if -arch is used.
916 // FIXME: Should this be picked by checking the target triple instead?
917 if (Args.getLastArg(options::OPT_arch))
918 return "cyclone";
919
920 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000921}
922
Tim Northover573cbee2014-05-24 12:52:07 +0000923void Clang::AddAArch64TargetArgs(const ArgList &Args,
924 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000925 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
926 llvm::Triple Triple(TripleStr);
927
928 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
929 Args.hasArg(options::OPT_mkernel) ||
930 Args.hasArg(options::OPT_fapple_kext))
931 CmdArgs.push_back("-disable-red-zone");
932
933 if (!Args.hasFlag(options::OPT_mimplicit_float,
934 options::OPT_mno_implicit_float, true))
935 CmdArgs.push_back("-no-implicit-float");
936
Craig Topper92fc2df2014-05-17 16:56:41 +0000937 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000938 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
939 ABIName = A->getValue();
940 else if (Triple.isOSDarwin())
941 ABIName = "darwinpcs";
942 else
943 ABIName = "aapcs";
944
945 CmdArgs.push_back("-target-abi");
946 CmdArgs.push_back(ABIName);
947
Bob Wilson0874e532014-07-29 00:23:18 +0000948 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
949 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000950 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000951 if (A->getOption().matches(options::OPT_mno_unaligned_access))
952 CmdArgs.push_back("-aarch64-strict-align");
953 else
954 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000955 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000956
Bradley Smith9ff64332014-10-13 10:16:06 +0000957 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
958 options::OPT_mno_fix_cortex_a53_835769)) {
959 CmdArgs.push_back("-backend-option");
960 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
961 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
962 else
963 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000964 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
965 // Enabled A53 errata (835769) workaround by default on android
966 CmdArgs.push_back("-backend-option");
967 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000968 }
969
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000970 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000971 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
972 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000973 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000974 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000975 CmdArgs.push_back("-aarch64-global-merge=false");
976 else
977 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000978 }
Renato Golinb625f482015-01-25 23:17:48 +0000979
980 if (Args.hasArg(options::OPT_ffixed_x18)) {
981 CmdArgs.push_back("-backend-option");
982 CmdArgs.push_back("-aarch64-reserve-x18");
983 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000984}
985
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000986// Get CPU and ABI names. They are not independent
987// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000988void mips::getMipsCPUAndABI(const ArgList &Args,
989 const llvm::Triple &Triple,
990 StringRef &CPUName,
991 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000992 const char *DefMips32CPU = "mips32r2";
993 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000994
Daniel Sanders2bf13662014-07-10 14:40:57 +0000995 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
996 // default for mips64(el)?-img-linux-gnu.
997 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
998 Triple.getEnvironment() == llvm::Triple::GNU) {
999 DefMips32CPU = "mips32r6";
1000 DefMips64CPU = "mips64r6";
1001 }
1002
Brad Smithba26f582015-01-06 02:53:17 +00001003 // MIPS3 is the default for mips64*-unknown-openbsd.
1004 if (Triple.getOS() == llvm::Triple::OpenBSD)
1005 DefMips64CPU = "mips3";
1006
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001007 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001008 options::OPT_mcpu_EQ))
1009 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001010
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001012 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001013 // Convert a GNU style Mips ABI name to the name
1014 // accepted by LLVM Mips backend.
1015 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1016 .Case("32", "o32")
1017 .Case("64", "n64")
1018 .Default(ABIName);
1019 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001020
1021 // Setup default CPU and ABI names.
1022 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001023 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001024 default:
1025 llvm_unreachable("Unexpected triple arch name");
1026 case llvm::Triple::mips:
1027 case llvm::Triple::mipsel:
1028 CPUName = DefMips32CPU;
1029 break;
1030 case llvm::Triple::mips64:
1031 case llvm::Triple::mips64el:
1032 CPUName = DefMips64CPU;
1033 break;
1034 }
1035 }
1036
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001037 if (ABIName.empty()) {
1038 // Deduce ABI name from the target triple.
1039 if (Triple.getArch() == llvm::Triple::mips ||
1040 Triple.getArch() == llvm::Triple::mipsel)
1041 ABIName = "o32";
1042 else
1043 ABIName = "n64";
1044 }
1045
1046 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001047 // Deduce CPU name from ABI name.
1048 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001049 .Cases("o32", "eabi", DefMips32CPU)
1050 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001051 .Default("");
1052 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001053
1054 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001055}
1056
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001057// Convert ABI name to the GNU tools acceptable variant.
1058static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1059 return llvm::StringSwitch<llvm::StringRef>(ABI)
1060 .Case("o32", "32")
1061 .Case("n64", "64")
1062 .Default(ABI);
1063}
1064
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001065// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1066// and -mfloat-abi=.
1067static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001068 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001069 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001070 options::OPT_mhard_float,
1071 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001072 if (A->getOption().matches(options::OPT_msoft_float))
1073 FloatABI = "soft";
1074 else if (A->getOption().matches(options::OPT_mhard_float))
1075 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001076 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001077 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001078 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001079 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001080 FloatABI = "hard";
1081 }
1082 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001083 }
1084
1085 // If unspecified, choose the default based on the platform.
1086 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001087 // Assume "hard", because it's a default value used by gcc.
1088 // When we start to recognize specific target MIPS processors,
1089 // we will be able to select the default more correctly.
1090 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001091 }
1092
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001093 return FloatABI;
1094}
1095
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001096static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001097 std::vector<const char *> &Features,
1098 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001099 StringRef FeatureName) {
1100 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001101 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001102 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001103 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001104 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001105 }
1106}
1107
Daniel Sanders379d44b2014-07-16 11:52:23 +00001108static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1109 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001110 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001111 StringRef CPUName;
1112 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001113 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001114 ABIName = getGnuCompatibleMipsABIName(ABIName);
1115
Daniel Sandersfeb61302014-08-08 15:47:17 +00001116 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1117 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001118
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001119 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001120 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001121 // FIXME: Note, this is a hack. We need to pass the selected float
1122 // mode to the MipsTargetInfoBase to define appropriate macros there.
1123 // Now it is the only method.
1124 Features.push_back("+soft-float");
1125 }
1126
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001127 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001128 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001129 if (Val == "2008") {
1130 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1131 Features.push_back("+nan2008");
1132 else {
1133 Features.push_back("-nan2008");
1134 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1135 }
1136 } else if (Val == "legacy") {
1137 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1138 Features.push_back("-nan2008");
1139 else {
1140 Features.push_back("+nan2008");
1141 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1142 }
1143 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001144 D.Diag(diag::err_drv_unsupported_option_argument)
1145 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001146 }
1147
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001148 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1149 options::OPT_mdouble_float, "single-float");
1150 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1151 "mips16");
1152 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1153 options::OPT_mno_micromips, "micromips");
1154 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1155 "dsp");
1156 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1157 "dspr2");
1158 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1159 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001160
1161 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1162 // pass -mfpxx
1163 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1164 options::OPT_mfp64)) {
1165 if (A->getOption().matches(options::OPT_mfp32))
1166 Features.push_back(Args.MakeArgString("-fp64"));
1167 else if (A->getOption().matches(options::OPT_mfpxx)) {
1168 Features.push_back(Args.MakeArgString("+fpxx"));
1169 Features.push_back(Args.MakeArgString("+nooddspreg"));
1170 } else
1171 Features.push_back(Args.MakeArgString("+fp64"));
1172 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001173 Features.push_back(Args.MakeArgString("+fpxx"));
1174 Features.push_back(Args.MakeArgString("+nooddspreg"));
1175 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001176
Daniel Sanders28e5d392014-07-10 10:39:51 +00001177 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1178 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001179}
1180
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001181void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001182 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001183 const Driver &D = getToolChain().getDriver();
1184 StringRef CPUName;
1185 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001186 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001187 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001188
1189 CmdArgs.push_back("-target-abi");
1190 CmdArgs.push_back(ABIName.data());
1191
1192 StringRef FloatABI = getMipsFloatABI(D, Args);
1193
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001194 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001195 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001197 CmdArgs.push_back("-mfloat-abi");
1198 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001199 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
1201 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001202 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001203 CmdArgs.push_back("-mfloat-abi");
1204 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001205 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001206
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001207 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1208 if (A->getOption().matches(options::OPT_mxgot)) {
1209 CmdArgs.push_back("-mllvm");
1210 CmdArgs.push_back("-mxgot");
1211 }
1212 }
1213
Simon Atanasyanc580b322013-05-11 06:33:44 +00001214 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1215 options::OPT_mno_ldc1_sdc1)) {
1216 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1217 CmdArgs.push_back("-mllvm");
1218 CmdArgs.push_back("-mno-ldc1-sdc1");
1219 }
1220 }
1221
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001222 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1223 options::OPT_mno_check_zero_division)) {
1224 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1225 CmdArgs.push_back("-mllvm");
1226 CmdArgs.push_back("-mno-check-zero-division");
1227 }
1228 }
1229
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001230 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001231 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001232 CmdArgs.push_back("-mllvm");
1233 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1234 A->claim();
1235 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001236}
1237
Hal Finkel8eb59282012-06-11 22:35:19 +00001238/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1239static std::string getPPCTargetCPU(const ArgList &Args) {
1240 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001241 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001242
1243 if (CPUName == "native") {
1244 std::string CPU = llvm::sys::getHostCPUName();
1245 if (!CPU.empty() && CPU != "generic")
1246 return CPU;
1247 else
1248 return "";
1249 }
1250
1251 return llvm::StringSwitch<const char *>(CPUName)
1252 .Case("common", "generic")
1253 .Case("440", "440")
1254 .Case("440fp", "440")
1255 .Case("450", "450")
1256 .Case("601", "601")
1257 .Case("602", "602")
1258 .Case("603", "603")
1259 .Case("603e", "603e")
1260 .Case("603ev", "603ev")
1261 .Case("604", "604")
1262 .Case("604e", "604e")
1263 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001264 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 .Case("G3", "g3")
1266 .Case("7400", "7400")
1267 .Case("G4", "g4")
1268 .Case("7450", "7450")
1269 .Case("G4+", "g4+")
1270 .Case("750", "750")
1271 .Case("970", "970")
1272 .Case("G5", "g5")
1273 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001274 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001275 .Case("e500mc", "e500mc")
1276 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001277 .Case("power3", "pwr3")
1278 .Case("power4", "pwr4")
1279 .Case("power5", "pwr5")
1280 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001281 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001282 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001283 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001284 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001285 .Case("pwr3", "pwr3")
1286 .Case("pwr4", "pwr4")
1287 .Case("pwr5", "pwr5")
1288 .Case("pwr5x", "pwr5x")
1289 .Case("pwr6", "pwr6")
1290 .Case("pwr6x", "pwr6x")
1291 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001292 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001293 .Case("powerpc", "ppc")
1294 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001295 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 .Default("");
1297 }
1298
1299 return "";
1300}
1301
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001302static void getPPCTargetFeatures(const ArgList &Args,
1303 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001304 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1305 ie = Args.filtered_end();
1306 it != ie; ++it) {
1307 StringRef Name = (*it)->getOption().getName();
1308 (*it)->claim();
1309
1310 // Skip over "-m".
1311 assert(Name.startswith("m") && "Invalid feature name.");
1312 Name = Name.substr(1);
1313
1314 bool IsNegative = Name.startswith("no-");
1315 if (IsNegative)
1316 Name = Name.substr(3);
1317
1318 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1319 // pass the correct option to the backend while calling the frontend
1320 // option the same.
1321 // TODO: Change the LLVM backend option maybe?
1322 if (Name == "mfcrf")
1323 Name = "mfocrf";
1324
1325 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1326 }
1327
1328 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001329 AddTargetFeature(Args, Features, options::OPT_faltivec,
1330 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001331}
1332
Ulrich Weigand8afad612014-07-28 13:17:52 +00001333void Clang::AddPPCTargetArgs(const ArgList &Args,
1334 ArgStringList &CmdArgs) const {
1335 // Select the ABI to use.
1336 const char *ABIName = nullptr;
1337 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1338 ABIName = A->getValue();
1339 } else if (getToolChain().getTriple().isOSLinux())
1340 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001341 case llvm::Triple::ppc64: {
1342 // When targeting a processor that supports QPX, or if QPX is
1343 // specifically enabled, default to using the ABI that supports QPX (so
1344 // long as it is not specifically disabled).
1345 bool HasQPX = false;
1346 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1347 HasQPX = A->getValue() == StringRef("a2q");
1348 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1349 if (HasQPX) {
1350 ABIName = "elfv1-qpx";
1351 break;
1352 }
1353
Ulrich Weigand8afad612014-07-28 13:17:52 +00001354 ABIName = "elfv1";
1355 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001356 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357 case llvm::Triple::ppc64le:
1358 ABIName = "elfv2";
1359 break;
1360 default:
1361 break;
1362 }
1363
1364 if (ABIName) {
1365 CmdArgs.push_back("-target-abi");
1366 CmdArgs.push_back(ABIName);
1367 }
1368}
1369
1370bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1371 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1372 return A && (A->getValue() == StringRef(Value));
1373}
1374
Tom Stellard6674c702013-04-01 20:56:53 +00001375/// Get the (LLVM) name of the R600 gpu we are targeting.
1376static std::string getR600TargetGPU(const ArgList &Args) {
1377 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001378 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001379 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001380 .Cases("rv630", "rv635", "r600")
1381 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001382 .Case("rv740", "rv770")
1383 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001384 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001385 .Case("hemlock", "cypress")
1386 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001387 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001388 }
1389 return "";
1390}
1391
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001392static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001393 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001394 bool SoftFloatABI = true;
1395 if (Arg *A =
1396 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1397 if (A->getOption().matches(options::OPT_mhard_float))
1398 SoftFloatABI = false;
1399 }
1400 if (SoftFloatABI)
1401 Features.push_back("+soft-float");
1402}
1403
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001404void Clang::AddSparcTargetArgs(const ArgList &Args,
1405 ArgStringList &CmdArgs) const {
1406 const Driver &D = getToolChain().getDriver();
1407
Brad Smith10cd0f42014-07-11 20:12:08 +00001408 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001409 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001410 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1411 options::OPT_mhard_float)) {
1412 if (A->getOption().matches(options::OPT_msoft_float))
1413 FloatABI = "soft";
1414 else if (A->getOption().matches(options::OPT_mhard_float))
1415 FloatABI = "hard";
1416 }
1417
1418 // If unspecified, choose the default based on the platform.
1419 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001420 // Assume "soft", but warn the user we are guessing.
1421 FloatABI = "soft";
1422 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423 }
1424
1425 if (FloatABI == "soft") {
1426 // Floating point operations and argument passing are soft.
1427 //
1428 // FIXME: This changes CPP defines, we need -target-soft-float.
1429 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430 } else {
1431 assert(FloatABI == "hard" && "Invalid float abi!");
1432 CmdArgs.push_back("-mhard-float");
1433 }
1434}
1435
Richard Sandiford4652d892013-07-19 16:51:51 +00001436static const char *getSystemZTargetCPU(const ArgList &Args) {
1437 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1438 return A->getValue();
1439 return "z10";
1440}
1441
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001442static void getSystemZTargetFeatures(const ArgList &Args,
1443 std::vector<const char *> &Features) {
1444 // -m(no-)htm overrides use of the transactional-execution facility.
1445 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1446 options::OPT_mno_htm)) {
1447 if (A->getOption().matches(options::OPT_mhtm))
1448 Features.push_back("+transactional-execution");
1449 else
1450 Features.push_back("-transactional-execution");
1451 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001452 // -m(no-)vx overrides use of the vector facility.
1453 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1454 options::OPT_mno_vx)) {
1455 if (A->getOption().matches(options::OPT_mvx))
1456 Features.push_back("+vector");
1457 else
1458 Features.push_back("-vector");
1459 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001460}
1461
Chandler Carruth953fb082013-01-13 11:46:33 +00001462static const char *getX86TargetCPU(const ArgList &Args,
1463 const llvm::Triple &Triple) {
1464 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001465 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001466 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001467 return "core-avx2";
1468
Chandler Carruth953fb082013-01-13 11:46:33 +00001469 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001470 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001471
1472 // FIXME: Reject attempts to use -march=native unless the target matches
1473 // the host.
1474 //
1475 // FIXME: We should also incorporate the detected target features for use
1476 // with -native.
1477 std::string CPU = llvm::sys::getHostCPUName();
1478 if (!CPU.empty() && CPU != "generic")
1479 return Args.MakeArgString(CPU);
1480 }
1481
1482 // Select the default CPU if none was given (or detection failed).
1483
1484 if (Triple.getArch() != llvm::Triple::x86_64 &&
1485 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001486 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001487
1488 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1489
1490 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001491 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001492 if (Triple.getArchName() == "x86_64h")
1493 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001494 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001495 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001496
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001497 // Set up default CPU name for PS4 compilers.
1498 if (Triple.isPS4CPU())
1499 return "btver2";
1500
Alexey Bataev286d1b92014-01-31 04:07:13 +00001501 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001502 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001503 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001504
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001505 // Everything else goes to x86-64 in 64-bit mode.
1506 if (Is64Bit)
1507 return "x86-64";
1508
1509 switch (Triple.getOS()) {
1510 case llvm::Triple::FreeBSD:
1511 case llvm::Triple::NetBSD:
1512 case llvm::Triple::OpenBSD:
1513 return "i486";
1514 case llvm::Triple::Haiku:
1515 return "i586";
1516 case llvm::Triple::Bitrig:
1517 return "i686";
1518 default:
1519 // Fallback to p4.
1520 return "pentium4";
1521 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001522}
1523
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001524static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1525 switch(T.getArch()) {
1526 default:
1527 return "";
1528
Amara Emerson703da2e2013-10-31 09:32:33 +00001529 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001530 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001531 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001532
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001533 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001534 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001535 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001536 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001537 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001538
1539 case llvm::Triple::mips:
1540 case llvm::Triple::mipsel:
1541 case llvm::Triple::mips64:
1542 case llvm::Triple::mips64el: {
1543 StringRef CPUName;
1544 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001545 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001546 return CPUName;
1547 }
1548
1549 case llvm::Triple::ppc:
1550 case llvm::Triple::ppc64:
1551 case llvm::Triple::ppc64le: {
1552 std::string TargetCPUName = getPPCTargetCPU(Args);
1553 // LLVM may default to generating code for the native CPU,
1554 // but, like gcc, we default to a more generic option for
1555 // each architecture. (except on Darwin)
1556 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1557 if (T.getArch() == llvm::Triple::ppc64)
1558 TargetCPUName = "ppc64";
1559 else if (T.getArch() == llvm::Triple::ppc64le)
1560 TargetCPUName = "ppc64le";
1561 else
1562 TargetCPUName = "ppc";
1563 }
1564 return TargetCPUName;
1565 }
1566
1567 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001568 case llvm::Triple::sparcv9:
1569 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001570 return A->getValue();
1571 return "";
1572
1573 case llvm::Triple::x86:
1574 case llvm::Triple::x86_64:
1575 return getX86TargetCPU(Args, T);
1576
1577 case llvm::Triple::hexagon:
1578 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1579
1580 case llvm::Triple::systemz:
1581 return getSystemZTargetCPU(Args);
1582
1583 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001584 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001585 return getR600TargetGPU(Args);
1586 }
1587}
1588
Alp Tokerce365ca2013-12-02 12:43:03 +00001589static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1590 ArgStringList &CmdArgs) {
1591 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1592 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1593 // forward.
1594 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001595 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001596 CmdArgs.push_back(Args.MakeArgString(Plugin));
1597
1598 // Try to pass driver level flags relevant to LTO code generation down to
1599 // the plugin.
1600
1601 // Handle flags for selecting CPU variants.
1602 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1603 if (!CPU.empty())
1604 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1605}
1606
Eric Christopherc54920a2015-03-23 19:26:05 +00001607static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001608 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001609 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001610 // If -march=native, autodetect the feature list.
1611 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1612 if (StringRef(A->getValue()) == "native") {
1613 llvm::StringMap<bool> HostFeatures;
1614 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1615 for (auto &F : HostFeatures)
1616 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1617 F.first()));
1618 }
1619 }
1620
Jim Grosbach82eee262013-11-16 00:53:35 +00001621 if (Triple.getArchName() == "x86_64h") {
1622 // x86_64h implies quite a few of the more modern subtarget features
1623 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1624 Features.push_back("-rdrnd");
1625 Features.push_back("-aes");
1626 Features.push_back("-pclmul");
1627 Features.push_back("-rtm");
1628 Features.push_back("-hle");
1629 Features.push_back("-fsgsbase");
1630 }
1631
Eric Christopherc54920a2015-03-23 19:26:05 +00001632 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001633 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001634 if (Triple.getArch() == llvm::Triple::x86_64) {
1635 Features.push_back("+sse4.2");
1636 Features.push_back("+popcnt");
1637 } else
1638 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001639 }
1640
Eric Christopherc54920a2015-03-23 19:26:05 +00001641 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001642 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1643 StringRef Arch = A->getValue();
1644 bool ArchUsed = false;
1645 // First, look for flags that are shared in x86 and x86-64.
1646 if (Triple.getArch() == llvm::Triple::x86_64 ||
1647 Triple.getArch() == llvm::Triple::x86) {
1648 if (Arch == "AVX" || Arch == "AVX2") {
1649 ArchUsed = true;
1650 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1651 }
1652 }
1653 // Then, look for x86-specific flags.
1654 if (Triple.getArch() == llvm::Triple::x86) {
1655 if (Arch == "IA32") {
1656 ArchUsed = true;
1657 } else if (Arch == "SSE" || Arch == "SSE2") {
1658 ArchUsed = true;
1659 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1660 }
1661 }
1662 if (!ArchUsed)
1663 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1664 }
1665
Jim Grosbach82eee262013-11-16 00:53:35 +00001666 // Now add any that the user explicitly requested on the command line,
1667 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001668 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1669 ie = Args.filtered_end();
1670 it != ie; ++it) {
1671 StringRef Name = (*it)->getOption().getName();
1672 (*it)->claim();
1673
1674 // Skip over "-m".
1675 assert(Name.startswith("m") && "Invalid feature name.");
1676 Name = Name.substr(1);
1677
1678 bool IsNegative = Name.startswith("no-");
1679 if (IsNegative)
1680 Name = Name.substr(3);
1681
1682 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1683 }
1684}
1685
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001686void Clang::AddX86TargetArgs(const ArgList &Args,
1687 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001688 if (!Args.hasFlag(options::OPT_mred_zone,
1689 options::OPT_mno_red_zone,
1690 true) ||
1691 Args.hasArg(options::OPT_mkernel) ||
1692 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001693 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001694
Bob Wilson2616e2e2013-02-10 16:01:41 +00001695 // Default to avoid implicit floating-point for kernel/kext code, but allow
1696 // that to be overridden with -mno-soft-float.
1697 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1698 Args.hasArg(options::OPT_fapple_kext));
1699 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1700 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001701 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001702 options::OPT_mno_implicit_float)) {
1703 const Option &O = A->getOption();
1704 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1705 O.matches(options::OPT_msoft_float));
1706 }
1707 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001708 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001709
1710 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1711 StringRef Value = A->getValue();
1712 if (Value == "intel" || Value == "att") {
1713 CmdArgs.push_back("-mllvm");
1714 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1715 } else {
1716 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1717 << A->getOption().getName() << Value;
1718 }
1719 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001720}
1721
Matthew Curtise8f80a12012-12-06 17:49:03 +00001722static inline bool HasPICArg(const ArgList &Args) {
1723 return Args.hasArg(options::OPT_fPIC)
1724 || Args.hasArg(options::OPT_fpic);
1725}
1726
1727static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1728 return Args.getLastArg(options::OPT_G,
1729 options::OPT_G_EQ,
1730 options::OPT_msmall_data_threshold_EQ);
1731}
1732
1733static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1734 std::string value;
1735 if (HasPICArg(Args))
1736 value = "0";
1737 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1738 value = A->getValue();
1739 A->claim();
1740 }
1741 return value;
1742}
1743
Tony Linthicum76329bf2011-12-12 21:14:55 +00001744void Clang::AddHexagonTargetArgs(const ArgList &Args,
1745 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001746 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001747 CmdArgs.push_back("-mqdsp6-compat");
1748 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001749
Matthew Curtise8f80a12012-12-06 17:49:03 +00001750 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1751 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001752 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001753 CmdArgs.push_back(Args.MakeArgString(
1754 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001755 }
1756
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001757 if (!Args.hasArg(options::OPT_fno_short_enums))
1758 CmdArgs.push_back("-fshort-enums");
1759 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1760 CmdArgs.push_back ("-mllvm");
1761 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1762 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001763 CmdArgs.push_back ("-mllvm");
1764 CmdArgs.push_back ("-machine-sink-split=0");
1765}
1766
Kevin Qin110db6f2014-07-18 07:03:22 +00001767// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001768static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001769 std::vector<const char *> &Features) {
1770 SmallVector<StringRef, 8> Split;
1771 text.split(Split, StringRef("+"), -1, false);
1772
1773 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1774 const char *result = llvm::StringSwitch<const char *>(Split[I])
1775 .Case("fp", "+fp-armv8")
1776 .Case("simd", "+neon")
1777 .Case("crc", "+crc")
1778 .Case("crypto", "+crypto")
1779 .Case("nofp", "-fp-armv8")
1780 .Case("nosimd", "-neon")
1781 .Case("nocrc", "-crc")
1782 .Case("nocrypto", "-crypto")
1783 .Default(nullptr);
1784 if (result)
1785 Features.push_back(result);
1786 else if (Split[I] == "neon" || Split[I] == "noneon")
1787 D.Diag(diag::err_drv_no_neon_modifier);
1788 else
1789 return false;
1790 }
1791 return true;
1792}
1793
1794// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1795// decode CPU and feature.
1796static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1797 std::vector<const char *> &Features) {
Renato Golin9e36fb42015-05-08 14:50:32 +00001798 Mcpu = Mcpu.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001799 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1800 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001801 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001802 Features.push_back("+neon");
1803 Features.push_back("+crc");
1804 Features.push_back("+crypto");
1805 } else if (CPU == "generic") {
1806 Features.push_back("+neon");
1807 } else {
1808 return false;
1809 }
1810
1811 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1812 return false;
1813
1814 return true;
1815}
1816
1817static bool
1818getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1819 const ArgList &Args,
1820 std::vector<const char *> &Features) {
1821 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001822
1823 if (Split.first == "armv8-a" ||
1824 Split.first == "armv8a") {
1825 // ok, no additional features.
1826 } else if (
1827 Split.first == "armv8.1-a" ||
1828 Split.first == "armv8.1a" ) {
1829 Features.push_back("+v8.1a");
1830 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001831 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001832 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001833
1834 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1835 return false;
1836
1837 return true;
1838}
1839
1840static bool
1841getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1842 const ArgList &Args,
1843 std::vector<const char *> &Features) {
1844 StringRef CPU;
1845 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1846 return false;
1847
1848 return true;
1849}
1850
1851static bool
1852getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1853 const ArgList &Args,
1854 std::vector<const char *> &Features) {
1855 // Handle CPU name is 'native'.
1856 if (Mtune == "native")
1857 Mtune = llvm::sys::getHostCPUName();
1858 if (Mtune == "cyclone") {
1859 Features.push_back("+zcm");
1860 Features.push_back("+zcz");
1861 }
1862 return true;
1863}
1864
1865static bool
1866getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1867 const ArgList &Args,
1868 std::vector<const char *> &Features) {
1869 StringRef CPU;
1870 std::vector<const char *> DecodedFeature;
1871 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1872 return false;
1873
1874 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1875}
1876
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001877static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1878 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001879 Arg *A;
1880 bool success = true;
1881 // Enable NEON by default.
1882 Features.push_back("+neon");
1883 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1884 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1885 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1886 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001887 else if (Args.hasArg(options::OPT_arch))
1888 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1889 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001890
1891 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1892 success =
1893 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1894 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1895 success =
1896 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001897 else if (Args.hasArg(options::OPT_arch))
1898 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1899 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001900
1901 if (!success)
1902 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001903
1904 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1905 Features.push_back("-fp-armv8");
1906 Features.push_back("-crypto");
1907 Features.push_back("-neon");
1908 }
Bradley Smith418c5932014-05-02 15:17:51 +00001909
1910 // En/disable crc
1911 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1912 options::OPT_mnocrc)) {
1913 if (A->getOption().matches(options::OPT_mcrc))
1914 Features.push_back("+crc");
1915 else
1916 Features.push_back("-crc");
1917 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001918}
1919
1920static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001921 const ArgList &Args, ArgStringList &CmdArgs,
1922 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001923 std::vector<const char *> Features;
1924 switch (Triple.getArch()) {
1925 default:
1926 break;
1927 case llvm::Triple::mips:
1928 case llvm::Triple::mipsel:
1929 case llvm::Triple::mips64:
1930 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001931 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001932 break;
1933
1934 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001935 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001936 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001937 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001938 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001939 break;
1940
1941 case llvm::Triple::ppc:
1942 case llvm::Triple::ppc64:
1943 case llvm::Triple::ppc64le:
1944 getPPCTargetFeatures(Args, Features);
1945 break;
1946 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001947 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001948 getSparcTargetFeatures(Args, Features);
1949 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001950 case llvm::Triple::systemz:
1951 getSystemZTargetFeatures(Args, Features);
1952 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001953 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001954 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001955 getAArch64TargetFeatures(D, Args, Features);
1956 break;
1957 case llvm::Triple::x86:
1958 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001959 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001960 break;
1961 }
Rafael Espindola43964802013-08-21 17:34:32 +00001962
1963 // Find the last of each feature.
1964 llvm::StringMap<unsigned> LastOpt;
1965 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1966 const char *Name = Features[I];
1967 assert(Name[0] == '-' || Name[0] == '+');
1968 LastOpt[Name + 1] = I;
1969 }
1970
1971 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1972 // If this feature was overridden, ignore it.
1973 const char *Name = Features[I];
1974 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1975 assert(LastI != LastOpt.end());
1976 unsigned Last = LastI->second;
1977 if (Last != I)
1978 continue;
1979
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001980 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001981 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001982 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001983}
1984
David Majnemerae394812014-12-09 00:12:30 +00001985static bool
1986shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1987 const llvm::Triple &Triple) {
1988 // We use the zero-cost exception tables for Objective-C if the non-fragile
1989 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1990 // later.
1991 if (runtime.isNonFragile())
1992 return true;
1993
1994 if (!Triple.isMacOSX())
1995 return false;
1996
1997 return (!Triple.isMacOSXVersionLT(10,5) &&
1998 (Triple.getArch() == llvm::Triple::x86_64 ||
1999 Triple.getArch() == llvm::Triple::arm));
2000}
2001
Nico Webere8e53112014-05-11 01:04:02 +00002002// exceptionSettings() exists to share the logic between -cc1 and linker
2003// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002004static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002005 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002006 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002007 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002008 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002009
David Majnemer8de68642014-12-05 08:11:58 +00002010 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002011}
2012
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002013/// Adds exception related arguments to the driver command arguments. There's a
2014/// master flag, -fexceptions and also language specific flags to enable/disable
2015/// C++ and Objective-C exceptions. This makes it possible to for example
2016/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002017static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002018 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002019 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002020 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002021 const Driver &D = TC.getDriver();
2022 const llvm::Triple &Triple = TC.getTriple();
2023
Chad Rosier4fab82c2012-03-26 22:04:46 +00002024 if (KernelOrKext) {
2025 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2026 // arguments now to avoid warnings about unused arguments.
2027 Args.ClaimAllArgs(options::OPT_fexceptions);
2028 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2029 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2030 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2031 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2032 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002033 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002034 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002035
David Majnemer8de68642014-12-05 08:11:58 +00002036 // Gather the exception settings from the command line arguments.
2037 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002038
David Majnemerae394812014-12-09 00:12:30 +00002039 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2040 // is not necessarily sensible, but follows GCC.
2041 if (types::isObjC(InputType) &&
2042 Args.hasFlag(options::OPT_fobjc_exceptions,
2043 options::OPT_fno_objc_exceptions,
2044 true)) {
2045 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002046
David Majnemerae394812014-12-09 00:12:30 +00002047 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002048 }
2049
2050 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002051 bool CXXExceptionsEnabled =
2052 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002053 Arg *ExceptionArg = Args.getLastArg(
2054 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2055 options::OPT_fexceptions, options::OPT_fno_exceptions);
2056 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002057 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002058 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2059 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002060
2061 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002062 if (Triple.isPS4CPU()) {
2063 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2064 assert(ExceptionArg &&
2065 "On the PS4 exceptions should only be enabled if passing "
2066 "an argument");
2067 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2068 const Arg *RTTIArg = TC.getRTTIArg();
2069 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2070 D.Diag(diag::err_drv_argument_not_allowed_with)
2071 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2072 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2073 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2074 } else
2075 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2076
Anders Carlssone96ab552011-02-28 02:27:16 +00002077 CmdArgs.push_back("-fcxx-exceptions");
2078
David Majnemer8de68642014-12-05 08:11:58 +00002079 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002080 }
2081 }
2082
David Majnemer8de68642014-12-05 08:11:58 +00002083 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002084 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002085}
2086
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002087static bool ShouldDisableAutolink(const ArgList &Args,
2088 const ToolChain &TC) {
2089 bool Default = true;
2090 if (TC.getTriple().isOSDarwin()) {
2091 // The native darwin assembler doesn't support the linker_option directives,
2092 // so we disable them if we think the .s file will be passed to it.
2093 Default = TC.useIntegratedAs();
2094 }
2095 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2096 Default);
2097}
2098
Ted Kremenek62093662013-03-12 17:02:12 +00002099static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2100 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002101 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2102 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002103 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002104 return !UseDwarfDirectory;
2105}
2106
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002107/// \brief Check whether the given input tree contains any compilation actions.
2108static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002109 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002110 return true;
2111
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002112 for (const auto &Act : *A)
2113 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002114 return true;
2115
2116 return false;
2117}
2118
2119/// \brief Check if -relax-all should be passed to the internal assembler.
2120/// This is done by default when compiling non-assembler source with -O0.
2121static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2122 bool RelaxDefault = true;
2123
2124 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2125 RelaxDefault = A->getOption().matches(options::OPT_O0);
2126
2127 if (RelaxDefault) {
2128 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002129 for (const auto &Act : C.getActions()) {
2130 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002131 RelaxDefault = true;
2132 break;
2133 }
2134 }
2135 }
2136
2137 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2138 RelaxDefault);
2139}
2140
David Blaikie9260ed62013-07-25 21:19:01 +00002141static void CollectArgsForIntegratedAssembler(Compilation &C,
2142 const ArgList &Args,
2143 ArgStringList &CmdArgs,
2144 const Driver &D) {
2145 if (UseRelaxAll(C, Args))
2146 CmdArgs.push_back("-mrelax-all");
2147
David Peixottodfb66142013-11-14 22:52:58 +00002148 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002149 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002150 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2151 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2152 // arg after parsing the '-I' arg.
2153 bool TakeNextArg = false;
2154
David Blaikie9260ed62013-07-25 21:19:01 +00002155 // When using an integrated assembler, translate -Wa, and -Xassembler
2156 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002157 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002158 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2159 options::OPT_Xassembler),
2160 ie = Args.filtered_end(); it != ie; ++it) {
2161 const Arg *A = *it;
2162 A->claim();
2163
2164 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2165 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002166 if (TakeNextArg) {
2167 CmdArgs.push_back(Value.data());
2168 TakeNextArg = false;
2169 continue;
2170 }
David Blaikie9260ed62013-07-25 21:19:01 +00002171
2172 if (Value == "-force_cpusubtype_ALL") {
2173 // Do nothing, this is the default and we don't support anything else.
2174 } else if (Value == "-L") {
2175 CmdArgs.push_back("-msave-temp-labels");
2176 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002177 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002178 } else if (Value == "--noexecstack") {
2179 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002180 } else if (Value == "-compress-debug-sections" ||
2181 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002182 CompressDebugSections = true;
2183 } else if (Value == "-nocompress-debug-sections" ||
2184 Value == "--nocompress-debug-sections") {
2185 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002186 } else if (Value.startswith("-I")) {
2187 CmdArgs.push_back(Value.data());
2188 // We need to consume the next argument if the current arg is a plain
2189 // -I. The next arg will be the include directory.
2190 if (Value == "-I")
2191 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002192 } else if (Value.startswith("-gdwarf-")) {
2193 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002194 } else {
2195 D.Diag(diag::err_drv_unsupported_option_argument)
2196 << A->getOption().getName() << Value;
2197 }
2198 }
2199 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002200 if (CompressDebugSections) {
2201 if (llvm::zlib::isAvailable())
2202 CmdArgs.push_back("-compress-debug-sections");
2203 else
2204 D.Diag(diag::warn_debug_compression_unavailable);
2205 }
David Blaikie9260ed62013-07-25 21:19:01 +00002206}
2207
Renato Goline807c122014-01-31 11:47:28 +00002208// Until ARM libraries are build separately, we have them all in one library
2209static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002210 // FIXME: handle 64-bit
2211 if (TC.getTriple().isOSWindows() &&
2212 !TC.getTriple().isWindowsItaniumEnvironment())
2213 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002214 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002215 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002216 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002217}
2218
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002219static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2220 // The runtimes are located in the OS-specific resource directory.
2221 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002222 const llvm::Triple &Triple = TC.getTriple();
2223 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002224 StringRef OSLibName =
2225 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002226 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002227 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002228}
2229
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002230static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002231 bool Shared = false) {
2232 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2233 ? "-android"
2234 : "";
2235
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002236 bool IsOSWindows = TC.getTriple().isOSWindows();
2237 StringRef Arch = getArchNameForCompilerRTLib(TC);
2238 const char *Prefix = IsOSWindows ? "" : "lib";
2239 const char *Suffix =
2240 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2241
2242 SmallString<128> Path = getCompilerRTLibDir(TC);
2243 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2244 Arch + Env + Suffix);
2245
2246 return Path;
2247}
2248
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002249// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002250// FIXME: Make sure we can also emit shared objects if they're requested
2251// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002252static void addClangRT(const ToolChain &TC, const ArgList &Args,
2253 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002254 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002255
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002256 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002257 // FIXME: why do we link against gcc when we are using compiler-rt?
2258 CmdArgs.push_back("-lgcc_s");
2259 if (TC.getDriver().CCCIsCXX())
2260 CmdArgs.push_back("-lgcc_eh");
2261 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002262}
2263
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002264static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2265 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002266 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2267 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002268 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002269 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002270 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002271 Args.hasArg(options::OPT_fcreate_profile) ||
2272 Args.hasArg(options::OPT_coverage)))
2273 return;
2274
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002275 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002276}
2277
Alexey Samsonov52550342014-09-15 19:58:40 +00002278static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2279 ArgStringList &CmdArgs, StringRef Sanitizer,
2280 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002281 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002282 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002283 if (!IsShared)
2284 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002285 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002286 if (!IsShared)
2287 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002288}
2289
Alexey Samsonov52550342014-09-15 19:58:40 +00002290// Tries to use a file with the list of dynamic symbols that need to be exported
2291// from the runtime library. Returns true if the file was found.
2292static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2293 ArgStringList &CmdArgs,
2294 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002295 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2296 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2297 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002298 return true;
2299 }
2300 return false;
2301}
2302
2303static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2304 ArgStringList &CmdArgs) {
2305 // Force linking against the system libraries sanitizers depends on
2306 // (see PR15823 why this is necessary).
2307 CmdArgs.push_back("--no-as-needed");
2308 CmdArgs.push_back("-lpthread");
2309 CmdArgs.push_back("-lrt");
2310 CmdArgs.push_back("-lm");
2311 // There's no libdl on FreeBSD.
2312 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2313 CmdArgs.push_back("-ldl");
2314}
2315
2316static void
2317collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2318 SmallVectorImpl<StringRef> &SharedRuntimes,
2319 SmallVectorImpl<StringRef> &StaticRuntimes,
2320 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2321 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2322 // Collect shared runtimes.
2323 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2324 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002325 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002326
Alexey Samsonov52550342014-09-15 19:58:40 +00002327 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002328 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002329 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2330 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002331 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002332 }
2333 if (SanArgs.needsAsanRt()) {
2334 if (SanArgs.needsSharedAsanRt()) {
2335 HelperStaticRuntimes.push_back("asan-preinit");
2336 } else {
2337 StaticRuntimes.push_back("asan");
2338 if (SanArgs.linkCXXRuntimes())
2339 StaticRuntimes.push_back("asan_cxx");
2340 }
2341 }
2342 if (SanArgs.needsDfsanRt())
2343 StaticRuntimes.push_back("dfsan");
2344 if (SanArgs.needsLsanRt())
2345 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002346 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002347 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002348 if (SanArgs.linkCXXRuntimes())
2349 StaticRuntimes.push_back("msan_cxx");
2350 }
2351 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002352 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002353 if (SanArgs.linkCXXRuntimes())
2354 StaticRuntimes.push_back("tsan_cxx");
2355 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002356 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002357 StaticRuntimes.push_back("ubsan_standalone");
2358 if (SanArgs.linkCXXRuntimes())
2359 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002360 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002361}
2362
Alexey Samsonov52550342014-09-15 19:58:40 +00002363// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2364// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2365static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002366 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002367 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2368 HelperStaticRuntimes;
2369 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2370 HelperStaticRuntimes);
2371 for (auto RT : SharedRuntimes)
2372 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2373 for (auto RT : HelperStaticRuntimes)
2374 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2375 bool AddExportDynamic = false;
2376 for (auto RT : StaticRuntimes) {
2377 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2378 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2379 }
2380 // If there is a static runtime with no dynamic list, force all the symbols
2381 // to be dynamic to be sure we export sanitizer interface functions.
2382 if (AddExportDynamic)
2383 CmdArgs.push_back("-export-dynamic");
2384 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002385}
2386
Reid Kleckner86ea7702015-02-04 23:45:07 +00002387static bool areOptimizationsEnabled(const ArgList &Args) {
2388 // Find the last -O arg and see if it is non-zero.
2389 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2390 return !A->getOption().matches(options::OPT_O0);
2391 // Defaults to -O0.
2392 return false;
2393}
2394
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002395static bool shouldUseFramePointerForTarget(const ArgList &Args,
2396 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002397 // XCore never wants frame pointers, regardless of OS.
2398 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002399 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002400 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002401
2402 if (Triple.isOSLinux()) {
2403 switch (Triple.getArch()) {
2404 // Don't use a frame pointer on linux if optimizing for certain targets.
2405 case llvm::Triple::mips64:
2406 case llvm::Triple::mips64el:
2407 case llvm::Triple::mips:
2408 case llvm::Triple::mipsel:
2409 case llvm::Triple::systemz:
2410 case llvm::Triple::x86:
2411 case llvm::Triple::x86_64:
2412 return !areOptimizationsEnabled(Args);
2413 default:
2414 return true;
2415 }
2416 }
2417
2418 if (Triple.isOSWindows()) {
2419 switch (Triple.getArch()) {
2420 case llvm::Triple::x86:
2421 return !areOptimizationsEnabled(Args);
2422 default:
2423 // All other supported Windows ISAs use xdata unwind information, so frame
2424 // pointers are not generally useful.
2425 return false;
2426 }
2427 }
2428
2429 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002430}
2431
Rafael Espindola224dd632011-12-14 21:02:23 +00002432static bool shouldUseFramePointer(const ArgList &Args,
2433 const llvm::Triple &Triple) {
2434 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2435 options::OPT_fomit_frame_pointer))
2436 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2437
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002438 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002439}
2440
Eric Christopherb7d97e92013-04-03 01:58:53 +00002441static bool shouldUseLeafFramePointer(const ArgList &Args,
2442 const llvm::Triple &Triple) {
2443 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2444 options::OPT_momit_leaf_frame_pointer))
2445 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2446
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002447 if (Triple.isPS4CPU())
2448 return false;
2449
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002450 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002451}
2452
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002453/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002454static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002455 SmallString<128> cwd;
2456 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002457 CmdArgs.push_back("-fdebug-compilation-dir");
2458 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002459 }
2460}
2461
Eric Christopherd3804002013-02-22 20:12:52 +00002462static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002463 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002464 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2465 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2466 SmallString<128> T(FinalOutput->getValue());
2467 llvm::sys::path::replace_extension(T, "dwo");
2468 return Args.MakeArgString(T);
2469 } else {
2470 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002471 SmallString<128> T(
2472 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002473 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002474 llvm::sys::path::replace_extension(F, "dwo");
2475 T += F;
2476 return Args.MakeArgString(F);
2477 }
2478}
2479
2480static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2481 const Tool &T, const JobAction &JA,
2482 const ArgList &Args, const InputInfo &Output,
2483 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002484 ArgStringList ExtractArgs;
2485 ExtractArgs.push_back("--extract-dwo");
2486
2487 ArgStringList StripArgs;
2488 StripArgs.push_back("--strip-dwo");
2489
2490 // Grabbing the output of the earlier compile step.
2491 StripArgs.push_back(Output.getFilename());
2492 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002493 ExtractArgs.push_back(OutFile);
2494
2495 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002496 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002497
2498 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002499 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002500
2501 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002502 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002503}
2504
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002505/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002506/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2507static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002508 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002509 if (A->getOption().matches(options::OPT_O4) ||
2510 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002511 return true;
2512
2513 if (A->getOption().matches(options::OPT_O0))
2514 return false;
2515
2516 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2517
Rafael Espindola91780de2013-08-26 14:05:41 +00002518 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002519 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002520 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002521 return true;
2522
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002523 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002524 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002525 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002526
2527 unsigned OptLevel = 0;
2528 if (S.getAsInteger(10, OptLevel))
2529 return false;
2530
2531 return OptLevel > 1;
2532 }
2533
2534 return false;
2535}
2536
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002537/// Add -x lang to \p CmdArgs for \p Input.
2538static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2539 ArgStringList &CmdArgs) {
2540 // When using -verify-pch, we don't want to provide the type
2541 // 'precompiled-header' if it was inferred from the file extension
2542 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2543 return;
2544
2545 CmdArgs.push_back("-x");
2546 if (Args.hasArg(options::OPT_rewrite_objc))
2547 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2548 else
2549 CmdArgs.push_back(types::getTypeName(Input.getType()));
2550}
2551
David Majnemerc371ff02015-03-22 08:39:22 +00002552static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002553 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002554 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002555
2556 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002557 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002558
2559 unsigned Build = 0, Factor = 1;
2560 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2561 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002562 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002563}
2564
Rafael Espindola577637a2015-01-03 00:06:04 +00002565// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002566// options that build systems might add but are unused when assembling or only
2567// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002568static void claimNoWarnArgs(const ArgList &Args) {
2569 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002570 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002571 Args.ClaimAllArgs(options::OPT_flto);
2572 Args.ClaimAllArgs(options::OPT_fno_lto);
2573}
2574
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002575static void appendUserToPath(SmallVectorImpl<char> &Result) {
2576#ifdef LLVM_ON_UNIX
2577 const char *Username = getenv("LOGNAME");
2578#else
2579 const char *Username = getenv("USERNAME");
2580#endif
2581 if (Username) {
2582 // Validate that LoginName can be used in a path, and get its length.
2583 size_t Len = 0;
2584 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002585 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002586 Username = nullptr;
2587 break;
2588 }
2589 }
2590
2591 if (Username && Len > 0) {
2592 Result.append(Username, Username + Len);
2593 return;
2594 }
2595 }
2596
2597 // Fallback to user id.
2598#ifdef LLVM_ON_UNIX
2599 std::string UID = llvm::utostr(getuid());
2600#else
2601 // FIXME: Windows seems to have an 'SID' that might work.
2602 std::string UID = "9999";
2603#endif
2604 Result.append(UID.begin(), UID.end());
2605}
2606
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002607void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002608 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002609 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002610 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002611 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002612 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2613 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002614 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002615 ArgStringList CmdArgs;
2616
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002617 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002618 bool IsWindowsCygnus =
2619 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002620 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2621
Daniel Dunbare521a892009-03-31 20:53:55 +00002622 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002623 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002624
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002625 // Invoke ourselves in -cc1 mode.
2626 //
2627 // FIXME: Implement custom jobs for internal actions.
2628 CmdArgs.push_back("-cc1");
2629
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002630 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002631 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002632 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002633 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002634
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002635 const llvm::Triple TT(TripleStr);
2636 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2637 TT.getArch() == llvm::Triple::thumb)) {
2638 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2639 unsigned Version;
2640 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2641 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002642 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2643 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002644 }
2645
Tim Northover336f1892014-03-29 13:16:12 +00002646 // Push all default warning arguments that are specific to
2647 // the given target. These come before user provided warning options
2648 // are provided.
2649 getToolChain().addClangWarningOptions(CmdArgs);
2650
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002651 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002652 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002653
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002654 if (isa<AnalyzeJobAction>(JA)) {
2655 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2656 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002657 } else if (isa<MigrateJobAction>(JA)) {
2658 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002659 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002660 if (Output.getType() == types::TY_Dependencies)
2661 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002662 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002663 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002664 if (Args.hasArg(options::OPT_rewrite_objc) &&
2665 !Args.hasArg(options::OPT_g_Group))
2666 CmdArgs.push_back("-P");
2667 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002668 } else if (isa<AssembleJobAction>(JA)) {
2669 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002670
David Blaikie9260ed62013-07-25 21:19:01 +00002671 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002672
2673 // Also ignore explicit -force_cpusubtype_ALL option.
2674 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002675 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002676 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002677 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002678
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002679 if (JA.getType() == types::TY_Nothing)
2680 CmdArgs.push_back("-fsyntax-only");
2681 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002682 CmdArgs.push_back("-emit-pch");
2683 else
2684 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002685 } else if (isa<VerifyPCHJobAction>(JA)) {
2686 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002687 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002688 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2689 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002690
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002691 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002692 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002693 } else if (JA.getType() == types::TY_LLVM_IR ||
2694 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002695 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002696 } else if (JA.getType() == types::TY_LLVM_BC ||
2697 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002698 CmdArgs.push_back("-emit-llvm-bc");
2699 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002700 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002701 } else if (JA.getType() == types::TY_AST) {
2702 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002703 } else if (JA.getType() == types::TY_ModuleFile) {
2704 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002705 } else if (JA.getType() == types::TY_RewrittenObjC) {
2706 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002707 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002708 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2709 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002710 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002711 } else {
2712 assert(JA.getType() == types::TY_PP_Asm &&
2713 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002714 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002715
2716 // Preserve use-list order by default when emitting bitcode, so that
2717 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2718 // same result as running passes here. For LTO, we don't need to preserve
2719 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002720 if (JA.getType() == types::TY_LLVM_BC)
2721 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002722 }
2723
Justin Bognera88f0122014-06-20 22:59:50 +00002724 // We normally speed up the clang process a bit by skipping destructors at
2725 // exit, but when we're generating diagnostics we can rely on some of the
2726 // cleanup.
2727 if (!C.isForDiagnostics())
2728 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002729
John McCallbb79b5f2010-02-13 03:50:24 +00002730 // Disable the verification pass in -asserts builds.
2731#ifdef NDEBUG
2732 CmdArgs.push_back("-disable-llvm-verifier");
2733#endif
2734
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002735 // Set the main file name, so that debug info works even with
2736 // -save-temps.
2737 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002738 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002739
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002740 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002741 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002742 if (Args.hasArg(options::OPT_static))
2743 CmdArgs.push_back("-static-define");
2744
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002745 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002746 // Enable region store model by default.
2747 CmdArgs.push_back("-analyzer-store=region");
2748
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002749 // Treat blocks as analysis entry points.
2750 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2751
Ted Kremenek49c79792011-03-24 00:28:47 +00002752 CmdArgs.push_back("-analyzer-eagerly-assume");
2753
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002754 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002755 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002756 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002757
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002758 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002759 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002760
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002761 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002762 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002763
2764 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002765
Artem Belevichba558952015-05-06 18:20:23 +00002766 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002767 CmdArgs.push_back("-analyzer-checker=cplusplus");
2768
Nico Webere8e53112014-05-11 01:04:02 +00002769 // Enable the following experimental checkers for testing.
2770 CmdArgs.push_back(
2771 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002772 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2773 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2774 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2776 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002777 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002778
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002779 // Set the output format. The default is plist, for (lame) historical
2780 // reasons.
2781 CmdArgs.push_back("-analyzer-output");
2782 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002783 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002784 else
2785 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002786
Ted Kremenekfe449a22010-03-22 22:32:05 +00002787 // Disable the presentation of standard compiler warnings when
2788 // using --analyze. We only want to show static analyzer diagnostics
2789 // or frontend errors.
2790 CmdArgs.push_back("-w");
2791
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002792 // Add -Xanalyzer arguments when running as analyzer.
2793 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002794 }
2795
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002796 CheckCodeGenerationOptions(D, Args);
2797
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002798 bool PIE = getToolChain().isPIEDefault();
2799 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002800 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002801
Alexey Bataev40e75222014-01-28 06:30:35 +00002802 // Android-specific defaults for PIC/PIE
2803 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2804 switch (getToolChain().getTriple().getArch()) {
2805 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002806 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002807 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002808 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002809 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002810 case llvm::Triple::mips:
2811 case llvm::Triple::mipsel:
2812 case llvm::Triple::mips64:
2813 case llvm::Triple::mips64el:
2814 PIC = true; // "-fpic"
2815 break;
2816
2817 case llvm::Triple::x86:
2818 case llvm::Triple::x86_64:
2819 PIC = true; // "-fPIC"
2820 IsPICLevelTwo = true;
2821 break;
2822
2823 default:
2824 break;
2825 }
2826 }
2827
Brad Smith5b05db82014-06-24 19:51:29 +00002828 // OpenBSD-specific defaults for PIE
2829 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2830 switch (getToolChain().getTriple().getArch()) {
2831 case llvm::Triple::mips64:
2832 case llvm::Triple::mips64el:
2833 case llvm::Triple::sparc:
2834 case llvm::Triple::x86:
2835 case llvm::Triple::x86_64:
2836 IsPICLevelTwo = false; // "-fpie"
2837 break;
2838
2839 case llvm::Triple::ppc:
2840 case llvm::Triple::sparcv9:
2841 IsPICLevelTwo = true; // "-fPIE"
2842 break;
2843
2844 default:
2845 break;
2846 }
2847 }
2848
Alexey Samsonov090301e2013-04-09 12:28:19 +00002849 // For the PIC and PIE flag options, this logic is different from the
2850 // legacy logic in very old versions of GCC, as that logic was just
2851 // a bug no one had ever fixed. This logic is both more rational and
2852 // consistent with GCC's new logic now that the bugs are fixed. The last
2853 // argument relating to either PIC or PIE wins, and no other argument is
2854 // used. If the last argument is any flavor of the '-fno-...' arguments,
2855 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2856 // at the same level.
2857 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2858 options::OPT_fpic, options::OPT_fno_pic,
2859 options::OPT_fPIE, options::OPT_fno_PIE,
2860 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002861 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2862 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002863 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002864 if (LastPICArg) {
2865 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002866 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2867 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2868 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2869 PIC = PIE || O.matches(options::OPT_fPIC) ||
2870 O.matches(options::OPT_fpic);
2871 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2872 O.matches(options::OPT_fPIC);
2873 } else {
2874 PIE = PIC = false;
2875 }
2876 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002877 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002878
Nick Lewycky609dd662013-10-11 03:33:53 +00002879 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002880 // specified while enabling PIC enabled level 1 PIC, just force it back to
2881 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2882 // informal testing).
2883 if (PIC && getToolChain().getTriple().isOSDarwin())
2884 IsPICLevelTwo |= getToolChain().isPICDefault();
2885
Chandler Carruthc0c04552012-04-08 16:40:35 +00002886 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2887 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002888 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002889 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002890 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002891 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002892 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002893
Chandler Carruth76a943b2012-11-19 03:52:03 +00002894 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2895 // This is a very special mode. It trumps the other modes, almost no one
2896 // uses it, and it isn't even valid on any OS but Darwin.
2897 if (!getToolChain().getTriple().isOSDarwin())
2898 D.Diag(diag::err_drv_unsupported_opt_for_target)
2899 << A->getSpelling() << getToolChain().getTriple().str();
2900
2901 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2902
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002903 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002904 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002905
Chandler Carruth76a943b2012-11-19 03:52:03 +00002906 // Only a forced PIC mode can cause the actual compile to have PIC defines
2907 // etc., no flags are sufficient. This behavior was selected to closely
2908 // match that of llvm-gcc and Apple GCC before that.
2909 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2910 CmdArgs.push_back("-pic-level");
2911 CmdArgs.push_back("2");
2912 }
2913 } else {
2914 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2915 // handled in Clang's IRGen by the -pie-level flag.
2916 CmdArgs.push_back("-mrelocation-model");
2917 CmdArgs.push_back(PIC ? "pic" : "static");
2918
2919 if (PIC) {
2920 CmdArgs.push_back("-pic-level");
2921 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2922 if (PIE) {
2923 CmdArgs.push_back("-pie-level");
2924 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2925 }
2926 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002927 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002928
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002929 CmdArgs.push_back("-mthread-model");
2930 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2931 CmdArgs.push_back(A->getValue());
2932 else
2933 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2934
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002935 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2936
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002937 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2938 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002939 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002940
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002941 // LLVM Code Generator Options.
2942
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002943 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2944 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2945 for (arg_iterator
2946 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2947 options::OPT_frewrite_map_file_EQ),
2948 MFE = Args.filtered_end();
2949 MFI != MFE; ++MFI) {
2950 CmdArgs.push_back("-frewrite-map-file");
2951 CmdArgs.push_back((*MFI)->getValue());
2952 (*MFI)->claim();
2953 }
2954 }
2955
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002956 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2957 StringRef v = A->getValue();
2958 CmdArgs.push_back("-mllvm");
2959 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2960 A->claim();
2961 }
2962
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002963 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2964 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002965 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002966 }
2967
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002968 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2969 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002970 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002971 D.Diag(diag::err_drv_unsupported_opt_for_target)
2972 << A->getSpelling() << getToolChain().getTriple().str();
2973 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2974 CmdArgs.push_back("-fpcc-struct-return");
2975 } else {
2976 assert(A->getOption().matches(options::OPT_freg_struct_return));
2977 CmdArgs.push_back("-freg-struct-return");
2978 }
2979 }
2980
Roman Divacky65b88cd2011-03-01 17:40:53 +00002981 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2982 CmdArgs.push_back("-mrtd");
2983
Rafael Espindola224dd632011-12-14 21:02:23 +00002984 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002985 CmdArgs.push_back("-mdisable-fp-elim");
2986 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2987 options::OPT_fno_zero_initialized_in_bss))
2988 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002989
2990 bool OFastEnabled = isOptimizationLevelFast(Args);
2991 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2992 // enabled. This alias option is being used to simplify the hasFlag logic.
2993 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2994 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002995 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2996 // doesn't do any TBAA.
2997 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002998 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002999 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003000 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003001 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3002 options::OPT_fno_struct_path_tbaa))
3003 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003004 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3005 false))
3006 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003007 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3008 options::OPT_fno_optimize_sibling_calls))
3009 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003010
Eric Christopher006208c2013-04-04 06:29:47 +00003011 // Handle segmented stacks.
3012 if (Args.hasArg(options::OPT_fsplit_stack))
3013 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003014
3015 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3016 // This alias option is being used to simplify the getLastArg logic.
3017 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3018 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003019
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003020 // Handle various floating point optimization flags, mapping them to the
3021 // appropriate LLVM code generation flags. The pattern for all of these is to
3022 // default off the codegen optimizations, and if any flag enables them and no
3023 // flag disables them after the flag enabling them, enable the codegen
3024 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003025 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003026 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003027 options::OPT_ffinite_math_only,
3028 options::OPT_fno_finite_math_only,
3029 options::OPT_fhonor_infinities,
3030 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003031 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3032 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003033 A->getOption().getID() != options::OPT_fhonor_infinities)
3034 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003035 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003036 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003037 options::OPT_ffinite_math_only,
3038 options::OPT_fno_finite_math_only,
3039 options::OPT_fhonor_nans,
3040 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003041 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3042 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003043 A->getOption().getID() != options::OPT_fhonor_nans)
3044 CmdArgs.push_back("-menable-no-nans");
3045
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003046 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3047 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003048 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003049 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003050 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003051 options::OPT_fno_math_errno)) {
3052 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3053 // However, turning *off* -ffast_math merely restores the toolchain default
3054 // (which may be false).
3055 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3056 A->getOption().getID() == options::OPT_ffast_math ||
3057 A->getOption().getID() == options::OPT_Ofast)
3058 MathErrno = false;
3059 else if (A->getOption().getID() == options::OPT_fmath_errno)
3060 MathErrno = true;
3061 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003062 if (MathErrno)
3063 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003064
3065 // There are several flags which require disabling very specific
3066 // optimizations. Any of these being disabled forces us to turn off the
3067 // entire set of LLVM optimizations, so collect them through all the flag
3068 // madness.
3069 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003070 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003071 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003072 options::OPT_funsafe_math_optimizations,
3073 options::OPT_fno_unsafe_math_optimizations,
3074 options::OPT_fassociative_math,
3075 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003076 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3077 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003078 A->getOption().getID() != options::OPT_fno_associative_math)
3079 AssociativeMath = true;
3080 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003081 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003082 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003083 options::OPT_funsafe_math_optimizations,
3084 options::OPT_fno_unsafe_math_optimizations,
3085 options::OPT_freciprocal_math,
3086 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003087 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3088 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003089 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3090 ReciprocalMath = true;
3091 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003092 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003093 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003094 options::OPT_funsafe_math_optimizations,
3095 options::OPT_fno_unsafe_math_optimizations,
3096 options::OPT_fsigned_zeros,
3097 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003098 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3099 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003100 A->getOption().getID() != options::OPT_fsigned_zeros)
3101 SignedZeros = false;
3102 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003103 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003104 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003105 options::OPT_funsafe_math_optimizations,
3106 options::OPT_fno_unsafe_math_optimizations,
3107 options::OPT_ftrapping_math,
3108 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003109 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3110 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003111 A->getOption().getID() != options::OPT_ftrapping_math)
3112 TrappingMath = false;
3113 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3114 !TrappingMath)
3115 CmdArgs.push_back("-menable-unsafe-fp-math");
3116
Sanjay Patel76c9e092015-01-23 16:40:50 +00003117 if (!SignedZeros)
3118 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003119
Sanjay Patel359b1052015-04-09 15:03:23 +00003120 if (ReciprocalMath)
3121 CmdArgs.push_back("-freciprocal-math");
3122
Lang Hamesaa53b932012-07-06 00:59:19 +00003123 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003124 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003125 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003126 options::OPT_ffp_contract)) {
3127 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003128 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003129 if (Val == "fast" || Val == "on" || Val == "off") {
3130 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3131 } else {
3132 D.Diag(diag::err_drv_unsupported_option_argument)
3133 << A->getOption().getName() << Val;
3134 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003135 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3136 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003137 // If fast-math is set then set the fp-contract mode to fast.
3138 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3139 }
3140 }
3141
Bob Wilson6a039162012-07-19 03:52:53 +00003142 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3143 // and if we find them, tell the frontend to provide the appropriate
3144 // preprocessor macros. This is distinct from enabling any optimizations as
3145 // these options induce language changes which must survive serialization
3146 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003147 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3148 options::OPT_fno_fast_math))
3149 if (!A->getOption().matches(options::OPT_fno_fast_math))
3150 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003151 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3152 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003153 if (A->getOption().matches(options::OPT_ffinite_math_only))
3154 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003155
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003156 // Decide whether to use verbose asm. Verbose assembly is the default on
3157 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003158 bool IsIntegratedAssemblerDefault =
3159 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003160 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003161 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003162 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003163 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003164
Rafael Espindola298059a2015-04-06 04:36:45 +00003165 bool UsingIntegratedAssembler =
3166 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3167 IsIntegratedAssemblerDefault);
3168 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003169 CmdArgs.push_back("-no-integrated-as");
3170
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003171 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3172 CmdArgs.push_back("-mdebug-pass");
3173 CmdArgs.push_back("Structure");
3174 }
3175 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3176 CmdArgs.push_back("-mdebug-pass");
3177 CmdArgs.push_back("Arguments");
3178 }
3179
John McCall8517abc2010-02-19 02:45:38 +00003180 // Enable -mconstructor-aliases except on darwin, where we have to
3181 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003182 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003183 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003184
John McCall7ef5cb32011-03-18 02:56:14 +00003185 // Darwin's kernel doesn't support guard variables; just die if we
3186 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003187 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003188 CmdArgs.push_back("-fforbid-guard-variables");
3189
Douglas Gregordbe39272011-02-01 15:15:22 +00003190 if (Args.hasArg(options::OPT_mms_bitfields)) {
3191 CmdArgs.push_back("-mms-bitfields");
3192 }
John McCall8517abc2010-02-19 02:45:38 +00003193
Daniel Dunbar306945d2009-09-16 06:17:29 +00003194 // This is a coarse approximation of what llvm-gcc actually does, both
3195 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3196 // complicated ways.
3197 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003198 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3199 options::OPT_fno_asynchronous_unwind_tables,
3200 (getToolChain().IsUnwindTablesDefault() ||
3201 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3202 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003203 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3204 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003205 CmdArgs.push_back("-munwind-tables");
3206
Chandler Carruth05fb5852012-11-21 23:40:23 +00003207 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003208
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003209 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3210 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003211 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003212 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003213
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003214 // FIXME: Handle -mtune=.
3215 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003216
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003217 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003218 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003219 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003220 }
3221
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003222 // Add the target cpu
3223 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3224 llvm::Triple ETriple(ETripleStr);
3225 std::string CPU = getCPUName(Args, ETriple);
3226 if (!CPU.empty()) {
3227 CmdArgs.push_back("-target-cpu");
3228 CmdArgs.push_back(Args.MakeArgString(CPU));
3229 }
3230
Rafael Espindolaeb265472013-08-21 21:59:03 +00003231 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3232 CmdArgs.push_back("-mfpmath");
3233 CmdArgs.push_back(A->getValue());
3234 }
3235
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003236 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003237 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003238
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003239 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003240 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003241 default:
3242 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003243
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003244 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003245 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003246 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003247 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003248 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003249 break;
3250
Tim Northover573cbee2014-05-24 12:52:07 +00003251 case llvm::Triple::aarch64:
3252 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003253 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003254 break;
3255
Eric Christopher0b26a612010-03-02 02:41:08 +00003256 case llvm::Triple::mips:
3257 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003258 case llvm::Triple::mips64:
3259 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003260 AddMIPSTargetArgs(Args, CmdArgs);
3261 break;
3262
Ulrich Weigand8afad612014-07-28 13:17:52 +00003263 case llvm::Triple::ppc:
3264 case llvm::Triple::ppc64:
3265 case llvm::Triple::ppc64le:
3266 AddPPCTargetArgs(Args, CmdArgs);
3267 break;
3268
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003269 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003270 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003271 AddSparcTargetArgs(Args, CmdArgs);
3272 break;
3273
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003274 case llvm::Triple::x86:
3275 case llvm::Triple::x86_64:
3276 AddX86TargetArgs(Args, CmdArgs);
3277 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003278
3279 case llvm::Triple::hexagon:
3280 AddHexagonTargetArgs(Args, CmdArgs);
3281 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003282 }
3283
Hans Wennborg75958c42013-08-08 00:17:41 +00003284 // Add clang-cl arguments.
3285 if (getToolChain().getDriver().IsCLMode())
3286 AddClangCLArgs(Args, CmdArgs);
3287
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003288 // Pass the linker version in use.
3289 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3290 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003291 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003292 }
3293
Eric Christopherb7d97e92013-04-03 01:58:53 +00003294 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003295 CmdArgs.push_back("-momit-leaf-frame-pointer");
3296
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003297 // Explicitly error on some things we know we don't support and can't just
3298 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003299 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003300 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3301 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003302 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003303 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003304 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003305 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3306 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003308 << Unsupported->getOption().getName();
3309 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003310 }
3311
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003312 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003313 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003314 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003315 CmdArgs.push_back("-header-include-file");
3316 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3317 D.CCPrintHeadersFilename : "-");
3318 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003319 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003320 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003321
Chad Rosierbe10f982011-08-02 17:58:04 +00003322 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003323 CmdArgs.push_back("-diagnostic-log-file");
3324 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3325 D.CCLogDiagnosticsFilename : "-");
3326 }
3327
Manman Ren17bdb0f2013-11-20 20:22:14 +00003328 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3329 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003330 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003331 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003332 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3333 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003334 // FIXME: we should support specifying dwarf version with
3335 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003336 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003337 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003338 const llvm::Triple &Triple = getToolChain().getTriple();
3339 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003340 Triple.getOS() == llvm::Triple::FreeBSD ||
3341 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003342 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003343 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003344 CmdArgs.push_back("-gdwarf-2");
3345 else if (A->getOption().matches(options::OPT_gdwarf_3))
3346 CmdArgs.push_back("-gdwarf-3");
3347 else if (A->getOption().matches(options::OPT_gdwarf_4))
3348 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003349 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003350 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003351 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003352 const llvm::Triple &Triple = getToolChain().getTriple();
3353 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003354 Triple.getOS() == llvm::Triple::FreeBSD ||
3355 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003356 CmdArgs.push_back("-gdwarf-2");
3357 else
3358 CmdArgs.push_back("-g");
3359 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003360 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003361
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003362 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3363 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003364 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3365 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003366 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003367
Eric Christopher138c32b2013-09-13 22:37:55 +00003368 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003369 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3370 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003371 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003372 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003373 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003374 CmdArgs.push_back("-g");
3375 CmdArgs.push_back("-backend-option");
3376 CmdArgs.push_back("-split-dwarf=Enable");
3377 }
3378
Eric Christopher138c32b2013-09-13 22:37:55 +00003379 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3380 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3381 CmdArgs.push_back("-backend-option");
3382 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3383 }
Eric Christophereec89c22013-06-18 00:03:50 +00003384
Eric Christopher0d403d22014-02-14 01:27:03 +00003385 // -gdwarf-aranges turns on the emission of the aranges section in the
3386 // backend.
3387 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3388 CmdArgs.push_back("-backend-option");
3389 CmdArgs.push_back("-generate-arange-section");
3390 }
3391
David Blaikief36d9ba2014-01-27 18:52:43 +00003392 if (Args.hasFlag(options::OPT_fdebug_types_section,
3393 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003394 CmdArgs.push_back("-backend-option");
3395 CmdArgs.push_back("-generate-type-units");
3396 }
Eric Christophereec89c22013-06-18 00:03:50 +00003397
Ed Schouten6e576152015-03-26 17:50:28 +00003398 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3399 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3400
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003401 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003402 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003403 CmdArgs.push_back("-ffunction-sections");
3404 }
3405
3406 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003407 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003408 CmdArgs.push_back("-fdata-sections");
3409 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003410
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003411 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003412 options::OPT_fno_unique_section_names,
3413 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003414 CmdArgs.push_back("-fno-unique-section-names");
3415
Chris Lattner3c77a352010-06-22 00:03:40 +00003416 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3417
Justin Bognera71e6812015-04-30 23:49:42 +00003418 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3419 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003420 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3421 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3422 D.Diag(diag::err_drv_argument_not_allowed_with)
3423 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3424
Justin Bognera71e6812015-04-30 23:49:42 +00003425 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3426 A->render(Args, CmdArgs);
3427 else
3428 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003429
3430 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3431 A->render(Args, CmdArgs);
3432 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3433 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3434
Nick Lewycky207bce32011-04-21 23:44:07 +00003435 if (Args.hasArg(options::OPT_ftest_coverage) ||
3436 Args.hasArg(options::OPT_coverage))
3437 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003438 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3439 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003440 Args.hasArg(options::OPT_coverage))
3441 CmdArgs.push_back("-femit-coverage-data");
3442
Alex Lorenzee024992014-08-04 18:41:51 +00003443 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003444 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3445 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003446 D.Diag(diag::err_drv_argument_only_allowed_with)
3447 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3448
3449 if (Args.hasArg(options::OPT_fcoverage_mapping))
3450 CmdArgs.push_back("-fcoverage-mapping");
3451
Nick Lewycky480cb992011-05-04 20:46:58 +00003452 if (C.getArgs().hasArg(options::OPT_c) ||
3453 C.getArgs().hasArg(options::OPT_S)) {
3454 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003455 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003456 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003457 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003458 CoverageFilename = FinalOutput->getValue();
3459 } else {
3460 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3461 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003462 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003463 SmallString<128> Pwd;
3464 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003465 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003466 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003467 }
3468 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003469 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003470 }
3471 }
3472
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003473 // Pass options for controlling the default header search paths.
3474 if (Args.hasArg(options::OPT_nostdinc)) {
3475 CmdArgs.push_back("-nostdsysteminc");
3476 CmdArgs.push_back("-nobuiltininc");
3477 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003478 if (Args.hasArg(options::OPT_nostdlibinc))
3479 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003480 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3481 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3482 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003483
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003484 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003485 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003486 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003487
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003488 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3489
Ted Kremenekf7639e12012-03-06 20:06:33 +00003490 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003491 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003492 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003493 options::OPT_ccc_arcmt_modify,
3494 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003495 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003496 switch (A->getOption().getID()) {
3497 default:
3498 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003499 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003500 CmdArgs.push_back("-arcmt-check");
3501 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003502 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003503 CmdArgs.push_back("-arcmt-modify");
3504 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003505 case options::OPT_ccc_arcmt_migrate:
3506 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003507 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003508 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003509
3510 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3511 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003512 break;
John McCalld70fb982011-06-15 23:25:17 +00003513 }
3514 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003515 } else {
3516 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3517 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3518 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003519 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003520
Ted Kremenekf7639e12012-03-06 20:06:33 +00003521 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3522 if (ARCMTEnabled) {
3523 D.Diag(diag::err_drv_argument_not_allowed_with)
3524 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3525 }
3526 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003527 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003528
3529 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003530 options::OPT_objcmt_migrate_subscripting,
3531 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003532 // None specified, means enable them all.
3533 CmdArgs.push_back("-objcmt-migrate-literals");
3534 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003535 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003536 } else {
3537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003540 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003541 } else {
3542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3551 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3552 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3553 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3554 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3555 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003556 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003557 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003558 }
3559
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003560 // Add preprocessing options like -I, -D, etc. if we are using the
3561 // preprocessor.
3562 //
3563 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003564 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003565 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566
Rafael Espindolaa7431922011-07-21 23:40:37 +00003567 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3568 // that "The compiler can only warn and ignore the option if not recognized".
3569 // When building with ccache, it will pass -D options to clang even on
3570 // preprocessed inputs and configure concludes that -fPIC is not supported.
3571 Args.ClaimAllArgs(options::OPT_D);
3572
Alp Toker7874bdc2013-11-15 20:40:58 +00003573 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003574 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3575 if (A->getOption().matches(options::OPT_O4)) {
3576 CmdArgs.push_back("-O3");
3577 D.Diag(diag::warn_O4_is_O3);
3578 } else {
3579 A->render(Args, CmdArgs);
3580 }
3581 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003582
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003583 // Warn about ignored options to clang.
3584 for (arg_iterator it = Args.filtered_begin(
3585 options::OPT_clang_ignored_gcc_optimization_f_Group),
3586 ie = Args.filtered_end(); it != ie; ++it) {
3587 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3588 }
3589
Rafael Espindola577637a2015-01-03 00:06:04 +00003590 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003591
Richard Smith3be1cb22014-08-07 00:24:21 +00003592 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003593 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003594 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3595 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003596 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003597 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003598
3599 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003600 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003601 //
3602 // If a std is supplied, only add -trigraphs if it follows the
3603 // option.
3604 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3605 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003606 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003607 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003608 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003609 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003610 else
3611 Std->render(Args, CmdArgs);
3612
Nico Weber00721502014-12-23 22:32:37 +00003613 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003614 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003615 options::OPT_ftrigraphs,
3616 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003617 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003618 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003619 } else {
3620 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003621 //
3622 // FIXME: Clang doesn't correctly handle -std= when the input language
3623 // doesn't match. For the time being just ignore this for C++ inputs;
3624 // eventually we want to do all the standard defaulting here instead of
3625 // splitting it between the driver and clang -cc1.
3626 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003627 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3628 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003629 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003630 CmdArgs.push_back("-std=c++11");
3631
Nico Weber00721502014-12-23 22:32:37 +00003632 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3633 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003634 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003635
Richard Smith282b4492013-09-04 22:50:31 +00003636 // GCC's behavior for -Wwrite-strings is a bit strange:
3637 // * In C, this "warning flag" changes the types of string literals from
3638 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3639 // for the discarded qualifier.
3640 // * In C++, this is just a normal warning flag.
3641 //
3642 // Implementing this warning correctly in C is hard, so we follow GCC's
3643 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3644 // a non-const char* in C, rather than using this crude hack.
3645 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003646 // FIXME: This should behave just like a warning flag, and thus should also
3647 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3648 Arg *WriteStrings =
3649 Args.getLastArg(options::OPT_Wwrite_strings,
3650 options::OPT_Wno_write_strings, options::OPT_w);
3651 if (WriteStrings &&
3652 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003653 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003654 }
3655
Chandler Carruth61fbf622011-04-23 09:27:53 +00003656 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003657 // during C++ compilation, which it is by default. GCC keeps this define even
3658 // in the presence of '-w', match this behavior bug-for-bug.
3659 if (types::isCXX(InputType) &&
3660 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3661 true)) {
3662 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003663 }
3664
Chandler Carruthe0391482010-05-22 02:21:53 +00003665 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3666 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3667 if (Asm->getOption().matches(options::OPT_fasm))
3668 CmdArgs.push_back("-fgnu-keywords");
3669 else
3670 CmdArgs.push_back("-fno-gnu-keywords");
3671 }
3672
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003673 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3674 CmdArgs.push_back("-fno-dwarf-directory-asm");
3675
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003676 if (ShouldDisableAutolink(Args, getToolChain()))
3677 CmdArgs.push_back("-fno-autolink");
3678
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003679 // Add in -fdebug-compilation-dir if necessary.
3680 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003681
Richard Smith9a568822011-11-21 19:36:32 +00003682 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3683 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003684 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003685 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686 }
3687
Richard Smith79c927b2013-11-06 19:31:51 +00003688 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3689 CmdArgs.push_back("-foperator-arrow-depth");
3690 CmdArgs.push_back(A->getValue());
3691 }
3692
Richard Smith9a568822011-11-21 19:36:32 +00003693 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3694 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003695 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003696 }
3697
Richard Smitha3d3bd22013-05-08 02:12:03 +00003698 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3699 CmdArgs.push_back("-fconstexpr-steps");
3700 CmdArgs.push_back(A->getValue());
3701 }
3702
Richard Smithb3a14522013-02-22 01:59:51 +00003703 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3704 CmdArgs.push_back("-fbracket-depth");
3705 CmdArgs.push_back(A->getValue());
3706 }
3707
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003708 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3709 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003710 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003711 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003712 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3713 } else
3714 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003715 }
3716
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003717
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003718 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003719 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003720
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003721 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3722 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003723 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003724 }
David Chisnall5778fce2009-08-31 16:41:57 +00003725
Chris Lattnere23003d2010-01-09 21:54:33 +00003726 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3727 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003728 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003729 }
3730
Chris Lattnerb35583d2010-04-07 20:49:23 +00003731 CmdArgs.push_back("-ferror-limit");
3732 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003733 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003734 else
3735 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003736
Chandler Carrutha77a7272010-05-06 04:55:18 +00003737 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3738 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003739 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003740 }
3741
3742 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3743 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003744 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003745 }
3746
Richard Smithf6f003a2011-12-16 19:06:07 +00003747 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3748 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003749 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003750 }
3751
Nick Lewycky24653262014-12-16 21:39:02 +00003752 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3753 CmdArgs.push_back("-fspell-checking-limit");
3754 CmdArgs.push_back(A->getValue());
3755 }
3756
Daniel Dunbar2c978472009-11-04 06:24:47 +00003757 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003758 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003759 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003760 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003761 } else {
3762 // If -fmessage-length=N was not specified, determine whether this is a
3763 // terminal and, if so, implicitly define -fmessage-length appropriately.
3764 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003765 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003766 }
3767
John McCallb4a99d32013-02-19 01:57:35 +00003768 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3769 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3770 options::OPT_fvisibility_ms_compat)) {
3771 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3772 CmdArgs.push_back("-fvisibility");
3773 CmdArgs.push_back(A->getValue());
3774 } else {
3775 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3776 CmdArgs.push_back("-fvisibility");
3777 CmdArgs.push_back("hidden");
3778 CmdArgs.push_back("-ftype-visibility");
3779 CmdArgs.push_back("default");
3780 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003781 }
3782
Douglas Gregor08329632010-06-15 17:05:35 +00003783 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003784
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003785 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3786
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003787 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003788 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3789 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003790 CmdArgs.push_back("-ffreestanding");
3791
Daniel Dunbare357d562009-12-03 18:42:11 +00003792 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003793 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003794 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003795 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3796 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003797 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003798 // AltiVec language extensions aren't relevant for assembling.
3799 if (!isa<PreprocessJobAction>(JA) ||
3800 Output.getType() != types::TY_PP_Asm)
3801 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003802 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3803 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003804
Peter Collingbourne32701642013-11-01 18:16:25 +00003805 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3806 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003807
Eric Christopher459d2712013-02-19 06:16:53 +00003808 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003809 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003810 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003811 getToolChain().getArch() == llvm::Triple::ppc64 ||
3812 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003813 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003814 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003815
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003816 if (getToolChain().SupportsProfiling())
3817 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003818
3819 // -flax-vector-conversions is default.
3820 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3821 options::OPT_fno_lax_vector_conversions))
3822 CmdArgs.push_back("-fno-lax-vector-conversions");
3823
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003824 if (Args.getLastArg(options::OPT_fapple_kext))
3825 CmdArgs.push_back("-fapple-kext");
3826
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003827 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003828 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003829 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003830 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3831 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003832
3833 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3834 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003835 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003836 }
3837
Bob Wilson14adb362012-02-03 06:27:22 +00003838 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003839
Chandler Carruth6e501032011-03-27 00:04:55 +00003840 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3841 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3842 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3843 options::OPT_fno_wrapv)) {
3844 if (A->getOption().matches(options::OPT_fwrapv))
3845 CmdArgs.push_back("-fwrapv");
3846 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3847 options::OPT_fno_strict_overflow)) {
3848 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3849 CmdArgs.push_back("-fwrapv");
3850 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003851
3852 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3853 options::OPT_fno_reroll_loops))
3854 if (A->getOption().matches(options::OPT_freroll_loops))
3855 CmdArgs.push_back("-freroll-loops");
3856
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003857 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003858 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3859 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003860
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003861 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3862
Mahesha S6a682be42012-10-27 07:47:56 +00003863
Daniel Dunbar4930e332009-11-17 08:07:36 +00003864 // -stack-protector=0 is default.
3865 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003866 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3867 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003868 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003869 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003870 if (A->getOption().matches(options::OPT_fstack_protector)) {
3871 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3872 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3873 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003874 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003875 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003876 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003877 } else {
3878 StackProtectorLevel =
3879 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3880 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003881 if (StackProtectorLevel) {
3882 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003883 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003884 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003885
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003886 // --param ssp-buffer-size=
3887 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3888 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003889 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003890 if (Str.startswith("ssp-buffer-size=")) {
3891 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003892 CmdArgs.push_back("-stack-protector-buffer-size");
3893 // FIXME: Verify the argument is a valid integer.
3894 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003895 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003896 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003897 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003898 }
3899
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003900 // Translate -mstackrealign
3901 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3902 false)) {
3903 CmdArgs.push_back("-backend-option");
3904 CmdArgs.push_back("-force-align-stack");
3905 }
3906 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3907 false)) {
3908 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3909 }
3910
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003911 if (Args.hasArg(options::OPT_mstack_alignment)) {
3912 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3913 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003914 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003915
Hans Wennborg77dc2362015-01-20 19:45:50 +00003916 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3917 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3918
3919 if (!Size.empty())
3920 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3921 else
3922 CmdArgs.push_back("-mstack-probe-size=0");
3923 }
3924
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003925 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3926 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3927 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3928
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003929 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3930 options::OPT_mno_restrict_it)) {
3931 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3932 CmdArgs.push_back("-backend-option");
3933 CmdArgs.push_back("-arm-restrict-it");
3934 } else {
3935 CmdArgs.push_back("-backend-option");
3936 CmdArgs.push_back("-arm-no-restrict-it");
3937 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003938 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3939 TT.getArch() == llvm::Triple::thumb)) {
3940 // Windows on ARM expects restricted IT blocks
3941 CmdArgs.push_back("-backend-option");
3942 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003943 }
3944
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003945 if (TT.getArch() == llvm::Triple::arm ||
3946 TT.getArch() == llvm::Triple::thumb) {
3947 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3948 options::OPT_mno_long_calls)) {
3949 if (A->getOption().matches(options::OPT_mlong_calls)) {
3950 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003951 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003952 }
3953 }
3954 }
3955
Daniel Dunbard18049a2009-04-07 21:16:11 +00003956 // Forward -f options with positive and negative forms; we translate
3957 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003958 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3959 StringRef fname = A->getValue();
3960 if (!llvm::sys::fs::exists(fname))
3961 D.Diag(diag::err_drv_no_such_file) << fname;
3962 else
3963 A->render(Args, CmdArgs);
3964 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003965
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003966 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003967 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003968 CmdArgs.push_back("-fapple-kext");
3969 if (!Args.hasArg(options::OPT_fbuiltin))
3970 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003971 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003972 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003973 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003974 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003975 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003976
Nuno Lopes13c88c72009-12-16 16:59:22 +00003977 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3978 options::OPT_fno_assume_sane_operator_new))
3979 CmdArgs.push_back("-fno-assume-sane-operator-new");
3980
Daniel Dunbar4930e332009-11-17 08:07:36 +00003981 // -fblocks=0 is default.
3982 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003983 getToolChain().IsBlocksDefault()) ||
3984 (Args.hasArg(options::OPT_fgnu_runtime) &&
3985 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3986 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003987 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003988
3989 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3990 !getToolChain().hasBlocksRuntime())
3991 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003992 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003993
Richard Smithffb65082014-09-30 23:10:19 +00003994 // -fmodules enables modules (off by default).
3995 // Users can pass -fno-cxx-modules to turn off modules support for
3996 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003997 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003998 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3999 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4000 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004001 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004002 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004003 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004004 HaveModules = true;
4005 }
4006 }
4007
Daniel Jasper07e6c402013-08-05 20:26:17 +00004008 // -fmodule-maps enables module map processing (off by default) for header
4009 // checking. It is implied by -fmodules.
4010 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4011 false)) {
4012 CmdArgs.push_back("-fmodule-maps");
4013 }
4014
Daniel Jasperac42b752013-10-21 06:34:34 +00004015 // -fmodules-decluse checks that modules used are declared so (off by
4016 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004017 if (Args.hasFlag(options::OPT_fmodules_decluse,
4018 options::OPT_fno_modules_decluse,
4019 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004020 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004021 }
4022
Daniel Jasper962b38e2014-04-11 11:47:45 +00004023 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4024 // all #included headers are part of modules.
4025 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4026 options::OPT_fno_modules_strict_decluse,
4027 false)) {
4028 CmdArgs.push_back("-fmodules-strict-decluse");
4029 }
4030
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004031 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4032 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4033 options::OPT_fno_implicit_modules)) {
4034 CmdArgs.push_back("-fno-implicit-modules");
4035 }
4036
Daniel Jasperac42b752013-10-21 06:34:34 +00004037 // -fmodule-name specifies the module that is currently being built (or
4038 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004039 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004040
Richard Smith9887d792014-10-17 01:42:53 +00004041 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004042 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004043 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004044
Richard Smithe842a472014-10-22 02:05:46 +00004045 // -fmodule-file can be used to specify files containing precompiled modules.
4046 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4047
4048 // -fmodule-cache-path specifies where our implicitly-built module files
4049 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004050 SmallString<128> ModuleCachePath;
4051 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4052 ModuleCachePath = A->getValue();
4053 if (HaveModules) {
4054 if (C.isForDiagnostics()) {
4055 // When generating crash reports, we want to emit the modules along with
4056 // the reproduction sources, so we ignore any provided module path.
4057 ModuleCachePath = Output.getFilename();
4058 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4059 llvm::sys::path::append(ModuleCachePath, "modules");
4060 } else if (ModuleCachePath.empty()) {
4061 // No module path was provided: use the default.
4062 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4063 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004064 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4065 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004066 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4067 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004068 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004069 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4070 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4071 }
4072
4073 // When building modules and generating crashdumps, we need to dump a module
4074 // dependency VFS alongside the output.
4075 if (HaveModules && C.isForDiagnostics()) {
4076 SmallString<128> VFSDir(Output.getFilename());
4077 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004078 // Add the cache directory as a temp so the crash diagnostics pick it up.
4079 C.addTempFile(Args.MakeArgString(VFSDir));
4080
Justin Bognera88f0122014-06-20 22:59:50 +00004081 llvm::sys::path::append(VFSDir, "vfs");
4082 CmdArgs.push_back("-module-dependency-dir");
4083 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004084 }
4085
Richard Smith9887d792014-10-17 01:42:53 +00004086 if (HaveModules)
4087 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004088
Douglas Gregor35b04d62013-02-07 19:01:24 +00004089 // Pass through all -fmodules-ignore-macro arguments.
4090 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004091 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4092 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004093
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004094 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4095
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004096 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4097 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4098 D.Diag(diag::err_drv_argument_not_allowed_with)
4099 << A->getAsString(Args) << "-fbuild-session-timestamp";
4100
4101 llvm::sys::fs::file_status Status;
4102 if (llvm::sys::fs::status(A->getValue(), Status))
4103 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004104 CmdArgs.push_back(Args.MakeArgString(
4105 "-fbuild-session-timestamp=" +
4106 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004107 }
4108
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004109 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004110 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4111 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004112 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4113
4114 Args.AddLastArg(CmdArgs,
4115 options::OPT_fmodules_validate_once_per_build_session);
4116 }
4117
Ben Langmuirdcf73862014-03-12 00:06:17 +00004118 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4119
John McCalldfea9982010-04-09 19:12:06 +00004120 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004121 if (Args.hasFlag(options::OPT_fno_access_control,
4122 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004123 false))
John McCall3155f572010-04-09 19:03:51 +00004124 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004125
Anders Carlssond470fef2010-11-21 00:09:52 +00004126 // -felide-constructors is the default.
4127 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4128 options::OPT_felide_constructors,
4129 false))
4130 CmdArgs.push_back("-fno-elide-constructors");
4131
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004132 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004133
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004134 if (KernelOrKext || (types::isCXX(InputType) &&
4135 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4136 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004137 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004138
Tony Linthicum76329bf2011-12-12 21:14:55 +00004139 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004140 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004141 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004142 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004143 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004144 CmdArgs.push_back("-fshort-enums");
4145
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004146 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004147 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004148 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004149 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004150
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004151 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004152 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4153 options::OPT_fno_use_cxa_atexit,
4154 !IsWindowsCygnus && !IsWindowsGNU &&
4155 getToolChain().getArch() != llvm::Triple::hexagon &&
4156 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004157 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004158 CmdArgs.push_back("-fno-use-cxa-atexit");
4159
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004160 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004161 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004162 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004163 CmdArgs.push_back("-fms-extensions");
4164
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004165 // -fno-use-line-directives is default.
4166 if (Args.hasFlag(options::OPT_fuse_line_directives,
4167 options::OPT_fno_use_line_directives, false))
4168 CmdArgs.push_back("-fuse-line-directives");
4169
Francois Pichet1b4f1632011-09-17 04:32:15 +00004170 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004171 if (Args.hasFlag(options::OPT_fms_compatibility,
4172 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004173 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4174 options::OPT_fno_ms_extensions,
4175 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004176 CmdArgs.push_back("-fms-compatibility");
4177
David Majnemerc371ff02015-03-22 08:39:22 +00004178 // -fms-compatibility-version=18.00 is default.
4179 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004180 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004181 IsWindowsMSVC) ||
4182 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004183 Args.hasArg(options::OPT_fms_compatibility_version)) {
4184 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4185 const Arg *MSCompatibilityVersion =
4186 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004187
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004188 if (MSCVersion && MSCompatibilityVersion)
4189 D.Diag(diag::err_drv_argument_not_allowed_with)
4190 << MSCVersion->getAsString(Args)
4191 << MSCompatibilityVersion->getAsString(Args);
4192
David Majnemerc371ff02015-03-22 08:39:22 +00004193 if (MSCompatibilityVersion) {
4194 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4195 D.Diag(diag::err_drv_invalid_value)
4196 << MSCompatibilityVersion->getAsString(Args)
4197 << MSCompatibilityVersion->getValue();
4198 } else if (MSCVersion) {
4199 unsigned Version = 0;
4200 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4201 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4202 << MSCVersion->getValue();
4203 MSVT = getMSCompatibilityVersion(Version);
4204 } else {
4205 MSVT = VersionTuple(18);
4206 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004207
David Majnemerc371ff02015-03-22 08:39:22 +00004208 CmdArgs.push_back(
4209 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004210 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004211
Eric Christopher5ecce122013-02-18 00:38:31 +00004212 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004213 if (Args.hasFlag(options::OPT_fborland_extensions,
4214 options::OPT_fno_borland_extensions, false))
4215 CmdArgs.push_back("-fborland-extensions");
4216
David Majnemerc371ff02015-03-22 08:39:22 +00004217 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4218 // than 19.
4219 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4220 options::OPT_fno_threadsafe_statics,
4221 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4222 CmdArgs.push_back("-fno-threadsafe-statics");
4223
Francois Pichet02744872011-09-01 16:38:08 +00004224 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4225 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004226 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004227 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004228 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004229
Chandler Carruthe03aa552010-04-17 20:17:31 +00004230 // -fgnu-keywords default varies depending on language; only pass if
4231 // specified.
4232 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004233 options::OPT_fno_gnu_keywords))
4234 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004235
Rafael Espindola922a6242011-06-02 17:30:53 +00004236 if (Args.hasFlag(options::OPT_fgnu89_inline,
4237 options::OPT_fno_gnu89_inline,
4238 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004239 CmdArgs.push_back("-fgnu89-inline");
4240
Chad Rosier9c76d242012-03-15 22:31:42 +00004241 if (Args.hasArg(options::OPT_fno_inline))
4242 CmdArgs.push_back("-fno-inline");
4243
Chad Rosier64d6be92012-03-06 21:17:19 +00004244 if (Args.hasArg(options::OPT_fno_inline_functions))
4245 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004246
John McCall5fb5df92012-06-20 06:18:46 +00004247 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004248
John McCall5fb5df92012-06-20 06:18:46 +00004249 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004250 // legacy is the default. Except for deployment taget of 10.5,
4251 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4252 // gets ignored silently.
4253 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004254 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4255 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004256 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004257 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004258 if (getToolChain().UseObjCMixedDispatch())
4259 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4260 else
4261 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4262 }
4263 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004264
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004265 // When ObjectiveC legacy runtime is in effect on MacOSX,
4266 // turn on the option to do Array/Dictionary subscripting
4267 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004268 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4269 getToolChain().getTriple().isMacOSX() &&
4270 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4271 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004272 objcRuntime.isNeXTFamily())
4273 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4274
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004275 // -fencode-extended-block-signature=1 is default.
4276 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4277 CmdArgs.push_back("-fencode-extended-block-signature");
4278 }
4279
John McCall24fc0de2011-07-06 00:26:06 +00004280 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4281 // NOTE: This logic is duplicated in ToolChains.cpp.
4282 bool ARC = isObjCAutoRefCount(Args);
4283 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004284 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004285
John McCall24fc0de2011-07-06 00:26:06 +00004286 CmdArgs.push_back("-fobjc-arc");
4287
Chandler Carruth491db322011-11-04 07:34:47 +00004288 // FIXME: It seems like this entire block, and several around it should be
4289 // wrapped in isObjC, but for now we just use it here as this is where it
4290 // was being used previously.
4291 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4292 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4293 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4294 else
4295 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4296 }
4297
John McCall24fc0de2011-07-06 00:26:06 +00004298 // Allow the user to enable full exceptions code emission.
4299 // We define off for Objective-CC, on for Objective-C++.
4300 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4301 options::OPT_fno_objc_arc_exceptions,
4302 /*default*/ types::isCXX(InputType)))
4303 CmdArgs.push_back("-fobjc-arc-exceptions");
4304 }
4305
4306 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4307 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004308 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004309 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004310
John McCall24fc0de2011-07-06 00:26:06 +00004311 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4312 // takes precedence.
4313 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4314 if (!GCArg)
4315 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4316 if (GCArg) {
4317 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004318 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004319 << GCArg->getAsString(Args);
4320 } else if (getToolChain().SupportsObjCGC()) {
4321 GCArg->render(Args, CmdArgs);
4322 } else {
4323 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004324 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004325 << GCArg->getAsString(Args);
4326 }
4327 }
4328
Bob Wilsonb111ec92015-03-02 19:01:14 +00004329 if (Args.hasFlag(options::OPT_fapplication_extension,
4330 options::OPT_fno_application_extension, false))
4331 CmdArgs.push_back("-fapplication-extension");
4332
Reid Klecknerc542d372014-06-27 17:02:02 +00004333 // Handle GCC-style exception args.
4334 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004335 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004336 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004337
4338 if (getToolChain().UseSjLjExceptions())
4339 CmdArgs.push_back("-fsjlj-exceptions");
4340
4341 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004342 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4343 options::OPT_fno_assume_sane_operator_new))
4344 CmdArgs.push_back("-fno-assume-sane-operator-new");
4345
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004346 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4347 // most platforms.
4348 if (Args.hasFlag(options::OPT_fsized_deallocation,
4349 options::OPT_fno_sized_deallocation, false))
4350 CmdArgs.push_back("-fsized-deallocation");
4351
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004352 // -fconstant-cfstrings is default, and may be subject to argument translation
4353 // on Darwin.
4354 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4355 options::OPT_fno_constant_cfstrings) ||
4356 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4357 options::OPT_mno_constant_cfstrings))
4358 CmdArgs.push_back("-fno-constant-cfstrings");
4359
John Thompsoned4e2952009-11-05 20:14:16 +00004360 // -fshort-wchar default varies depending on platform; only
4361 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004362 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4363 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004364 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004365
Hans Wennborg28c96312013-07-31 23:39:13 +00004366 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004367 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004368 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004369 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004370 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004371
Daniel Dunbar096ed292011-10-05 21:04:55 +00004372 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4373 // -fno-pack-struct doesn't apply to -fpack-struct=.
4374 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004375 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004376 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004377 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004378 } else if (Args.hasFlag(options::OPT_fpack_struct,
4379 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004380 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004381 }
4382
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004383 // Handle -fmax-type-align=N and -fno-type-align
4384 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4385 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4386 if (!SkipMaxTypeAlign) {
4387 std::string MaxTypeAlignStr = "-fmax-type-align=";
4388 MaxTypeAlignStr += A->getValue();
4389 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4390 }
4391 } else if (getToolChain().getTriple().isOSDarwin()) {
4392 if (!SkipMaxTypeAlign) {
4393 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4394 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4395 }
4396 }
4397
Robert Lytton0e076492013-08-13 09:43:10 +00004398 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004399 if (!Args.hasArg(options::OPT_fcommon))
4400 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004401 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004402 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004403
Daniel Dunbard18049a2009-04-07 21:16:11 +00004404 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004405 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004406 CmdArgs.push_back("-fno-common");
4407
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004408 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004409 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004410 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004411 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004412 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004413 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4414
Daniel Dunbar6358d682010-10-15 22:30:42 +00004415 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4416 if (!Args.hasFlag(options::OPT_ffor_scope,
4417 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004418 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004419 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4420
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004421 // -finput_charset=UTF-8 is default. Reject others
4422 if (Arg *inputCharset = Args.getLastArg(
4423 options::OPT_finput_charset_EQ)) {
4424 StringRef value = inputCharset->getValue();
4425 if (value != "UTF-8")
4426 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4427 }
4428
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004429 // -fexec_charset=UTF-8 is default. Reject others
4430 if (Arg *execCharset = Args.getLastArg(
4431 options::OPT_fexec_charset_EQ)) {
4432 StringRef value = execCharset->getValue();
4433 if (value != "UTF-8")
4434 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4435 }
4436
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004437 // -fcaret-diagnostics is default.
4438 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4439 options::OPT_fno_caret_diagnostics, true))
4440 CmdArgs.push_back("-fno-caret-diagnostics");
4441
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004442 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004443 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004444 options::OPT_fno_diagnostics_fixit_info))
4445 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004446
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004447 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004448 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004449 options::OPT_fno_diagnostics_show_option))
4450 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004451
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004452 if (const Arg *A =
4453 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4454 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004455 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004456 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004457
Douglas Gregor643c9222011-05-21 17:07:29 +00004458 if (const Arg *A =
4459 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4460 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004461 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004462 }
4463
Chandler Carruthb6766f02011-03-27 01:50:55 +00004464 if (Arg *A = Args.getLastArg(
4465 options::OPT_fdiagnostics_show_note_include_stack,
4466 options::OPT_fno_diagnostics_show_note_include_stack)) {
4467 if (A->getOption().matches(
4468 options::OPT_fdiagnostics_show_note_include_stack))
4469 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4470 else
4471 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4472 }
4473
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004474 // Color diagnostics are the default, unless the terminal doesn't support
4475 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004476 // Support both clang's -f[no-]color-diagnostics and gcc's
4477 // -f[no-]diagnostics-colors[=never|always|auto].
4478 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004479 for (const auto &Arg : Args) {
4480 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004481 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4482 !O.matches(options::OPT_fdiagnostics_color) &&
4483 !O.matches(options::OPT_fno_color_diagnostics) &&
4484 !O.matches(options::OPT_fno_diagnostics_color) &&
4485 !O.matches(options::OPT_fdiagnostics_color_EQ))
4486 continue;
4487
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004488 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004489 if (O.matches(options::OPT_fcolor_diagnostics) ||
4490 O.matches(options::OPT_fdiagnostics_color)) {
4491 ShowColors = Colors_On;
4492 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4493 O.matches(options::OPT_fno_diagnostics_color)) {
4494 ShowColors = Colors_Off;
4495 } else {
4496 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004497 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004498 if (value == "always")
4499 ShowColors = Colors_On;
4500 else if (value == "never")
4501 ShowColors = Colors_Off;
4502 else if (value == "auto")
4503 ShowColors = Colors_Auto;
4504 else
4505 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4506 << ("-fdiagnostics-color=" + value).str();
4507 }
4508 }
4509 if (ShowColors == Colors_On ||
4510 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004511 CmdArgs.push_back("-fcolor-diagnostics");
4512
Nico Rieck7857d462013-09-11 00:38:02 +00004513 if (Args.hasArg(options::OPT_fansi_escape_codes))
4514 CmdArgs.push_back("-fansi-escape-codes");
4515
Daniel Dunbardb097022009-06-08 21:13:54 +00004516 if (!Args.hasFlag(options::OPT_fshow_source_location,
4517 options::OPT_fno_show_source_location))
4518 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004519
Douglas Gregor643c9222011-05-21 17:07:29 +00004520 if (!Args.hasFlag(options::OPT_fshow_column,
4521 options::OPT_fno_show_column,
4522 true))
4523 CmdArgs.push_back("-fno-show-column");
4524
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004525 if (!Args.hasFlag(options::OPT_fspell_checking,
4526 options::OPT_fno_spell_checking))
4527 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004528
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004529
Chad Rosierc8e56e82012-12-05 21:08:21 +00004530 // -fno-asm-blocks is default.
4531 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4532 false))
4533 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004534
Steven Wucb0d13f2015-01-16 23:05:28 +00004535 // -fgnu-inline-asm is default.
4536 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4537 options::OPT_fno_gnu_inline_asm, true))
4538 CmdArgs.push_back("-fno-gnu-inline-asm");
4539
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004540 // Enable vectorization per default according to the optimization level
4541 // selected. For optimization levels that want vectorization we use the alias
4542 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004543 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004544 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004545 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004546 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004547 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004548 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004549
Chad Rosier136d67d2014-04-28 19:30:57 +00004550 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004551 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4552 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004553 options::OPT_fslp_vectorize;
4554 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004555 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004556 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004557
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004558 // -fno-slp-vectorize-aggressive is default.
4559 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004560 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004561 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004562
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004563 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4564 A->render(Args, CmdArgs);
4565
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004566 // -fdollars-in-identifiers default varies depending on platform and
4567 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004568 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004569 options::OPT_fno_dollars_in_identifiers)) {
4570 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004571 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004572 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004573 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004574 }
4575
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004576 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4577 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004578 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004579 options::OPT_fno_unit_at_a_time)) {
4580 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004581 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004582 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004583
Eli Friedman055c9702011-11-02 01:53:16 +00004584 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4585 options::OPT_fno_apple_pragma_pack, false))
4586 CmdArgs.push_back("-fapple-pragma-pack");
4587
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004588 // le32-specific flags:
4589 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4590 // by default.
4591 if (getToolChain().getArch() == llvm::Triple::le32) {
4592 CmdArgs.push_back("-fno-math-builtin");
4593 }
4594
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004595 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004596 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004597 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004598#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004599 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004600 (getToolChain().getArch() == llvm::Triple::arm ||
4601 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004602 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4603 CmdArgs.push_back("-fno-builtin-strcat");
4604 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4605 CmdArgs.push_back("-fno-builtin-strcpy");
4606 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004607#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004608
Justin Bognera88f0122014-06-20 22:59:50 +00004609 // Enable rewrite includes if the user's asked for it or if we're generating
4610 // diagnostics.
4611 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4612 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004613 if (Args.hasFlag(options::OPT_frewrite_includes,
4614 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004615 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004616 CmdArgs.push_back("-frewrite-includes");
4617
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004618 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004619 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004620 options::OPT_traditional_cpp)) {
4621 if (isa<PreprocessJobAction>(JA))
4622 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004623 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004624 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004625 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004626
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004627 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004628 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004629
4630 // Handle serialized diagnostics.
4631 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4632 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004633 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004634 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004635
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004636 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4637 CmdArgs.push_back("-fretain-comments-from-system-headers");
4638
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004639 // Forward -fcomment-block-commands to -cc1.
4640 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004641 // Forward -fparse-all-comments to -cc1.
4642 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004643
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004644 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4645 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004646 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004647 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004648 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4649 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004650 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004651
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004652 // We translate this by hand to the -cc1 argument, since nightly test uses
4653 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004654 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004655 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004656 OptDisabled = true;
4657 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004658 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004659 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004660
Bob Wilson23a55f12014-12-21 07:00:00 +00004661 // With -save-temps, we want to save the unoptimized bitcode output from the
4662 // CompileJobAction, so disable optimizations if they are not already
4663 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004664 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004665 isa<CompileJobAction>(JA))
4666 CmdArgs.push_back("-disable-llvm-optzns");
4667
Daniel Dunbard67a3222009-03-30 06:36:42 +00004668 if (Output.getType() == types::TY_Dependencies) {
4669 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004670 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004671 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004672 CmdArgs.push_back(Output.getFilename());
4673 } else {
4674 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004675 }
4676
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004677 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004678 addDashXForInput(Args, II, CmdArgs);
4679
Daniel Dunbarb440f562010-08-02 02:38:21 +00004680 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004681 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004682 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004683 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004684 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004685
Chris Lattnere9d7d782009-11-03 19:50:27 +00004686 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4687
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004688 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004689
4690 // Optionally embed the -cc1 level arguments into the debug info, for build
4691 // analysis.
4692 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004693 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004694 for (const auto &Arg : Args)
4695 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004696
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004697 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004698 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004699 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004700 SmallString<128> EscapedArg;
4701 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004702 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004703 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004704 }
4705 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004706 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004707 }
4708
Eric Christopherd3804002013-02-22 20:12:52 +00004709 // Add the split debug info name to the command lines here so we
4710 // can propagate it to the backend.
4711 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004712 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004713 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4714 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004715 const char *SplitDwarfOut;
4716 if (SplitDwarf) {
4717 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004718 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004719 CmdArgs.push_back(SplitDwarfOut);
4720 }
4721
4722 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004723 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004724 Output.getType() == types::TY_Object &&
4725 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004726 auto CLCommand =
4727 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4728 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4729 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004730 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004731 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004732 }
4733
Daniel Dunbar17731772009-03-23 19:03:36 +00004734
Eric Christopherf1545832013-02-22 23:50:16 +00004735 // Handle the debug info splitting at object creation time if we're
4736 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004737 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004738 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004739 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004740
Roman Divacky178e01602011-02-10 16:52:03 +00004741 if (Arg *A = Args.getLastArg(options::OPT_pg))
4742 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004743 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004744 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004745
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004746 // Claim some arguments which clang supports automatically.
4747
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004748 // -fpch-preprocess is used with gcc to add a special marker in the output to
4749 // include the PCH file. Clang's PTH solution is completely transparent, so we
4750 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004751 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004752
Daniel Dunbar17731772009-03-23 19:03:36 +00004753 // Claim some arguments which clang doesn't support, but we don't
4754 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004755 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4756 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004757
Rafael Espindolab0092d72013-09-04 19:37:35 +00004758 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004759 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004760}
4761
John McCall5fb5df92012-06-20 06:18:46 +00004762/// Add options related to the Objective-C runtime/ABI.
4763///
4764/// Returns true if the runtime is non-fragile.
4765ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4766 ArgStringList &cmdArgs,
4767 RewriteKind rewriteKind) const {
4768 // Look for the controlling runtime option.
4769 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4770 options::OPT_fgnu_runtime,
4771 options::OPT_fobjc_runtime_EQ);
4772
4773 // Just forward -fobjc-runtime= to the frontend. This supercedes
4774 // options about fragility.
4775 if (runtimeArg &&
4776 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4777 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004778 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004779 if (runtime.tryParse(value)) {
4780 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4781 << value;
4782 }
4783
4784 runtimeArg->render(args, cmdArgs);
4785 return runtime;
4786 }
4787
4788 // Otherwise, we'll need the ABI "version". Version numbers are
4789 // slightly confusing for historical reasons:
4790 // 1 - Traditional "fragile" ABI
4791 // 2 - Non-fragile ABI, version 1
4792 // 3 - Non-fragile ABI, version 2
4793 unsigned objcABIVersion = 1;
4794 // If -fobjc-abi-version= is present, use that to set the version.
4795 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004796 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004797 if (value == "1")
4798 objcABIVersion = 1;
4799 else if (value == "2")
4800 objcABIVersion = 2;
4801 else if (value == "3")
4802 objcABIVersion = 3;
4803 else
4804 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4805 << value;
4806 } else {
4807 // Otherwise, determine if we are using the non-fragile ABI.
4808 bool nonFragileABIIsDefault =
4809 (rewriteKind == RK_NonFragile ||
4810 (rewriteKind == RK_None &&
4811 getToolChain().IsObjCNonFragileABIDefault()));
4812 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4813 options::OPT_fno_objc_nonfragile_abi,
4814 nonFragileABIIsDefault)) {
4815 // Determine the non-fragile ABI version to use.
4816#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4817 unsigned nonFragileABIVersion = 1;
4818#else
4819 unsigned nonFragileABIVersion = 2;
4820#endif
4821
4822 if (Arg *abiArg = args.getLastArg(
4823 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004824 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004825 if (value == "1")
4826 nonFragileABIVersion = 1;
4827 else if (value == "2")
4828 nonFragileABIVersion = 2;
4829 else
4830 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4831 << value;
4832 }
4833
4834 objcABIVersion = 1 + nonFragileABIVersion;
4835 } else {
4836 objcABIVersion = 1;
4837 }
4838 }
4839
4840 // We don't actually care about the ABI version other than whether
4841 // it's non-fragile.
4842 bool isNonFragile = objcABIVersion != 1;
4843
4844 // If we have no runtime argument, ask the toolchain for its default runtime.
4845 // However, the rewriter only really supports the Mac runtime, so assume that.
4846 ObjCRuntime runtime;
4847 if (!runtimeArg) {
4848 switch (rewriteKind) {
4849 case RK_None:
4850 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4851 break;
4852 case RK_Fragile:
4853 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4854 break;
4855 case RK_NonFragile:
4856 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4857 break;
4858 }
4859
4860 // -fnext-runtime
4861 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4862 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004863 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004864 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4865
4866 // Otherwise, build for a generic macosx port.
4867 } else {
4868 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4869 }
4870
4871 // -fgnu-runtime
4872 } else {
4873 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004874 // Legacy behaviour is to target the gnustep runtime if we are i
4875 // non-fragile mode or the GCC runtime in fragile mode.
4876 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004877 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004878 else
4879 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004880 }
4881
4882 cmdArgs.push_back(args.MakeArgString(
4883 "-fobjc-runtime=" + runtime.getAsString()));
4884 return runtime;
4885}
4886
Reid Klecknerc542d372014-06-27 17:02:02 +00004887static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4888 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4889 I += HaveDash;
4890 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004891}
Reid Klecknerc542d372014-06-27 17:02:02 +00004892
4893struct EHFlags {
4894 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4895 bool Synch;
4896 bool Asynch;
4897 bool NoExceptC;
4898};
4899
4900/// /EH controls whether to run destructor cleanups when exceptions are
4901/// thrown. There are three modifiers:
4902/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4903/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4904/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4905/// - c: Assume that extern "C" functions are implicitly noexcept. This
4906/// modifier is an optimization, so we ignore it for now.
4907/// The default is /EHs-c-, meaning cleanups are disabled.
4908static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4909 EHFlags EH;
4910 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4911 for (auto EHVal : EHArgs) {
4912 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4913 switch (EHVal[I]) {
4914 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4915 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4916 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4917 default: break;
4918 }
4919 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4920 break;
4921 }
4922 }
4923 return EH;
4924}
4925
Hans Wennborg75958c42013-08-08 00:17:41 +00004926void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4927 unsigned RTOptionID = options::OPT__SLASH_MT;
4928
Hans Wennborgf1a74252013-09-10 20:18:04 +00004929 if (Args.hasArg(options::OPT__SLASH_LDd))
4930 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4931 // but defining _DEBUG is sticky.
4932 RTOptionID = options::OPT__SLASH_MTd;
4933
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004934 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004935 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004936
Hans Wennborg75958c42013-08-08 00:17:41 +00004937 switch(RTOptionID) {
4938 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004939 if (Args.hasArg(options::OPT__SLASH_LDd))
4940 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004941 CmdArgs.push_back("-D_MT");
4942 CmdArgs.push_back("-D_DLL");
4943 CmdArgs.push_back("--dependent-lib=msvcrt");
4944 break;
4945 case options::OPT__SLASH_MDd:
4946 CmdArgs.push_back("-D_DEBUG");
4947 CmdArgs.push_back("-D_MT");
4948 CmdArgs.push_back("-D_DLL");
4949 CmdArgs.push_back("--dependent-lib=msvcrtd");
4950 break;
4951 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004952 if (Args.hasArg(options::OPT__SLASH_LDd))
4953 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004954 CmdArgs.push_back("-D_MT");
4955 CmdArgs.push_back("--dependent-lib=libcmt");
4956 break;
4957 case options::OPT__SLASH_MTd:
4958 CmdArgs.push_back("-D_DEBUG");
4959 CmdArgs.push_back("-D_MT");
4960 CmdArgs.push_back("--dependent-lib=libcmtd");
4961 break;
4962 default:
4963 llvm_unreachable("Unexpected option ID.");
4964 }
4965
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004966 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4967 // users want. The /Za flag to cl.exe turns this off, but it's not
4968 // implemented in clang.
4969 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004970
Hans Wennborg8858a032014-07-21 23:42:07 +00004971 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4972 // would produce interleaved output, so ignore /showIncludes in such cases.
4973 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4974 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4975 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004976
David Majnemerf6072342014-07-01 22:24:56 +00004977 // This controls whether or not we emit RTTI data for polymorphic types.
4978 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4979 /*default=*/false))
4980 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004981
Reid Klecknerc542d372014-06-27 17:02:02 +00004982 const Driver &D = getToolChain().getDriver();
4983 EHFlags EH = parseClangCLEHFlags(D, Args);
4984 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004985 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004986 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004987 CmdArgs.push_back("-fexceptions");
4988 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004989
Hans Wennborge50cec32014-06-13 20:59:54 +00004990 // /EP should expand to -E -P.
4991 if (Args.hasArg(options::OPT__SLASH_EP)) {
4992 CmdArgs.push_back("-E");
4993 CmdArgs.push_back("-P");
4994 }
4995
David Majnemera5b195a2015-02-14 01:35:12 +00004996 unsigned VolatileOptionID;
4997 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4998 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4999 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5000 else
5001 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5002
5003 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5004 VolatileOptionID = A->getOption().getID();
5005
5006 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5007 CmdArgs.push_back("-fms-volatile");
5008
David Majnemer86c318f2014-02-11 21:05:00 +00005009 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5010 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5011 if (MostGeneralArg && BestCaseArg)
5012 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5013 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5014
5015 if (MostGeneralArg) {
5016 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5017 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5018 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5019
5020 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5021 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5022 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5023 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5024 << FirstConflict->getAsString(Args)
5025 << SecondConflict->getAsString(Args);
5026
5027 if (SingleArg)
5028 CmdArgs.push_back("-fms-memptr-rep=single");
5029 else if (MultipleArg)
5030 CmdArgs.push_back("-fms-memptr-rep=multiple");
5031 else
5032 CmdArgs.push_back("-fms-memptr-rep=virtual");
5033 }
5034
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005035 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5036 A->render(Args, CmdArgs);
5037
Hans Wennborg81f74482013-09-10 01:07:07 +00005038 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5039 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005040 if (Args.hasArg(options::OPT__SLASH_fallback))
5041 CmdArgs.push_back("msvc-fallback");
5042 else
5043 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005044 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005045}
5046
Hans Wennborg1da044a2014-06-26 19:59:02 +00005047visualstudio::Compile *Clang::getCLFallback() const {
5048 if (!CLFallback)
5049 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5050 return CLFallback.get();
5051}
5052
Daniel Sanders7f933f42015-01-30 17:35:23 +00005053void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5054 ArgStringList &CmdArgs) const {
5055 StringRef CPUName;
5056 StringRef ABIName;
5057 const llvm::Triple &Triple = getToolChain().getTriple();
5058 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5059
5060 CmdArgs.push_back("-target-abi");
5061 CmdArgs.push_back(ABIName.data());
5062}
5063
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005064void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005065 const InputInfo &Output,
5066 const InputInfoList &Inputs,
5067 const ArgList &Args,
5068 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005069 ArgStringList CmdArgs;
5070
5071 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5072 const InputInfo &Input = Inputs[0];
5073
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005074 // Don't warn about "clang -w -c foo.s"
5075 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005076 // and "clang -emit-llvm -c foo.s"
5077 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005078
Rafael Espindola577637a2015-01-03 00:06:04 +00005079 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005080
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005081 // Invoke ourselves in -cc1as mode.
5082 //
5083 // FIXME: Implement custom jobs for internal actions.
5084 CmdArgs.push_back("-cc1as");
5085
5086 // Add the "effective" target triple.
5087 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005088 std::string TripleStr =
5089 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005090 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5091
5092 // Set the output mode, we currently only expect to be used as a real
5093 // assembler.
5094 CmdArgs.push_back("-filetype");
5095 CmdArgs.push_back("obj");
5096
Eric Christopher45f2e712012-12-18 00:31:10 +00005097 // Set the main file name, so that debug info works even with
5098 // -save-temps or preprocessed assembly.
5099 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005100 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005101
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005102 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005103 const llvm::Triple &Triple = getToolChain().getTriple();
5104 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005105 if (!CPU.empty()) {
5106 CmdArgs.push_back("-target-cpu");
5107 CmdArgs.push_back(Args.MakeArgString(CPU));
5108 }
5109
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005110 // Add the target features
5111 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005112 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005113
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005114 // Ignore explicit -force_cpusubtype_ALL option.
5115 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005116
Eric Christopherfc3ee562012-01-10 00:38:01 +00005117 // Determine the original source input.
5118 const Action *SourceAction = &JA;
5119 while (SourceAction->getKind() != Action::InputClass) {
5120 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5121 SourceAction = SourceAction->getInputs()[0];
5122 }
5123
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005124 // Forward -g and handle debug info related flags, assuming we are dealing
5125 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005126 if (SourceAction->getType() == types::TY_Asm ||
5127 SourceAction->getType() == types::TY_PP_Asm) {
5128 Args.ClaimAllArgs(options::OPT_g_Group);
5129 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5130 if (!A->getOption().matches(options::OPT_g0))
5131 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005132
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005133 if (Args.hasArg(options::OPT_gdwarf_2))
5134 CmdArgs.push_back("-gdwarf-2");
5135 if (Args.hasArg(options::OPT_gdwarf_3))
5136 CmdArgs.push_back("-gdwarf-3");
5137 if (Args.hasArg(options::OPT_gdwarf_4))
5138 CmdArgs.push_back("-gdwarf-4");
5139
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005140 // Add the -fdebug-compilation-dir flag if needed.
5141 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005142
5143 // Set the AT_producer to the clang version when using the integrated
5144 // assembler on assembly source files.
5145 CmdArgs.push_back("-dwarf-debug-producer");
5146 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005147 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005148
5149 // Optionally embed the -cc1as level arguments into the debug info, for build
5150 // analysis.
5151 if (getToolChain().UseDwarfDebugFlags()) {
5152 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005153 for (const auto &Arg : Args)
5154 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005155
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005156 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005157 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5158 Flags += Exec;
5159 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005160 SmallString<128> EscapedArg;
5161 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005162 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005163 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005164 }
5165 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005166 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005167 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005168
5169 // FIXME: Add -static support, once we have it.
5170
Daniel Sanders7f933f42015-01-30 17:35:23 +00005171 // Add target specific flags.
5172 switch(getToolChain().getArch()) {
5173 default:
5174 break;
5175
5176 case llvm::Triple::mips:
5177 case llvm::Triple::mipsel:
5178 case llvm::Triple::mips64:
5179 case llvm::Triple::mips64el:
5180 AddMIPSTargetArgs(Args, CmdArgs);
5181 break;
5182 }
5183
David Blaikie372d9502014-01-17 03:17:40 +00005184 // Consume all the warning flags. Usually this would be handled more
5185 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5186 // doesn't handle that so rather than warning about unused flags that are
5187 // actually used, we'll lie by omission instead.
5188 // FIXME: Stop lying and consume only the appropriate driver flags
5189 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5190 ie = Args.filtered_end();
5191 it != ie; ++it)
5192 (*it)->claim();
5193
David Blaikie9260ed62013-07-25 21:19:01 +00005194 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5195 getToolChain().getDriver());
5196
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005197 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005198
5199 assert(Output.isFilename() && "Unexpected lipo output.");
5200 CmdArgs.push_back("-o");
5201 CmdArgs.push_back(Output.getFilename());
5202
Daniel Dunbarb440f562010-08-02 02:38:21 +00005203 assert(Input.isFilename() && "Invalid input.");
5204 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005205
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005206 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005207 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005208
5209 // Handle the debug info splitting at object creation time if we're
5210 // creating an object.
5211 // TODO: Currently only works on linux with newer objcopy.
5212 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005213 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005214 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005215 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005216}
5217
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005218void GnuTool::anchor() {}
5219
Daniel Dunbara3246a02009-03-18 08:07:30 +00005220void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005221 const InputInfo &Output,
5222 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005223 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005224 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005225 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005226 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005227
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005228 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005229 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005230 // Don't forward any -g arguments to assembly steps.
5231 if (isa<AssembleJobAction>(JA) &&
5232 A->getOption().matches(options::OPT_g_Group))
5233 continue;
5234
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005235 // Don't forward any -W arguments to assembly and link steps.
5236 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5237 A->getOption().matches(options::OPT_W_Group))
5238 continue;
5239
Daniel Dunbar2da02722009-03-19 07:55:12 +00005240 // It is unfortunate that we have to claim here, as this means
5241 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005242 // platforms using a generic gcc, even if we are just using gcc
5243 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005244 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005245 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005246 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005247 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005248
Daniel Dunbar4e295052010-01-25 22:35:08 +00005249 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005250
5251 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005252 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005253 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005254 CmdArgs.push_back(
5255 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005256 }
5257
Daniel Dunbar5716d872009-05-02 21:41:52 +00005258 // Try to force gcc to match the tool chain we want, if we recognize
5259 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005260 //
5261 // FIXME: The triple class should directly provide the information we want
5262 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005263 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005264 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005265 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005266 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5267 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005268 CmdArgs.push_back("-m64");
5269
Daniel Dunbarb440f562010-08-02 02:38:21 +00005270 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005271 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005272 CmdArgs.push_back(Output.getFilename());
5273 } else {
5274 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005275 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005276 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005277
Tony Linthicum76329bf2011-12-12 21:14:55 +00005278 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5279 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005280
5281 // Only pass -x if gcc will understand it; otherwise hope gcc
5282 // understands the suffix correctly. The main use case this would go
5283 // wrong in is for linker inputs if they happened to have an odd
5284 // suffix; really the only way to get this to happen is a command
5285 // like '-x foobar a.c' which will treat a.c like a linker input.
5286 //
5287 // FIXME: For the linker case specifically, can we safely convert
5288 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005289 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005290 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005291 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5292 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005293 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005294 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005295 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005296 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005297 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005298 else if (II.getType() == types::TY_ModuleFile)
5299 D.Diag(diag::err_drv_no_module_support)
5300 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005301
Daniel Dunbara3246a02009-03-18 08:07:30 +00005302 if (types::canTypeBeUserSpecified(II.getType())) {
5303 CmdArgs.push_back("-x");
5304 CmdArgs.push_back(types::getTypeName(II.getType()));
5305 }
5306
Daniel Dunbarb440f562010-08-02 02:38:21 +00005307 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005308 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005309 else {
5310 const Arg &A = II.getInputArg();
5311
5312 // Reverse translate some rewritten options.
5313 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5314 CmdArgs.push_back("-lstdc++");
5315 continue;
5316 }
5317
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005318 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005319 A.render(Args, CmdArgs);
5320 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005321 }
5322
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005323 const std::string customGCCName = D.getCCCGenericGCCName();
5324 const char *GCCName;
5325 if (!customGCCName.empty())
5326 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005327 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005328 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005329 } else
5330 GCCName = "gcc";
5331
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005332 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005333 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005334 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005335}
5336
Daniel Dunbar4e295052010-01-25 22:35:08 +00005337void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5338 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005339 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005340}
5341
Daniel Dunbar4e295052010-01-25 22:35:08 +00005342void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5343 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005344 const Driver &D = getToolChain().getDriver();
5345
Eric Christophercc7ff502015-01-29 00:56:17 +00005346 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005347 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005348 case types::TY_LLVM_IR:
5349 case types::TY_LTO_IR:
5350 case types::TY_LLVM_BC:
5351 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005352 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005353 break;
5354 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005355 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005356 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005357 case types::TY_Nothing:
5358 CmdArgs.push_back("-fsyntax-only");
5359 break;
5360 default:
5361 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005362 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005363}
5364
Daniel Dunbar4e295052010-01-25 22:35:08 +00005365void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5366 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005367 // The types are (hopefully) good enough.
5368}
5369
Tony Linthicum76329bf2011-12-12 21:14:55 +00005370// Hexagon tools start.
5371void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5372 ArgStringList &CmdArgs) const {
5373
5374}
5375void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5376 const InputInfo &Output,
5377 const InputInfoList &Inputs,
5378 const ArgList &Args,
5379 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005380 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005381
5382 const Driver &D = getToolChain().getDriver();
5383 ArgStringList CmdArgs;
5384
5385 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005386 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005387 CmdArgs.push_back(Args.MakeArgString(MarchString));
5388
5389 RenderExtraToolArgs(JA, CmdArgs);
5390
5391 if (Output.isFilename()) {
5392 CmdArgs.push_back("-o");
5393 CmdArgs.push_back(Output.getFilename());
5394 } else {
5395 assert(Output.isNothing() && "Unexpected output");
5396 CmdArgs.push_back("-fsyntax-only");
5397 }
5398
Matthew Curtise8f80a12012-12-06 17:49:03 +00005399 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5400 if (!SmallDataThreshold.empty())
5401 CmdArgs.push_back(
5402 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005403
Matthew Curtise5df3812012-12-07 17:23:04 +00005404 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5405 options::OPT_Xassembler);
5406
Tony Linthicum76329bf2011-12-12 21:14:55 +00005407 // Only pass -x if gcc will understand it; otherwise hope gcc
5408 // understands the suffix correctly. The main use case this would go
5409 // wrong in is for linker inputs if they happened to have an odd
5410 // suffix; really the only way to get this to happen is a command
5411 // like '-x foobar a.c' which will treat a.c like a linker input.
5412 //
5413 // FIXME: For the linker case specifically, can we safely convert
5414 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005415 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005416 // Don't try to pass LLVM or AST inputs to a generic gcc.
5417 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5418 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5419 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5420 << getToolChain().getTripleString();
5421 else if (II.getType() == types::TY_AST)
5422 D.Diag(clang::diag::err_drv_no_ast_support)
5423 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005424 else if (II.getType() == types::TY_ModuleFile)
5425 D.Diag(diag::err_drv_no_module_support)
5426 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005427
5428 if (II.isFilename())
5429 CmdArgs.push_back(II.getFilename());
5430 else
5431 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5432 II.getInputArg().render(Args, CmdArgs);
5433 }
5434
5435 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005436 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005438}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005439
Tony Linthicum76329bf2011-12-12 21:14:55 +00005440void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5441 ArgStringList &CmdArgs) const {
5442 // The types are (hopefully) good enough.
5443}
5444
5445void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5446 const InputInfo &Output,
5447 const InputInfoList &Inputs,
5448 const ArgList &Args,
5449 const char *LinkingOutput) const {
5450
Matthew Curtise689b052012-12-06 15:46:07 +00005451 const toolchains::Hexagon_TC& ToolChain =
5452 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5453 const Driver &D = ToolChain.getDriver();
5454
Tony Linthicum76329bf2011-12-12 21:14:55 +00005455 ArgStringList CmdArgs;
5456
Matthew Curtise689b052012-12-06 15:46:07 +00005457 //----------------------------------------------------------------------------
5458 //
5459 //----------------------------------------------------------------------------
5460 bool hasStaticArg = Args.hasArg(options::OPT_static);
5461 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005462 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005463 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5464 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5465 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5466 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005467
Matthew Curtise689b052012-12-06 15:46:07 +00005468 //----------------------------------------------------------------------------
5469 // Silence warnings for various options
5470 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005471
Matthew Curtise689b052012-12-06 15:46:07 +00005472 Args.ClaimAllArgs(options::OPT_g_Group);
5473 Args.ClaimAllArgs(options::OPT_emit_llvm);
5474 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5475 // handled somewhere else.
5476 Args.ClaimAllArgs(options::OPT_static_libgcc);
5477
5478 //----------------------------------------------------------------------------
5479 //
5480 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005481 for (const auto &Opt : ToolChain.ExtraOpts)
5482 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005483
Matthew Curtisf10a5952012-12-06 14:16:43 +00005484 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5485 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005486
Matthew Curtise689b052012-12-06 15:46:07 +00005487 if (buildingLib) {
5488 CmdArgs.push_back("-shared");
5489 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5490 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005491 }
5492
Matthew Curtise689b052012-12-06 15:46:07 +00005493 if (hasStaticArg)
5494 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005495
Matthew Curtise8f80a12012-12-06 17:49:03 +00005496 if (buildPIE && !buildingLib)
5497 CmdArgs.push_back("-pie");
5498
5499 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5500 if (!SmallDataThreshold.empty()) {
5501 CmdArgs.push_back(
5502 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5503 }
5504
Matthew Curtise689b052012-12-06 15:46:07 +00005505 //----------------------------------------------------------------------------
5506 //
5507 //----------------------------------------------------------------------------
5508 CmdArgs.push_back("-o");
5509 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005510
Matthew Curtise689b052012-12-06 15:46:07 +00005511 const std::string MarchSuffix = "/" + MarchString;
5512 const std::string G0Suffix = "/G0";
5513 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005514 const std::string RootDir =
5515 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005516 const std::string StartFilesDir = RootDir
5517 + "hexagon/lib"
5518 + (buildingLib
5519 ? MarchG0Suffix : MarchSuffix);
5520
5521 //----------------------------------------------------------------------------
5522 // moslib
5523 //----------------------------------------------------------------------------
5524 std::vector<std::string> oslibs;
5525 bool hasStandalone= false;
5526
5527 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5528 ie = Args.filtered_end(); it != ie; ++it) {
5529 (*it)->claim();
5530 oslibs.push_back((*it)->getValue());
5531 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005532 }
Matthew Curtise689b052012-12-06 15:46:07 +00005533 if (oslibs.empty()) {
5534 oslibs.push_back("standalone");
5535 hasStandalone = true;
5536 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005537
Matthew Curtise689b052012-12-06 15:46:07 +00005538 //----------------------------------------------------------------------------
5539 // Start Files
5540 //----------------------------------------------------------------------------
5541 if (incStdLib && incStartFiles) {
5542
5543 if (!buildingLib) {
5544 if (hasStandalone) {
5545 CmdArgs.push_back(
5546 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5547 }
5548 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5549 }
5550 std::string initObj = useShared ? "/initS.o" : "/init.o";
5551 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5552 }
5553
5554 //----------------------------------------------------------------------------
5555 // Library Search Paths
5556 //----------------------------------------------------------------------------
5557 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005558 for (const auto &LibPath : LibPaths)
5559 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005560
5561 //----------------------------------------------------------------------------
5562 //
5563 //----------------------------------------------------------------------------
5564 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5565 Args.AddAllArgs(CmdArgs, options::OPT_e);
5566 Args.AddAllArgs(CmdArgs, options::OPT_s);
5567 Args.AddAllArgs(CmdArgs, options::OPT_t);
5568 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5569
5570 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5571
5572 //----------------------------------------------------------------------------
5573 // Libraries
5574 //----------------------------------------------------------------------------
5575 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005576 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005577 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5578 CmdArgs.push_back("-lm");
5579 }
5580
5581 CmdArgs.push_back("--start-group");
5582
5583 if (!buildingLib) {
5584 for(std::vector<std::string>::iterator i = oslibs.begin(),
5585 e = oslibs.end(); i != e; ++i)
5586 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5587 CmdArgs.push_back("-lc");
5588 }
5589 CmdArgs.push_back("-lgcc");
5590
5591 CmdArgs.push_back("--end-group");
5592 }
5593
5594 //----------------------------------------------------------------------------
5595 // End files
5596 //----------------------------------------------------------------------------
5597 if (incStdLib && incStartFiles) {
5598 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5599 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5600 }
5601
5602 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005603 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5604 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005605}
5606// Hexagon tools end.
5607
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005608/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005609const char *arm::getARMCPUForMArch(const ArgList &Args,
5610 const llvm::Triple &Triple) {
5611 StringRef MArch;
5612 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5613 // Otherwise, if we have -march= choose the base CPU for that arch.
5614 MArch = A->getValue();
5615 } else {
5616 // Otherwise, use the Arch from the triple.
5617 MArch = Triple.getArchName();
5618 }
5619
5620 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005621 if (MArch == "native") {
5622 std::string CPU = llvm::sys::getHostCPUName();
5623 if (CPU != "generic") {
5624 // Translate the native cpu into the architecture. The switch below will
5625 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005626 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005627 }
5628 }
5629
John Brawna95c1a82015-05-08 12:52:18 +00005630 // We need to return an empty string here on invalid MArch values as the
5631 // various places that call this function can't cope with a null result.
5632 const char *result = Triple.getARMCPUForArch(MArch);
5633 if (result)
5634 return result;
5635 else
5636 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005637}
5638
5639/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005640StringRef arm::getARMTargetCPU(const ArgList &Args,
5641 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005642 // FIXME: Warn on inconsistent use of -mcpu and -march.
5643 // If we have -mcpu=, use that.
5644 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin9e36fb42015-05-08 14:50:32 +00005645 StringRef MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005646 // Handle -mcpu=native.
5647 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005648 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005649 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005650 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005651 }
5652
5653 return getARMCPUForMArch(Args, Triple);
5654}
5655
5656/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5657/// CPU.
5658//
5659// FIXME: This is redundant with -mcpu, why does LLVM use this.
5660// FIXME: tblgen this, or kill it!
5661const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5662 return llvm::StringSwitch<const char *>(CPU)
5663 .Case("strongarm", "v4")
5664 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5665 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5666 .Cases("arm920", "arm920t", "arm922t", "v4t")
5667 .Cases("arm940t", "ep9312","v4t")
5668 .Cases("arm10tdmi", "arm1020t", "v5")
5669 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5670 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5671 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005672 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5673 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5674 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005675 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005676 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005677 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005678 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005679 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5680 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005681 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005682 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005683 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005684 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005685 .Default("");
5686}
5687
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005688void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5689 if (Args.hasArg(options::OPT_r))
5690 return;
5691
5692 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5693 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5694 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005695 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005696 .Default("--be8");
5697
5698 if (LinkFlag)
5699 CmdArgs.push_back(LinkFlag);
5700}
5701
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005702mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5703 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5704 .Case("mips1", NanLegacy)
5705 .Case("mips2", NanLegacy)
5706 .Case("mips3", NanLegacy)
5707 .Case("mips4", NanLegacy)
5708 .Case("mips5", NanLegacy)
5709 .Case("mips32", NanLegacy)
5710 .Case("mips32r2", NanLegacy)
5711 .Case("mips32r3", NanLegacy | Nan2008)
5712 .Case("mips32r5", NanLegacy | Nan2008)
5713 .Case("mips32r6", Nan2008)
5714 .Case("mips64", NanLegacy)
5715 .Case("mips64r2", NanLegacy)
5716 .Case("mips64r3", NanLegacy | Nan2008)
5717 .Case("mips64r5", NanLegacy | Nan2008)
5718 .Case("mips64r6", Nan2008)
5719 .Default(NanLegacy);
5720}
5721
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005722bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5723 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5724 return A && (A->getValue() == StringRef(Value));
5725}
5726
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005727bool mips::isUCLibc(const ArgList &Args) {
5728 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005729 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005730}
5731
Daniel Sanders2bf13662014-07-10 14:40:57 +00005732bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005733 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5734 return llvm::StringSwitch<bool>(NaNArg->getValue())
5735 .Case("2008", true)
5736 .Case("legacy", false)
5737 .Default(false);
5738
5739 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005740 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5741 .Cases("mips32r6", "mips64r6", true)
5742 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005743
5744 return false;
5745}
5746
Daniel Sanders379d44b2014-07-16 11:52:23 +00005747bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5748 StringRef ABIName) {
5749 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005750 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005751 return false;
5752
5753 if (ABIName != "32")
5754 return false;
5755
5756 return llvm::StringSwitch<bool>(CPUName)
5757 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005758 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5759 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005760 .Default(false);
5761}
5762
Tim Northover157d9112014-01-16 08:48:16 +00005763llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005764 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5765 // archs which Darwin doesn't use.
5766
5767 // The matching this routine does is fairly pointless, since it is neither the
5768 // complete architecture list, nor a reasonable subset. The problem is that
5769 // historically the driver driver accepts this and also ties its -march=
5770 // handling to the architecture name, so we need to be careful before removing
5771 // support for it.
5772
5773 // This code must be kept in sync with Clang's Darwin specific argument
5774 // translation.
5775
5776 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5777 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5778 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5779 .Case("ppc64", llvm::Triple::ppc64)
5780 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5781 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5782 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005783 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005784 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005785 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005786 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005787 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005788 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005789 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005790 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005791 .Case("nvptx", llvm::Triple::nvptx)
5792 .Case("nvptx64", llvm::Triple::nvptx64)
5793 .Case("amdil", llvm::Triple::amdil)
5794 .Case("spir", llvm::Triple::spir)
5795 .Default(llvm::Triple::UnknownArch);
5796}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005797
Tim Northover157d9112014-01-16 08:48:16 +00005798void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5799 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5800 T.setArch(Arch);
5801
5802 if (Str == "x86_64h")
5803 T.setArchName(Str);
5804 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5805 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005806 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005807 }
5808}
5809
Bob Wilsondecc03e2012-11-23 06:14:39 +00005810const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005811 const InputInfo &Input) {
5812 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005813}
5814
Bob Wilsondecc03e2012-11-23 06:14:39 +00005815const char *Clang::getBaseInputStem(const ArgList &Args,
5816 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005817 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005818
Chris Lattner906bb902011-01-16 08:14:11 +00005819 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005820 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005821
5822 return Str;
5823}
5824
Bob Wilsondecc03e2012-11-23 06:14:39 +00005825const char *Clang::getDependencyFileName(const ArgList &Args,
5826 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005827 // FIXME: Think about this more.
5828 std::string Res;
5829
5830 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005831 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005832 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005833 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005834 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005835 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005836 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005837}
5838
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005839void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5840 const InputInfo &Output,
5841 const InputInfoList &Inputs,
5842 const ArgList &Args,
5843 const char *LinkingOutput) const {
5844 const ToolChain &ToolChain = getToolChain();
5845 const Driver &D = ToolChain.getDriver();
5846 ArgStringList CmdArgs;
5847
5848 // Silence warning for "clang -g foo.o -o foo"
5849 Args.ClaimAllArgs(options::OPT_g_Group);
5850 // and "clang -emit-llvm foo.o -o foo"
5851 Args.ClaimAllArgs(options::OPT_emit_llvm);
5852 // and for "clang -w foo.o -o foo". Other warning options are already
5853 // handled somewhere else.
5854 Args.ClaimAllArgs(options::OPT_w);
5855
5856 if (!D.SysRoot.empty())
5857 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5858
5859 // CloudABI only supports static linkage.
5860 CmdArgs.push_back("-Bstatic");
5861 CmdArgs.push_back("--eh-frame-hdr");
5862 CmdArgs.push_back("--gc-sections");
5863
5864 if (Output.isFilename()) {
5865 CmdArgs.push_back("-o");
5866 CmdArgs.push_back(Output.getFilename());
5867 } else {
5868 assert(Output.isNothing() && "Invalid output.");
5869 }
5870
5871 if (!Args.hasArg(options::OPT_nostdlib) &&
5872 !Args.hasArg(options::OPT_nostartfiles)) {
5873 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5874 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5875 }
5876
5877 Args.AddAllArgs(CmdArgs, options::OPT_L);
5878 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5879 for (const auto &Path : Paths)
5880 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5881 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5882 Args.AddAllArgs(CmdArgs, options::OPT_e);
5883 Args.AddAllArgs(CmdArgs, options::OPT_s);
5884 Args.AddAllArgs(CmdArgs, options::OPT_t);
5885 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5886 Args.AddAllArgs(CmdArgs, options::OPT_r);
5887
5888 if (D.IsUsingLTO(ToolChain, Args))
5889 AddGoldPlugin(ToolChain, Args, CmdArgs);
5890
5891 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5892
5893 if (!Args.hasArg(options::OPT_nostdlib) &&
5894 !Args.hasArg(options::OPT_nodefaultlibs)) {
5895 if (D.CCCIsCXX())
5896 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5897 CmdArgs.push_back("-lc");
5898 CmdArgs.push_back("-lcompiler_rt");
5899 }
5900
5901 if (!Args.hasArg(options::OPT_nostdlib) &&
5902 !Args.hasArg(options::OPT_nostartfiles))
5903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5904
5905 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5906 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5907}
5908
Daniel Dunbarbe220842009-03-20 16:06:39 +00005909void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005910 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005911 const InputInfoList &Inputs,
5912 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005913 const char *LinkingOutput) const {
5914 ArgStringList CmdArgs;
5915
5916 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5917 const InputInfo &Input = Inputs[0];
5918
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005919 // Determine the original source input.
5920 const Action *SourceAction = &JA;
5921 while (SourceAction->getKind() != Action::InputClass) {
5922 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5923 SourceAction = SourceAction->getInputs()[0];
5924 }
5925
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005926 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005927 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005928 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5929 // FIXME: at run-time detect assembler capabilities or rely on version
5930 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005931 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005932 const llvm::Triple &T(getToolChain().getTriple());
5933 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005934 CmdArgs.push_back("-Q");
5935 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005936
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005937 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005938 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005939 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005940 if (Args.hasArg(options::OPT_gstabs))
5941 CmdArgs.push_back("--gstabs");
5942 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005943 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005944 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005945
Daniel Dunbarbe220842009-03-20 16:06:39 +00005946 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005947 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005948
Daniel Dunbar6d484762010-07-22 01:47:22 +00005949 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005950 if (getToolChain().getArch() == llvm::Triple::x86 ||
5951 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005952 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5953 CmdArgs.push_back("-force_cpusubtype_ALL");
5954
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005955 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005956 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005957 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005958 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005959 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005960 CmdArgs.push_back("-static");
5961
Daniel Dunbarbe220842009-03-20 16:06:39 +00005962 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5963 options::OPT_Xassembler);
5964
5965 assert(Output.isFilename() && "Unexpected lipo output.");
5966 CmdArgs.push_back("-o");
5967 CmdArgs.push_back(Output.getFilename());
5968
Daniel Dunbarb440f562010-08-02 02:38:21 +00005969 assert(Input.isFilename() && "Invalid input.");
5970 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005971
5972 // asm_final spec is empty.
5973
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005974 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005975 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005976 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005977}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005978
Tim Northover157d9112014-01-16 08:48:16 +00005979void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005980
Tim Northover157d9112014-01-16 08:48:16 +00005981void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5982 ArgStringList &CmdArgs) const {
5983 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005984
Daniel Dunbarc1964212009-03-26 16:23:12 +00005985 // Derived from darwin_arch spec.
5986 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005987 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005988
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005989 // FIXME: Is this needed anymore?
5990 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005991 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005992}
5993
Bill Wendling3b2000f2012-10-02 18:02:50 +00005994bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5995 // We only need to generate a temp path for LTO if we aren't compiling object
5996 // files. When compiling source files, we run 'dsymutil' after linking. We
5997 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005998 for (const auto &Input : Inputs)
5999 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006000 return true;
6001
6002 return false;
6003}
6004
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006005void darwin::Link::AddLinkArgs(Compilation &C,
6006 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006007 ArgStringList &CmdArgs,
6008 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006009 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006010 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006011
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006012 unsigned Version[3] = { 0, 0, 0 };
6013 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6014 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006015 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006016 Version[1], Version[2], HadExtra) ||
6017 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006018 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006019 << A->getAsString(Args);
6020 }
6021
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006022 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006023 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006024 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6025 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006026
Bob Wilson3d27dad2013-08-02 22:25:34 +00006027 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6028 CmdArgs.push_back("-export_dynamic");
6029
Bob Wilsonb111ec92015-03-02 19:01:14 +00006030 // If we are using App Extension restrictions, pass a flag to the linker
6031 // telling it that the compiled code has been audited.
6032 if (Args.hasFlag(options::OPT_fapplication_extension,
6033 options::OPT_fno_application_extension, false))
6034 CmdArgs.push_back("-application_extension");
6035
Bill Wendling313b6bf2012-11-16 23:03:00 +00006036 // If we are using LTO, then automatically create a temporary file path for
6037 // the linker to use, so that it's lifetime will extend past a possible
6038 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006039 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6040 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006041 const char *TmpPath = C.getArgs().MakeArgString(
6042 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6043 C.addTempFile(TmpPath);
6044 CmdArgs.push_back("-object_path_lto");
6045 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006046 }
6047
Daniel Dunbarc1964212009-03-26 16:23:12 +00006048 // Derived from the "link" spec.
6049 Args.AddAllArgs(CmdArgs, options::OPT_static);
6050 if (!Args.hasArg(options::OPT_static))
6051 CmdArgs.push_back("-dynamic");
6052 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6053 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6054 // here. How do we wish to handle such things?
6055 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006056
Daniel Dunbarc1964212009-03-26 16:23:12 +00006057 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006058 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006059 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006060 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006061
6062 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6063 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6064 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6065
6066 Arg *A;
6067 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6068 (A = Args.getLastArg(options::OPT_current__version)) ||
6069 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006070 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006071 << A->getAsString(Args) << "-dynamiclib";
6072
6073 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6074 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6075 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6076 } else {
6077 CmdArgs.push_back("-dylib");
6078
6079 Arg *A;
6080 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6081 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6082 (A = Args.getLastArg(options::OPT_client__name)) ||
6083 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6084 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6085 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006086 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006087 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006088
Daniel Dunbarc1964212009-03-26 16:23:12 +00006089 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6090 "-dylib_compatibility_version");
6091 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6092 "-dylib_current_version");
6093
Tim Northover157d9112014-01-16 08:48:16 +00006094 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006095
6096 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6097 "-dylib_install_name");
6098 }
6099
6100 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6101 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6102 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006103 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006104 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006105 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6106 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6107 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6108 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6109 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6110 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006111 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006112 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6113 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6114 Args.AddAllArgs(CmdArgs, options::OPT_init);
6115
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006116 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006117 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006118
Daniel Dunbarc1964212009-03-26 16:23:12 +00006119 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6120 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6121 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6122 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6123 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006124
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006125 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6126 options::OPT_fno_pie,
6127 options::OPT_fno_PIE)) {
6128 if (A->getOption().matches(options::OPT_fpie) ||
6129 A->getOption().matches(options::OPT_fPIE))
6130 CmdArgs.push_back("-pie");
6131 else
6132 CmdArgs.push_back("-no_pie");
6133 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006134
6135 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6136 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6137 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6138 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6139 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6140 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6141 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6142 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6143 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6144 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6145 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6146 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6147 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6148 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6149 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6150 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006151
Daniel Dunbar84384642011-05-02 21:03:47 +00006152 // Give --sysroot= preference, over the Apple specific behavior to also use
6153 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006154 StringRef sysroot = C.getSysRoot();
6155 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006156 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006157 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006158 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6159 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006160 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006161 }
6162
Daniel Dunbarc1964212009-03-26 16:23:12 +00006163 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6164 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6165 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6166 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6167 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006168 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006169 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6170 Args.AddAllArgs(CmdArgs, options::OPT_y);
6171 Args.AddLastArg(CmdArgs, options::OPT_w);
6172 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6173 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6174 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6175 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6176 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6177 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6178 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6179 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6180 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6181 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6182 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6183 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6184}
6185
Alexey Bataev186b28a2014-03-06 05:43:53 +00006186enum LibOpenMP {
6187 LibUnknown,
6188 LibGOMP,
6189 LibIOMP5
6190};
6191
Daniel Dunbarc1964212009-03-26 16:23:12 +00006192void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006193 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006194 const InputInfoList &Inputs,
6195 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006196 const char *LinkingOutput) const {
6197 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006198
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006199 // If the number of arguments surpasses the system limits, we will encode the
6200 // input files in a separate file, shortening the command line. To this end,
6201 // build a list of input file names that can be passed via a file with the
6202 // -filelist linker option.
6203 llvm::opt::ArgStringList InputFileList;
6204
Daniel Dunbarc1964212009-03-26 16:23:12 +00006205 // The logic here is derived from gcc's behavior; most of which
6206 // comes from specs (starting with link_command). Consult gcc for
6207 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006208 ArgStringList CmdArgs;
6209
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006210 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6211 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6212 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006213 for (const auto &Arg : Args)
6214 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006215 const char *Exec =
6216 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6217 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006218 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006219 return;
6220 }
6221
Daniel Dunbarc1964212009-03-26 16:23:12 +00006222 // I'm not sure why this particular decomposition exists in gcc, but
6223 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006224 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006225
Daniel Dunbarc1964212009-03-26 16:23:12 +00006226 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6227 Args.AddAllArgs(CmdArgs, options::OPT_s);
6228 Args.AddAllArgs(CmdArgs, options::OPT_t);
6229 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6230 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006231 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006232 Args.AddAllArgs(CmdArgs, options::OPT_r);
6233
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006234 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6235 // members of static archive libraries which implement Objective-C classes or
6236 // categories.
6237 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6238 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006239
Daniel Dunbarc1964212009-03-26 16:23:12 +00006240 CmdArgs.push_back("-o");
6241 CmdArgs.push_back(Output.getFilename());
6242
Chad Rosier06fd3c62012-05-16 23:45:12 +00006243 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006244 !Args.hasArg(options::OPT_nostartfiles))
6245 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006246
6247 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006248
Alexey Bataev186b28a2014-03-06 05:43:53 +00006249 LibOpenMP UsedOpenMPLib = LibUnknown;
6250 if (Args.hasArg(options::OPT_fopenmp)) {
6251 UsedOpenMPLib = LibGOMP;
6252 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6253 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6254 .Case("libgomp", LibGOMP)
6255 .Case("libiomp5", LibIOMP5)
6256 .Default(LibUnknown);
6257 if (UsedOpenMPLib == LibUnknown)
6258 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6259 << A->getOption().getName() << A->getValue();
6260 }
6261 switch (UsedOpenMPLib) {
6262 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006263 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006264 break;
6265 case LibIOMP5:
6266 CmdArgs.push_back("-liomp5");
6267 break;
6268 case LibUnknown:
6269 break;
6270 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006271
Douglas Gregor9295df02012-05-15 21:00:27 +00006272 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006273 // Build the input file for -filelist (list of linker input files) in case we
6274 // need it later
6275 for (const auto &II : Inputs) {
6276 if (!II.isFilename()) {
6277 // This is a linker input argument.
6278 // We cannot mix input arguments and file names in a -filelist input, thus
6279 // we prematurely stop our list (remaining files shall be passed as
6280 // arguments).
6281 if (InputFileList.size() > 0)
6282 break;
6283
6284 continue;
6285 }
6286
6287 InputFileList.push_back(II.getFilename());
6288 }
6289
Bob Wilson16d93952012-05-15 18:57:39 +00006290 if (isObjCRuntimeLinked(Args) &&
6291 !Args.hasArg(options::OPT_nostdlib) &&
6292 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006293 // We use arclite library for both ARC and subscripting support.
6294 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6295
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006296 CmdArgs.push_back("-framework");
6297 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006298 // Link libobj.
6299 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006300 }
John McCall31168b02011-06-15 23:02:42 +00006301
Daniel Dunbarc1964212009-03-26 16:23:12 +00006302 if (LinkingOutput) {
6303 CmdArgs.push_back("-arch_multiple");
6304 CmdArgs.push_back("-final_output");
6305 CmdArgs.push_back(LinkingOutput);
6306 }
6307
Daniel Dunbarc1964212009-03-26 16:23:12 +00006308 if (Args.hasArg(options::OPT_fnested_functions))
6309 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006310
Daniel Dunbarc1964212009-03-26 16:23:12 +00006311 if (!Args.hasArg(options::OPT_nostdlib) &&
6312 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006313 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006314 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006315
Daniel Dunbarc1964212009-03-26 16:23:12 +00006316 // link_ssp spec is empty.
6317
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006318 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006319 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006320 }
6321
Chad Rosier06fd3c62012-05-16 23:45:12 +00006322 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006323 !Args.hasArg(options::OPT_nostartfiles)) {
6324 // endfile_spec is empty.
6325 }
6326
6327 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6328 Args.AddAllArgs(CmdArgs, options::OPT_F);
6329
Steven Wu3ffb61b2015-02-06 18:08:29 +00006330 // -iframework should be forwarded as -F.
6331 for (auto it = Args.filtered_begin(options::OPT_iframework),
6332 ie = Args.filtered_end(); it != ie; ++it)
6333 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6334 (*it)->getValue()));
6335
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006336 if (!Args.hasArg(options::OPT_nostdlib) &&
6337 !Args.hasArg(options::OPT_nodefaultlibs)) {
6338 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6339 if (A->getValue() == StringRef("Accelerate")) {
6340 CmdArgs.push_back("-framework");
6341 CmdArgs.push_back("Accelerate");
6342 }
6343 }
6344 }
6345
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006346 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006347 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006348 std::unique_ptr<Command> Cmd =
6349 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6350 Cmd->setInputFileList(std::move(InputFileList));
6351 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006352}
6353
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006354void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006355 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006356 const InputInfoList &Inputs,
6357 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006358 const char *LinkingOutput) const {
6359 ArgStringList CmdArgs;
6360
6361 CmdArgs.push_back("-create");
6362 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006363
6364 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006365 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006366
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006367 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006368 assert(II.isFilename() && "Unexpected lipo input.");
6369 CmdArgs.push_back(II.getFilename());
6370 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006371
6372 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006373 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006374}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006375
Daniel Dunbar88299622010-06-04 18:28:36 +00006376void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006377 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006378 const InputInfoList &Inputs,
6379 const ArgList &Args,
6380 const char *LinkingOutput) const {
6381 ArgStringList CmdArgs;
6382
Daniel Dunbareb86b042011-05-09 17:23:16 +00006383 CmdArgs.push_back("-o");
6384 CmdArgs.push_back(Output.getFilename());
6385
Daniel Dunbar88299622010-06-04 18:28:36 +00006386 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6387 const InputInfo &Input = Inputs[0];
6388 assert(Input.isFilename() && "Unexpected dsymutil input.");
6389 CmdArgs.push_back(Input.getFilename());
6390
Daniel Dunbar88299622010-06-04 18:28:36 +00006391 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006392 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006393 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006394}
6395
Eric Christopher551ef452011-08-23 17:56:55 +00006396void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006397 const InputInfo &Output,
6398 const InputInfoList &Inputs,
6399 const ArgList &Args,
6400 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006401 ArgStringList CmdArgs;
6402 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006403 CmdArgs.push_back("--debug-info");
6404 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006405 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006406
6407 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6408 const InputInfo &Input = Inputs[0];
6409 assert(Input.isFilename() && "Unexpected verify input");
6410
6411 // Grabbing the output of the earlier dsymutil run.
6412 CmdArgs.push_back(Input.getFilename());
6413
6414 const char *Exec =
6415 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006416 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006417}
6418
David Chisnallf571cde2012-02-15 13:39:01 +00006419void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6420 const InputInfo &Output,
6421 const InputInfoList &Inputs,
6422 const ArgList &Args,
6423 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006424 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006425 ArgStringList CmdArgs;
6426
6427 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6428 options::OPT_Xassembler);
6429
6430 CmdArgs.push_back("-o");
6431 CmdArgs.push_back(Output.getFilename());
6432
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006433 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006434 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006435
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006436 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006438}
6439
David Chisnallf571cde2012-02-15 13:39:01 +00006440void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6441 const InputInfo &Output,
6442 const InputInfoList &Inputs,
6443 const ArgList &Args,
6444 const char *LinkingOutput) const {
6445 // FIXME: Find a real GCC, don't hard-code versions here
6446 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6447 const llvm::Triple &T = getToolChain().getTriple();
6448 std::string LibPath = "/usr/lib/";
6449 llvm::Triple::ArchType Arch = T.getArch();
6450 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006451 case llvm::Triple::x86:
6452 GCCLibPath +=
6453 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6454 break;
6455 case llvm::Triple::x86_64:
6456 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6457 GCCLibPath += "/4.5.2/amd64/";
6458 LibPath += "amd64/";
6459 break;
6460 default:
6461 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006462 }
6463
6464 ArgStringList CmdArgs;
6465
David Chisnall272a0712012-02-29 15:06:12 +00006466 // Demangle C++ names in errors
6467 CmdArgs.push_back("-C");
6468
David Chisnallf571cde2012-02-15 13:39:01 +00006469 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6470 (!Args.hasArg(options::OPT_shared))) {
6471 CmdArgs.push_back("-e");
6472 CmdArgs.push_back("_start");
6473 }
6474
6475 if (Args.hasArg(options::OPT_static)) {
6476 CmdArgs.push_back("-Bstatic");
6477 CmdArgs.push_back("-dn");
6478 } else {
6479 CmdArgs.push_back("-Bdynamic");
6480 if (Args.hasArg(options::OPT_shared)) {
6481 CmdArgs.push_back("-shared");
6482 } else {
6483 CmdArgs.push_back("--dynamic-linker");
6484 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6485 }
6486 }
6487
6488 if (Output.isFilename()) {
6489 CmdArgs.push_back("-o");
6490 CmdArgs.push_back(Output.getFilename());
6491 } else {
6492 assert(Output.isNothing() && "Invalid output.");
6493 }
6494
6495 if (!Args.hasArg(options::OPT_nostdlib) &&
6496 !Args.hasArg(options::OPT_nostartfiles)) {
6497 if (!Args.hasArg(options::OPT_shared)) {
6498 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6499 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006500 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006501 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6502 } else {
6503 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006504 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6505 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006506 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006507 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006508 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006509 }
6510
6511 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6512
6513 Args.AddAllArgs(CmdArgs, options::OPT_L);
6514 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6515 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006516 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006517
6518 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6519
6520 if (!Args.hasArg(options::OPT_nostdlib) &&
6521 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006522 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006523 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006524 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006525 if (!Args.hasArg(options::OPT_shared)) {
6526 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006527 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006528 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006529 }
David Chisnallf571cde2012-02-15 13:39:01 +00006530 }
6531
6532 if (!Args.hasArg(options::OPT_nostdlib) &&
6533 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006534 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006535 }
David Chisnall96de9932012-02-16 16:00:47 +00006536 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006537
Alexey Samsonov7811d192014-02-20 13:57:37 +00006538 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006539
6540 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006541 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006543}
6544
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006545void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006546 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006547 const InputInfoList &Inputs,
6548 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006549 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006550 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006551 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006552 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006553
Rafael Espindolacc126272014-02-28 01:55:21 +00006554 switch (getToolChain().getArch()) {
6555 case llvm::Triple::x86:
6556 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6557 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006558 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006559 break;
6560
6561 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006562 CmdArgs.push_back("-mppc");
6563 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006564 break;
6565
6566 case llvm::Triple::sparc:
6567 CmdArgs.push_back("-32");
6568 NeedsKPIC = true;
6569 break;
6570
6571 case llvm::Triple::sparcv9:
6572 CmdArgs.push_back("-64");
6573 CmdArgs.push_back("-Av9a");
6574 NeedsKPIC = true;
6575 break;
6576
6577 case llvm::Triple::mips64:
6578 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006579 StringRef CPUName;
6580 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006581 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006582
6583 CmdArgs.push_back("-mabi");
6584 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6585
6586 if (getToolChain().getArch() == llvm::Triple::mips64)
6587 CmdArgs.push_back("-EB");
6588 else
6589 CmdArgs.push_back("-EL");
6590
Rafael Espindolacc126272014-02-28 01:55:21 +00006591 NeedsKPIC = true;
6592 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006593 }
6594
Rafael Espindolacc126272014-02-28 01:55:21 +00006595 default:
6596 break;
6597 }
6598
6599 if (NeedsKPIC)
6600 addAssemblerKPIC(Args, CmdArgs);
6601
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006602 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6603 options::OPT_Xassembler);
6604
6605 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006606 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006607
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006608 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006609 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006610
6611 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006612 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006613 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006614}
6615
6616void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006617 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006618 const InputInfoList &Inputs,
6619 const ArgList &Args,
6620 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006621 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006622 ArgStringList CmdArgs;
6623
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006624 // Silence warning for "clang -g foo.o -o foo"
6625 Args.ClaimAllArgs(options::OPT_g_Group);
6626 // and "clang -emit-llvm foo.o -o foo"
6627 Args.ClaimAllArgs(options::OPT_emit_llvm);
6628 // and for "clang -w foo.o -o foo". Other warning options are already
6629 // handled somewhere else.
6630 Args.ClaimAllArgs(options::OPT_w);
6631
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006632 if (getToolChain().getArch() == llvm::Triple::mips64)
6633 CmdArgs.push_back("-EB");
6634 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6635 CmdArgs.push_back("-EL");
6636
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006637 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006638 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006639 CmdArgs.push_back("-e");
6640 CmdArgs.push_back("__start");
6641 }
6642
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006643 if (Args.hasArg(options::OPT_static)) {
6644 CmdArgs.push_back("-Bstatic");
6645 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006646 if (Args.hasArg(options::OPT_rdynamic))
6647 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006648 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006649 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006650 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006651 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006652 } else {
6653 CmdArgs.push_back("-dynamic-linker");
6654 CmdArgs.push_back("/usr/libexec/ld.so");
6655 }
6656 }
6657
Rafael Espindola044f7832013-06-05 04:28:55 +00006658 if (Args.hasArg(options::OPT_nopie))
6659 CmdArgs.push_back("-nopie");
6660
Daniel Dunbarb440f562010-08-02 02:38:21 +00006661 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006662 CmdArgs.push_back("-o");
6663 CmdArgs.push_back(Output.getFilename());
6664 } else {
6665 assert(Output.isNothing() && "Invalid output.");
6666 }
6667
6668 if (!Args.hasArg(options::OPT_nostdlib) &&
6669 !Args.hasArg(options::OPT_nostartfiles)) {
6670 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006671 if (Args.hasArg(options::OPT_pg))
6672 CmdArgs.push_back(Args.MakeArgString(
6673 getToolChain().GetFilePath("gcrt0.o")));
6674 else
6675 CmdArgs.push_back(Args.MakeArgString(
6676 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006677 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006678 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006679 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006680 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006681 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006682 }
6683 }
6684
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006685 std::string Triple = getToolChain().getTripleString();
6686 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006687 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006688 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006689 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006690
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006691 Args.AddAllArgs(CmdArgs, options::OPT_L);
6692 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6693 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006694 Args.AddAllArgs(CmdArgs, options::OPT_s);
6695 Args.AddAllArgs(CmdArgs, options::OPT_t);
6696 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6697 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006698
Daniel Dunbar54423b22010-09-17 00:24:54 +00006699 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006700
6701 if (!Args.hasArg(options::OPT_nostdlib) &&
6702 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006703 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006704 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006705 if (Args.hasArg(options::OPT_pg))
6706 CmdArgs.push_back("-lm_p");
6707 else
6708 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006709 }
6710
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006711 // FIXME: For some reason GCC passes -lgcc before adding
6712 // the default system libraries. Just mimic this for now.
6713 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006714
Eric Christopher17674ec2012-09-13 06:32:34 +00006715 if (Args.hasArg(options::OPT_pthread)) {
6716 if (!Args.hasArg(options::OPT_shared) &&
6717 Args.hasArg(options::OPT_pg))
6718 CmdArgs.push_back("-lpthread_p");
6719 else
6720 CmdArgs.push_back("-lpthread");
6721 }
6722
Chandler Carruth45661652011-12-17 22:32:42 +00006723 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006724 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006725 CmdArgs.push_back("-lc_p");
6726 else
6727 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006728 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006729
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006730 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006731 }
6732
6733 if (!Args.hasArg(options::OPT_nostdlib) &&
6734 !Args.hasArg(options::OPT_nostartfiles)) {
6735 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006736 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006737 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006738 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006739 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006740 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006741 }
6742
6743 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006744 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006745 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006746}
Ed Schoutene33194b2009-04-02 19:13:12 +00006747
Eli Friedman9fa28852012-08-08 23:57:20 +00006748void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6749 const InputInfo &Output,
6750 const InputInfoList &Inputs,
6751 const ArgList &Args,
6752 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006753 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006754 ArgStringList CmdArgs;
6755
6756 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6757 options::OPT_Xassembler);
6758
6759 CmdArgs.push_back("-o");
6760 CmdArgs.push_back(Output.getFilename());
6761
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006762 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006763 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006764
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006765 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006766 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006767}
6768
6769void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6770 const InputInfo &Output,
6771 const InputInfoList &Inputs,
6772 const ArgList &Args,
6773 const char *LinkingOutput) const {
6774 const Driver &D = getToolChain().getDriver();
6775 ArgStringList CmdArgs;
6776
6777 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6778 (!Args.hasArg(options::OPT_shared))) {
6779 CmdArgs.push_back("-e");
6780 CmdArgs.push_back("__start");
6781 }
6782
6783 if (Args.hasArg(options::OPT_static)) {
6784 CmdArgs.push_back("-Bstatic");
6785 } else {
6786 if (Args.hasArg(options::OPT_rdynamic))
6787 CmdArgs.push_back("-export-dynamic");
6788 CmdArgs.push_back("--eh-frame-hdr");
6789 CmdArgs.push_back("-Bdynamic");
6790 if (Args.hasArg(options::OPT_shared)) {
6791 CmdArgs.push_back("-shared");
6792 } else {
6793 CmdArgs.push_back("-dynamic-linker");
6794 CmdArgs.push_back("/usr/libexec/ld.so");
6795 }
6796 }
6797
6798 if (Output.isFilename()) {
6799 CmdArgs.push_back("-o");
6800 CmdArgs.push_back(Output.getFilename());
6801 } else {
6802 assert(Output.isNothing() && "Invalid output.");
6803 }
6804
6805 if (!Args.hasArg(options::OPT_nostdlib) &&
6806 !Args.hasArg(options::OPT_nostartfiles)) {
6807 if (!Args.hasArg(options::OPT_shared)) {
6808 if (Args.hasArg(options::OPT_pg))
6809 CmdArgs.push_back(Args.MakeArgString(
6810 getToolChain().GetFilePath("gcrt0.o")));
6811 else
6812 CmdArgs.push_back(Args.MakeArgString(
6813 getToolChain().GetFilePath("crt0.o")));
6814 CmdArgs.push_back(Args.MakeArgString(
6815 getToolChain().GetFilePath("crtbegin.o")));
6816 } else {
6817 CmdArgs.push_back(Args.MakeArgString(
6818 getToolChain().GetFilePath("crtbeginS.o")));
6819 }
6820 }
6821
6822 Args.AddAllArgs(CmdArgs, options::OPT_L);
6823 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6824 Args.AddAllArgs(CmdArgs, options::OPT_e);
6825
6826 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6827
6828 if (!Args.hasArg(options::OPT_nostdlib) &&
6829 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006830 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006831 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6832 if (Args.hasArg(options::OPT_pg))
6833 CmdArgs.push_back("-lm_p");
6834 else
6835 CmdArgs.push_back("-lm");
6836 }
6837
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006838 if (Args.hasArg(options::OPT_pthread)) {
6839 if (!Args.hasArg(options::OPT_shared) &&
6840 Args.hasArg(options::OPT_pg))
6841 CmdArgs.push_back("-lpthread_p");
6842 else
6843 CmdArgs.push_back("-lpthread");
6844 }
6845
Eli Friedman9fa28852012-08-08 23:57:20 +00006846 if (!Args.hasArg(options::OPT_shared)) {
6847 if (Args.hasArg(options::OPT_pg))
6848 CmdArgs.push_back("-lc_p");
6849 else
6850 CmdArgs.push_back("-lc");
6851 }
6852
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006853 StringRef MyArch;
6854 switch (getToolChain().getTriple().getArch()) {
6855 case llvm::Triple::arm:
6856 MyArch = "arm";
6857 break;
6858 case llvm::Triple::x86:
6859 MyArch = "i386";
6860 break;
6861 case llvm::Triple::x86_64:
6862 MyArch = "amd64";
6863 break;
6864 default:
6865 llvm_unreachable("Unsupported architecture");
6866 }
6867 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006868 }
6869
6870 if (!Args.hasArg(options::OPT_nostdlib) &&
6871 !Args.hasArg(options::OPT_nostartfiles)) {
6872 if (!Args.hasArg(options::OPT_shared))
6873 CmdArgs.push_back(Args.MakeArgString(
6874 getToolChain().GetFilePath("crtend.o")));
6875 else
6876 CmdArgs.push_back(Args.MakeArgString(
6877 getToolChain().GetFilePath("crtendS.o")));
6878 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006879
6880 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006881 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006882 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006883}
6884
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006885void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006886 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006887 const InputInfoList &Inputs,
6888 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006889 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006890 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006891 ArgStringList CmdArgs;
6892
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006893 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6894 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006895 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006896 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006897 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006898 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006899 else if (getToolChain().getArch() == llvm::Triple::mips ||
6900 getToolChain().getArch() == llvm::Triple::mipsel ||
6901 getToolChain().getArch() == llvm::Triple::mips64 ||
6902 getToolChain().getArch() == llvm::Triple::mips64el) {
6903 StringRef CPUName;
6904 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006905 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006906
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006907 CmdArgs.push_back("-march");
6908 CmdArgs.push_back(CPUName.data());
6909
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006910 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006911 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006912
6913 if (getToolChain().getArch() == llvm::Triple::mips ||
6914 getToolChain().getArch() == llvm::Triple::mips64)
6915 CmdArgs.push_back("-EB");
6916 else
6917 CmdArgs.push_back("-EL");
6918
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006919 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006920 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006921 getToolChain().getArch() == llvm::Triple::armeb ||
6922 getToolChain().getArch() == llvm::Triple::thumb ||
6923 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006924 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006925 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006926 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6927
6928 if (FloatABI == "hard") {
6929 CmdArgs.push_back("-mfpu=vfp");
6930 } else {
6931 CmdArgs.push_back("-mfpu=softvfp");
6932 }
6933
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006934 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006935 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006936 case llvm::Triple::GNUEABI:
6937 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006938 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006939 break;
6940
6941 default:
6942 CmdArgs.push_back("-matpcs");
6943 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006944 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006945 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006946 if (getToolChain().getArch() == llvm::Triple::sparc)
6947 CmdArgs.push_back("-Av8plusa");
6948 else
6949 CmdArgs.push_back("-Av9a");
6950
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006951 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006952 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006953
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006954 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6955 options::OPT_Xassembler);
6956
6957 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006958 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006959
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006960 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006961 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006962
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006963 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006965}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006966
6967void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006968 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006969 const InputInfoList &Inputs,
6970 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006971 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006972 const toolchains::FreeBSD& ToolChain =
6973 static_cast<const toolchains::FreeBSD&>(getToolChain());
6974 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006975 const bool IsPIE =
6976 !Args.hasArg(options::OPT_shared) &&
6977 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006978 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006979
6980 // Silence warning for "clang -g foo.o -o foo"
6981 Args.ClaimAllArgs(options::OPT_g_Group);
6982 // and "clang -emit-llvm foo.o -o foo"
6983 Args.ClaimAllArgs(options::OPT_emit_llvm);
6984 // and for "clang -w foo.o -o foo". Other warning options are already
6985 // handled somewhere else.
6986 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006987
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006988 if (!D.SysRoot.empty())
6989 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6990
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006991 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006992 CmdArgs.push_back("-pie");
6993
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006994 if (Args.hasArg(options::OPT_static)) {
6995 CmdArgs.push_back("-Bstatic");
6996 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006997 if (Args.hasArg(options::OPT_rdynamic))
6998 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006999 CmdArgs.push_back("--eh-frame-hdr");
7000 if (Args.hasArg(options::OPT_shared)) {
7001 CmdArgs.push_back("-Bshareable");
7002 } else {
7003 CmdArgs.push_back("-dynamic-linker");
7004 CmdArgs.push_back("/libexec/ld-elf.so.1");
7005 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007006 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
7007 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00007008 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7009 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7010 CmdArgs.push_back("--hash-style=both");
7011 }
7012 }
7013 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007014 }
7015
7016 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7017 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007018 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007019 CmdArgs.push_back("-m");
7020 CmdArgs.push_back("elf_i386_fbsd");
7021 }
7022
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007023 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007024 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007025 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007026 }
7027
Daniel Dunbarb440f562010-08-02 02:38:21 +00007028 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007029 CmdArgs.push_back("-o");
7030 CmdArgs.push_back(Output.getFilename());
7031 } else {
7032 assert(Output.isNothing() && "Invalid output.");
7033 }
7034
7035 if (!Args.hasArg(options::OPT_nostdlib) &&
7036 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007037 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007038 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007039 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007040 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007041 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007042 crt1 = "Scrt1.o";
7043 else
7044 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007045 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007046 if (crt1)
7047 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7048
7049 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7050
Craig Topper92fc2df2014-05-17 16:56:41 +00007051 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007052 if (Args.hasArg(options::OPT_static))
7053 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007054 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007055 crtbegin = "crtbeginS.o";
7056 else
7057 crtbegin = "crtbegin.o";
7058
7059 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007060 }
7061
7062 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007063 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007064 for (const auto &Path : Paths)
7065 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007066 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7067 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007068 Args.AddAllArgs(CmdArgs, options::OPT_s);
7069 Args.AddAllArgs(CmdArgs, options::OPT_t);
7070 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7071 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007072
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007073 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007074 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007075
Alexey Samsonov52550342014-09-15 19:58:40 +00007076 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007077 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007078
7079 if (!Args.hasArg(options::OPT_nostdlib) &&
7080 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007081 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007082 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007083 if (Args.hasArg(options::OPT_pg))
7084 CmdArgs.push_back("-lm_p");
7085 else
7086 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007087 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007088 if (NeedsSanitizerDeps)
7089 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007090 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7091 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007092 if (Args.hasArg(options::OPT_pg))
7093 CmdArgs.push_back("-lgcc_p");
7094 else
7095 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007096 if (Args.hasArg(options::OPT_static)) {
7097 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007098 } else if (Args.hasArg(options::OPT_pg)) {
7099 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007100 } else {
7101 CmdArgs.push_back("--as-needed");
7102 CmdArgs.push_back("-lgcc_s");
7103 CmdArgs.push_back("--no-as-needed");
7104 }
7105
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007106 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007107 if (Args.hasArg(options::OPT_pg))
7108 CmdArgs.push_back("-lpthread_p");
7109 else
7110 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007111 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007112
Roman Divacky66f22762011-02-10 16:59:40 +00007113 if (Args.hasArg(options::OPT_pg)) {
7114 if (Args.hasArg(options::OPT_shared))
7115 CmdArgs.push_back("-lc");
7116 else
7117 CmdArgs.push_back("-lc_p");
7118 CmdArgs.push_back("-lgcc_p");
7119 } else {
7120 CmdArgs.push_back("-lc");
7121 CmdArgs.push_back("-lgcc");
7122 }
7123
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007124 if (Args.hasArg(options::OPT_static)) {
7125 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007126 } else if (Args.hasArg(options::OPT_pg)) {
7127 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007128 } else {
7129 CmdArgs.push_back("--as-needed");
7130 CmdArgs.push_back("-lgcc_s");
7131 CmdArgs.push_back("--no-as-needed");
7132 }
7133 }
7134
7135 if (!Args.hasArg(options::OPT_nostdlib) &&
7136 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007137 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007138 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007139 else
7140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007141 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007142 }
7143
Alexey Samsonov7811d192014-02-20 13:57:37 +00007144 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007145
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007146 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007147 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007148 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007149}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007150
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007151void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7152 const InputInfo &Output,
7153 const InputInfoList &Inputs,
7154 const ArgList &Args,
7155 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007156 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007157 ArgStringList CmdArgs;
7158
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007159 // GNU as needs different flags for creating the correct output format
7160 // on architectures with different ABIs or optional feature sets.
7161 switch (getToolChain().getArch()) {
7162 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007163 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007164 break;
7165 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007166 case llvm::Triple::armeb:
7167 case llvm::Triple::thumb:
7168 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007169 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007170 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007171 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007172 }
7173
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007174 case llvm::Triple::mips:
7175 case llvm::Triple::mipsel:
7176 case llvm::Triple::mips64:
7177 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007178 StringRef CPUName;
7179 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007180 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007181
7182 CmdArgs.push_back("-march");
7183 CmdArgs.push_back(CPUName.data());
7184
7185 CmdArgs.push_back("-mabi");
7186 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7187
7188 if (getToolChain().getArch() == llvm::Triple::mips ||
7189 getToolChain().getArch() == llvm::Triple::mips64)
7190 CmdArgs.push_back("-EB");
7191 else
7192 CmdArgs.push_back("-EL");
7193
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007194 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007195 break;
7196 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007197
7198 case llvm::Triple::sparc:
7199 CmdArgs.push_back("-32");
7200 addAssemblerKPIC(Args, CmdArgs);
7201 break;
7202
7203 case llvm::Triple::sparcv9:
7204 CmdArgs.push_back("-64");
7205 CmdArgs.push_back("-Av9");
7206 addAssemblerKPIC(Args, CmdArgs);
7207 break;
7208
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007209 default:
7210 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007211 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007212
7213 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7214 options::OPT_Xassembler);
7215
7216 CmdArgs.push_back("-o");
7217 CmdArgs.push_back(Output.getFilename());
7218
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007219 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007220 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007221
David Chisnallddbd68f2011-09-27 22:03:18 +00007222 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007223 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007224}
7225
7226void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7227 const InputInfo &Output,
7228 const InputInfoList &Inputs,
7229 const ArgList &Args,
7230 const char *LinkingOutput) const {
7231 const Driver &D = getToolChain().getDriver();
7232 ArgStringList CmdArgs;
7233
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007234 if (!D.SysRoot.empty())
7235 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7236
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007237 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007238 if (Args.hasArg(options::OPT_static)) {
7239 CmdArgs.push_back("-Bstatic");
7240 } else {
7241 if (Args.hasArg(options::OPT_rdynamic))
7242 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007243 if (Args.hasArg(options::OPT_shared)) {
7244 CmdArgs.push_back("-Bshareable");
7245 } else {
7246 CmdArgs.push_back("-dynamic-linker");
7247 CmdArgs.push_back("/libexec/ld.elf_so");
7248 }
7249 }
7250
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007251 // Many NetBSD architectures support more than one ABI.
7252 // Determine the correct emulation for ld.
7253 switch (getToolChain().getArch()) {
7254 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007255 CmdArgs.push_back("-m");
7256 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007257 break;
7258 case llvm::Triple::arm:
7259 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007260 CmdArgs.push_back("-m");
7261 switch (getToolChain().getTriple().getEnvironment()) {
7262 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007263 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007264 CmdArgs.push_back("armelf_nbsd_eabi");
7265 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007266 case llvm::Triple::EABIHF:
7267 case llvm::Triple::GNUEABIHF:
7268 CmdArgs.push_back("armelf_nbsd_eabihf");
7269 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007270 default:
7271 CmdArgs.push_back("armelf_nbsd");
7272 break;
7273 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007274 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007275 case llvm::Triple::armeb:
7276 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007277 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007278 CmdArgs.push_back("-m");
7279 switch (getToolChain().getTriple().getEnvironment()) {
7280 case llvm::Triple::EABI:
7281 case llvm::Triple::GNUEABI:
7282 CmdArgs.push_back("armelfb_nbsd_eabi");
7283 break;
7284 case llvm::Triple::EABIHF:
7285 case llvm::Triple::GNUEABIHF:
7286 CmdArgs.push_back("armelfb_nbsd_eabihf");
7287 break;
7288 default:
7289 CmdArgs.push_back("armelfb_nbsd");
7290 break;
7291 }
7292 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007293 case llvm::Triple::mips64:
7294 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007295 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007296 CmdArgs.push_back("-m");
7297 if (getToolChain().getArch() == llvm::Triple::mips64)
7298 CmdArgs.push_back("elf32btsmip");
7299 else
7300 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007301 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007302 CmdArgs.push_back("-m");
7303 if (getToolChain().getArch() == llvm::Triple::mips64)
7304 CmdArgs.push_back("elf64btsmip");
7305 else
7306 CmdArgs.push_back("elf64ltsmip");
7307 }
7308 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007309 case llvm::Triple::ppc:
7310 CmdArgs.push_back("-m");
7311 CmdArgs.push_back("elf32ppc_nbsd");
7312 break;
7313
7314 case llvm::Triple::ppc64:
7315 case llvm::Triple::ppc64le:
7316 CmdArgs.push_back("-m");
7317 CmdArgs.push_back("elf64ppc");
7318 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007319
7320 case llvm::Triple::sparc:
7321 CmdArgs.push_back("-m");
7322 CmdArgs.push_back("elf32_sparc");
7323 break;
7324
7325 case llvm::Triple::sparcv9:
7326 CmdArgs.push_back("-m");
7327 CmdArgs.push_back("elf64_sparc");
7328 break;
7329
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007330 default:
7331 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007332 }
7333
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007334 if (Output.isFilename()) {
7335 CmdArgs.push_back("-o");
7336 CmdArgs.push_back(Output.getFilename());
7337 } else {
7338 assert(Output.isNothing() && "Invalid output.");
7339 }
7340
7341 if (!Args.hasArg(options::OPT_nostdlib) &&
7342 !Args.hasArg(options::OPT_nostartfiles)) {
7343 if (!Args.hasArg(options::OPT_shared)) {
7344 CmdArgs.push_back(Args.MakeArgString(
7345 getToolChain().GetFilePath("crt0.o")));
7346 CmdArgs.push_back(Args.MakeArgString(
7347 getToolChain().GetFilePath("crti.o")));
7348 CmdArgs.push_back(Args.MakeArgString(
7349 getToolChain().GetFilePath("crtbegin.o")));
7350 } else {
7351 CmdArgs.push_back(Args.MakeArgString(
7352 getToolChain().GetFilePath("crti.o")));
7353 CmdArgs.push_back(Args.MakeArgString(
7354 getToolChain().GetFilePath("crtbeginS.o")));
7355 }
7356 }
7357
7358 Args.AddAllArgs(CmdArgs, options::OPT_L);
7359 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7360 Args.AddAllArgs(CmdArgs, options::OPT_e);
7361 Args.AddAllArgs(CmdArgs, options::OPT_s);
7362 Args.AddAllArgs(CmdArgs, options::OPT_t);
7363 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7364 Args.AddAllArgs(CmdArgs, options::OPT_r);
7365
7366 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7367
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007368 unsigned Major, Minor, Micro;
7369 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7370 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007371 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007372 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007373 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007374 case llvm::Triple::arm:
7375 case llvm::Triple::armeb:
7376 case llvm::Triple::thumb:
7377 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007378 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007379 case llvm::Triple::ppc64:
7380 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007381 case llvm::Triple::x86:
7382 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007383 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007384 break;
7385 default:
7386 break;
7387 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007388 }
7389
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007390 if (!Args.hasArg(options::OPT_nostdlib) &&
7391 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007392 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007393 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7394 CmdArgs.push_back("-lm");
7395 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007396 if (Args.hasArg(options::OPT_pthread))
7397 CmdArgs.push_back("-lpthread");
7398 CmdArgs.push_back("-lc");
7399
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007400 if (useLibgcc) {
7401 if (Args.hasArg(options::OPT_static)) {
7402 // libgcc_eh depends on libc, so resolve as much as possible,
7403 // pull in any new requirements from libc and then get the rest
7404 // of libgcc.
7405 CmdArgs.push_back("-lgcc_eh");
7406 CmdArgs.push_back("-lc");
7407 CmdArgs.push_back("-lgcc");
7408 } else {
7409 CmdArgs.push_back("-lgcc");
7410 CmdArgs.push_back("--as-needed");
7411 CmdArgs.push_back("-lgcc_s");
7412 CmdArgs.push_back("--no-as-needed");
7413 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007414 }
7415 }
7416
7417 if (!Args.hasArg(options::OPT_nostdlib) &&
7418 !Args.hasArg(options::OPT_nostartfiles)) {
7419 if (!Args.hasArg(options::OPT_shared))
7420 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7421 "crtend.o")));
7422 else
7423 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7424 "crtendS.o")));
7425 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7426 "crtn.o")));
7427 }
7428
Alexey Samsonov7811d192014-02-20 13:57:37 +00007429 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007430
Logan Chieneb9162f2014-06-26 14:23:45 +00007431 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007432 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007433}
7434
Thomas Schwinge4e555262013-03-28 19:04:25 +00007435void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7436 const InputInfo &Output,
7437 const InputInfoList &Inputs,
7438 const ArgList &Args,
7439 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007440 claimNoWarnArgs(Args);
7441
Rafael Espindola92b00932010-08-10 00:25:48 +00007442 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007443 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007444
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007445 switch (getToolChain().getArch()) {
7446 default:
7447 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007448 // Add --32/--64 to make sure we get the format we want.
7449 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007450 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007451 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007452 break;
7453 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007454 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7455 CmdArgs.push_back("--x32");
7456 else
7457 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007458 break;
7459 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007460 CmdArgs.push_back("-a32");
7461 CmdArgs.push_back("-mppc");
7462 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007463 break;
7464 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007465 CmdArgs.push_back("-a64");
7466 CmdArgs.push_back("-mppc64");
7467 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007468 break;
7469 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007470 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007471 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007472 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007473 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007474 break;
7475 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007476 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007477 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007478 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007479 break;
7480 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007481 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007482 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007483 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007484 break;
7485 case llvm::Triple::arm:
7486 case llvm::Triple::armeb:
7487 case llvm::Triple::thumb:
7488 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007489 const llvm::Triple &Triple = getToolChain().getTriple();
7490 switch (Triple.getSubArch()) {
7491 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007492 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007493 break;
7494 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007495 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007496 break;
7497 default:
7498 break;
7499 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007500
Tim Northover9c7e0352013-12-12 11:55:52 +00007501 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007502 getToolChain().getDriver(), Args,
7503 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007504 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007505
7506 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007507
7508 // FIXME: remove krait check when GNU tools support krait cpu
7509 // for now replace it with -march=armv7-a to avoid a lower
7510 // march from being picked in the absence of a cpu flag.
7511 Arg *A;
7512 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin9e36fb42015-05-08 14:50:32 +00007513 StringRef(A->getValue()).lower() == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007514 CmdArgs.push_back("-march=armv7-a");
7515 else
7516 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007517 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007518 break;
7519 }
7520 case llvm::Triple::mips:
7521 case llvm::Triple::mipsel:
7522 case llvm::Triple::mips64:
7523 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007524 StringRef CPUName;
7525 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007526 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007527 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007528
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007529 CmdArgs.push_back("-march");
7530 CmdArgs.push_back(CPUName.data());
7531
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007532 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007533 CmdArgs.push_back(ABIName.data());
7534
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007535 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7536 // or -mshared (not implemented) is in effect.
7537 bool IsPicOrPie = false;
7538 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7539 options::OPT_fpic, options::OPT_fno_pic,
7540 options::OPT_fPIE, options::OPT_fno_PIE,
7541 options::OPT_fpie, options::OPT_fno_pie)) {
7542 if (A->getOption().matches(options::OPT_fPIC) ||
7543 A->getOption().matches(options::OPT_fpic) ||
7544 A->getOption().matches(options::OPT_fPIE) ||
7545 A->getOption().matches(options::OPT_fpie))
7546 IsPicOrPie = true;
7547 }
7548 if (!IsPicOrPie)
7549 CmdArgs.push_back("-mno-shared");
7550
Daniel Sanders379d44b2014-07-16 11:52:23 +00007551 // LLVM doesn't support -mplt yet and acts as if it is always given.
7552 // However, -mplt has no effect with the N64 ABI.
7553 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007554
7555 if (getToolChain().getArch() == llvm::Triple::mips ||
7556 getToolChain().getArch() == llvm::Triple::mips64)
7557 CmdArgs.push_back("-EB");
7558 else
7559 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007560
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007561 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7562 if (StringRef(A->getValue()) == "2008")
7563 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7564 }
7565
Daniel Sanders379d44b2014-07-16 11:52:23 +00007566 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7567 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7568 options::OPT_mfp64)) {
7569 A->claim();
7570 A->render(Args, CmdArgs);
7571 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7572 ABIName))
7573 CmdArgs.push_back("-mfpxx");
7574
7575 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7576 // -mno-mips16 is actually -no-mips16.
7577 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7578 options::OPT_mno_mips16)) {
7579 if (A->getOption().matches(options::OPT_mips16)) {
7580 A->claim();
7581 A->render(Args, CmdArgs);
7582 } else {
7583 A->claim();
7584 CmdArgs.push_back("-no-mips16");
7585 }
7586 }
7587
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007588 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7589 options::OPT_mno_micromips);
7590 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7591 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7592
Simon Atanasyanbd986632013-11-26 11:58:04 +00007593 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7594 // Do not use AddLastArg because not all versions of MIPS assembler
7595 // support -mmsa / -mno-msa options.
7596 if (A->getOption().matches(options::OPT_mmsa))
7597 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7598 }
7599
Daniel Sanders379d44b2014-07-16 11:52:23 +00007600 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7601 options::OPT_msoft_float);
7602
7603 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7604 options::OPT_mno_odd_spreg);
7605
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007606 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007607 break;
7608 }
7609 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007610 // Always pass an -march option, since our default of z10 is later
7611 // than the GNU assembler's default.
7612 StringRef CPUName = getSystemZTargetCPU(Args);
7613 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007614 break;
7615 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007616 }
7617
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007618 if (NeedsKPIC)
7619 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007620
7621 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7622 options::OPT_Xassembler);
7623
7624 CmdArgs.push_back("-o");
7625 CmdArgs.push_back(Output.getFilename());
7626
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007627 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007628 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007629
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007630 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007631 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007632
7633 // Handle the debug info splitting at object creation time if we're
7634 // creating an object.
7635 // TODO: Currently only works on linux with newer objcopy.
7636 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007637 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007638 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007639 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007640}
7641
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007642static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007643 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007644 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007645 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7646 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007647 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007648 CmdArgs.push_back("-lgcc");
7649
Logan Chien3d3373c2012-11-19 12:04:11 +00007650 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007651 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007652 CmdArgs.push_back("-lgcc");
7653 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007654 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007655 CmdArgs.push_back("--as-needed");
7656 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007657 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007658 CmdArgs.push_back("--no-as-needed");
7659 }
7660
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007661 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007662 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007663 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007664 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007665
7666 // According to Android ABI, we have to link with libdl if we are
7667 // linking with non-static libgcc.
7668 //
7669 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7670 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7671 if (isAndroid && !StaticLibgcc)
7672 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007673}
7674
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007675static std::string getLinuxDynamicLinker(const ArgList &Args,
7676 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007677 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7678 if (ToolChain.getTriple().isArch64Bit())
7679 return "/system/bin/linker64";
7680 else
7681 return "/system/bin/linker";
7682 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7683 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007684 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007685 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007686 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007687 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007688 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007689 else if (ToolChain.getArch() == llvm::Triple::arm ||
7690 ToolChain.getArch() == llvm::Triple::thumb) {
7691 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7692 return "/lib/ld-linux-armhf.so.3";
7693 else
7694 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007695 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7696 ToolChain.getArch() == llvm::Triple::thumbeb) {
7697 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7698 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7699 else
7700 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007701 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007702 ToolChain.getArch() == llvm::Triple::mipsel ||
7703 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007704 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007705 StringRef CPUName;
7706 StringRef ABIName;
7707 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7708 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7709
7710 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7711 .Case("o32", "/lib")
7712 .Case("n32", "/lib32")
7713 .Case("n64", "/lib64")
7714 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007715 StringRef LibName;
7716 if (mips::isUCLibc(Args))
7717 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7718 else
7719 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007720
7721 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007722 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7723 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007724 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7725 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7726 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007727 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007728 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7729 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7730 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007731 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007732 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7733 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007734 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7735 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007736 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7737 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7738 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007739 else
7740 return "/lib64/ld-linux-x86-64.so.2";
7741}
7742
Renato Golinc4b49242014-02-13 10:01:16 +00007743static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007744 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007745 // Make use of compiler-rt if --rtlib option is used
7746 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7747
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007748 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007749 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007750 switch (TC.getTriple().getOS()) {
7751 default: llvm_unreachable("unsupported OS");
7752 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007753 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007754 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007755 break;
7756 }
Renato Golinc4b49242014-02-13 10:01:16 +00007757 break;
7758 case ToolChain::RLT_Libgcc:
7759 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7760 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007761 }
7762}
7763
Rafael Espindola1e085772014-08-15 17:14:35 +00007764static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7765 switch (T.getArch()) {
7766 case llvm::Triple::x86:
7767 return "elf_i386";
7768 case llvm::Triple::aarch64:
7769 return "aarch64linux";
7770 case llvm::Triple::aarch64_be:
7771 return "aarch64_be_linux";
7772 case llvm::Triple::arm:
7773 case llvm::Triple::thumb:
7774 return "armelf_linux_eabi";
7775 case llvm::Triple::armeb:
7776 case llvm::Triple::thumbeb:
7777 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7778 case llvm::Triple::ppc:
7779 return "elf32ppclinux";
7780 case llvm::Triple::ppc64:
7781 return "elf64ppc";
7782 case llvm::Triple::ppc64le:
7783 return "elf64lppc";
7784 case llvm::Triple::sparc:
7785 return "elf32_sparc";
7786 case llvm::Triple::sparcv9:
7787 return "elf64_sparc";
7788 case llvm::Triple::mips:
7789 return "elf32btsmip";
7790 case llvm::Triple::mipsel:
7791 return "elf32ltsmip";
7792 case llvm::Triple::mips64:
7793 if (mips::hasMipsAbiArg(Args, "n32"))
7794 return "elf32btsmipn32";
7795 return "elf64btsmip";
7796 case llvm::Triple::mips64el:
7797 if (mips::hasMipsAbiArg(Args, "n32"))
7798 return "elf32ltsmipn32";
7799 return "elf64ltsmip";
7800 case llvm::Triple::systemz:
7801 return "elf64_s390";
7802 case llvm::Triple::x86_64:
7803 if (T.getEnvironment() == llvm::Triple::GNUX32)
7804 return "elf32_x86_64";
7805 return "elf_x86_64";
7806 default:
7807 llvm_unreachable("Unexpected arch");
7808 }
7809}
7810
Thomas Schwinge4e555262013-03-28 19:04:25 +00007811void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7812 const InputInfo &Output,
7813 const InputInfoList &Inputs,
7814 const ArgList &Args,
7815 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007816 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007817 static_cast<const toolchains::Linux&>(getToolChain());
7818 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007819 const bool isAndroid =
7820 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007821 const bool IsPIE =
7822 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007823 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007824 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007825
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007826 ArgStringList CmdArgs;
7827
Rafael Espindolad1002f62010-11-15 18:28:16 +00007828 // Silence warning for "clang -g foo.o -o foo"
7829 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007830 // and "clang -emit-llvm foo.o -o foo"
7831 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007832 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007833 // handled somewhere else.
7834 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007835
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007836 if (!D.SysRoot.empty())
7837 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007838
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007839 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007840 CmdArgs.push_back("-pie");
7841
Rafael Espindola1c76c592010-11-07 22:57:16 +00007842 if (Args.hasArg(options::OPT_rdynamic))
7843 CmdArgs.push_back("-export-dynamic");
7844
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007845 if (Args.hasArg(options::OPT_s))
7846 CmdArgs.push_back("-s");
7847
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007848 if (ToolChain.getArch() == llvm::Triple::armeb ||
7849 ToolChain.getArch() == llvm::Triple::thumbeb)
7850 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7851
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007852 for (const auto &Opt : ToolChain.ExtraOpts)
7853 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007854
7855 if (!Args.hasArg(options::OPT_static)) {
7856 CmdArgs.push_back("--eh-frame-hdr");
7857 }
7858
7859 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007860 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007861
7862 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007863 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007864 ToolChain.getArch() == llvm::Triple::armeb ||
7865 ToolChain.getArch() == llvm::Triple::thumb ||
7866 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007867 CmdArgs.push_back("-Bstatic");
7868 else
7869 CmdArgs.push_back("-static");
7870 } else if (Args.hasArg(options::OPT_shared)) {
7871 CmdArgs.push_back("-shared");
7872 }
7873
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007874 if (ToolChain.getArch() == llvm::Triple::arm ||
7875 ToolChain.getArch() == llvm::Triple::armeb ||
7876 ToolChain.getArch() == llvm::Triple::thumb ||
7877 ToolChain.getArch() == llvm::Triple::thumbeb ||
7878 (!Args.hasArg(options::OPT_static) &&
7879 !Args.hasArg(options::OPT_shared))) {
7880 CmdArgs.push_back("-dynamic-linker");
7881 CmdArgs.push_back(Args.MakeArgString(
7882 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7883 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007884
7885 CmdArgs.push_back("-o");
7886 CmdArgs.push_back(Output.getFilename());
7887
Rafael Espindola81937ec2010-12-01 01:52:43 +00007888 if (!Args.hasArg(options::OPT_nostdlib) &&
7889 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007890 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007891 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007892 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007893 if (Args.hasArg(options::OPT_pg))
7894 crt1 = "gcrt1.o";
7895 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007896 crt1 = "Scrt1.o";
7897 else
7898 crt1 = "crt1.o";
7899 }
7900 if (crt1)
7901 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007902
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7904 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007905
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007906 const char *crtbegin;
7907 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007908 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007909 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007910 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007911 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007912 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007913 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007914 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007916
7917 // Add crtfastmath.o if available and fast math is enabled.
7918 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007919 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007920
7921 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007922 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007923
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007924 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007925
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007926 for (const auto &Path : Paths)
7927 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007928
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007929 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007930 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007931
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007932 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7933 CmdArgs.push_back("--no-demangle");
7934
Alexey Samsonov52550342014-09-15 19:58:40 +00007935 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007936 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007937 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007938 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007939
Hans Wennborg70850d82013-07-18 20:29:38 +00007940 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007941 !Args.hasArg(options::OPT_nostdlib) &&
7942 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007943 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7944 !Args.hasArg(options::OPT_static);
7945 if (OnlyLibstdcxxStatic)
7946 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007947 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007948 if (OnlyLibstdcxxStatic)
7949 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007950 CmdArgs.push_back("-lm");
7951 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007952 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7953 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007954
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007955 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007956 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7957 if (Args.hasArg(options::OPT_static))
7958 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007959
Alexey Samsonov52550342014-09-15 19:58:40 +00007960 if (NeedsSanitizerDeps)
7961 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7962
Alexey Bataev186b28a2014-03-06 05:43:53 +00007963 LibOpenMP UsedOpenMPLib = LibUnknown;
7964 if (Args.hasArg(options::OPT_fopenmp)) {
7965 UsedOpenMPLib = LibGOMP;
7966 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7967 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7968 .Case("libgomp", LibGOMP)
7969 .Case("libiomp5", LibIOMP5)
7970 .Default(LibUnknown);
7971 if (UsedOpenMPLib == LibUnknown)
7972 D.Diag(diag::err_drv_unsupported_option_argument)
7973 << A->getOption().getName() << A->getValue();
7974 }
7975 switch (UsedOpenMPLib) {
7976 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007977 CmdArgs.push_back("-lgomp");
7978
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007979 // FIXME: Exclude this for platforms with libgomp that don't require
7980 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007981 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007982 break;
7983 case LibIOMP5:
7984 CmdArgs.push_back("-liomp5");
7985 break;
7986 case LibUnknown:
7987 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007988 }
Renato Golinc4b49242014-02-13 10:01:16 +00007989 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007990
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007991 if ((Args.hasArg(options::OPT_pthread) ||
7992 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7993 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007994 CmdArgs.push_back("-lpthread");
7995
7996 CmdArgs.push_back("-lc");
7997
7998 if (Args.hasArg(options::OPT_static))
7999 CmdArgs.push_back("--end-group");
8000 else
Renato Golinc4b49242014-02-13 10:01:16 +00008001 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008002 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008003
Rafael Espindola81937ec2010-12-01 01:52:43 +00008004 if (!Args.hasArg(options::OPT_nostartfiles)) {
8005 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008006 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008007 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008008 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008009 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008010 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008011 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008012
Rafael Espindola81937ec2010-12-01 01:52:43 +00008013 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008014 if (!isAndroid)
8015 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008016 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008017 }
8018
David Blaikiec11bf802014-09-04 16:04:28 +00008019 C.addCommand(
8020 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008021}
8022
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008023
8024// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8025// for the various SFI requirements like register masking. The assembly tool
8026// inserts the file containing the macros as an input into all the assembly
8027// jobs.
8028void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8029 const InputInfo &Output,
8030 const InputInfoList &Inputs,
8031 const ArgList &Args,
8032 const char *LinkingOutput) const {
8033 const toolchains::NaCl_TC& ToolChain =
8034 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8035 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8036 "nacl-arm-macros.s");
8037 InputInfoList NewInputs;
8038 NewInputs.push_back(NaClMacros);
8039 NewInputs.append(Inputs.begin(), Inputs.end());
8040 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8041 LinkingOutput);
8042}
8043
8044
8045// This is quite similar to gnutools::link::ConstructJob with changes that
8046// we use static by default, do not yet support sanitizers or LTO, and a few
8047// others. Eventually we can support more of that and hopefully migrate back
8048// to gnutools::link.
8049void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8050 const InputInfo &Output,
8051 const InputInfoList &Inputs,
8052 const ArgList &Args,
8053 const char *LinkingOutput) const {
8054
8055 const toolchains::NaCl_TC& ToolChain =
8056 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8057 const Driver &D = ToolChain.getDriver();
8058 const bool IsStatic =
8059 !Args.hasArg(options::OPT_dynamic) &&
8060 !Args.hasArg(options::OPT_shared);
8061
8062 ArgStringList CmdArgs;
8063
8064 // Silence warning for "clang -g foo.o -o foo"
8065 Args.ClaimAllArgs(options::OPT_g_Group);
8066 // and "clang -emit-llvm foo.o -o foo"
8067 Args.ClaimAllArgs(options::OPT_emit_llvm);
8068 // and for "clang -w foo.o -o foo". Other warning options are already
8069 // handled somewhere else.
8070 Args.ClaimAllArgs(options::OPT_w);
8071
8072 if (!D.SysRoot.empty())
8073 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8074
8075 if (Args.hasArg(options::OPT_rdynamic))
8076 CmdArgs.push_back("-export-dynamic");
8077
8078 if (Args.hasArg(options::OPT_s))
8079 CmdArgs.push_back("-s");
8080
8081 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8082 // there is --build-id, which we do want.
8083 CmdArgs.push_back("--build-id");
8084
8085 if (!IsStatic)
8086 CmdArgs.push_back("--eh-frame-hdr");
8087
8088 CmdArgs.push_back("-m");
8089 if (ToolChain.getArch() == llvm::Triple::x86)
8090 CmdArgs.push_back("elf_i386_nacl");
8091 else if (ToolChain.getArch() == llvm::Triple::arm)
8092 CmdArgs.push_back("armelf_nacl");
8093 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8094 CmdArgs.push_back("elf_x86_64_nacl");
8095 else
8096 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8097 "Native Client";
8098
8099
8100 if (IsStatic)
8101 CmdArgs.push_back("-static");
8102 else if (Args.hasArg(options::OPT_shared))
8103 CmdArgs.push_back("-shared");
8104
8105 CmdArgs.push_back("-o");
8106 CmdArgs.push_back(Output.getFilename());
8107 if (!Args.hasArg(options::OPT_nostdlib) &&
8108 !Args.hasArg(options::OPT_nostartfiles)) {
8109 if (!Args.hasArg(options::OPT_shared))
8110 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8111 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8112
8113 const char *crtbegin;
8114 if (IsStatic)
8115 crtbegin = "crtbeginT.o";
8116 else if (Args.hasArg(options::OPT_shared))
8117 crtbegin = "crtbeginS.o";
8118 else
8119 crtbegin = "crtbegin.o";
8120 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8121 }
8122
8123 Args.AddAllArgs(CmdArgs, options::OPT_L);
8124 Args.AddAllArgs(CmdArgs, options::OPT_u);
8125
8126 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8127
8128 for (const auto &Path : Paths)
8129 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8130
8131 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8132 CmdArgs.push_back("--no-demangle");
8133
8134 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8135
8136 if (D.CCCIsCXX() &&
8137 !Args.hasArg(options::OPT_nostdlib) &&
8138 !Args.hasArg(options::OPT_nodefaultlibs)) {
8139 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8140 !IsStatic;
8141 if (OnlyLibstdcxxStatic)
8142 CmdArgs.push_back("-Bstatic");
8143 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8144 if (OnlyLibstdcxxStatic)
8145 CmdArgs.push_back("-Bdynamic");
8146 CmdArgs.push_back("-lm");
8147 }
8148
8149 if (!Args.hasArg(options::OPT_nostdlib)) {
8150 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8151 // Always use groups, since it has no effect on dynamic libraries.
8152 CmdArgs.push_back("--start-group");
8153 CmdArgs.push_back("-lc");
8154 // NaCl's libc++ currently requires libpthread, so just always include it
8155 // in the group for C++.
8156 if (Args.hasArg(options::OPT_pthread) ||
8157 Args.hasArg(options::OPT_pthreads) ||
8158 D.CCCIsCXX()) {
8159 CmdArgs.push_back("-lpthread");
8160 }
8161
8162 CmdArgs.push_back("-lgcc");
8163 CmdArgs.push_back("--as-needed");
8164 if (IsStatic)
8165 CmdArgs.push_back("-lgcc_eh");
8166 else
8167 CmdArgs.push_back("-lgcc_s");
8168 CmdArgs.push_back("--no-as-needed");
8169 CmdArgs.push_back("--end-group");
8170 }
8171
8172 if (!Args.hasArg(options::OPT_nostartfiles)) {
8173 const char *crtend;
8174 if (Args.hasArg(options::OPT_shared))
8175 crtend = "crtendS.o";
8176 else
8177 crtend = "crtend.o";
8178
8179 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8180 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8181 }
8182 }
8183
8184 C.addCommand(llvm::make_unique<Command>(JA, *this,
8185 ToolChain.Linker.c_str(), CmdArgs));
8186}
8187
8188
Chris Lattner3e2ee142010-07-07 16:01:42 +00008189void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008190 const InputInfo &Output,
8191 const InputInfoList &Inputs,
8192 const ArgList &Args,
8193 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008194 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008195 ArgStringList CmdArgs;
8196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008197 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008198
8199 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008200 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008202 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008203 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008205 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008206 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008207}
8208
8209void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008210 const InputInfo &Output,
8211 const InputInfoList &Inputs,
8212 const ArgList &Args,
8213 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008214 const Driver &D = getToolChain().getDriver();
8215 ArgStringList CmdArgs;
8216
Daniel Dunbarb440f562010-08-02 02:38:21 +00008217 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008218 CmdArgs.push_back("-o");
8219 CmdArgs.push_back(Output.getFilename());
8220 } else {
8221 assert(Output.isNothing() && "Invalid output.");
8222 }
8223
8224 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008225 !Args.hasArg(options::OPT_nostartfiles)) {
8226 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8227 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8228 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8229 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8230 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008231
8232 Args.AddAllArgs(CmdArgs, options::OPT_L);
8233 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8234 Args.AddAllArgs(CmdArgs, options::OPT_e);
8235
Daniel Dunbar54423b22010-09-17 00:24:54 +00008236 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008237
Alexey Samsonov7811d192014-02-20 13:57:37 +00008238 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008239
Chris Lattner3e2ee142010-07-07 16:01:42 +00008240 if (!Args.hasArg(options::OPT_nostdlib) &&
8241 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008242 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008243 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008244 CmdArgs.push_back("-lm");
8245 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008246 }
8247
8248 if (!Args.hasArg(options::OPT_nostdlib) &&
8249 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008250 if (Args.hasArg(options::OPT_pthread))
8251 CmdArgs.push_back("-lpthread");
8252 CmdArgs.push_back("-lc");
8253 CmdArgs.push_back("-lCompilerRT-Generic");
8254 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8255 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008256 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008257 }
8258
Logan Chieneb9162f2014-06-26 14:23:45 +00008259 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008261}
8262
Daniel Dunbarcc912342009-05-02 18:28:39 +00008263/// DragonFly Tools
8264
8265// For now, DragonFly Assemble does just about the same as for
8266// FreeBSD, but this may change soon.
8267void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008268 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008269 const InputInfoList &Inputs,
8270 const ArgList &Args,
8271 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008272 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008273 ArgStringList CmdArgs;
8274
8275 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8276 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008277 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008278 CmdArgs.push_back("--32");
8279
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008280 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008281
8282 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008283 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008284
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008285 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008286 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008287
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008288 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008289 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008290}
8291
8292void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008293 const InputInfo &Output,
8294 const InputInfoList &Inputs,
8295 const ArgList &Args,
8296 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008297 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008298 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008299 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008300
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008301 if (!D.SysRoot.empty())
8302 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8303
John McCall65b8da02013-04-11 22:55:55 +00008304 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008305 if (Args.hasArg(options::OPT_static)) {
8306 CmdArgs.push_back("-Bstatic");
8307 } else {
John McCall65b8da02013-04-11 22:55:55 +00008308 if (Args.hasArg(options::OPT_rdynamic))
8309 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008310 if (Args.hasArg(options::OPT_shared))
8311 CmdArgs.push_back("-Bshareable");
8312 else {
8313 CmdArgs.push_back("-dynamic-linker");
8314 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8315 }
John McCall65b8da02013-04-11 22:55:55 +00008316 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008317 }
8318
8319 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8320 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008321 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008322 CmdArgs.push_back("-m");
8323 CmdArgs.push_back("elf_i386");
8324 }
8325
Daniel Dunbarb440f562010-08-02 02:38:21 +00008326 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008327 CmdArgs.push_back("-o");
8328 CmdArgs.push_back(Output.getFilename());
8329 } else {
8330 assert(Output.isNothing() && "Invalid output.");
8331 }
8332
8333 if (!Args.hasArg(options::OPT_nostdlib) &&
8334 !Args.hasArg(options::OPT_nostartfiles)) {
8335 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008336 if (Args.hasArg(options::OPT_pg))
8337 CmdArgs.push_back(Args.MakeArgString(
8338 getToolChain().GetFilePath("gcrt1.o")));
8339 else {
8340 if (Args.hasArg(options::OPT_pie))
8341 CmdArgs.push_back(Args.MakeArgString(
8342 getToolChain().GetFilePath("Scrt1.o")));
8343 else
8344 CmdArgs.push_back(Args.MakeArgString(
8345 getToolChain().GetFilePath("crt1.o")));
8346 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008347 }
John McCall65b8da02013-04-11 22:55:55 +00008348 CmdArgs.push_back(Args.MakeArgString(
8349 getToolChain().GetFilePath("crti.o")));
8350 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8351 CmdArgs.push_back(Args.MakeArgString(
8352 getToolChain().GetFilePath("crtbeginS.o")));
8353 else
8354 CmdArgs.push_back(Args.MakeArgString(
8355 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008356 }
8357
8358 Args.AddAllArgs(CmdArgs, options::OPT_L);
8359 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8360 Args.AddAllArgs(CmdArgs, options::OPT_e);
8361
Daniel Dunbar54423b22010-09-17 00:24:54 +00008362 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008363
8364 if (!Args.hasArg(options::OPT_nostdlib) &&
8365 !Args.hasArg(options::OPT_nodefaultlibs)) {
8366 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8367 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008368 if (UseGCC47)
8369 CmdArgs.push_back("-L/usr/lib/gcc47");
8370 else
8371 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008372
8373 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008374 if (UseGCC47) {
8375 CmdArgs.push_back("-rpath");
8376 CmdArgs.push_back("/usr/lib/gcc47");
8377 } else {
8378 CmdArgs.push_back("-rpath");
8379 CmdArgs.push_back("/usr/lib/gcc44");
8380 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008381 }
8382
Hans Wennborg70850d82013-07-18 20:29:38 +00008383 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008384 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008385 CmdArgs.push_back("-lm");
8386 }
8387
Daniel Dunbarcc912342009-05-02 18:28:39 +00008388 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008389 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008390
8391 if (!Args.hasArg(options::OPT_nolibc)) {
8392 CmdArgs.push_back("-lc");
8393 }
8394
John McCall65b8da02013-04-11 22:55:55 +00008395 if (UseGCC47) {
8396 if (Args.hasArg(options::OPT_static) ||
8397 Args.hasArg(options::OPT_static_libgcc)) {
8398 CmdArgs.push_back("-lgcc");
8399 CmdArgs.push_back("-lgcc_eh");
8400 } else {
8401 if (Args.hasArg(options::OPT_shared_libgcc)) {
8402 CmdArgs.push_back("-lgcc_pic");
8403 if (!Args.hasArg(options::OPT_shared))
8404 CmdArgs.push_back("-lgcc");
8405 } else {
8406 CmdArgs.push_back("-lgcc");
8407 CmdArgs.push_back("--as-needed");
8408 CmdArgs.push_back("-lgcc_pic");
8409 CmdArgs.push_back("--no-as-needed");
8410 }
8411 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008412 } else {
John McCall65b8da02013-04-11 22:55:55 +00008413 if (Args.hasArg(options::OPT_shared)) {
8414 CmdArgs.push_back("-lgcc_pic");
8415 } else {
8416 CmdArgs.push_back("-lgcc");
8417 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008418 }
8419 }
8420
8421 if (!Args.hasArg(options::OPT_nostdlib) &&
8422 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008423 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008424 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008425 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008426 else
8427 CmdArgs.push_back(Args.MakeArgString(
8428 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008429 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008430 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008431 }
8432
Alexey Samsonov7811d192014-02-20 13:57:37 +00008433 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008434
Logan Chieneb9162f2014-06-26 14:23:45 +00008435 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008437}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008438
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008439// Try to find Exe from a Visual Studio distribution. This first tries to find
8440// an installed copy of Visual Studio and, failing that, looks in the PATH,
8441// making sure that whatever executable that's found is not a same-named exe
8442// from clang itself to prevent clang from falling back to itself.
8443static std::string FindVisualStudioExecutable(const ToolChain &TC,
8444 const char *Exe,
8445 const char *ClangProgramPath) {
8446 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8447 std::string visualStudioBinDir;
8448 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8449 visualStudioBinDir)) {
8450 SmallString<128> FilePath(visualStudioBinDir);
8451 llvm::sys::path::append(FilePath, Exe);
8452 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8453 return FilePath.str();
8454 }
8455
8456 return Exe;
8457}
8458
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008459void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8460 const InputInfo &Output,
8461 const InputInfoList &Inputs,
8462 const ArgList &Args,
8463 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008464 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008465 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008466
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008467 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8468 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008469 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8470 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008471
8472 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008473 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008474 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008475
Zachary Turner10d75b22014-10-22 20:40:43 +00008476 if (!llvm::sys::Process::GetEnv("LIB")) {
8477 // If the VC environment hasn't been configured (perhaps because the user
8478 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008479 // the environment variable is set however, assume the user knows what
8480 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008481 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008482 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008483 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8484 SmallString<128> LibDir(VisualStudioDir);
8485 llvm::sys::path::append(LibDir, "VC", "lib");
8486 switch (MSVC.getArch()) {
8487 case llvm::Triple::x86:
8488 // x86 just puts the libraries directly in lib
8489 break;
8490 case llvm::Triple::x86_64:
8491 llvm::sys::path::append(LibDir, "amd64");
8492 break;
8493 case llvm::Triple::arm:
8494 llvm::sys::path::append(LibDir, "arm");
8495 break;
8496 default:
8497 break;
8498 }
8499 CmdArgs.push_back(
8500 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8501 }
8502
8503 std::string WindowsSdkLibPath;
8504 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8505 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8506 WindowsSdkLibPath.c_str()));
8507 }
8508
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008509 CmdArgs.push_back("-nologo");
8510
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008511 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008512 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008513
Hans Wennborge4c47f22015-03-04 23:16:21 +00008514 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8515 options::OPT__SLASH_LDd,
8516 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008517 if (DLL) {
8518 CmdArgs.push_back(Args.MakeArgString("-dll"));
8519
8520 SmallString<128> ImplibName(Output.getFilename());
8521 llvm::sys::path::replace_extension(ImplibName, "lib");
8522 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008523 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008524 }
8525
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008526 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008527 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008528 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008529 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008530 static const char *CompilerRTComponents[] = {
8531 "asan_dynamic",
8532 "asan_dynamic_runtime_thunk",
8533 };
8534 for (const auto &Component : CompilerRTComponents)
8535 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008536 // Make sure the dynamic runtime thunk is not optimized out at link time
8537 // to ensure proper SEH handling.
8538 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008539 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008540 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008541 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008542 static const char *CompilerRTComponents[] = {
8543 "asan",
8544 "asan_cxx",
8545 };
8546 for (const auto &Component : CompilerRTComponents)
8547 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008548 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008549 }
8550
Hans Wennborg2e274592013-08-13 23:38:57 +00008551 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008552
Reid Kleckner337188f2014-09-16 19:22:00 +00008553 // Add filenames, libraries, and other linker inputs.
8554 for (const auto &Input : Inputs) {
8555 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008556 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008557 continue;
8558 }
8559
8560 const Arg &A = Input.getInputArg();
8561
8562 // Render -l options differently for the MSVC linker.
8563 if (A.getOption().matches(options::OPT_l)) {
8564 StringRef Lib = A.getValue();
8565 const char *LinkLibArg;
8566 if (Lib.endswith(".lib"))
8567 LinkLibArg = Args.MakeArgString(Lib);
8568 else
8569 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8570 CmdArgs.push_back(LinkLibArg);
8571 continue;
8572 }
8573
8574 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8575 // or -L. Render it, even if MSVC doesn't understand it.
8576 A.renderAsInput(Args, CmdArgs);
8577 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008578
Zachary Turner719f58c2014-12-01 23:06:47 +00008579 // We need to special case some linker paths. In the case of lld, we need to
8580 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8581 // linker, we need to use a special search algorithm.
8582 llvm::SmallString<128> linkPath;
8583 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8584 if (Linker.equals_lower("lld"))
8585 Linker = "lld-link";
8586
8587 if (Linker.equals_lower("link")) {
8588 // If we're using the MSVC linker, it's not sufficient to just use link
8589 // from the program PATH, because other environments like GnuWin32 install
8590 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008591 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008592 C.getDriver().getClangProgramPath());
8593 } else {
8594 linkPath = Linker;
8595 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008596 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008597 }
8598
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008599 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008600 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008601}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008602
8603void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8604 const InputInfo &Output,
8605 const InputInfoList &Inputs,
8606 const ArgList &Args,
8607 const char *LinkingOutput) const {
8608 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8609}
8610
David Blaikiec11bf802014-09-04 16:04:28 +00008611std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8612 Compilation &C, const JobAction &JA, const InputInfo &Output,
8613 const InputInfoList &Inputs, const ArgList &Args,
8614 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008615 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008616 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008617 CmdArgs.push_back("/c"); // Compile only.
8618 CmdArgs.push_back("/W0"); // No warnings.
8619
8620 // The goal is to be able to invoke this tool correctly based on
8621 // any flag accepted by clang-cl.
8622
8623 // These are spelled the same way in clang and cl.exe,.
8624 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8625 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008626
8627 // Optimization level.
8628 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8629 if (A->getOption().getID() == options::OPT_O0) {
8630 CmdArgs.push_back("/Od");
8631 } else {
8632 StringRef OptLevel = A->getValue();
8633 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8634 A->render(Args, CmdArgs);
8635 else if (OptLevel == "3")
8636 CmdArgs.push_back("/Ox");
8637 }
8638 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008639
Nico Weber3f8dafb2015-03-12 19:37:10 +00008640 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008641 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8642
David Majnemerf6072342014-07-01 22:24:56 +00008643 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8644 /*default=*/false))
8645 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008646 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8647 options::OPT_fno_function_sections))
8648 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8649 ? "/Gy"
8650 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008651 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8652 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008653 CmdArgs.push_back(
8654 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008655 if (Args.hasArg(options::OPT_fsyntax_only))
8656 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008657 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8658 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008659
Nico Weber3f8dafb2015-03-12 19:37:10 +00008660 std::vector<std::string> Includes =
8661 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008662 for (const auto &Include : Includes)
8663 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008664
Hans Wennborg87cfa712013-09-19 20:32:16 +00008665 // Flags that can simply be passed through.
8666 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8667 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008668 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008669
8670 // The order of these flags is relevant, so pick the last one.
8671 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8672 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8673 A->render(Args, CmdArgs);
8674
8675
8676 // Input filename.
8677 assert(Inputs.size() == 1);
8678 const InputInfo &II = Inputs[0];
8679 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8680 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8681 if (II.isFilename())
8682 CmdArgs.push_back(II.getFilename());
8683 else
8684 II.getInputArg().renderAsInput(Args, CmdArgs);
8685
8686 // Output filename.
8687 assert(Output.getType() == types::TY_Object);
8688 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8689 Output.getFilename());
8690 CmdArgs.push_back(Fo);
8691
Hans Wennborg188382e2013-09-20 18:16:35 +00008692 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008693 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8694 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008695 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8696 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008697}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008698
8699
8700/// XCore Tools
8701// We pass assemble and link construction to the xcc tool.
8702
8703void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8704 const InputInfo &Output,
8705 const InputInfoList &Inputs,
8706 const ArgList &Args,
8707 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008708 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008709 ArgStringList CmdArgs;
8710
8711 CmdArgs.push_back("-o");
8712 CmdArgs.push_back(Output.getFilename());
8713
8714 CmdArgs.push_back("-c");
8715
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008716 if (Args.hasArg(options::OPT_v))
8717 CmdArgs.push_back("-v");
8718
Robert Lytton894d25c2014-05-02 09:33:25 +00008719 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8720 if (!A->getOption().matches(options::OPT_g0))
8721 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008722
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008723 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8724 false))
8725 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008726
8727 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8728 options::OPT_Xassembler);
8729
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008730 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008731 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008732
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008733 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008734 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008735}
8736
8737void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8738 const InputInfo &Output,
8739 const InputInfoList &Inputs,
8740 const ArgList &Args,
8741 const char *LinkingOutput) const {
8742 ArgStringList CmdArgs;
8743
8744 if (Output.isFilename()) {
8745 CmdArgs.push_back("-o");
8746 CmdArgs.push_back(Output.getFilename());
8747 } else {
8748 assert(Output.isNothing() && "Invalid output.");
8749 }
8750
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008751 if (Args.hasArg(options::OPT_v))
8752 CmdArgs.push_back("-v");
8753
David Majnemer8de68642014-12-05 08:11:58 +00008754 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008755 CmdArgs.push_back("-fexceptions");
8756
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8758
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008759 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008760 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008761}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008762
8763void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8764 const InputInfo &Output,
8765 const InputInfoList &Inputs,
8766 const ArgList &Args,
8767 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008768 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008769 const auto &TC =
8770 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8771 ArgStringList CmdArgs;
8772 const char *Exec;
8773
8774 switch (TC.getArch()) {
8775 default: llvm_unreachable("unsupported architecture");
8776 case llvm::Triple::arm:
8777 case llvm::Triple::thumb:
8778 break;
8779 case llvm::Triple::x86:
8780 CmdArgs.push_back("--32");
8781 break;
8782 case llvm::Triple::x86_64:
8783 CmdArgs.push_back("--64");
8784 break;
8785 }
8786
8787 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8788
8789 CmdArgs.push_back("-o");
8790 CmdArgs.push_back(Output.getFilename());
8791
8792 for (const auto &Input : Inputs)
8793 CmdArgs.push_back(Input.getFilename());
8794
8795 const std::string Assembler = TC.GetProgramPath("as");
8796 Exec = Args.MakeArgString(Assembler);
8797
8798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8799}
8800
8801void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8802 const InputInfo &Output,
8803 const InputInfoList &Inputs,
8804 const ArgList &Args,
8805 const char *LinkingOutput) const {
8806 const auto &TC =
8807 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8808 const llvm::Triple &T = TC.getTriple();
8809 const Driver &D = TC.getDriver();
8810 SmallString<128> EntryPoint;
8811 ArgStringList CmdArgs;
8812 const char *Exec;
8813
8814 // Silence warning for "clang -g foo.o -o foo"
8815 Args.ClaimAllArgs(options::OPT_g_Group);
8816 // and "clang -emit-llvm foo.o -o foo"
8817 Args.ClaimAllArgs(options::OPT_emit_llvm);
8818 // and for "clang -w foo.o -o foo"
8819 Args.ClaimAllArgs(options::OPT_w);
8820 // Other warning options are already handled somewhere else.
8821
8822 if (!D.SysRoot.empty())
8823 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8824
8825 if (Args.hasArg(options::OPT_pie))
8826 CmdArgs.push_back("-pie");
8827 if (Args.hasArg(options::OPT_rdynamic))
8828 CmdArgs.push_back("-export-dynamic");
8829 if (Args.hasArg(options::OPT_s))
8830 CmdArgs.push_back("--strip-all");
8831
8832 CmdArgs.push_back("-m");
8833 switch (TC.getArch()) {
8834 default: llvm_unreachable("unsupported architecture");
8835 case llvm::Triple::arm:
8836 case llvm::Triple::thumb:
8837 // FIXME: this is incorrect for WinCE
8838 CmdArgs.push_back("thumb2pe");
8839 break;
8840 case llvm::Triple::x86:
8841 CmdArgs.push_back("i386pe");
8842 EntryPoint.append("_");
8843 break;
8844 case llvm::Triple::x86_64:
8845 CmdArgs.push_back("i386pep");
8846 break;
8847 }
8848
8849 if (Args.hasArg(options::OPT_shared)) {
8850 switch (T.getArch()) {
8851 default: llvm_unreachable("unsupported architecture");
8852 case llvm::Triple::arm:
8853 case llvm::Triple::thumb:
8854 case llvm::Triple::x86_64:
8855 EntryPoint.append("_DllMainCRTStartup");
8856 break;
8857 case llvm::Triple::x86:
8858 EntryPoint.append("_DllMainCRTStartup@12");
8859 break;
8860 }
8861
8862 CmdArgs.push_back("-shared");
8863 CmdArgs.push_back("-Bdynamic");
8864
8865 CmdArgs.push_back("--enable-auto-image-base");
8866
8867 CmdArgs.push_back("--entry");
8868 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8869 } else {
8870 EntryPoint.append("mainCRTStartup");
8871
8872 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8873 : "-Bdynamic");
8874
8875 if (!Args.hasArg(options::OPT_nostdlib) &&
8876 !Args.hasArg(options::OPT_nostartfiles)) {
8877 CmdArgs.push_back("--entry");
8878 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8879 }
8880
8881 // FIXME: handle subsystem
8882 }
8883
8884 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008885 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008886
8887 CmdArgs.push_back("-o");
8888 CmdArgs.push_back(Output.getFilename());
8889
8890 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8891 SmallString<261> ImpLib(Output.getFilename());
8892 llvm::sys::path::replace_extension(ImpLib, ".lib");
8893
8894 CmdArgs.push_back("--out-implib");
8895 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8896 }
8897
8898 if (!Args.hasArg(options::OPT_nostdlib) &&
8899 !Args.hasArg(options::OPT_nostartfiles)) {
8900 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8901 const char *CRTBegin;
8902
8903 CRTBegin =
8904 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8905 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8906 }
8907
8908 Args.AddAllArgs(CmdArgs, options::OPT_L);
8909
8910 const auto &Paths = TC.getFilePaths();
8911 for (const auto &Path : Paths)
8912 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8913
8914 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8915
8916 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8917 !Args.hasArg(options::OPT_nodefaultlibs)) {
8918 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8919 !Args.hasArg(options::OPT_static);
8920 if (StaticCXX)
8921 CmdArgs.push_back("-Bstatic");
8922 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8923 if (StaticCXX)
8924 CmdArgs.push_back("-Bdynamic");
8925 }
8926
8927 if (!Args.hasArg(options::OPT_nostdlib)) {
8928 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8929 // TODO handle /MT[d] /MD[d]
8930 CmdArgs.push_back("-lmsvcrt");
8931 AddRunTimeLibs(TC, D, CmdArgs, Args);
8932 }
8933 }
8934
8935 const std::string Linker = TC.GetProgramPath("ld");
8936 Exec = Args.MakeArgString(Linker);
8937
8938 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8939}