blob: fda410687c105d045c95dc8a57762760b2565684 [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);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000341
342 // Convert all -MQ <target> args to -MT <quoted target>
343 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
344 options::OPT_MQ),
345 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000346 const Arg *A = *it;
347 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000348
Daniel Dunbara442fd52010-06-11 22:00:13 +0000349 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000351 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000352 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000353 CmdArgs.push_back(Args.MakeArgString(Quoted));
354
355 // -MT flag - no change
356 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000357 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000358 }
359 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000360
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 // Add -i* options, and automatically translate to
362 // -include-pch/-include-pth for transparent PCH support. It's
363 // wonky, but we include looking for .gch so we can support seamless
364 // replacement into a build system already set up to be generating
365 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000366 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000367 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
368 ie = Args.filtered_end(); it != ie; ++it) {
369 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000370
371 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000372 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
373 RenderedImplicitInclude = true;
374
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000375 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000376 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000377
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000378 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000379 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000380 SmallString<128> P(A->getValue());
381 // We want the files to have a name like foo.h.pch. Add a dummy extension
382 // so that replace_extension does the right thing.
383 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000384 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000385 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000387 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000388 }
389
Douglas Gregor111af7d2009-04-18 00:34:01 +0000390 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000391 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000392 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000393 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000394 }
395
Douglas Gregor111af7d2009-04-18 00:34:01 +0000396 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000397 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000398 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000399 FoundPCH = UsePCH;
400 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000401 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000402 }
403
404 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000405 if (IsFirstImplicitInclude) {
406 A->claim();
407 if (UsePCH)
408 CmdArgs.push_back("-include-pch");
409 else
410 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000411 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000412 continue;
413 } else {
414 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000415 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000416 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000417 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000418 }
419 }
420
421 // Not translated, render as usual.
422 A->claim();
423 A->render(Args, CmdArgs);
424 }
425
426 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000427 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
428 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000429
430 // Add -Wp, and -Xassembler if using the preprocessor.
431
432 // FIXME: There is a very unfortunate problem here, some troubled
433 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
434 // really support that we would have to parse and then translate
435 // those options. :(
436 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
437 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000438
439 // -I- is a deprecated GCC feature, reject it.
440 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000441 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000442
443 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
444 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000445 StringRef sysroot = C.getSysRoot();
446 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000447 if (!Args.hasArg(options::OPT_isysroot)) {
448 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000449 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000450 }
451 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000452
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000453 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000454 // FIXME: We should probably sink the logic for handling these from the
455 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000456 // CPATH - included following the user specified includes (but prior to
457 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000458 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000459 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000467
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000468 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000469 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000470 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000471
472 // Add system include arguments.
473 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000474}
475
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000476// FIXME: Move to target hook.
477static bool isSignedCharDefault(const llvm::Triple &Triple) {
478 switch (Triple.getArch()) {
479 default:
480 return true;
481
Tim Northover9bb857a2013-01-31 12:13:10 +0000482 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000483 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000484 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000485 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000486 case llvm::Triple::thumb:
487 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000488 if (Triple.isOSDarwin() || Triple.isOSWindows())
489 return true;
490 return false;
491
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492 case llvm::Triple::ppc:
493 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000494 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000495 return true;
496 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000497
Bill Schmidt778d3872013-07-26 01:36:11 +0000498 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000499 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000500 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000501 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000502 }
503}
504
Robert Lytton0e076492013-08-13 09:43:10 +0000505static bool isNoCommonDefault(const llvm::Triple &Triple) {
506 switch (Triple.getArch()) {
507 default:
508 return false;
509
510 case llvm::Triple::xcore:
511 return true;
512 }
513}
514
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000515// Handle -mhwdiv=.
516static void getARMHWDivFeatures(const Driver &D, const Arg *A,
517 const ArgList &Args,
518 std::vector<const char *> &Features) {
519 StringRef HWDiv = A->getValue();
520 if (HWDiv == "arm") {
521 Features.push_back("+hwdiv-arm");
522 Features.push_back("-hwdiv");
523 } else if (HWDiv == "thumb") {
524 Features.push_back("-hwdiv-arm");
525 Features.push_back("+hwdiv");
526 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
527 Features.push_back("+hwdiv-arm");
528 Features.push_back("+hwdiv");
529 } else if (HWDiv == "none") {
530 Features.push_back("-hwdiv-arm");
531 Features.push_back("-hwdiv");
532 } else
533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000535
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000536// Handle -mfpu=.
537//
538// FIXME: Centralize feature selection, defaulting shouldn't be also in the
539// frontend target.
540static void getARMFPUFeatures(const Driver &D, const Arg *A,
541 const ArgList &Args,
542 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000543 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000544
545 // Set the target features based on the FPU.
546 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
547 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000548 Features.push_back("-vfp2");
549 Features.push_back("-vfp3");
550 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000551 } else if (FPU == "vfp") {
552 Features.push_back("+vfp2");
553 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000554 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000555 Features.push_back("+vfp3");
556 Features.push_back("+d16");
557 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000558 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000559 Features.push_back("+vfp3");
560 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000561 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
562 Features.push_back("+vfp4");
563 Features.push_back("+d16");
564 Features.push_back("-neon");
565 } else if (FPU == "vfp4" || FPU == "vfpv4") {
566 Features.push_back("+vfp4");
567 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000568 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
569 Features.push_back("+vfp4");
570 Features.push_back("+d16");
571 Features.push_back("+fp-only-sp");
572 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000573 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
574 Features.push_back("+fp-armv8");
575 Features.push_back("+fp-only-sp");
576 Features.push_back("+d16");
577 Features.push_back("-neon");
578 Features.push_back("-crypto");
579 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
580 FPU == "fp5-d16" || FPU == "fpv5-d16") {
581 Features.push_back("+fp-armv8");
582 Features.push_back("+d16");
583 Features.push_back("-neon");
584 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000585 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000586 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000587 Features.push_back("-neon");
588 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000589 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000590 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000591 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000592 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000593 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000594 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000595 Features.push_back("+neon");
596 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000597 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000598 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000599 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000600 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000601 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000602 } else if (FPU == "neon-vfpv4") {
603 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000604 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000605 } else if (FPU == "none") {
606 Features.push_back("-vfp2");
607 Features.push_back("-vfp3");
608 Features.push_back("-vfp4");
609 Features.push_back("-fp-armv8");
610 Features.push_back("-crypto");
611 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000612 } else
613 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
614}
615
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000616// Select the float ABI as determined by -msoft-float, -mhard-float, and
617// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000618StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000619 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000620 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000621 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
622 options::OPT_mhard_float,
623 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000624 if (A->getOption().matches(options::OPT_msoft_float))
625 FloatABI = "soft";
626 else if (A->getOption().matches(options::OPT_mhard_float))
627 FloatABI = "hard";
628 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000629 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000630 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000631 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000632 << A->getAsString(Args);
633 FloatABI = "soft";
634 }
635 }
636 }
637
638 // If unspecified, choose the default based on the platform.
639 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000640 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000641 case llvm::Triple::Darwin:
642 case llvm::Triple::MacOSX:
643 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000644 // Darwin defaults to "softfp" for v6 and v7.
645 //
646 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000647 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000648 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000649 if (StringRef(ArchName).startswith("v6") ||
650 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
656
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000657 // FIXME: this is invalid for WindowsCE
658 case llvm::Triple::Win32:
659 FloatABI = "hard";
660 break;
661
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000662 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000663 switch(Triple.getEnvironment()) {
664 case llvm::Triple::GNUEABIHF:
665 FloatABI = "hard";
666 break;
667 default:
668 // FreeBSD defaults to soft float
669 FloatABI = "soft";
670 break;
671 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000672 break;
673
Daniel Dunbar78485922009-09-10 23:00:09 +0000674 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000675 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000676 case llvm::Triple::GNUEABIHF:
677 FloatABI = "hard";
678 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000679 case llvm::Triple::GNUEABI:
680 FloatABI = "softfp";
681 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000682 case llvm::Triple::EABIHF:
683 FloatABI = "hard";
684 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000685 case llvm::Triple::EABI:
686 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
687 FloatABI = "softfp";
688 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000689 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000690 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000691 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000692 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000693 FloatABI = "softfp";
694 else
695 FloatABI = "soft";
696 break;
697 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000698 default:
699 // Assume "soft", but warn the user we are guessing.
700 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000701 if (Triple.getOS() != llvm::Triple::UnknownOS ||
702 !Triple.isOSBinFormatMachO())
703 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000704 break;
705 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000706 }
707 }
708
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000709 return FloatABI;
710}
711
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000712static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
713 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000714 std::vector<const char *> &Features,
715 bool ForAS) {
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000716 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000717 if (!ForAS) {
718 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
719 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
720 // stripped out by the ARM target. We should probably pass this a new
721 // -target-option, which is handled by the -cc1/-cc1as invocation.
722 //
723 // FIXME2: For consistency, it would be ideal if we set up the target
724 // machine state the same when using the frontend or the assembler. We don't
725 // currently do that for the assembler, we pass the options directly to the
726 // backend and never even instantiate the frontend TargetInfo. If we did,
727 // and used its handleTargetFeatures hook, then we could ensure the
728 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000729
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000730 // Use software floating point operations?
731 if (FloatABI == "soft")
732 Features.push_back("+soft-float");
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard")
736 Features.push_back("+soft-float-abi");
737 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000738
739 // Honor -mfpu=.
740 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000741 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000742 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
743 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000744
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000745 // Setting -msoft-float effectively disables NEON because of the GCC
746 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000747 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000748 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000749 // Also need to explicitly disable features which imply NEON.
750 Features.push_back("-crypto");
751 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000752
Eric Christopher269c2a22015-04-04 03:34:43 +0000753 // En/disable crc code generation.
754 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000755 if (A->getOption().matches(options::OPT_mcrc))
756 Features.push_back("+crc");
757 else
758 Features.push_back("-crc");
759 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000760}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000761
762void Clang::AddARMTargetArgs(const ArgList &Args,
763 ArgStringList &CmdArgs,
764 bool KernelOrKext) const {
765 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000766 // Get the effective triple, which takes into account the deployment target.
767 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
768 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000769 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770
771 // Select the ABI to use.
772 //
773 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000774 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000775 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000776 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000777 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000778 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000779 // The backend is hardwired to assume AAPCS for M-class processors, ensure
780 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000781 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000782 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000783 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000784 ABIName = "aapcs";
785 } else {
786 ABIName = "apcs-gnu";
787 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000788 } else if (Triple.isOSWindows()) {
789 // FIXME: this is invalid for WindowsCE
790 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000791 } else {
792 // Select the default based on the platform.
793 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000794 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000795 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000796 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000797 ABIName = "aapcs-linux";
798 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000799 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000800 case llvm::Triple::EABI:
801 ABIName = "aapcs";
802 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000803 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000804 if (Triple.getOS() == llvm::Triple::NetBSD)
805 ABIName = "apcs-gnu";
806 else
807 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000808 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000809 }
810 }
811 CmdArgs.push_back("-target-abi");
812 CmdArgs.push_back(ABIName);
813
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000815 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000816 if (FloatABI == "soft") {
817 // Floating point operations and argument passing are soft.
818 //
819 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000820 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000821 CmdArgs.push_back("-mfloat-abi");
822 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000823 } else if (FloatABI == "softfp") {
824 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000825 CmdArgs.push_back("-mfloat-abi");
826 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000827 } else {
828 // Floating point operations and argument passing are hard.
829 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000830 CmdArgs.push_back("-mfloat-abi");
831 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000832 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000833
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000834 // Kernel code has more strict alignment requirements.
835 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000836 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000837 CmdArgs.push_back("-backend-option");
838 CmdArgs.push_back("-arm-long-calls");
839 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000840
Daniel Dunbar12100e22011-03-22 16:48:17 +0000841 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000842 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000843
844 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000845 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000846 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000847 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000848
Bob Wilson0874e532014-07-29 00:23:18 +0000849 // -mkernel implies -mstrict-align; don't add the redundant option.
850 if (!KernelOrKext) {
851 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
852 options::OPT_munaligned_access)) {
853 CmdArgs.push_back("-backend-option");
854 if (A->getOption().matches(options::OPT_mno_unaligned_access))
855 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000856 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000857 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000858 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000859 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000860 }
Bob Wilson0874e532014-07-29 00:23:18 +0000861 }
862 }
863
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000864 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000865 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
866 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000867 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000868 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000869 CmdArgs.push_back("-arm-global-merge=false");
870 else
871 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000872 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000873
Bob Wilson9c8af452013-04-11 18:53:25 +0000874 if (!Args.hasFlag(options::OPT_mimplicit_float,
875 options::OPT_mno_implicit_float,
876 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000877 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000878
Logan Chien749763e2014-04-03 13:12:44 +0000879 // llvm does not support reserving registers in general. There is support
880 // for reserving r9 on ARM though (defined as a platform-specific register
881 // in ARM EABI).
882 if (Args.hasArg(options::OPT_ffixed_r9)) {
883 CmdArgs.push_back("-backend-option");
884 CmdArgs.push_back("-arm-reserve-r9");
885 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000886}
887
Tim Northover573cbee2014-05-24 12:52:07 +0000888/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
889/// targeting.
890static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000891 Arg *A;
892 std::string CPU;
893 // If we have -mtune or -mcpu, use that.
894 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
895 CPU = A->getValue();
896 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
897 StringRef Mcpu = A->getValue();
898 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000899 }
900
Kevin Qin110db6f2014-07-18 07:03:22 +0000901 // Handle CPU name is 'native'.
902 if (CPU == "native")
903 return llvm::sys::getHostCPUName();
904 else if (CPU.size())
905 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000906
James Molloy9b1586b2014-04-17 12:51:17 +0000907 // Make sure we pick "cyclone" if -arch is used.
908 // FIXME: Should this be picked by checking the target triple instead?
909 if (Args.getLastArg(options::OPT_arch))
910 return "cyclone";
911
912 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000913}
914
Tim Northover573cbee2014-05-24 12:52:07 +0000915void Clang::AddAArch64TargetArgs(const ArgList &Args,
916 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000917 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
918 llvm::Triple Triple(TripleStr);
919
920 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
921 Args.hasArg(options::OPT_mkernel) ||
922 Args.hasArg(options::OPT_fapple_kext))
923 CmdArgs.push_back("-disable-red-zone");
924
925 if (!Args.hasFlag(options::OPT_mimplicit_float,
926 options::OPT_mno_implicit_float, true))
927 CmdArgs.push_back("-no-implicit-float");
928
Craig Topper92fc2df2014-05-17 16:56:41 +0000929 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000930 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
931 ABIName = A->getValue();
932 else if (Triple.isOSDarwin())
933 ABIName = "darwinpcs";
934 else
935 ABIName = "aapcs";
936
937 CmdArgs.push_back("-target-abi");
938 CmdArgs.push_back(ABIName);
939
Bob Wilson0874e532014-07-29 00:23:18 +0000940 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
941 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000942 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000943 if (A->getOption().matches(options::OPT_mno_unaligned_access))
944 CmdArgs.push_back("-aarch64-strict-align");
945 else
946 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000947 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000948
Bradley Smith9ff64332014-10-13 10:16:06 +0000949 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
950 options::OPT_mno_fix_cortex_a53_835769)) {
951 CmdArgs.push_back("-backend-option");
952 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
953 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
954 else
955 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000956 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
957 // Enabled A53 errata (835769) workaround by default on android
958 CmdArgs.push_back("-backend-option");
959 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000960 }
961
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000962 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000963 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
964 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000965 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000966 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000967 CmdArgs.push_back("-aarch64-global-merge=false");
968 else
969 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000970 }
Renato Golinb625f482015-01-25 23:17:48 +0000971
972 if (Args.hasArg(options::OPT_ffixed_x18)) {
973 CmdArgs.push_back("-backend-option");
974 CmdArgs.push_back("-aarch64-reserve-x18");
975 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000976}
977
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000978// Get CPU and ABI names. They are not independent
979// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000980void mips::getMipsCPUAndABI(const ArgList &Args,
981 const llvm::Triple &Triple,
982 StringRef &CPUName,
983 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000984 const char *DefMips32CPU = "mips32r2";
985 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000986
Daniel Sanders2bf13662014-07-10 14:40:57 +0000987 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
988 // default for mips64(el)?-img-linux-gnu.
989 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
990 Triple.getEnvironment() == llvm::Triple::GNU) {
991 DefMips32CPU = "mips32r6";
992 DefMips64CPU = "mips64r6";
993 }
994
Brad Smithba26f582015-01-06 02:53:17 +0000995 // MIPS3 is the default for mips64*-unknown-openbsd.
996 if (Triple.getOS() == llvm::Triple::OpenBSD)
997 DefMips64CPU = "mips3";
998
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000999 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001000 options::OPT_mcpu_EQ))
1001 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001002
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001003 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001004 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001005 // Convert a GNU style Mips ABI name to the name
1006 // accepted by LLVM Mips backend.
1007 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1008 .Case("32", "o32")
1009 .Case("64", "n64")
1010 .Default(ABIName);
1011 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001012
1013 // Setup default CPU and ABI names.
1014 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001015 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001016 default:
1017 llvm_unreachable("Unexpected triple arch name");
1018 case llvm::Triple::mips:
1019 case llvm::Triple::mipsel:
1020 CPUName = DefMips32CPU;
1021 break;
1022 case llvm::Triple::mips64:
1023 case llvm::Triple::mips64el:
1024 CPUName = DefMips64CPU;
1025 break;
1026 }
1027 }
1028
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001029 if (ABIName.empty()) {
1030 // Deduce ABI name from the target triple.
1031 if (Triple.getArch() == llvm::Triple::mips ||
1032 Triple.getArch() == llvm::Triple::mipsel)
1033 ABIName = "o32";
1034 else
1035 ABIName = "n64";
1036 }
1037
1038 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001039 // Deduce CPU name from ABI name.
1040 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001041 .Cases("o32", "eabi", DefMips32CPU)
1042 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001043 .Default("");
1044 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001045
1046 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001047}
1048
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001049// Convert ABI name to the GNU tools acceptable variant.
1050static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1051 return llvm::StringSwitch<llvm::StringRef>(ABI)
1052 .Case("o32", "32")
1053 .Case("n64", "64")
1054 .Default(ABI);
1055}
1056
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001057// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1058// and -mfloat-abi=.
1059static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001060 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001061 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001062 options::OPT_mhard_float,
1063 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001064 if (A->getOption().matches(options::OPT_msoft_float))
1065 FloatABI = "soft";
1066 else if (A->getOption().matches(options::OPT_mhard_float))
1067 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001068 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001069 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001070 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001071 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001072 FloatABI = "hard";
1073 }
1074 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001075 }
1076
1077 // If unspecified, choose the default based on the platform.
1078 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001079 // Assume "hard", because it's a default value used by gcc.
1080 // When we start to recognize specific target MIPS processors,
1081 // we will be able to select the default more correctly.
1082 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001083 }
1084
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001085 return FloatABI;
1086}
1087
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001088static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001089 std::vector<const char *> &Features,
1090 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001091 StringRef FeatureName) {
1092 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001093 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001094 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001095 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001096 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001097 }
1098}
1099
Daniel Sanders379d44b2014-07-16 11:52:23 +00001100static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1101 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001102 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001103 StringRef CPUName;
1104 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001105 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001106 ABIName = getGnuCompatibleMipsABIName(ABIName);
1107
Daniel Sandersfeb61302014-08-08 15:47:17 +00001108 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1109 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001110
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001111 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001112 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001113 // FIXME: Note, this is a hack. We need to pass the selected float
1114 // mode to the MipsTargetInfoBase to define appropriate macros there.
1115 // Now it is the only method.
1116 Features.push_back("+soft-float");
1117 }
1118
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001119 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001120 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001121 if (Val == "2008") {
1122 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1123 Features.push_back("+nan2008");
1124 else {
1125 Features.push_back("-nan2008");
1126 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1127 }
1128 } else if (Val == "legacy") {
1129 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1130 Features.push_back("-nan2008");
1131 else {
1132 Features.push_back("+nan2008");
1133 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1134 }
1135 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001136 D.Diag(diag::err_drv_unsupported_option_argument)
1137 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001138 }
1139
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001140 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1141 options::OPT_mdouble_float, "single-float");
1142 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1143 "mips16");
1144 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1145 options::OPT_mno_micromips, "micromips");
1146 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1147 "dsp");
1148 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1149 "dspr2");
1150 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1151 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001152
1153 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1154 // pass -mfpxx
1155 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1156 options::OPT_mfp64)) {
1157 if (A->getOption().matches(options::OPT_mfp32))
1158 Features.push_back(Args.MakeArgString("-fp64"));
1159 else if (A->getOption().matches(options::OPT_mfpxx)) {
1160 Features.push_back(Args.MakeArgString("+fpxx"));
1161 Features.push_back(Args.MakeArgString("+nooddspreg"));
1162 } else
1163 Features.push_back(Args.MakeArgString("+fp64"));
1164 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001165 Features.push_back(Args.MakeArgString("+fpxx"));
1166 Features.push_back(Args.MakeArgString("+nooddspreg"));
1167 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001168
Daniel Sanders28e5d392014-07-10 10:39:51 +00001169 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1170 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001171}
1172
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001173void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001174 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001175 const Driver &D = getToolChain().getDriver();
1176 StringRef CPUName;
1177 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001178 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001179 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001180
1181 CmdArgs.push_back("-target-abi");
1182 CmdArgs.push_back(ABIName.data());
1183
1184 StringRef FloatABI = getMipsFloatABI(D, Args);
1185
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001186 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001187 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001188 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001189 CmdArgs.push_back("-mfloat-abi");
1190 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001191 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001192 else {
1193 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001194 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001195 CmdArgs.push_back("-mfloat-abi");
1196 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001197 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001198
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001199 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1200 if (A->getOption().matches(options::OPT_mxgot)) {
1201 CmdArgs.push_back("-mllvm");
1202 CmdArgs.push_back("-mxgot");
1203 }
1204 }
1205
Simon Atanasyanc580b322013-05-11 06:33:44 +00001206 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1207 options::OPT_mno_ldc1_sdc1)) {
1208 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1209 CmdArgs.push_back("-mllvm");
1210 CmdArgs.push_back("-mno-ldc1-sdc1");
1211 }
1212 }
1213
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001214 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1215 options::OPT_mno_check_zero_division)) {
1216 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1217 CmdArgs.push_back("-mllvm");
1218 CmdArgs.push_back("-mno-check-zero-division");
1219 }
1220 }
1221
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001222 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001223 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001224 CmdArgs.push_back("-mllvm");
1225 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1226 A->claim();
1227 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001228}
1229
Hal Finkel8eb59282012-06-11 22:35:19 +00001230/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1231static std::string getPPCTargetCPU(const ArgList &Args) {
1232 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001233 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001234
1235 if (CPUName == "native") {
1236 std::string CPU = llvm::sys::getHostCPUName();
1237 if (!CPU.empty() && CPU != "generic")
1238 return CPU;
1239 else
1240 return "";
1241 }
1242
1243 return llvm::StringSwitch<const char *>(CPUName)
1244 .Case("common", "generic")
1245 .Case("440", "440")
1246 .Case("440fp", "440")
1247 .Case("450", "450")
1248 .Case("601", "601")
1249 .Case("602", "602")
1250 .Case("603", "603")
1251 .Case("603e", "603e")
1252 .Case("603ev", "603ev")
1253 .Case("604", "604")
1254 .Case("604e", "604e")
1255 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001256 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001257 .Case("G3", "g3")
1258 .Case("7400", "7400")
1259 .Case("G4", "g4")
1260 .Case("7450", "7450")
1261 .Case("G4+", "g4+")
1262 .Case("750", "750")
1263 .Case("970", "970")
1264 .Case("G5", "g5")
1265 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001266 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001267 .Case("e500mc", "e500mc")
1268 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001269 .Case("power3", "pwr3")
1270 .Case("power4", "pwr4")
1271 .Case("power5", "pwr5")
1272 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001273 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001274 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001275 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001276 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001277 .Case("pwr3", "pwr3")
1278 .Case("pwr4", "pwr4")
1279 .Case("pwr5", "pwr5")
1280 .Case("pwr5x", "pwr5x")
1281 .Case("pwr6", "pwr6")
1282 .Case("pwr6x", "pwr6x")
1283 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001284 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001285 .Case("powerpc", "ppc")
1286 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001287 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001288 .Default("");
1289 }
1290
1291 return "";
1292}
1293
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001294static void getPPCTargetFeatures(const ArgList &Args,
1295 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001296 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1297 ie = Args.filtered_end();
1298 it != ie; ++it) {
1299 StringRef Name = (*it)->getOption().getName();
1300 (*it)->claim();
1301
1302 // Skip over "-m".
1303 assert(Name.startswith("m") && "Invalid feature name.");
1304 Name = Name.substr(1);
1305
1306 bool IsNegative = Name.startswith("no-");
1307 if (IsNegative)
1308 Name = Name.substr(3);
1309
1310 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1311 // pass the correct option to the backend while calling the frontend
1312 // option the same.
1313 // TODO: Change the LLVM backend option maybe?
1314 if (Name == "mfcrf")
1315 Name = "mfocrf";
1316
1317 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1318 }
1319
1320 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001321 AddTargetFeature(Args, Features, options::OPT_faltivec,
1322 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001323}
1324
Ulrich Weigand8afad612014-07-28 13:17:52 +00001325void Clang::AddPPCTargetArgs(const ArgList &Args,
1326 ArgStringList &CmdArgs) const {
1327 // Select the ABI to use.
1328 const char *ABIName = nullptr;
1329 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1330 ABIName = A->getValue();
1331 } else if (getToolChain().getTriple().isOSLinux())
1332 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001333 case llvm::Triple::ppc64: {
1334 // When targeting a processor that supports QPX, or if QPX is
1335 // specifically enabled, default to using the ABI that supports QPX (so
1336 // long as it is not specifically disabled).
1337 bool HasQPX = false;
1338 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1339 HasQPX = A->getValue() == StringRef("a2q");
1340 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1341 if (HasQPX) {
1342 ABIName = "elfv1-qpx";
1343 break;
1344 }
1345
Ulrich Weigand8afad612014-07-28 13:17:52 +00001346 ABIName = "elfv1";
1347 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001348 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001349 case llvm::Triple::ppc64le:
1350 ABIName = "elfv2";
1351 break;
1352 default:
1353 break;
1354 }
1355
1356 if (ABIName) {
1357 CmdArgs.push_back("-target-abi");
1358 CmdArgs.push_back(ABIName);
1359 }
1360}
1361
1362bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1363 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1364 return A && (A->getValue() == StringRef(Value));
1365}
1366
Tom Stellard6674c702013-04-01 20:56:53 +00001367/// Get the (LLVM) name of the R600 gpu we are targeting.
1368static std::string getR600TargetGPU(const ArgList &Args) {
1369 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001370 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001371 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001372 .Cases("rv630", "rv635", "r600")
1373 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001374 .Case("rv740", "rv770")
1375 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001376 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001377 .Case("hemlock", "cypress")
1378 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001379 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001380 }
1381 return "";
1382}
1383
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001384static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001385 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001386 bool SoftFloatABI = true;
1387 if (Arg *A =
1388 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1389 if (A->getOption().matches(options::OPT_mhard_float))
1390 SoftFloatABI = false;
1391 }
1392 if (SoftFloatABI)
1393 Features.push_back("+soft-float");
1394}
1395
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001396void Clang::AddSparcTargetArgs(const ArgList &Args,
1397 ArgStringList &CmdArgs) const {
1398 const Driver &D = getToolChain().getDriver();
1399
Brad Smith10cd0f42014-07-11 20:12:08 +00001400 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001401 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001402 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1403 options::OPT_mhard_float)) {
1404 if (A->getOption().matches(options::OPT_msoft_float))
1405 FloatABI = "soft";
1406 else if (A->getOption().matches(options::OPT_mhard_float))
1407 FloatABI = "hard";
1408 }
1409
1410 // If unspecified, choose the default based on the platform.
1411 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001412 // Assume "soft", but warn the user we are guessing.
1413 FloatABI = "soft";
1414 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001415 }
1416
1417 if (FloatABI == "soft") {
1418 // Floating point operations and argument passing are soft.
1419 //
1420 // FIXME: This changes CPP defines, we need -target-soft-float.
1421 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001422 } else {
1423 assert(FloatABI == "hard" && "Invalid float abi!");
1424 CmdArgs.push_back("-mhard-float");
1425 }
1426}
1427
Richard Sandiford4652d892013-07-19 16:51:51 +00001428static const char *getSystemZTargetCPU(const ArgList &Args) {
1429 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1430 return A->getValue();
1431 return "z10";
1432}
1433
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001434static void getSystemZTargetFeatures(const ArgList &Args,
1435 std::vector<const char *> &Features) {
1436 // -m(no-)htm overrides use of the transactional-execution facility.
1437 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1438 options::OPT_mno_htm)) {
1439 if (A->getOption().matches(options::OPT_mhtm))
1440 Features.push_back("+transactional-execution");
1441 else
1442 Features.push_back("-transactional-execution");
1443 }
1444}
1445
Chandler Carruth953fb082013-01-13 11:46:33 +00001446static const char *getX86TargetCPU(const ArgList &Args,
1447 const llvm::Triple &Triple) {
1448 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001449 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001450 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001451 return "core-avx2";
1452
Chandler Carruth953fb082013-01-13 11:46:33 +00001453 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001454 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001455
1456 // FIXME: Reject attempts to use -march=native unless the target matches
1457 // the host.
1458 //
1459 // FIXME: We should also incorporate the detected target features for use
1460 // with -native.
1461 std::string CPU = llvm::sys::getHostCPUName();
1462 if (!CPU.empty() && CPU != "generic")
1463 return Args.MakeArgString(CPU);
1464 }
1465
1466 // Select the default CPU if none was given (or detection failed).
1467
1468 if (Triple.getArch() != llvm::Triple::x86_64 &&
1469 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001470 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001471
1472 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1473
1474 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001475 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001476 if (Triple.getArchName() == "x86_64h")
1477 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001478 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001479 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001480
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001481 // Set up default CPU name for PS4 compilers.
1482 if (Triple.isPS4CPU())
1483 return "btver2";
1484
Alexey Bataev286d1b92014-01-31 04:07:13 +00001485 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001486 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001487 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001488
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001489 // Everything else goes to x86-64 in 64-bit mode.
1490 if (Is64Bit)
1491 return "x86-64";
1492
1493 switch (Triple.getOS()) {
1494 case llvm::Triple::FreeBSD:
1495 case llvm::Triple::NetBSD:
1496 case llvm::Triple::OpenBSD:
1497 return "i486";
1498 case llvm::Triple::Haiku:
1499 return "i586";
1500 case llvm::Triple::Bitrig:
1501 return "i686";
1502 default:
1503 // Fallback to p4.
1504 return "pentium4";
1505 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001506}
1507
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001508static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1509 switch(T.getArch()) {
1510 default:
1511 return "";
1512
Amara Emerson703da2e2013-10-31 09:32:33 +00001513 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001514 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001515 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001516
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001517 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001518 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001519 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001520 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001521 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001522
1523 case llvm::Triple::mips:
1524 case llvm::Triple::mipsel:
1525 case llvm::Triple::mips64:
1526 case llvm::Triple::mips64el: {
1527 StringRef CPUName;
1528 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001529 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001530 return CPUName;
1531 }
1532
1533 case llvm::Triple::ppc:
1534 case llvm::Triple::ppc64:
1535 case llvm::Triple::ppc64le: {
1536 std::string TargetCPUName = getPPCTargetCPU(Args);
1537 // LLVM may default to generating code for the native CPU,
1538 // but, like gcc, we default to a more generic option for
1539 // each architecture. (except on Darwin)
1540 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1541 if (T.getArch() == llvm::Triple::ppc64)
1542 TargetCPUName = "ppc64";
1543 else if (T.getArch() == llvm::Triple::ppc64le)
1544 TargetCPUName = "ppc64le";
1545 else
1546 TargetCPUName = "ppc";
1547 }
1548 return TargetCPUName;
1549 }
1550
1551 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001552 case llvm::Triple::sparcv9:
1553 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001554 return A->getValue();
1555 return "";
1556
1557 case llvm::Triple::x86:
1558 case llvm::Triple::x86_64:
1559 return getX86TargetCPU(Args, T);
1560
1561 case llvm::Triple::hexagon:
1562 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1563
1564 case llvm::Triple::systemz:
1565 return getSystemZTargetCPU(Args);
1566
1567 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001568 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001569 return getR600TargetGPU(Args);
1570 }
1571}
1572
Alp Tokerce365ca2013-12-02 12:43:03 +00001573static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1574 ArgStringList &CmdArgs) {
1575 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1576 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1577 // forward.
1578 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001579 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001580 CmdArgs.push_back(Args.MakeArgString(Plugin));
1581
1582 // Try to pass driver level flags relevant to LTO code generation down to
1583 // the plugin.
1584
1585 // Handle flags for selecting CPU variants.
1586 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1587 if (!CPU.empty())
1588 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1589}
1590
Eric Christopherc54920a2015-03-23 19:26:05 +00001591static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001592 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001593 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001594 // If -march=native, autodetect the feature list.
1595 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1596 if (StringRef(A->getValue()) == "native") {
1597 llvm::StringMap<bool> HostFeatures;
1598 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1599 for (auto &F : HostFeatures)
1600 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1601 F.first()));
1602 }
1603 }
1604
Jim Grosbach82eee262013-11-16 00:53:35 +00001605 if (Triple.getArchName() == "x86_64h") {
1606 // x86_64h implies quite a few of the more modern subtarget features
1607 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1608 Features.push_back("-rdrnd");
1609 Features.push_back("-aes");
1610 Features.push_back("-pclmul");
1611 Features.push_back("-rtm");
1612 Features.push_back("-hle");
1613 Features.push_back("-fsgsbase");
1614 }
1615
Eric Christopherc54920a2015-03-23 19:26:05 +00001616 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001617 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001618 if (Triple.getArch() == llvm::Triple::x86_64) {
1619 Features.push_back("+sse4.2");
1620 Features.push_back("+popcnt");
1621 } else
1622 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001623 }
1624
Eric Christopherc54920a2015-03-23 19:26:05 +00001625 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001626 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1627 StringRef Arch = A->getValue();
1628 bool ArchUsed = false;
1629 // First, look for flags that are shared in x86 and x86-64.
1630 if (Triple.getArch() == llvm::Triple::x86_64 ||
1631 Triple.getArch() == llvm::Triple::x86) {
1632 if (Arch == "AVX" || Arch == "AVX2") {
1633 ArchUsed = true;
1634 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1635 }
1636 }
1637 // Then, look for x86-specific flags.
1638 if (Triple.getArch() == llvm::Triple::x86) {
1639 if (Arch == "IA32") {
1640 ArchUsed = true;
1641 } else if (Arch == "SSE" || Arch == "SSE2") {
1642 ArchUsed = true;
1643 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1644 }
1645 }
1646 if (!ArchUsed)
1647 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1648 }
1649
Jim Grosbach82eee262013-11-16 00:53:35 +00001650 // Now add any that the user explicitly requested on the command line,
1651 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001652 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1653 ie = Args.filtered_end();
1654 it != ie; ++it) {
1655 StringRef Name = (*it)->getOption().getName();
1656 (*it)->claim();
1657
1658 // Skip over "-m".
1659 assert(Name.startswith("m") && "Invalid feature name.");
1660 Name = Name.substr(1);
1661
1662 bool IsNegative = Name.startswith("no-");
1663 if (IsNegative)
1664 Name = Name.substr(3);
1665
1666 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1667 }
1668}
1669
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001670void Clang::AddX86TargetArgs(const ArgList &Args,
1671 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001672 if (!Args.hasFlag(options::OPT_mred_zone,
1673 options::OPT_mno_red_zone,
1674 true) ||
1675 Args.hasArg(options::OPT_mkernel) ||
1676 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001677 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001678
Bob Wilson2616e2e2013-02-10 16:01:41 +00001679 // Default to avoid implicit floating-point for kernel/kext code, but allow
1680 // that to be overridden with -mno-soft-float.
1681 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1682 Args.hasArg(options::OPT_fapple_kext));
1683 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1684 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001685 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001686 options::OPT_mno_implicit_float)) {
1687 const Option &O = A->getOption();
1688 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1689 O.matches(options::OPT_msoft_float));
1690 }
1691 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001692 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001693
1694 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1695 StringRef Value = A->getValue();
1696 if (Value == "intel" || Value == "att") {
1697 CmdArgs.push_back("-mllvm");
1698 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1699 } else {
1700 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1701 << A->getOption().getName() << Value;
1702 }
1703 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001704}
1705
Matthew Curtise8f80a12012-12-06 17:49:03 +00001706static inline bool HasPICArg(const ArgList &Args) {
1707 return Args.hasArg(options::OPT_fPIC)
1708 || Args.hasArg(options::OPT_fpic);
1709}
1710
1711static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1712 return Args.getLastArg(options::OPT_G,
1713 options::OPT_G_EQ,
1714 options::OPT_msmall_data_threshold_EQ);
1715}
1716
1717static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1718 std::string value;
1719 if (HasPICArg(Args))
1720 value = "0";
1721 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1722 value = A->getValue();
1723 A->claim();
1724 }
1725 return value;
1726}
1727
Tony Linthicum76329bf2011-12-12 21:14:55 +00001728void Clang::AddHexagonTargetArgs(const ArgList &Args,
1729 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001730 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001731 CmdArgs.push_back("-mqdsp6-compat");
1732 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001733
Matthew Curtise8f80a12012-12-06 17:49:03 +00001734 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1735 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001736 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001737 CmdArgs.push_back(Args.MakeArgString(
1738 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001739 }
1740
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001741 if (!Args.hasArg(options::OPT_fno_short_enums))
1742 CmdArgs.push_back("-fshort-enums");
1743 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1744 CmdArgs.push_back ("-mllvm");
1745 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1746 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001747 CmdArgs.push_back ("-mllvm");
1748 CmdArgs.push_back ("-machine-sink-split=0");
1749}
1750
Kevin Qin110db6f2014-07-18 07:03:22 +00001751// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001752static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001753 std::vector<const char *> &Features) {
1754 SmallVector<StringRef, 8> Split;
1755 text.split(Split, StringRef("+"), -1, false);
1756
1757 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1758 const char *result = llvm::StringSwitch<const char *>(Split[I])
1759 .Case("fp", "+fp-armv8")
1760 .Case("simd", "+neon")
1761 .Case("crc", "+crc")
1762 .Case("crypto", "+crypto")
1763 .Case("nofp", "-fp-armv8")
1764 .Case("nosimd", "-neon")
1765 .Case("nocrc", "-crc")
1766 .Case("nocrypto", "-crypto")
1767 .Default(nullptr);
1768 if (result)
1769 Features.push_back(result);
1770 else if (Split[I] == "neon" || Split[I] == "noneon")
1771 D.Diag(diag::err_drv_no_neon_modifier);
1772 else
1773 return false;
1774 }
1775 return true;
1776}
1777
1778// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1779// decode CPU and feature.
1780static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1781 std::vector<const char *> &Features) {
1782 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1783 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001784 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001785 Features.push_back("+neon");
1786 Features.push_back("+crc");
1787 Features.push_back("+crypto");
1788 } else if (CPU == "generic") {
1789 Features.push_back("+neon");
1790 } else {
1791 return false;
1792 }
1793
1794 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1795 return false;
1796
1797 return true;
1798}
1799
1800static bool
1801getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1802 const ArgList &Args,
1803 std::vector<const char *> &Features) {
1804 std::pair<StringRef, StringRef> Split = March.split("+");
1805 if (Split.first != "armv8-a")
1806 return false;
1807
1808 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1809 return false;
1810
1811 return true;
1812}
1813
1814static bool
1815getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1816 const ArgList &Args,
1817 std::vector<const char *> &Features) {
1818 StringRef CPU;
1819 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1820 return false;
1821
1822 return true;
1823}
1824
1825static bool
1826getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1827 const ArgList &Args,
1828 std::vector<const char *> &Features) {
1829 // Handle CPU name is 'native'.
1830 if (Mtune == "native")
1831 Mtune = llvm::sys::getHostCPUName();
1832 if (Mtune == "cyclone") {
1833 Features.push_back("+zcm");
1834 Features.push_back("+zcz");
1835 }
1836 return true;
1837}
1838
1839static bool
1840getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1841 const ArgList &Args,
1842 std::vector<const char *> &Features) {
1843 StringRef CPU;
1844 std::vector<const char *> DecodedFeature;
1845 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1846 return false;
1847
1848 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1849}
1850
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001851static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1852 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001853 Arg *A;
1854 bool success = true;
1855 // Enable NEON by default.
1856 Features.push_back("+neon");
1857 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1858 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1859 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1860 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001861 else if (Args.hasArg(options::OPT_arch))
1862 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1863 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001864
1865 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1866 success =
1867 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1868 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1869 success =
1870 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001871 else if (Args.hasArg(options::OPT_arch))
1872 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1873 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001874
1875 if (!success)
1876 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001877
1878 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1879 Features.push_back("-fp-armv8");
1880 Features.push_back("-crypto");
1881 Features.push_back("-neon");
1882 }
Bradley Smith418c5932014-05-02 15:17:51 +00001883
1884 // En/disable crc
1885 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1886 options::OPT_mnocrc)) {
1887 if (A->getOption().matches(options::OPT_mcrc))
1888 Features.push_back("+crc");
1889 else
1890 Features.push_back("-crc");
1891 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001892}
1893
1894static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001895 const ArgList &Args, ArgStringList &CmdArgs,
1896 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001897 std::vector<const char *> Features;
1898 switch (Triple.getArch()) {
1899 default:
1900 break;
1901 case llvm::Triple::mips:
1902 case llvm::Triple::mipsel:
1903 case llvm::Triple::mips64:
1904 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001905 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001906 break;
1907
1908 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001909 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001910 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001911 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001912 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001913 break;
1914
1915 case llvm::Triple::ppc:
1916 case llvm::Triple::ppc64:
1917 case llvm::Triple::ppc64le:
1918 getPPCTargetFeatures(Args, Features);
1919 break;
1920 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001921 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001922 getSparcTargetFeatures(Args, Features);
1923 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001924 case llvm::Triple::systemz:
1925 getSystemZTargetFeatures(Args, Features);
1926 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001927 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001928 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001929 getAArch64TargetFeatures(D, Args, Features);
1930 break;
1931 case llvm::Triple::x86:
1932 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001933 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001934 break;
1935 }
Rafael Espindola43964802013-08-21 17:34:32 +00001936
1937 // Find the last of each feature.
1938 llvm::StringMap<unsigned> LastOpt;
1939 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1940 const char *Name = Features[I];
1941 assert(Name[0] == '-' || Name[0] == '+');
1942 LastOpt[Name + 1] = I;
1943 }
1944
1945 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1946 // If this feature was overridden, ignore it.
1947 const char *Name = Features[I];
1948 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1949 assert(LastI != LastOpt.end());
1950 unsigned Last = LastI->second;
1951 if (Last != I)
1952 continue;
1953
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001954 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001955 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001956 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001957}
1958
David Majnemerae394812014-12-09 00:12:30 +00001959static bool
1960shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1961 const llvm::Triple &Triple) {
1962 // We use the zero-cost exception tables for Objective-C if the non-fragile
1963 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1964 // later.
1965 if (runtime.isNonFragile())
1966 return true;
1967
1968 if (!Triple.isMacOSX())
1969 return false;
1970
1971 return (!Triple.isMacOSXVersionLT(10,5) &&
1972 (Triple.getArch() == llvm::Triple::x86_64 ||
1973 Triple.getArch() == llvm::Triple::arm));
1974}
1975
Nico Webere8e53112014-05-11 01:04:02 +00001976// exceptionSettings() exists to share the logic between -cc1 and linker
1977// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001978static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001979 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001980 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001981 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001982 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001983
David Majnemer8de68642014-12-05 08:11:58 +00001984 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001985}
1986
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001987/// Adds exception related arguments to the driver command arguments. There's a
1988/// master flag, -fexceptions and also language specific flags to enable/disable
1989/// C++ and Objective-C exceptions. This makes it possible to for example
1990/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00001991static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001992 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001993 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001994 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001995 const Driver &D = TC.getDriver();
1996 const llvm::Triple &Triple = TC.getTriple();
1997
Chad Rosier4fab82c2012-03-26 22:04:46 +00001998 if (KernelOrKext) {
1999 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2000 // arguments now to avoid warnings about unused arguments.
2001 Args.ClaimAllArgs(options::OPT_fexceptions);
2002 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2003 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2004 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2005 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2006 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002007 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002008 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002009
David Majnemer8de68642014-12-05 08:11:58 +00002010 // Gather the exception settings from the command line arguments.
2011 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002012
David Majnemerae394812014-12-09 00:12:30 +00002013 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2014 // is not necessarily sensible, but follows GCC.
2015 if (types::isObjC(InputType) &&
2016 Args.hasFlag(options::OPT_fobjc_exceptions,
2017 options::OPT_fno_objc_exceptions,
2018 true)) {
2019 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002020
David Majnemerae394812014-12-09 00:12:30 +00002021 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002022 }
2023
2024 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002025 bool CXXExceptionsEnabled =
2026 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002027 Arg *ExceptionArg = Args.getLastArg(
2028 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2029 options::OPT_fexceptions, options::OPT_fno_exceptions);
2030 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002031 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002032 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2033 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002034
2035 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002036 if (Triple.isPS4CPU()) {
2037 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2038 assert(ExceptionArg &&
2039 "On the PS4 exceptions should only be enabled if passing "
2040 "an argument");
2041 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2042 const Arg *RTTIArg = TC.getRTTIArg();
2043 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2044 D.Diag(diag::err_drv_argument_not_allowed_with)
2045 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2046 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2047 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2048 } else
2049 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2050
Anders Carlssone96ab552011-02-28 02:27:16 +00002051 CmdArgs.push_back("-fcxx-exceptions");
2052
David Majnemer8de68642014-12-05 08:11:58 +00002053 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002054 }
2055 }
2056
David Majnemer8de68642014-12-05 08:11:58 +00002057 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002058 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002059}
2060
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002061static bool ShouldDisableAutolink(const ArgList &Args,
2062 const ToolChain &TC) {
2063 bool Default = true;
2064 if (TC.getTriple().isOSDarwin()) {
2065 // The native darwin assembler doesn't support the linker_option directives,
2066 // so we disable them if we think the .s file will be passed to it.
2067 Default = TC.useIntegratedAs();
2068 }
2069 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2070 Default);
2071}
2072
Ted Kremenek62093662013-03-12 17:02:12 +00002073static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2074 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002075 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2076 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002077 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002078 return !UseDwarfDirectory;
2079}
2080
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002081/// \brief Check whether the given input tree contains any compilation actions.
2082static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002083 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002084 return true;
2085
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002086 for (const auto &Act : *A)
2087 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002088 return true;
2089
2090 return false;
2091}
2092
2093/// \brief Check if -relax-all should be passed to the internal assembler.
2094/// This is done by default when compiling non-assembler source with -O0.
2095static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2096 bool RelaxDefault = true;
2097
2098 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2099 RelaxDefault = A->getOption().matches(options::OPT_O0);
2100
2101 if (RelaxDefault) {
2102 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002103 for (const auto &Act : C.getActions()) {
2104 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002105 RelaxDefault = true;
2106 break;
2107 }
2108 }
2109 }
2110
2111 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2112 RelaxDefault);
2113}
2114
David Blaikie9260ed62013-07-25 21:19:01 +00002115static void CollectArgsForIntegratedAssembler(Compilation &C,
2116 const ArgList &Args,
2117 ArgStringList &CmdArgs,
2118 const Driver &D) {
2119 if (UseRelaxAll(C, Args))
2120 CmdArgs.push_back("-mrelax-all");
2121
David Peixottodfb66142013-11-14 22:52:58 +00002122 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002123 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002124 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2125 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2126 // arg after parsing the '-I' arg.
2127 bool TakeNextArg = false;
2128
David Blaikie9260ed62013-07-25 21:19:01 +00002129 // When using an integrated assembler, translate -Wa, and -Xassembler
2130 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002131 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002132 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2133 options::OPT_Xassembler),
2134 ie = Args.filtered_end(); it != ie; ++it) {
2135 const Arg *A = *it;
2136 A->claim();
2137
2138 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2139 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002140 if (TakeNextArg) {
2141 CmdArgs.push_back(Value.data());
2142 TakeNextArg = false;
2143 continue;
2144 }
David Blaikie9260ed62013-07-25 21:19:01 +00002145
2146 if (Value == "-force_cpusubtype_ALL") {
2147 // Do nothing, this is the default and we don't support anything else.
2148 } else if (Value == "-L") {
2149 CmdArgs.push_back("-msave-temp-labels");
2150 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002151 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002152 } else if (Value == "--noexecstack") {
2153 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002154 } else if (Value == "-compress-debug-sections" ||
2155 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002156 CompressDebugSections = true;
2157 } else if (Value == "-nocompress-debug-sections" ||
2158 Value == "--nocompress-debug-sections") {
2159 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002160 } else if (Value.startswith("-I")) {
2161 CmdArgs.push_back(Value.data());
2162 // We need to consume the next argument if the current arg is a plain
2163 // -I. The next arg will be the include directory.
2164 if (Value == "-I")
2165 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002166 } else if (Value.startswith("-gdwarf-")) {
2167 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002168 } else {
2169 D.Diag(diag::err_drv_unsupported_option_argument)
2170 << A->getOption().getName() << Value;
2171 }
2172 }
2173 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002174 if (CompressDebugSections) {
2175 if (llvm::zlib::isAvailable())
2176 CmdArgs.push_back("-compress-debug-sections");
2177 else
2178 D.Diag(diag::warn_debug_compression_unavailable);
2179 }
David Blaikie9260ed62013-07-25 21:19:01 +00002180}
2181
Renato Goline807c122014-01-31 11:47:28 +00002182// Until ARM libraries are build separately, we have them all in one library
2183static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002184 // FIXME: handle 64-bit
2185 if (TC.getTriple().isOSWindows() &&
2186 !TC.getTriple().isWindowsItaniumEnvironment())
2187 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002188 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002189 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002190 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002191}
2192
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002193static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2194 // The runtimes are located in the OS-specific resource directory.
2195 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002196 const llvm::Triple &Triple = TC.getTriple();
2197 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002198 StringRef OSLibName =
2199 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002200 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002201 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002202}
2203
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002204static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002205 bool Shared = false) {
2206 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2207 ? "-android"
2208 : "";
2209
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002210 bool IsOSWindows = TC.getTriple().isOSWindows();
2211 StringRef Arch = getArchNameForCompilerRTLib(TC);
2212 const char *Prefix = IsOSWindows ? "" : "lib";
2213 const char *Suffix =
2214 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2215
2216 SmallString<128> Path = getCompilerRTLibDir(TC);
2217 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2218 Arch + Env + Suffix);
2219
2220 return Path;
2221}
2222
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002223// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002224// FIXME: Make sure we can also emit shared objects if they're requested
2225// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002226static void addClangRT(const ToolChain &TC, const ArgList &Args,
2227 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002228 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002229
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002230 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002231 // FIXME: why do we link against gcc when we are using compiler-rt?
2232 CmdArgs.push_back("-lgcc_s");
2233 if (TC.getDriver().CCCIsCXX())
2234 CmdArgs.push_back("-lgcc_eh");
2235 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002236}
2237
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002238static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2239 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002240 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2241 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002242 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002243 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002244 Args.hasArg(options::OPT_fcreate_profile) ||
2245 Args.hasArg(options::OPT_coverage)))
2246 return;
2247
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002248 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002249}
2250
Alexey Samsonov52550342014-09-15 19:58:40 +00002251static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2252 ArgStringList &CmdArgs, StringRef Sanitizer,
2253 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002254 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002255 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002256 if (!IsShared)
2257 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002258 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002259 if (!IsShared)
2260 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002261}
2262
Alexey Samsonov52550342014-09-15 19:58:40 +00002263// Tries to use a file with the list of dynamic symbols that need to be exported
2264// from the runtime library. Returns true if the file was found.
2265static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2266 ArgStringList &CmdArgs,
2267 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002268 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2269 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2270 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002271 return true;
2272 }
2273 return false;
2274}
2275
2276static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2277 ArgStringList &CmdArgs) {
2278 // Force linking against the system libraries sanitizers depends on
2279 // (see PR15823 why this is necessary).
2280 CmdArgs.push_back("--no-as-needed");
2281 CmdArgs.push_back("-lpthread");
2282 CmdArgs.push_back("-lrt");
2283 CmdArgs.push_back("-lm");
2284 // There's no libdl on FreeBSD.
2285 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2286 CmdArgs.push_back("-ldl");
2287}
2288
2289static void
2290collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2291 SmallVectorImpl<StringRef> &SharedRuntimes,
2292 SmallVectorImpl<StringRef> &StaticRuntimes,
2293 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2294 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2295 // Collect shared runtimes.
2296 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2297 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002298 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002299
Alexey Samsonov52550342014-09-15 19:58:40 +00002300 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002301 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002302 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2303 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002304 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002305 }
2306 if (SanArgs.needsAsanRt()) {
2307 if (SanArgs.needsSharedAsanRt()) {
2308 HelperStaticRuntimes.push_back("asan-preinit");
2309 } else {
2310 StaticRuntimes.push_back("asan");
2311 if (SanArgs.linkCXXRuntimes())
2312 StaticRuntimes.push_back("asan_cxx");
2313 }
2314 }
2315 if (SanArgs.needsDfsanRt())
2316 StaticRuntimes.push_back("dfsan");
2317 if (SanArgs.needsLsanRt())
2318 StaticRuntimes.push_back("lsan");
2319 if (SanArgs.needsMsanRt())
2320 StaticRuntimes.push_back("msan");
2321 if (SanArgs.needsTsanRt())
2322 StaticRuntimes.push_back("tsan");
Alexey Samsonov52550342014-09-15 19:58:40 +00002323 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002324 StaticRuntimes.push_back("ubsan_standalone");
2325 if (SanArgs.linkCXXRuntimes())
2326 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002327 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002328}
2329
Alexey Samsonov52550342014-09-15 19:58:40 +00002330// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2331// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2332static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002333 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002334 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2335 HelperStaticRuntimes;
2336 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2337 HelperStaticRuntimes);
2338 for (auto RT : SharedRuntimes)
2339 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2340 for (auto RT : HelperStaticRuntimes)
2341 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2342 bool AddExportDynamic = false;
2343 for (auto RT : StaticRuntimes) {
2344 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2345 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2346 }
2347 // If there is a static runtime with no dynamic list, force all the symbols
2348 // to be dynamic to be sure we export sanitizer interface functions.
2349 if (AddExportDynamic)
2350 CmdArgs.push_back("-export-dynamic");
2351 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002352}
2353
Reid Kleckner86ea7702015-02-04 23:45:07 +00002354static bool areOptimizationsEnabled(const ArgList &Args) {
2355 // Find the last -O arg and see if it is non-zero.
2356 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2357 return !A->getOption().matches(options::OPT_O0);
2358 // Defaults to -O0.
2359 return false;
2360}
2361
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002362static bool shouldUseFramePointerForTarget(const ArgList &Args,
2363 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002364 // XCore never wants frame pointers, regardless of OS.
2365 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002366 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002367 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002368
2369 if (Triple.isOSLinux()) {
2370 switch (Triple.getArch()) {
2371 // Don't use a frame pointer on linux if optimizing for certain targets.
2372 case llvm::Triple::mips64:
2373 case llvm::Triple::mips64el:
2374 case llvm::Triple::mips:
2375 case llvm::Triple::mipsel:
2376 case llvm::Triple::systemz:
2377 case llvm::Triple::x86:
2378 case llvm::Triple::x86_64:
2379 return !areOptimizationsEnabled(Args);
2380 default:
2381 return true;
2382 }
2383 }
2384
2385 if (Triple.isOSWindows()) {
2386 switch (Triple.getArch()) {
2387 case llvm::Triple::x86:
2388 return !areOptimizationsEnabled(Args);
2389 default:
2390 // All other supported Windows ISAs use xdata unwind information, so frame
2391 // pointers are not generally useful.
2392 return false;
2393 }
2394 }
2395
2396 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002397}
2398
Rafael Espindola224dd632011-12-14 21:02:23 +00002399static bool shouldUseFramePointer(const ArgList &Args,
2400 const llvm::Triple &Triple) {
2401 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2402 options::OPT_fomit_frame_pointer))
2403 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2404
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002405 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002406}
2407
Eric Christopherb7d97e92013-04-03 01:58:53 +00002408static bool shouldUseLeafFramePointer(const ArgList &Args,
2409 const llvm::Triple &Triple) {
2410 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2411 options::OPT_momit_leaf_frame_pointer))
2412 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2413
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002414 if (Triple.isPS4CPU())
2415 return false;
2416
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002417 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002418}
2419
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002420/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002421static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002422 SmallString<128> cwd;
2423 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002424 CmdArgs.push_back("-fdebug-compilation-dir");
2425 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002426 }
2427}
2428
Eric Christopherd3804002013-02-22 20:12:52 +00002429static const char *SplitDebugName(const ArgList &Args,
2430 const InputInfoList &Inputs) {
2431 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2432 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2433 SmallString<128> T(FinalOutput->getValue());
2434 llvm::sys::path::replace_extension(T, "dwo");
2435 return Args.MakeArgString(T);
2436 } else {
2437 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002438 SmallString<128> T(
2439 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002440 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2441 llvm::sys::path::replace_extension(F, "dwo");
2442 T += F;
2443 return Args.MakeArgString(F);
2444 }
2445}
2446
2447static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2448 const Tool &T, const JobAction &JA,
2449 const ArgList &Args, const InputInfo &Output,
2450 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002451 ArgStringList ExtractArgs;
2452 ExtractArgs.push_back("--extract-dwo");
2453
2454 ArgStringList StripArgs;
2455 StripArgs.push_back("--strip-dwo");
2456
2457 // Grabbing the output of the earlier compile step.
2458 StripArgs.push_back(Output.getFilename());
2459 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002460 ExtractArgs.push_back(OutFile);
2461
2462 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002463 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002464
2465 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002466 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002467
2468 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002469 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002470}
2471
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002472/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002473/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2474static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002475 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002476 if (A->getOption().matches(options::OPT_O4) ||
2477 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002478 return true;
2479
2480 if (A->getOption().matches(options::OPT_O0))
2481 return false;
2482
2483 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2484
Rafael Espindola91780de2013-08-26 14:05:41 +00002485 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002486 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002487 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002488 return true;
2489
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002490 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002491 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002492 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002493
2494 unsigned OptLevel = 0;
2495 if (S.getAsInteger(10, OptLevel))
2496 return false;
2497
2498 return OptLevel > 1;
2499 }
2500
2501 return false;
2502}
2503
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002504/// Add -x lang to \p CmdArgs for \p Input.
2505static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2506 ArgStringList &CmdArgs) {
2507 // When using -verify-pch, we don't want to provide the type
2508 // 'precompiled-header' if it was inferred from the file extension
2509 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2510 return;
2511
2512 CmdArgs.push_back("-x");
2513 if (Args.hasArg(options::OPT_rewrite_objc))
2514 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2515 else
2516 CmdArgs.push_back(types::getTypeName(Input.getType()));
2517}
2518
David Majnemerc371ff02015-03-22 08:39:22 +00002519static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002520 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002521 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002522
2523 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002524 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002525
2526 unsigned Build = 0, Factor = 1;
2527 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2528 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002529 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002530}
2531
Rafael Espindola577637a2015-01-03 00:06:04 +00002532// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002533// options that build systems might add but are unused when assembling or only
2534// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002535static void claimNoWarnArgs(const ArgList &Args) {
2536 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002537 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002538 Args.ClaimAllArgs(options::OPT_flto);
2539 Args.ClaimAllArgs(options::OPT_fno_lto);
2540}
2541
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002542static void appendUserToPath(SmallVectorImpl<char> &Result) {
2543#ifdef LLVM_ON_UNIX
2544 const char *Username = getenv("LOGNAME");
2545#else
2546 const char *Username = getenv("USERNAME");
2547#endif
2548 if (Username) {
2549 // Validate that LoginName can be used in a path, and get its length.
2550 size_t Len = 0;
2551 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002552 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002553 Username = nullptr;
2554 break;
2555 }
2556 }
2557
2558 if (Username && Len > 0) {
2559 Result.append(Username, Username + Len);
2560 return;
2561 }
2562 }
2563
2564 // Fallback to user id.
2565#ifdef LLVM_ON_UNIX
2566 std::string UID = llvm::utostr(getuid());
2567#else
2568 // FIXME: Windows seems to have an 'SID' that might work.
2569 std::string UID = "9999";
2570#endif
2571 Result.append(UID.begin(), UID.end());
2572}
2573
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002574void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002575 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002576 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002577 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002578 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002579 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2580 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002581 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002582 ArgStringList CmdArgs;
2583
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002584 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002585 bool IsWindowsCygnus =
2586 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002587 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2588
Daniel Dunbare521a892009-03-31 20:53:55 +00002589 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2590
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002591 // Invoke ourselves in -cc1 mode.
2592 //
2593 // FIXME: Implement custom jobs for internal actions.
2594 CmdArgs.push_back("-cc1");
2595
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002596 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002597 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002598 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002599 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002600
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002601 const llvm::Triple TT(TripleStr);
2602 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2603 TT.getArch() == llvm::Triple::thumb)) {
2604 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2605 unsigned Version;
2606 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2607 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002608 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2609 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002610 }
2611
Tim Northover336f1892014-03-29 13:16:12 +00002612 // Push all default warning arguments that are specific to
2613 // the given target. These come before user provided warning options
2614 // are provided.
2615 getToolChain().addClangWarningOptions(CmdArgs);
2616
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002617 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002618 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002619
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002620 if (isa<AnalyzeJobAction>(JA)) {
2621 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2622 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002623 } else if (isa<MigrateJobAction>(JA)) {
2624 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002625 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002626 if (Output.getType() == types::TY_Dependencies)
2627 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002628 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002629 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002630 if (Args.hasArg(options::OPT_rewrite_objc) &&
2631 !Args.hasArg(options::OPT_g_Group))
2632 CmdArgs.push_back("-P");
2633 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002634 } else if (isa<AssembleJobAction>(JA)) {
2635 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002636
David Blaikie9260ed62013-07-25 21:19:01 +00002637 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002638
2639 // Also ignore explicit -force_cpusubtype_ALL option.
2640 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002641 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002642 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002643 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002644
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002645 if (JA.getType() == types::TY_Nothing)
2646 CmdArgs.push_back("-fsyntax-only");
2647 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002648 CmdArgs.push_back("-emit-pch");
2649 else
2650 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002651 } else if (isa<VerifyPCHJobAction>(JA)) {
2652 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002653 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002654 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2655 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002656
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002657 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002658 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002659 } else if (JA.getType() == types::TY_LLVM_IR ||
2660 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002661 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002662 } else if (JA.getType() == types::TY_LLVM_BC ||
2663 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002664 CmdArgs.push_back("-emit-llvm-bc");
2665 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002666 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002667 } else if (JA.getType() == types::TY_AST) {
2668 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002669 } else if (JA.getType() == types::TY_ModuleFile) {
2670 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002671 } else if (JA.getType() == types::TY_RewrittenObjC) {
2672 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002673 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002674 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2675 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002676 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002677 } else {
2678 assert(JA.getType() == types::TY_PP_Asm &&
2679 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002680 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002681
2682 // Preserve use-list order by default when emitting bitcode, so that
2683 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2684 // same result as running passes here. For LTO, we don't need to preserve
2685 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002686 if (JA.getType() == types::TY_LLVM_BC)
2687 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002688 }
2689
Justin Bognera88f0122014-06-20 22:59:50 +00002690 // We normally speed up the clang process a bit by skipping destructors at
2691 // exit, but when we're generating diagnostics we can rely on some of the
2692 // cleanup.
2693 if (!C.isForDiagnostics())
2694 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002695
John McCallbb79b5f2010-02-13 03:50:24 +00002696 // Disable the verification pass in -asserts builds.
2697#ifdef NDEBUG
2698 CmdArgs.push_back("-disable-llvm-verifier");
2699#endif
2700
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002701 // Set the main file name, so that debug info works even with
2702 // -save-temps.
2703 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002704 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002705
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002706 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002707 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002708 if (Args.hasArg(options::OPT_static))
2709 CmdArgs.push_back("-static-define");
2710
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002711 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002712 // Enable region store model by default.
2713 CmdArgs.push_back("-analyzer-store=region");
2714
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002715 // Treat blocks as analysis entry points.
2716 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2717
Ted Kremenek49c79792011-03-24 00:28:47 +00002718 CmdArgs.push_back("-analyzer-eagerly-assume");
2719
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002720 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002721 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002722 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002723
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002724 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002725 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002726
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002727 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002728 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002729
2730 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002731
Jordan Rose10ad0812013-04-05 17:55:07 +00002732 if (types::isCXX(Inputs[0].getType()))
2733 CmdArgs.push_back("-analyzer-checker=cplusplus");
2734
Nico Webere8e53112014-05-11 01:04:02 +00002735 // Enable the following experimental checkers for testing.
2736 CmdArgs.push_back(
2737 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002738 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2739 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2740 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2741 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2742 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002743 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002744
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002745 // Set the output format. The default is plist, for (lame) historical
2746 // reasons.
2747 CmdArgs.push_back("-analyzer-output");
2748 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002749 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002750 else
2751 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002752
Ted Kremenekfe449a22010-03-22 22:32:05 +00002753 // Disable the presentation of standard compiler warnings when
2754 // using --analyze. We only want to show static analyzer diagnostics
2755 // or frontend errors.
2756 CmdArgs.push_back("-w");
2757
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002758 // Add -Xanalyzer arguments when running as analyzer.
2759 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002760 }
2761
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002762 CheckCodeGenerationOptions(D, Args);
2763
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002764 bool PIE = getToolChain().isPIEDefault();
2765 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002766 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002767
Alexey Bataev40e75222014-01-28 06:30:35 +00002768 // Android-specific defaults for PIC/PIE
2769 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2770 switch (getToolChain().getTriple().getArch()) {
2771 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002772 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002773 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002774 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002775 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002776 case llvm::Triple::mips:
2777 case llvm::Triple::mipsel:
2778 case llvm::Triple::mips64:
2779 case llvm::Triple::mips64el:
2780 PIC = true; // "-fpic"
2781 break;
2782
2783 case llvm::Triple::x86:
2784 case llvm::Triple::x86_64:
2785 PIC = true; // "-fPIC"
2786 IsPICLevelTwo = true;
2787 break;
2788
2789 default:
2790 break;
2791 }
2792 }
2793
Brad Smith5b05db82014-06-24 19:51:29 +00002794 // OpenBSD-specific defaults for PIE
2795 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2796 switch (getToolChain().getTriple().getArch()) {
2797 case llvm::Triple::mips64:
2798 case llvm::Triple::mips64el:
2799 case llvm::Triple::sparc:
2800 case llvm::Triple::x86:
2801 case llvm::Triple::x86_64:
2802 IsPICLevelTwo = false; // "-fpie"
2803 break;
2804
2805 case llvm::Triple::ppc:
2806 case llvm::Triple::sparcv9:
2807 IsPICLevelTwo = true; // "-fPIE"
2808 break;
2809
2810 default:
2811 break;
2812 }
2813 }
2814
Alexey Samsonov090301e2013-04-09 12:28:19 +00002815 // For the PIC and PIE flag options, this logic is different from the
2816 // legacy logic in very old versions of GCC, as that logic was just
2817 // a bug no one had ever fixed. This logic is both more rational and
2818 // consistent with GCC's new logic now that the bugs are fixed. The last
2819 // argument relating to either PIC or PIE wins, and no other argument is
2820 // used. If the last argument is any flavor of the '-fno-...' arguments,
2821 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2822 // at the same level.
2823 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2824 options::OPT_fpic, options::OPT_fno_pic,
2825 options::OPT_fPIE, options::OPT_fno_PIE,
2826 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002827 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2828 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002829 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002830 if (LastPICArg) {
2831 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002832 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2833 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2834 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2835 PIC = PIE || O.matches(options::OPT_fPIC) ||
2836 O.matches(options::OPT_fpic);
2837 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2838 O.matches(options::OPT_fPIC);
2839 } else {
2840 PIE = PIC = false;
2841 }
2842 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002843 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002844
Nick Lewycky609dd662013-10-11 03:33:53 +00002845 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002846 // specified while enabling PIC enabled level 1 PIC, just force it back to
2847 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2848 // informal testing).
2849 if (PIC && getToolChain().getTriple().isOSDarwin())
2850 IsPICLevelTwo |= getToolChain().isPICDefault();
2851
Chandler Carruthc0c04552012-04-08 16:40:35 +00002852 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2853 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002854 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002855 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002856 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002857 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002858 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002859
Chandler Carruth76a943b2012-11-19 03:52:03 +00002860 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2861 // This is a very special mode. It trumps the other modes, almost no one
2862 // uses it, and it isn't even valid on any OS but Darwin.
2863 if (!getToolChain().getTriple().isOSDarwin())
2864 D.Diag(diag::err_drv_unsupported_opt_for_target)
2865 << A->getSpelling() << getToolChain().getTriple().str();
2866
2867 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2868
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002869 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002870 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002871
Chandler Carruth76a943b2012-11-19 03:52:03 +00002872 // Only a forced PIC mode can cause the actual compile to have PIC defines
2873 // etc., no flags are sufficient. This behavior was selected to closely
2874 // match that of llvm-gcc and Apple GCC before that.
2875 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2876 CmdArgs.push_back("-pic-level");
2877 CmdArgs.push_back("2");
2878 }
2879 } else {
2880 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2881 // handled in Clang's IRGen by the -pie-level flag.
2882 CmdArgs.push_back("-mrelocation-model");
2883 CmdArgs.push_back(PIC ? "pic" : "static");
2884
2885 if (PIC) {
2886 CmdArgs.push_back("-pic-level");
2887 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2888 if (PIE) {
2889 CmdArgs.push_back("-pie-level");
2890 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2891 }
2892 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002893 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002894
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002895 CmdArgs.push_back("-mthread-model");
2896 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2897 CmdArgs.push_back(A->getValue());
2898 else
2899 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2900
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002901 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2902
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002903 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2904 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002905 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002906
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002907 // LLVM Code Generator Options.
2908
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002909 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2910 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2911 for (arg_iterator
2912 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2913 options::OPT_frewrite_map_file_EQ),
2914 MFE = Args.filtered_end();
2915 MFI != MFE; ++MFI) {
2916 CmdArgs.push_back("-frewrite-map-file");
2917 CmdArgs.push_back((*MFI)->getValue());
2918 (*MFI)->claim();
2919 }
2920 }
2921
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002922 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2923 StringRef v = A->getValue();
2924 CmdArgs.push_back("-mllvm");
2925 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2926 A->claim();
2927 }
2928
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002929 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2930 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002931 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002932 }
2933
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002934 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2935 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002936 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002937 D.Diag(diag::err_drv_unsupported_opt_for_target)
2938 << A->getSpelling() << getToolChain().getTriple().str();
2939 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2940 CmdArgs.push_back("-fpcc-struct-return");
2941 } else {
2942 assert(A->getOption().matches(options::OPT_freg_struct_return));
2943 CmdArgs.push_back("-freg-struct-return");
2944 }
2945 }
2946
Roman Divacky65b88cd2011-03-01 17:40:53 +00002947 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2948 CmdArgs.push_back("-mrtd");
2949
Rafael Espindola224dd632011-12-14 21:02:23 +00002950 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002951 CmdArgs.push_back("-mdisable-fp-elim");
2952 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2953 options::OPT_fno_zero_initialized_in_bss))
2954 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002955
2956 bool OFastEnabled = isOptimizationLevelFast(Args);
2957 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2958 // enabled. This alias option is being used to simplify the hasFlag logic.
2959 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2960 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002961 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2962 // doesn't do any TBAA.
2963 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002964 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002965 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002966 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002967 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2968 options::OPT_fno_struct_path_tbaa))
2969 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002970 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2971 false))
2972 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002973 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2974 options::OPT_fno_optimize_sibling_calls))
2975 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002976
Eric Christopher006208c2013-04-04 06:29:47 +00002977 // Handle segmented stacks.
2978 if (Args.hasArg(options::OPT_fsplit_stack))
2979 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002980
2981 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2982 // This alias option is being used to simplify the getLastArg logic.
2983 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2984 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002985
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002986 // Handle various floating point optimization flags, mapping them to the
2987 // appropriate LLVM code generation flags. The pattern for all of these is to
2988 // default off the codegen optimizations, and if any flag enables them and no
2989 // flag disables them after the flag enabling them, enable the codegen
2990 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002991 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002992 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002993 options::OPT_ffinite_math_only,
2994 options::OPT_fno_finite_math_only,
2995 options::OPT_fhonor_infinities,
2996 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002997 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2998 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002999 A->getOption().getID() != options::OPT_fhonor_infinities)
3000 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003001 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003002 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003003 options::OPT_ffinite_math_only,
3004 options::OPT_fno_finite_math_only,
3005 options::OPT_fhonor_nans,
3006 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003007 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3008 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003009 A->getOption().getID() != options::OPT_fhonor_nans)
3010 CmdArgs.push_back("-menable-no-nans");
3011
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003012 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3013 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003014 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003015 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003016 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003017 options::OPT_fno_math_errno)) {
3018 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3019 // However, turning *off* -ffast_math merely restores the toolchain default
3020 // (which may be false).
3021 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3022 A->getOption().getID() == options::OPT_ffast_math ||
3023 A->getOption().getID() == options::OPT_Ofast)
3024 MathErrno = false;
3025 else if (A->getOption().getID() == options::OPT_fmath_errno)
3026 MathErrno = true;
3027 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003028 if (MathErrno)
3029 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003030
3031 // There are several flags which require disabling very specific
3032 // optimizations. Any of these being disabled forces us to turn off the
3033 // entire set of LLVM optimizations, so collect them through all the flag
3034 // madness.
3035 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003036 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003037 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003038 options::OPT_funsafe_math_optimizations,
3039 options::OPT_fno_unsafe_math_optimizations,
3040 options::OPT_fassociative_math,
3041 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003042 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3043 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003044 A->getOption().getID() != options::OPT_fno_associative_math)
3045 AssociativeMath = true;
3046 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003047 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003048 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003049 options::OPT_funsafe_math_optimizations,
3050 options::OPT_fno_unsafe_math_optimizations,
3051 options::OPT_freciprocal_math,
3052 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003053 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3054 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003055 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3056 ReciprocalMath = true;
3057 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003058 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003059 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003060 options::OPT_funsafe_math_optimizations,
3061 options::OPT_fno_unsafe_math_optimizations,
3062 options::OPT_fsigned_zeros,
3063 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003064 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3065 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003066 A->getOption().getID() != options::OPT_fsigned_zeros)
3067 SignedZeros = false;
3068 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003069 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003070 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003071 options::OPT_funsafe_math_optimizations,
3072 options::OPT_fno_unsafe_math_optimizations,
3073 options::OPT_ftrapping_math,
3074 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003075 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3076 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003077 A->getOption().getID() != options::OPT_ftrapping_math)
3078 TrappingMath = false;
3079 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3080 !TrappingMath)
3081 CmdArgs.push_back("-menable-unsafe-fp-math");
3082
Sanjay Patel76c9e092015-01-23 16:40:50 +00003083 if (!SignedZeros)
3084 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003085
Sanjay Patel359b1052015-04-09 15:03:23 +00003086 if (ReciprocalMath)
3087 CmdArgs.push_back("-freciprocal-math");
3088
Lang Hamesaa53b932012-07-06 00:59:19 +00003089 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003090 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003091 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003092 options::OPT_ffp_contract)) {
3093 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003094 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003095 if (Val == "fast" || Val == "on" || Val == "off") {
3096 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3097 } else {
3098 D.Diag(diag::err_drv_unsupported_option_argument)
3099 << A->getOption().getName() << Val;
3100 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003101 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3102 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003103 // If fast-math is set then set the fp-contract mode to fast.
3104 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3105 }
3106 }
3107
Bob Wilson6a039162012-07-19 03:52:53 +00003108 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3109 // and if we find them, tell the frontend to provide the appropriate
3110 // preprocessor macros. This is distinct from enabling any optimizations as
3111 // these options induce language changes which must survive serialization
3112 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003113 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3114 options::OPT_fno_fast_math))
3115 if (!A->getOption().matches(options::OPT_fno_fast_math))
3116 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003117 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3118 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003119 if (A->getOption().matches(options::OPT_ffinite_math_only))
3120 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003121
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003122 // Decide whether to use verbose asm. Verbose assembly is the default on
3123 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003124 bool IsIntegratedAssemblerDefault =
3125 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003126 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003127 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003128 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003129 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003130
Rafael Espindola298059a2015-04-06 04:36:45 +00003131 bool UsingIntegratedAssembler =
3132 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3133 IsIntegratedAssemblerDefault);
3134 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003135 CmdArgs.push_back("-no-integrated-as");
3136
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003137 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3138 CmdArgs.push_back("-mdebug-pass");
3139 CmdArgs.push_back("Structure");
3140 }
3141 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3142 CmdArgs.push_back("-mdebug-pass");
3143 CmdArgs.push_back("Arguments");
3144 }
3145
John McCall8517abc2010-02-19 02:45:38 +00003146 // Enable -mconstructor-aliases except on darwin, where we have to
3147 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003148 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003149 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003150
John McCall7ef5cb32011-03-18 02:56:14 +00003151 // Darwin's kernel doesn't support guard variables; just die if we
3152 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003153 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003154 CmdArgs.push_back("-fforbid-guard-variables");
3155
Douglas Gregordbe39272011-02-01 15:15:22 +00003156 if (Args.hasArg(options::OPT_mms_bitfields)) {
3157 CmdArgs.push_back("-mms-bitfields");
3158 }
John McCall8517abc2010-02-19 02:45:38 +00003159
Daniel Dunbar306945d2009-09-16 06:17:29 +00003160 // This is a coarse approximation of what llvm-gcc actually does, both
3161 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3162 // complicated ways.
3163 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003164 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3165 options::OPT_fno_asynchronous_unwind_tables,
3166 (getToolChain().IsUnwindTablesDefault() ||
3167 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3168 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003169 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3170 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003171 CmdArgs.push_back("-munwind-tables");
3172
Chandler Carruth05fb5852012-11-21 23:40:23 +00003173 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003174
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003175 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3176 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003177 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003178 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003179
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003180 // FIXME: Handle -mtune=.
3181 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003182
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003183 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003184 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003185 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003186 }
3187
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003188 // Add the target cpu
3189 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3190 llvm::Triple ETriple(ETripleStr);
3191 std::string CPU = getCPUName(Args, ETriple);
3192 if (!CPU.empty()) {
3193 CmdArgs.push_back("-target-cpu");
3194 CmdArgs.push_back(Args.MakeArgString(CPU));
3195 }
3196
Rafael Espindolaeb265472013-08-21 21:59:03 +00003197 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3198 CmdArgs.push_back("-mfpmath");
3199 CmdArgs.push_back(A->getValue());
3200 }
3201
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003202 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003203 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003204
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003205 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003206 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003207 default:
3208 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003209
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003210 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003211 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003212 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003213 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003214 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003215 break;
3216
Tim Northover573cbee2014-05-24 12:52:07 +00003217 case llvm::Triple::aarch64:
3218 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003219 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003220 break;
3221
Eric Christopher0b26a612010-03-02 02:41:08 +00003222 case llvm::Triple::mips:
3223 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003224 case llvm::Triple::mips64:
3225 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003226 AddMIPSTargetArgs(Args, CmdArgs);
3227 break;
3228
Ulrich Weigand8afad612014-07-28 13:17:52 +00003229 case llvm::Triple::ppc:
3230 case llvm::Triple::ppc64:
3231 case llvm::Triple::ppc64le:
3232 AddPPCTargetArgs(Args, CmdArgs);
3233 break;
3234
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003235 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003236 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003237 AddSparcTargetArgs(Args, CmdArgs);
3238 break;
3239
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003240 case llvm::Triple::x86:
3241 case llvm::Triple::x86_64:
3242 AddX86TargetArgs(Args, CmdArgs);
3243 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003244
3245 case llvm::Triple::hexagon:
3246 AddHexagonTargetArgs(Args, CmdArgs);
3247 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003248 }
3249
Hans Wennborg75958c42013-08-08 00:17:41 +00003250 // Add clang-cl arguments.
3251 if (getToolChain().getDriver().IsCLMode())
3252 AddClangCLArgs(Args, CmdArgs);
3253
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003254 // Pass the linker version in use.
3255 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3256 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003257 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003258 }
3259
Eric Christopherb7d97e92013-04-03 01:58:53 +00003260 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003261 CmdArgs.push_back("-momit-leaf-frame-pointer");
3262
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003263 // Explicitly error on some things we know we don't support and can't just
3264 // ignore.
3265 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003266 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3267 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003268 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003269 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003270 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003271 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3272 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003273 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003274 << Unsupported->getOption().getName();
3275 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003276 }
3277
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003278 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003279 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003280 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003281 CmdArgs.push_back("-header-include-file");
3282 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3283 D.CCPrintHeadersFilename : "-");
3284 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003285 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003286 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003287
Chad Rosierbe10f982011-08-02 17:58:04 +00003288 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003289 CmdArgs.push_back("-diagnostic-log-file");
3290 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3291 D.CCLogDiagnosticsFilename : "-");
3292 }
3293
Manman Ren17bdb0f2013-11-20 20:22:14 +00003294 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3295 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003296 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003297 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003298 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3299 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003300 // FIXME: we should support specifying dwarf version with
3301 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003302 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003303 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003304 const llvm::Triple &Triple = getToolChain().getTriple();
3305 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003306 Triple.getOS() == llvm::Triple::FreeBSD ||
3307 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003308 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003309 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003310 CmdArgs.push_back("-gdwarf-2");
3311 else if (A->getOption().matches(options::OPT_gdwarf_3))
3312 CmdArgs.push_back("-gdwarf-3");
3313 else if (A->getOption().matches(options::OPT_gdwarf_4))
3314 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003315 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003316 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003317 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003318 const llvm::Triple &Triple = getToolChain().getTriple();
3319 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003320 Triple.getOS() == llvm::Triple::FreeBSD ||
3321 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003322 CmdArgs.push_back("-gdwarf-2");
3323 else
3324 CmdArgs.push_back("-g");
3325 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003326 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003327
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003328 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3329 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003330 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3331 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003332 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003333
Eric Christopher138c32b2013-09-13 22:37:55 +00003334 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003335 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3336 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003337 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003338 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003339 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003340 CmdArgs.push_back("-g");
3341 CmdArgs.push_back("-backend-option");
3342 CmdArgs.push_back("-split-dwarf=Enable");
3343 }
3344
Eric Christopher138c32b2013-09-13 22:37:55 +00003345 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3346 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3347 CmdArgs.push_back("-backend-option");
3348 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3349 }
Eric Christophereec89c22013-06-18 00:03:50 +00003350
Eric Christopher0d403d22014-02-14 01:27:03 +00003351 // -gdwarf-aranges turns on the emission of the aranges section in the
3352 // backend.
3353 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3354 CmdArgs.push_back("-backend-option");
3355 CmdArgs.push_back("-generate-arange-section");
3356 }
3357
David Blaikief36d9ba2014-01-27 18:52:43 +00003358 if (Args.hasFlag(options::OPT_fdebug_types_section,
3359 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003360 CmdArgs.push_back("-backend-option");
3361 CmdArgs.push_back("-generate-type-units");
3362 }
Eric Christophereec89c22013-06-18 00:03:50 +00003363
Ed Schouten6e576152015-03-26 17:50:28 +00003364 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3365 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3366
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003367 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003368 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003369 CmdArgs.push_back("-ffunction-sections");
3370 }
3371
3372 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003373 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003374 CmdArgs.push_back("-fdata-sections");
3375 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003376
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003377 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003378 options::OPT_fno_unique_section_names,
3379 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003380 CmdArgs.push_back("-fno-unique-section-names");
3381
Chris Lattner3c77a352010-06-22 00:03:40 +00003382 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3383
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003384 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3385 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3386 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3387 D.Diag(diag::err_drv_argument_not_allowed_with)
3388 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3389
3390 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3391
3392 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3393 A->render(Args, CmdArgs);
3394 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3395 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3396
Nick Lewycky207bce32011-04-21 23:44:07 +00003397 if (Args.hasArg(options::OPT_ftest_coverage) ||
3398 Args.hasArg(options::OPT_coverage))
3399 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003400 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3401 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003402 Args.hasArg(options::OPT_coverage))
3403 CmdArgs.push_back("-femit-coverage-data");
3404
Alex Lorenzee024992014-08-04 18:41:51 +00003405 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3406 !Args.hasArg(options::OPT_fprofile_instr_generate))
3407 D.Diag(diag::err_drv_argument_only_allowed_with)
3408 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3409
3410 if (Args.hasArg(options::OPT_fcoverage_mapping))
3411 CmdArgs.push_back("-fcoverage-mapping");
3412
Nick Lewycky480cb992011-05-04 20:46:58 +00003413 if (C.getArgs().hasArg(options::OPT_c) ||
3414 C.getArgs().hasArg(options::OPT_S)) {
3415 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003416 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003417 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003418 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003419 CoverageFilename = FinalOutput->getValue();
3420 } else {
3421 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3422 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003423 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003424 SmallString<128> Pwd;
3425 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003426 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003427 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003428 }
3429 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003430 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003431 }
3432 }
3433
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003434 // Pass options for controlling the default header search paths.
3435 if (Args.hasArg(options::OPT_nostdinc)) {
3436 CmdArgs.push_back("-nostdsysteminc");
3437 CmdArgs.push_back("-nobuiltininc");
3438 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003439 if (Args.hasArg(options::OPT_nostdlibinc))
3440 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003441 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3442 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3443 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003444
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003445 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003446 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003447 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003448
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003449 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3450
Ted Kremenekf7639e12012-03-06 20:06:33 +00003451 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003452 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003453 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003454 options::OPT_ccc_arcmt_modify,
3455 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003456 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003457 switch (A->getOption().getID()) {
3458 default:
3459 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003460 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003461 CmdArgs.push_back("-arcmt-check");
3462 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003463 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003464 CmdArgs.push_back("-arcmt-modify");
3465 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003466 case options::OPT_ccc_arcmt_migrate:
3467 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003468 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003469 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003470
3471 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3472 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003473 break;
John McCalld70fb982011-06-15 23:25:17 +00003474 }
3475 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003476 } else {
3477 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3478 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3479 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003480 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003481
Ted Kremenekf7639e12012-03-06 20:06:33 +00003482 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3483 if (ARCMTEnabled) {
3484 D.Diag(diag::err_drv_argument_not_allowed_with)
3485 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3486 }
3487 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003488 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003489
3490 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003491 options::OPT_objcmt_migrate_subscripting,
3492 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003493 // None specified, means enable them all.
3494 CmdArgs.push_back("-objcmt-migrate-literals");
3495 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003496 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003497 } else {
3498 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3499 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003500 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003501 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003502 } else {
3503 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3504 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3505 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3506 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3507 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3508 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003509 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003510 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3511 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3512 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3513 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003517 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003518 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003519 }
3520
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003521 // Add preprocessing options like -I, -D, etc. if we are using the
3522 // preprocessor.
3523 //
3524 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003525 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003526 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003527
Rafael Espindolaa7431922011-07-21 23:40:37 +00003528 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3529 // that "The compiler can only warn and ignore the option if not recognized".
3530 // When building with ccache, it will pass -D options to clang even on
3531 // preprocessed inputs and configure concludes that -fPIC is not supported.
3532 Args.ClaimAllArgs(options::OPT_D);
3533
Alp Toker7874bdc2013-11-15 20:40:58 +00003534 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003535 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3536 if (A->getOption().matches(options::OPT_O4)) {
3537 CmdArgs.push_back("-O3");
3538 D.Diag(diag::warn_O4_is_O3);
3539 } else {
3540 A->render(Args, CmdArgs);
3541 }
3542 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003543
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003544 // Warn about ignored options to clang.
3545 for (arg_iterator it = Args.filtered_begin(
3546 options::OPT_clang_ignored_gcc_optimization_f_Group),
3547 ie = Args.filtered_end(); it != ie; ++it) {
3548 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3549 }
3550
Rafael Espindola577637a2015-01-03 00:06:04 +00003551 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003552
Richard Smith3be1cb22014-08-07 00:24:21 +00003553 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003554 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003555 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3556 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003557 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003558 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003559
3560 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003561 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003562 //
3563 // If a std is supplied, only add -trigraphs if it follows the
3564 // option.
3565 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3566 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003567 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003568 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003569 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003570 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003571 else
3572 Std->render(Args, CmdArgs);
3573
Nico Weber00721502014-12-23 22:32:37 +00003574 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003575 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003576 options::OPT_ftrigraphs,
3577 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003578 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003579 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003580 } else {
3581 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003582 //
3583 // FIXME: Clang doesn't correctly handle -std= when the input language
3584 // doesn't match. For the time being just ignore this for C++ inputs;
3585 // eventually we want to do all the standard defaulting here instead of
3586 // splitting it between the driver and clang -cc1.
3587 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003588 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3589 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003590 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003591 CmdArgs.push_back("-std=c++11");
3592
Nico Weber00721502014-12-23 22:32:37 +00003593 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3594 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003595 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003596
Richard Smith282b4492013-09-04 22:50:31 +00003597 // GCC's behavior for -Wwrite-strings is a bit strange:
3598 // * In C, this "warning flag" changes the types of string literals from
3599 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3600 // for the discarded qualifier.
3601 // * In C++, this is just a normal warning flag.
3602 //
3603 // Implementing this warning correctly in C is hard, so we follow GCC's
3604 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3605 // a non-const char* in C, rather than using this crude hack.
3606 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003607 // FIXME: This should behave just like a warning flag, and thus should also
3608 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3609 Arg *WriteStrings =
3610 Args.getLastArg(options::OPT_Wwrite_strings,
3611 options::OPT_Wno_write_strings, options::OPT_w);
3612 if (WriteStrings &&
3613 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003614 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003615 }
3616
Chandler Carruth61fbf622011-04-23 09:27:53 +00003617 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003618 // during C++ compilation, which it is by default. GCC keeps this define even
3619 // in the presence of '-w', match this behavior bug-for-bug.
3620 if (types::isCXX(InputType) &&
3621 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3622 true)) {
3623 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003624 }
3625
Chandler Carruthe0391482010-05-22 02:21:53 +00003626 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3627 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3628 if (Asm->getOption().matches(options::OPT_fasm))
3629 CmdArgs.push_back("-fgnu-keywords");
3630 else
3631 CmdArgs.push_back("-fno-gnu-keywords");
3632 }
3633
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003634 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3635 CmdArgs.push_back("-fno-dwarf-directory-asm");
3636
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003637 if (ShouldDisableAutolink(Args, getToolChain()))
3638 CmdArgs.push_back("-fno-autolink");
3639
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003640 // Add in -fdebug-compilation-dir if necessary.
3641 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003642
Richard Smith9a568822011-11-21 19:36:32 +00003643 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3644 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003645 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003646 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003647 }
3648
Richard Smith79c927b2013-11-06 19:31:51 +00003649 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3650 CmdArgs.push_back("-foperator-arrow-depth");
3651 CmdArgs.push_back(A->getValue());
3652 }
3653
Richard Smith9a568822011-11-21 19:36:32 +00003654 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3655 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003656 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003657 }
3658
Richard Smitha3d3bd22013-05-08 02:12:03 +00003659 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3660 CmdArgs.push_back("-fconstexpr-steps");
3661 CmdArgs.push_back(A->getValue());
3662 }
3663
Richard Smithb3a14522013-02-22 01:59:51 +00003664 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3665 CmdArgs.push_back("-fbracket-depth");
3666 CmdArgs.push_back(A->getValue());
3667 }
3668
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003669 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3670 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003671 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003672 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003673 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3674 } else
3675 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003676 }
3677
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003678
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003679 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003680 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003681
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003682 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3683 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003684 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003685 }
David Chisnall5778fce2009-08-31 16:41:57 +00003686
Chris Lattnere23003d2010-01-09 21:54:33 +00003687 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3688 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003689 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003690 }
3691
Chris Lattnerb35583d2010-04-07 20:49:23 +00003692 CmdArgs.push_back("-ferror-limit");
3693 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003694 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003695 else
3696 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003697
Chandler Carrutha77a7272010-05-06 04:55:18 +00003698 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3699 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003700 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003701 }
3702
3703 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3704 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003705 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003706 }
3707
Richard Smithf6f003a2011-12-16 19:06:07 +00003708 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3709 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003710 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003711 }
3712
Nick Lewycky24653262014-12-16 21:39:02 +00003713 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3714 CmdArgs.push_back("-fspell-checking-limit");
3715 CmdArgs.push_back(A->getValue());
3716 }
3717
Daniel Dunbar2c978472009-11-04 06:24:47 +00003718 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003719 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003720 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003721 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003722 } else {
3723 // If -fmessage-length=N was not specified, determine whether this is a
3724 // terminal and, if so, implicitly define -fmessage-length appropriately.
3725 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003726 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003727 }
3728
John McCallb4a99d32013-02-19 01:57:35 +00003729 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3730 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3731 options::OPT_fvisibility_ms_compat)) {
3732 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3733 CmdArgs.push_back("-fvisibility");
3734 CmdArgs.push_back(A->getValue());
3735 } else {
3736 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3737 CmdArgs.push_back("-fvisibility");
3738 CmdArgs.push_back("hidden");
3739 CmdArgs.push_back("-ftype-visibility");
3740 CmdArgs.push_back("default");
3741 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003742 }
3743
Douglas Gregor08329632010-06-15 17:05:35 +00003744 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003745
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003746 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3747
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003748 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003749 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3750 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003751 CmdArgs.push_back("-ffreestanding");
3752
Daniel Dunbare357d562009-12-03 18:42:11 +00003753 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003754 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003755 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003756 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3757 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003758 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003759 // AltiVec language extensions aren't relevant for assembling.
3760 if (!isa<PreprocessJobAction>(JA) ||
3761 Output.getType() != types::TY_PP_Asm)
3762 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003763 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3764 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003765
Peter Collingbourne32701642013-11-01 18:16:25 +00003766 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3767 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003768
Eric Christopher459d2712013-02-19 06:16:53 +00003769 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003770 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003771 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003772 getToolChain().getArch() == llvm::Triple::ppc64 ||
3773 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003774 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003775 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003776
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003777 if (getToolChain().SupportsProfiling())
3778 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003779
3780 // -flax-vector-conversions is default.
3781 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3782 options::OPT_fno_lax_vector_conversions))
3783 CmdArgs.push_back("-fno-lax-vector-conversions");
3784
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003785 if (Args.getLastArg(options::OPT_fapple_kext))
3786 CmdArgs.push_back("-fapple-kext");
3787
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003788 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003789 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003790 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003791 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3792 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003793
3794 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3795 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003796 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003797 }
3798
Bob Wilson14adb362012-02-03 06:27:22 +00003799 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003800
Chandler Carruth6e501032011-03-27 00:04:55 +00003801 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3802 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3803 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3804 options::OPT_fno_wrapv)) {
3805 if (A->getOption().matches(options::OPT_fwrapv))
3806 CmdArgs.push_back("-fwrapv");
3807 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3808 options::OPT_fno_strict_overflow)) {
3809 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3810 CmdArgs.push_back("-fwrapv");
3811 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003812
3813 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3814 options::OPT_fno_reroll_loops))
3815 if (A->getOption().matches(options::OPT_freroll_loops))
3816 CmdArgs.push_back("-freroll-loops");
3817
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003818 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003819 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3820 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003821
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003822 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3823
Mahesha S6a682be42012-10-27 07:47:56 +00003824
Daniel Dunbar4930e332009-11-17 08:07:36 +00003825 // -stack-protector=0 is default.
3826 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003827 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3828 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003829 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003830 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003831 if (A->getOption().matches(options::OPT_fstack_protector)) {
3832 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3833 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3834 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003835 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003836 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003837 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003838 } else {
3839 StackProtectorLevel =
3840 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3841 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003842 if (StackProtectorLevel) {
3843 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003844 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003845 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003846
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003847 // --param ssp-buffer-size=
3848 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3849 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003850 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003851 if (Str.startswith("ssp-buffer-size=")) {
3852 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003853 CmdArgs.push_back("-stack-protector-buffer-size");
3854 // FIXME: Verify the argument is a valid integer.
3855 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003856 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003857 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003858 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003859 }
3860
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003861 // Translate -mstackrealign
3862 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3863 false)) {
3864 CmdArgs.push_back("-backend-option");
3865 CmdArgs.push_back("-force-align-stack");
3866 }
3867 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3868 false)) {
3869 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3870 }
3871
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003872 if (Args.hasArg(options::OPT_mstack_alignment)) {
3873 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3874 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003875 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003876
Hans Wennborg77dc2362015-01-20 19:45:50 +00003877 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3878 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3879
3880 if (!Size.empty())
3881 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3882 else
3883 CmdArgs.push_back("-mstack-probe-size=0");
3884 }
3885
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003886 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3887 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3888 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3889
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003890 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3891 options::OPT_mno_restrict_it)) {
3892 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3893 CmdArgs.push_back("-backend-option");
3894 CmdArgs.push_back("-arm-restrict-it");
3895 } else {
3896 CmdArgs.push_back("-backend-option");
3897 CmdArgs.push_back("-arm-no-restrict-it");
3898 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003899 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3900 TT.getArch() == llvm::Triple::thumb)) {
3901 // Windows on ARM expects restricted IT blocks
3902 CmdArgs.push_back("-backend-option");
3903 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003904 }
3905
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003906 if (TT.getArch() == llvm::Triple::arm ||
3907 TT.getArch() == llvm::Triple::thumb) {
3908 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3909 options::OPT_mno_long_calls)) {
3910 if (A->getOption().matches(options::OPT_mlong_calls)) {
3911 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003912 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003913 }
3914 }
3915 }
3916
Daniel Dunbard18049a2009-04-07 21:16:11 +00003917 // Forward -f options with positive and negative forms; we translate
3918 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003919 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3920 StringRef fname = A->getValue();
3921 if (!llvm::sys::fs::exists(fname))
3922 D.Diag(diag::err_drv_no_such_file) << fname;
3923 else
3924 A->render(Args, CmdArgs);
3925 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003926
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003927 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003928 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003929 CmdArgs.push_back("-fapple-kext");
3930 if (!Args.hasArg(options::OPT_fbuiltin))
3931 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003932 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003933 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003934 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003935 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003936 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003937
Nuno Lopes13c88c72009-12-16 16:59:22 +00003938 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3939 options::OPT_fno_assume_sane_operator_new))
3940 CmdArgs.push_back("-fno-assume-sane-operator-new");
3941
Daniel Dunbar4930e332009-11-17 08:07:36 +00003942 // -fblocks=0 is default.
3943 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003944 getToolChain().IsBlocksDefault()) ||
3945 (Args.hasArg(options::OPT_fgnu_runtime) &&
3946 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3947 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003948 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003949
3950 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3951 !getToolChain().hasBlocksRuntime())
3952 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003953 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003954
Richard Smithffb65082014-09-30 23:10:19 +00003955 // -fmodules enables modules (off by default).
3956 // Users can pass -fno-cxx-modules to turn off modules support for
3957 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003958 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003959 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3960 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3961 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003962 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003963 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003964 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003965 HaveModules = true;
3966 }
3967 }
3968
Daniel Jasper07e6c402013-08-05 20:26:17 +00003969 // -fmodule-maps enables module map processing (off by default) for header
3970 // checking. It is implied by -fmodules.
3971 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3972 false)) {
3973 CmdArgs.push_back("-fmodule-maps");
3974 }
3975
Daniel Jasperac42b752013-10-21 06:34:34 +00003976 // -fmodules-decluse checks that modules used are declared so (off by
3977 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003978 if (Args.hasFlag(options::OPT_fmodules_decluse,
3979 options::OPT_fno_modules_decluse,
3980 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003981 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003982 }
3983
Daniel Jasper962b38e2014-04-11 11:47:45 +00003984 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3985 // all #included headers are part of modules.
3986 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3987 options::OPT_fno_modules_strict_decluse,
3988 false)) {
3989 CmdArgs.push_back("-fmodules-strict-decluse");
3990 }
3991
Manuel Klimekd2e8b042015-02-20 11:44:41 +00003992 // -fno-implicit-modules turns off implicitly compiling modules on demand.
3993 if (!Args.hasFlag(options::OPT_fimplicit_modules,
3994 options::OPT_fno_implicit_modules)) {
3995 CmdArgs.push_back("-fno-implicit-modules");
3996 }
3997
Daniel Jasperac42b752013-10-21 06:34:34 +00003998 // -fmodule-name specifies the module that is currently being built (or
3999 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004000 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004001
Richard Smith9887d792014-10-17 01:42:53 +00004002 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004003 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004004 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004005
Richard Smithe842a472014-10-22 02:05:46 +00004006 // -fmodule-file can be used to specify files containing precompiled modules.
4007 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4008
4009 // -fmodule-cache-path specifies where our implicitly-built module files
4010 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004011 SmallString<128> ModuleCachePath;
4012 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4013 ModuleCachePath = A->getValue();
4014 if (HaveModules) {
4015 if (C.isForDiagnostics()) {
4016 // When generating crash reports, we want to emit the modules along with
4017 // the reproduction sources, so we ignore any provided module path.
4018 ModuleCachePath = Output.getFilename();
4019 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4020 llvm::sys::path::append(ModuleCachePath, "modules");
4021 } else if (ModuleCachePath.empty()) {
4022 // No module path was provided: use the default.
4023 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4024 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004025 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4026 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004027 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4028 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004029 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004030 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4031 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4032 }
4033
4034 // When building modules and generating crashdumps, we need to dump a module
4035 // dependency VFS alongside the output.
4036 if (HaveModules && C.isForDiagnostics()) {
4037 SmallString<128> VFSDir(Output.getFilename());
4038 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004039 // Add the cache directory as a temp so the crash diagnostics pick it up.
4040 C.addTempFile(Args.MakeArgString(VFSDir));
4041
Justin Bognera88f0122014-06-20 22:59:50 +00004042 llvm::sys::path::append(VFSDir, "vfs");
4043 CmdArgs.push_back("-module-dependency-dir");
4044 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004045 }
4046
Richard Smith9887d792014-10-17 01:42:53 +00004047 if (HaveModules)
4048 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004049
Douglas Gregor35b04d62013-02-07 19:01:24 +00004050 // Pass through all -fmodules-ignore-macro arguments.
4051 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004052 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4053 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004054
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004055 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4056
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004057 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4058 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4059 D.Diag(diag::err_drv_argument_not_allowed_with)
4060 << A->getAsString(Args) << "-fbuild-session-timestamp";
4061
4062 llvm::sys::fs::file_status Status;
4063 if (llvm::sys::fs::status(A->getValue(), Status))
4064 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004065 CmdArgs.push_back(Args.MakeArgString(
4066 "-fbuild-session-timestamp=" +
4067 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004068 }
4069
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004070 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004071 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4072 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004073 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4074
4075 Args.AddLastArg(CmdArgs,
4076 options::OPT_fmodules_validate_once_per_build_session);
4077 }
4078
Ben Langmuirdcf73862014-03-12 00:06:17 +00004079 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4080
John McCalldfea9982010-04-09 19:12:06 +00004081 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004082 if (Args.hasFlag(options::OPT_fno_access_control,
4083 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004084 false))
John McCall3155f572010-04-09 19:03:51 +00004085 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004086
Anders Carlssond470fef2010-11-21 00:09:52 +00004087 // -felide-constructors is the default.
4088 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4089 options::OPT_felide_constructors,
4090 false))
4091 CmdArgs.push_back("-fno-elide-constructors");
4092
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004093 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004094
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004095 if (KernelOrKext || (types::isCXX(InputType) &&
4096 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4097 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004098 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004099
Tony Linthicum76329bf2011-12-12 21:14:55 +00004100 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004101 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004102 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004103 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004104 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004105 CmdArgs.push_back("-fshort-enums");
4106
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004107 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004108 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004109 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004110 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004111
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004112 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004113 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4114 options::OPT_fno_use_cxa_atexit,
4115 !IsWindowsCygnus && !IsWindowsGNU &&
4116 getToolChain().getArch() != llvm::Triple::hexagon &&
4117 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004118 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004119 CmdArgs.push_back("-fno-use-cxa-atexit");
4120
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004121 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004122 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004123 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004124 CmdArgs.push_back("-fms-extensions");
4125
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004126 // -fno-use-line-directives is default.
4127 if (Args.hasFlag(options::OPT_fuse_line_directives,
4128 options::OPT_fno_use_line_directives, false))
4129 CmdArgs.push_back("-fuse-line-directives");
4130
Francois Pichet1b4f1632011-09-17 04:32:15 +00004131 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004132 if (Args.hasFlag(options::OPT_fms_compatibility,
4133 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004134 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4135 options::OPT_fno_ms_extensions,
4136 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004137 CmdArgs.push_back("-fms-compatibility");
4138
David Majnemerc371ff02015-03-22 08:39:22 +00004139 // -fms-compatibility-version=18.00 is default.
4140 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004141 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004142 IsWindowsMSVC) ||
4143 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004144 Args.hasArg(options::OPT_fms_compatibility_version)) {
4145 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4146 const Arg *MSCompatibilityVersion =
4147 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004148
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004149 if (MSCVersion && MSCompatibilityVersion)
4150 D.Diag(diag::err_drv_argument_not_allowed_with)
4151 << MSCVersion->getAsString(Args)
4152 << MSCompatibilityVersion->getAsString(Args);
4153
David Majnemerc371ff02015-03-22 08:39:22 +00004154 if (MSCompatibilityVersion) {
4155 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4156 D.Diag(diag::err_drv_invalid_value)
4157 << MSCompatibilityVersion->getAsString(Args)
4158 << MSCompatibilityVersion->getValue();
4159 } else if (MSCVersion) {
4160 unsigned Version = 0;
4161 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4162 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4163 << MSCVersion->getValue();
4164 MSVT = getMSCompatibilityVersion(Version);
4165 } else {
4166 MSVT = VersionTuple(18);
4167 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004168
David Majnemerc371ff02015-03-22 08:39:22 +00004169 CmdArgs.push_back(
4170 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004171 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004172
Eric Christopher5ecce122013-02-18 00:38:31 +00004173 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004174 if (Args.hasFlag(options::OPT_fborland_extensions,
4175 options::OPT_fno_borland_extensions, false))
4176 CmdArgs.push_back("-fborland-extensions");
4177
David Majnemerc371ff02015-03-22 08:39:22 +00004178 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4179 // than 19.
4180 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4181 options::OPT_fno_threadsafe_statics,
4182 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4183 CmdArgs.push_back("-fno-threadsafe-statics");
4184
Francois Pichet02744872011-09-01 16:38:08 +00004185 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4186 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004187 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004188 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004189 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004190
Chandler Carruthe03aa552010-04-17 20:17:31 +00004191 // -fgnu-keywords default varies depending on language; only pass if
4192 // specified.
4193 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004194 options::OPT_fno_gnu_keywords))
4195 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004196
Rafael Espindola922a6242011-06-02 17:30:53 +00004197 if (Args.hasFlag(options::OPT_fgnu89_inline,
4198 options::OPT_fno_gnu89_inline,
4199 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004200 CmdArgs.push_back("-fgnu89-inline");
4201
Chad Rosier9c76d242012-03-15 22:31:42 +00004202 if (Args.hasArg(options::OPT_fno_inline))
4203 CmdArgs.push_back("-fno-inline");
4204
Chad Rosier64d6be92012-03-06 21:17:19 +00004205 if (Args.hasArg(options::OPT_fno_inline_functions))
4206 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004207
John McCall5fb5df92012-06-20 06:18:46 +00004208 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004209
John McCall5fb5df92012-06-20 06:18:46 +00004210 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004211 // legacy is the default. Except for deployment taget of 10.5,
4212 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4213 // gets ignored silently.
4214 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004215 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4216 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004217 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004218 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004219 if (getToolChain().UseObjCMixedDispatch())
4220 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4221 else
4222 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4223 }
4224 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004225
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004226 // When ObjectiveC legacy runtime is in effect on MacOSX,
4227 // turn on the option to do Array/Dictionary subscripting
4228 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004229 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4230 getToolChain().getTriple().isMacOSX() &&
4231 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4232 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004233 objcRuntime.isNeXTFamily())
4234 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4235
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004236 // -fencode-extended-block-signature=1 is default.
4237 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4238 CmdArgs.push_back("-fencode-extended-block-signature");
4239 }
4240
John McCall24fc0de2011-07-06 00:26:06 +00004241 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4242 // NOTE: This logic is duplicated in ToolChains.cpp.
4243 bool ARC = isObjCAutoRefCount(Args);
4244 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004245 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004246
John McCall24fc0de2011-07-06 00:26:06 +00004247 CmdArgs.push_back("-fobjc-arc");
4248
Chandler Carruth491db322011-11-04 07:34:47 +00004249 // FIXME: It seems like this entire block, and several around it should be
4250 // wrapped in isObjC, but for now we just use it here as this is where it
4251 // was being used previously.
4252 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4253 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4254 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4255 else
4256 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4257 }
4258
John McCall24fc0de2011-07-06 00:26:06 +00004259 // Allow the user to enable full exceptions code emission.
4260 // We define off for Objective-CC, on for Objective-C++.
4261 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4262 options::OPT_fno_objc_arc_exceptions,
4263 /*default*/ types::isCXX(InputType)))
4264 CmdArgs.push_back("-fobjc-arc-exceptions");
4265 }
4266
4267 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4268 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004269 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004270 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004271
John McCall24fc0de2011-07-06 00:26:06 +00004272 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4273 // takes precedence.
4274 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4275 if (!GCArg)
4276 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4277 if (GCArg) {
4278 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004279 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004280 << GCArg->getAsString(Args);
4281 } else if (getToolChain().SupportsObjCGC()) {
4282 GCArg->render(Args, CmdArgs);
4283 } else {
4284 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004285 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004286 << GCArg->getAsString(Args);
4287 }
4288 }
4289
Bob Wilsonb111ec92015-03-02 19:01:14 +00004290 if (Args.hasFlag(options::OPT_fapplication_extension,
4291 options::OPT_fno_application_extension, false))
4292 CmdArgs.push_back("-fapplication-extension");
4293
Reid Klecknerc542d372014-06-27 17:02:02 +00004294 // Handle GCC-style exception args.
4295 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004296 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004297 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004298
4299 if (getToolChain().UseSjLjExceptions())
4300 CmdArgs.push_back("-fsjlj-exceptions");
4301
4302 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004303 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4304 options::OPT_fno_assume_sane_operator_new))
4305 CmdArgs.push_back("-fno-assume-sane-operator-new");
4306
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004307 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4308 // most platforms.
4309 if (Args.hasFlag(options::OPT_fsized_deallocation,
4310 options::OPT_fno_sized_deallocation, false))
4311 CmdArgs.push_back("-fsized-deallocation");
4312
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004313 // -fconstant-cfstrings is default, and may be subject to argument translation
4314 // on Darwin.
4315 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4316 options::OPT_fno_constant_cfstrings) ||
4317 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4318 options::OPT_mno_constant_cfstrings))
4319 CmdArgs.push_back("-fno-constant-cfstrings");
4320
John Thompsoned4e2952009-11-05 20:14:16 +00004321 // -fshort-wchar default varies depending on platform; only
4322 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004323 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4324 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004325 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004326
Hans Wennborg28c96312013-07-31 23:39:13 +00004327 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004328 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004329 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004330 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004331 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004332
Daniel Dunbar096ed292011-10-05 21:04:55 +00004333 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4334 // -fno-pack-struct doesn't apply to -fpack-struct=.
4335 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004336 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004337 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004338 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004339 } else if (Args.hasFlag(options::OPT_fpack_struct,
4340 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004341 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004342 }
4343
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004344 // Handle -fmax-type-align=N and -fno-type-align
4345 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4346 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4347 if (!SkipMaxTypeAlign) {
4348 std::string MaxTypeAlignStr = "-fmax-type-align=";
4349 MaxTypeAlignStr += A->getValue();
4350 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4351 }
4352 } else if (getToolChain().getTriple().isOSDarwin()) {
4353 if (!SkipMaxTypeAlign) {
4354 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4355 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4356 }
4357 }
4358
Robert Lytton0e076492013-08-13 09:43:10 +00004359 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004360 if (!Args.hasArg(options::OPT_fcommon))
4361 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004362 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004363 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004364
Daniel Dunbard18049a2009-04-07 21:16:11 +00004365 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004366 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004367 CmdArgs.push_back("-fno-common");
4368
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004369 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004370 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004371 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004372 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004373 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004374 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4375
Daniel Dunbar6358d682010-10-15 22:30:42 +00004376 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4377 if (!Args.hasFlag(options::OPT_ffor_scope,
4378 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004379 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004380 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4381
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004382 // -finput_charset=UTF-8 is default. Reject others
4383 if (Arg *inputCharset = Args.getLastArg(
4384 options::OPT_finput_charset_EQ)) {
4385 StringRef value = inputCharset->getValue();
4386 if (value != "UTF-8")
4387 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4388 }
4389
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004390 // -fexec_charset=UTF-8 is default. Reject others
4391 if (Arg *execCharset = Args.getLastArg(
4392 options::OPT_fexec_charset_EQ)) {
4393 StringRef value = execCharset->getValue();
4394 if (value != "UTF-8")
4395 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4396 }
4397
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004398 // -fcaret-diagnostics is default.
4399 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4400 options::OPT_fno_caret_diagnostics, true))
4401 CmdArgs.push_back("-fno-caret-diagnostics");
4402
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004403 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004404 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004405 options::OPT_fno_diagnostics_fixit_info))
4406 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004407
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004408 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004409 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004410 options::OPT_fno_diagnostics_show_option))
4411 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004412
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004413 if (const Arg *A =
4414 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4415 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004416 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004417 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004418
Douglas Gregor643c9222011-05-21 17:07:29 +00004419 if (const Arg *A =
4420 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4421 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004422 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004423 }
4424
Chandler Carruthb6766f02011-03-27 01:50:55 +00004425 if (Arg *A = Args.getLastArg(
4426 options::OPT_fdiagnostics_show_note_include_stack,
4427 options::OPT_fno_diagnostics_show_note_include_stack)) {
4428 if (A->getOption().matches(
4429 options::OPT_fdiagnostics_show_note_include_stack))
4430 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4431 else
4432 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4433 }
4434
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004435 // Color diagnostics are the default, unless the terminal doesn't support
4436 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004437 // Support both clang's -f[no-]color-diagnostics and gcc's
4438 // -f[no-]diagnostics-colors[=never|always|auto].
4439 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004440 for (const auto &Arg : Args) {
4441 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004442 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4443 !O.matches(options::OPT_fdiagnostics_color) &&
4444 !O.matches(options::OPT_fno_color_diagnostics) &&
4445 !O.matches(options::OPT_fno_diagnostics_color) &&
4446 !O.matches(options::OPT_fdiagnostics_color_EQ))
4447 continue;
4448
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004449 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004450 if (O.matches(options::OPT_fcolor_diagnostics) ||
4451 O.matches(options::OPT_fdiagnostics_color)) {
4452 ShowColors = Colors_On;
4453 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4454 O.matches(options::OPT_fno_diagnostics_color)) {
4455 ShowColors = Colors_Off;
4456 } else {
4457 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004458 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004459 if (value == "always")
4460 ShowColors = Colors_On;
4461 else if (value == "never")
4462 ShowColors = Colors_Off;
4463 else if (value == "auto")
4464 ShowColors = Colors_Auto;
4465 else
4466 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4467 << ("-fdiagnostics-color=" + value).str();
4468 }
4469 }
4470 if (ShowColors == Colors_On ||
4471 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004472 CmdArgs.push_back("-fcolor-diagnostics");
4473
Nico Rieck7857d462013-09-11 00:38:02 +00004474 if (Args.hasArg(options::OPT_fansi_escape_codes))
4475 CmdArgs.push_back("-fansi-escape-codes");
4476
Daniel Dunbardb097022009-06-08 21:13:54 +00004477 if (!Args.hasFlag(options::OPT_fshow_source_location,
4478 options::OPT_fno_show_source_location))
4479 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004480
Douglas Gregor643c9222011-05-21 17:07:29 +00004481 if (!Args.hasFlag(options::OPT_fshow_column,
4482 options::OPT_fno_show_column,
4483 true))
4484 CmdArgs.push_back("-fno-show-column");
4485
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004486 if (!Args.hasFlag(options::OPT_fspell_checking,
4487 options::OPT_fno_spell_checking))
4488 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004489
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004490
Chad Rosierc8e56e82012-12-05 21:08:21 +00004491 // -fno-asm-blocks is default.
4492 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4493 false))
4494 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004495
Steven Wucb0d13f2015-01-16 23:05:28 +00004496 // -fgnu-inline-asm is default.
4497 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4498 options::OPT_fno_gnu_inline_asm, true))
4499 CmdArgs.push_back("-fno-gnu-inline-asm");
4500
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004501 // Enable vectorization per default according to the optimization level
4502 // selected. For optimization levels that want vectorization we use the alias
4503 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004504 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004505 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004506 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004507 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004508 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004509 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004510
Chad Rosier136d67d2014-04-28 19:30:57 +00004511 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004512 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4513 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004514 options::OPT_fslp_vectorize;
4515 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004516 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004517 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004518
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004519 // -fno-slp-vectorize-aggressive is default.
4520 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004521 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004522 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004523
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004524 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4525 A->render(Args, CmdArgs);
4526
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004527 // -fdollars-in-identifiers default varies depending on platform and
4528 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004529 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004530 options::OPT_fno_dollars_in_identifiers)) {
4531 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004532 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004533 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004534 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004535 }
4536
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004537 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4538 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004539 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004540 options::OPT_fno_unit_at_a_time)) {
4541 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004542 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004543 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004544
Eli Friedman055c9702011-11-02 01:53:16 +00004545 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4546 options::OPT_fno_apple_pragma_pack, false))
4547 CmdArgs.push_back("-fapple-pragma-pack");
4548
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004549 // le32-specific flags:
4550 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4551 // by default.
4552 if (getToolChain().getArch() == llvm::Triple::le32) {
4553 CmdArgs.push_back("-fno-math-builtin");
4554 }
4555
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004556 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004557 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004558 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004559#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004560 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004561 (getToolChain().getArch() == llvm::Triple::arm ||
4562 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004563 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4564 CmdArgs.push_back("-fno-builtin-strcat");
4565 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4566 CmdArgs.push_back("-fno-builtin-strcpy");
4567 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004568#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004569
Justin Bognera88f0122014-06-20 22:59:50 +00004570 // Enable rewrite includes if the user's asked for it or if we're generating
4571 // diagnostics.
4572 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4573 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004574 if (Args.hasFlag(options::OPT_frewrite_includes,
4575 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004576 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004577 CmdArgs.push_back("-frewrite-includes");
4578
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004579 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004580 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004581 options::OPT_traditional_cpp)) {
4582 if (isa<PreprocessJobAction>(JA))
4583 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004584 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004585 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004586 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004587
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004588 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004589 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004590
4591 // Handle serialized diagnostics.
4592 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4593 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004594 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004595 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004596
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004597 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4598 CmdArgs.push_back("-fretain-comments-from-system-headers");
4599
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004600 // Forward -fcomment-block-commands to -cc1.
4601 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004602 // Forward -fparse-all-comments to -cc1.
4603 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004604
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004605 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4606 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004607 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004608 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004609 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4610 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004611 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004612
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004613 // We translate this by hand to the -cc1 argument, since nightly test uses
4614 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004615 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004616 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004617 OptDisabled = true;
4618 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004619 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004620 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004621
Bob Wilson23a55f12014-12-21 07:00:00 +00004622 // With -save-temps, we want to save the unoptimized bitcode output from the
4623 // CompileJobAction, so disable optimizations if they are not already
4624 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004625 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004626 isa<CompileJobAction>(JA))
4627 CmdArgs.push_back("-disable-llvm-optzns");
4628
Daniel Dunbard67a3222009-03-30 06:36:42 +00004629 if (Output.getType() == types::TY_Dependencies) {
4630 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004631 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004632 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004633 CmdArgs.push_back(Output.getFilename());
4634 } else {
4635 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004636 }
4637
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004638 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004639 addDashXForInput(Args, II, CmdArgs);
4640
Daniel Dunbarb440f562010-08-02 02:38:21 +00004641 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004642 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004643 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004644 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004645 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004646
Chris Lattnere9d7d782009-11-03 19:50:27 +00004647 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4648
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004649 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004650
4651 // Optionally embed the -cc1 level arguments into the debug info, for build
4652 // analysis.
4653 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004654 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004655 for (const auto &Arg : Args)
4656 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004657
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004658 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004659 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004660 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004661 SmallString<128> EscapedArg;
4662 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004663 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004664 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004665 }
4666 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004667 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004668 }
4669
Eric Christopherd3804002013-02-22 20:12:52 +00004670 // Add the split debug info name to the command lines here so we
4671 // can propagate it to the backend.
4672 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004673 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004674 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4675 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004676 const char *SplitDwarfOut;
4677 if (SplitDwarf) {
4678 CmdArgs.push_back("-split-dwarf-file");
4679 SplitDwarfOut = SplitDebugName(Args, Inputs);
4680 CmdArgs.push_back(SplitDwarfOut);
4681 }
4682
4683 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004684 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004685 Output.getType() == types::TY_Object &&
4686 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004687 auto CLCommand =
4688 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4689 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4690 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004691 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004692 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004693 }
4694
Daniel Dunbar17731772009-03-23 19:03:36 +00004695
Eric Christopherf1545832013-02-22 23:50:16 +00004696 // Handle the debug info splitting at object creation time if we're
4697 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004698 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004699 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004700 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004701
Roman Divacky178e01602011-02-10 16:52:03 +00004702 if (Arg *A = Args.getLastArg(options::OPT_pg))
4703 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004704 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004705 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004706
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004707 // Claim some arguments which clang supports automatically.
4708
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004709 // -fpch-preprocess is used with gcc to add a special marker in the output to
4710 // include the PCH file. Clang's PTH solution is completely transparent, so we
4711 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004712 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004713
Daniel Dunbar17731772009-03-23 19:03:36 +00004714 // Claim some arguments which clang doesn't support, but we don't
4715 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004716 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4717 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004718
Rafael Espindolab0092d72013-09-04 19:37:35 +00004719 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004720 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004721}
4722
John McCall5fb5df92012-06-20 06:18:46 +00004723/// Add options related to the Objective-C runtime/ABI.
4724///
4725/// Returns true if the runtime is non-fragile.
4726ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4727 ArgStringList &cmdArgs,
4728 RewriteKind rewriteKind) const {
4729 // Look for the controlling runtime option.
4730 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4731 options::OPT_fgnu_runtime,
4732 options::OPT_fobjc_runtime_EQ);
4733
4734 // Just forward -fobjc-runtime= to the frontend. This supercedes
4735 // options about fragility.
4736 if (runtimeArg &&
4737 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4738 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004739 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004740 if (runtime.tryParse(value)) {
4741 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4742 << value;
4743 }
4744
4745 runtimeArg->render(args, cmdArgs);
4746 return runtime;
4747 }
4748
4749 // Otherwise, we'll need the ABI "version". Version numbers are
4750 // slightly confusing for historical reasons:
4751 // 1 - Traditional "fragile" ABI
4752 // 2 - Non-fragile ABI, version 1
4753 // 3 - Non-fragile ABI, version 2
4754 unsigned objcABIVersion = 1;
4755 // If -fobjc-abi-version= is present, use that to set the version.
4756 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004757 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004758 if (value == "1")
4759 objcABIVersion = 1;
4760 else if (value == "2")
4761 objcABIVersion = 2;
4762 else if (value == "3")
4763 objcABIVersion = 3;
4764 else
4765 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4766 << value;
4767 } else {
4768 // Otherwise, determine if we are using the non-fragile ABI.
4769 bool nonFragileABIIsDefault =
4770 (rewriteKind == RK_NonFragile ||
4771 (rewriteKind == RK_None &&
4772 getToolChain().IsObjCNonFragileABIDefault()));
4773 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4774 options::OPT_fno_objc_nonfragile_abi,
4775 nonFragileABIIsDefault)) {
4776 // Determine the non-fragile ABI version to use.
4777#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4778 unsigned nonFragileABIVersion = 1;
4779#else
4780 unsigned nonFragileABIVersion = 2;
4781#endif
4782
4783 if (Arg *abiArg = args.getLastArg(
4784 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004785 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004786 if (value == "1")
4787 nonFragileABIVersion = 1;
4788 else if (value == "2")
4789 nonFragileABIVersion = 2;
4790 else
4791 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4792 << value;
4793 }
4794
4795 objcABIVersion = 1 + nonFragileABIVersion;
4796 } else {
4797 objcABIVersion = 1;
4798 }
4799 }
4800
4801 // We don't actually care about the ABI version other than whether
4802 // it's non-fragile.
4803 bool isNonFragile = objcABIVersion != 1;
4804
4805 // If we have no runtime argument, ask the toolchain for its default runtime.
4806 // However, the rewriter only really supports the Mac runtime, so assume that.
4807 ObjCRuntime runtime;
4808 if (!runtimeArg) {
4809 switch (rewriteKind) {
4810 case RK_None:
4811 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4812 break;
4813 case RK_Fragile:
4814 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4815 break;
4816 case RK_NonFragile:
4817 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4818 break;
4819 }
4820
4821 // -fnext-runtime
4822 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4823 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004824 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004825 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4826
4827 // Otherwise, build for a generic macosx port.
4828 } else {
4829 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4830 }
4831
4832 // -fgnu-runtime
4833 } else {
4834 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004835 // Legacy behaviour is to target the gnustep runtime if we are i
4836 // non-fragile mode or the GCC runtime in fragile mode.
4837 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004838 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004839 else
4840 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004841 }
4842
4843 cmdArgs.push_back(args.MakeArgString(
4844 "-fobjc-runtime=" + runtime.getAsString()));
4845 return runtime;
4846}
4847
Reid Klecknerc542d372014-06-27 17:02:02 +00004848static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4849 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4850 I += HaveDash;
4851 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004852}
Reid Klecknerc542d372014-06-27 17:02:02 +00004853
4854struct EHFlags {
4855 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4856 bool Synch;
4857 bool Asynch;
4858 bool NoExceptC;
4859};
4860
4861/// /EH controls whether to run destructor cleanups when exceptions are
4862/// thrown. There are three modifiers:
4863/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4864/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4865/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4866/// - c: Assume that extern "C" functions are implicitly noexcept. This
4867/// modifier is an optimization, so we ignore it for now.
4868/// The default is /EHs-c-, meaning cleanups are disabled.
4869static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4870 EHFlags EH;
4871 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4872 for (auto EHVal : EHArgs) {
4873 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4874 switch (EHVal[I]) {
4875 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4876 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4877 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4878 default: break;
4879 }
4880 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4881 break;
4882 }
4883 }
4884 return EH;
4885}
4886
Hans Wennborg75958c42013-08-08 00:17:41 +00004887void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4888 unsigned RTOptionID = options::OPT__SLASH_MT;
4889
Hans Wennborgf1a74252013-09-10 20:18:04 +00004890 if (Args.hasArg(options::OPT__SLASH_LDd))
4891 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4892 // but defining _DEBUG is sticky.
4893 RTOptionID = options::OPT__SLASH_MTd;
4894
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004895 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004896 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004897
Hans Wennborg75958c42013-08-08 00:17:41 +00004898 switch(RTOptionID) {
4899 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004900 if (Args.hasArg(options::OPT__SLASH_LDd))
4901 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004902 CmdArgs.push_back("-D_MT");
4903 CmdArgs.push_back("-D_DLL");
4904 CmdArgs.push_back("--dependent-lib=msvcrt");
4905 break;
4906 case options::OPT__SLASH_MDd:
4907 CmdArgs.push_back("-D_DEBUG");
4908 CmdArgs.push_back("-D_MT");
4909 CmdArgs.push_back("-D_DLL");
4910 CmdArgs.push_back("--dependent-lib=msvcrtd");
4911 break;
4912 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004913 if (Args.hasArg(options::OPT__SLASH_LDd))
4914 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004915 CmdArgs.push_back("-D_MT");
4916 CmdArgs.push_back("--dependent-lib=libcmt");
4917 break;
4918 case options::OPT__SLASH_MTd:
4919 CmdArgs.push_back("-D_DEBUG");
4920 CmdArgs.push_back("-D_MT");
4921 CmdArgs.push_back("--dependent-lib=libcmtd");
4922 break;
4923 default:
4924 llvm_unreachable("Unexpected option ID.");
4925 }
4926
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004927 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4928 // users want. The /Za flag to cl.exe turns this off, but it's not
4929 // implemented in clang.
4930 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004931
Hans Wennborg8858a032014-07-21 23:42:07 +00004932 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4933 // would produce interleaved output, so ignore /showIncludes in such cases.
4934 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4935 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4936 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004937
David Majnemerf6072342014-07-01 22:24:56 +00004938 // This controls whether or not we emit RTTI data for polymorphic types.
4939 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4940 /*default=*/false))
4941 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004942
Reid Klecknerc542d372014-06-27 17:02:02 +00004943 const Driver &D = getToolChain().getDriver();
4944 EHFlags EH = parseClangCLEHFlags(D, Args);
4945 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004946 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004947 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004948 CmdArgs.push_back("-fexceptions");
4949 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004950
Hans Wennborge50cec32014-06-13 20:59:54 +00004951 // /EP should expand to -E -P.
4952 if (Args.hasArg(options::OPT__SLASH_EP)) {
4953 CmdArgs.push_back("-E");
4954 CmdArgs.push_back("-P");
4955 }
4956
David Majnemera5b195a2015-02-14 01:35:12 +00004957 unsigned VolatileOptionID;
4958 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4959 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4960 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4961 else
4962 VolatileOptionID = options::OPT__SLASH_volatile_iso;
4963
4964 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
4965 VolatileOptionID = A->getOption().getID();
4966
4967 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
4968 CmdArgs.push_back("-fms-volatile");
4969
David Majnemer86c318f2014-02-11 21:05:00 +00004970 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4971 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4972 if (MostGeneralArg && BestCaseArg)
4973 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4974 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4975
4976 if (MostGeneralArg) {
4977 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4978 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4979 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4980
4981 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4982 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4983 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4984 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4985 << FirstConflict->getAsString(Args)
4986 << SecondConflict->getAsString(Args);
4987
4988 if (SingleArg)
4989 CmdArgs.push_back("-fms-memptr-rep=single");
4990 else if (MultipleArg)
4991 CmdArgs.push_back("-fms-memptr-rep=multiple");
4992 else
4993 CmdArgs.push_back("-fms-memptr-rep=virtual");
4994 }
4995
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004996 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4997 A->render(Args, CmdArgs);
4998
Hans Wennborg81f74482013-09-10 01:07:07 +00004999 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5000 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005001 if (Args.hasArg(options::OPT__SLASH_fallback))
5002 CmdArgs.push_back("msvc-fallback");
5003 else
5004 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005005 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005006}
5007
Hans Wennborg1da044a2014-06-26 19:59:02 +00005008visualstudio::Compile *Clang::getCLFallback() const {
5009 if (!CLFallback)
5010 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5011 return CLFallback.get();
5012}
5013
Daniel Sanders7f933f42015-01-30 17:35:23 +00005014void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5015 ArgStringList &CmdArgs) const {
5016 StringRef CPUName;
5017 StringRef ABIName;
5018 const llvm::Triple &Triple = getToolChain().getTriple();
5019 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5020
5021 CmdArgs.push_back("-target-abi");
5022 CmdArgs.push_back(ABIName.data());
5023}
5024
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005025void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005026 const InputInfo &Output,
5027 const InputInfoList &Inputs,
5028 const ArgList &Args,
5029 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005030 ArgStringList CmdArgs;
5031
5032 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5033 const InputInfo &Input = Inputs[0];
5034
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005035 // Don't warn about "clang -w -c foo.s"
5036 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005037 // and "clang -emit-llvm -c foo.s"
5038 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005039
Rafael Espindola577637a2015-01-03 00:06:04 +00005040 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005041
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005042 // Invoke ourselves in -cc1as mode.
5043 //
5044 // FIXME: Implement custom jobs for internal actions.
5045 CmdArgs.push_back("-cc1as");
5046
5047 // Add the "effective" target triple.
5048 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005049 std::string TripleStr =
5050 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005051 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5052
5053 // Set the output mode, we currently only expect to be used as a real
5054 // assembler.
5055 CmdArgs.push_back("-filetype");
5056 CmdArgs.push_back("obj");
5057
Eric Christopher45f2e712012-12-18 00:31:10 +00005058 // Set the main file name, so that debug info works even with
5059 // -save-temps or preprocessed assembly.
5060 CmdArgs.push_back("-main-file-name");
5061 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
5062
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005063 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005064 const llvm::Triple &Triple = getToolChain().getTriple();
5065 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005066 if (!CPU.empty()) {
5067 CmdArgs.push_back("-target-cpu");
5068 CmdArgs.push_back(Args.MakeArgString(CPU));
5069 }
5070
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005071 // Add the target features
5072 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005073 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005074
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005075 // Ignore explicit -force_cpusubtype_ALL option.
5076 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005077
Eric Christopherfc3ee562012-01-10 00:38:01 +00005078 // Determine the original source input.
5079 const Action *SourceAction = &JA;
5080 while (SourceAction->getKind() != Action::InputClass) {
5081 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5082 SourceAction = SourceAction->getInputs()[0];
5083 }
5084
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005085 // Forward -g and handle debug info related flags, assuming we are dealing
5086 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005087 if (SourceAction->getType() == types::TY_Asm ||
5088 SourceAction->getType() == types::TY_PP_Asm) {
5089 Args.ClaimAllArgs(options::OPT_g_Group);
5090 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5091 if (!A->getOption().matches(options::OPT_g0))
5092 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005093
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005094 if (Args.hasArg(options::OPT_gdwarf_2))
5095 CmdArgs.push_back("-gdwarf-2");
5096 if (Args.hasArg(options::OPT_gdwarf_3))
5097 CmdArgs.push_back("-gdwarf-3");
5098 if (Args.hasArg(options::OPT_gdwarf_4))
5099 CmdArgs.push_back("-gdwarf-4");
5100
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005101 // Add the -fdebug-compilation-dir flag if needed.
5102 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005103
5104 // Set the AT_producer to the clang version when using the integrated
5105 // assembler on assembly source files.
5106 CmdArgs.push_back("-dwarf-debug-producer");
5107 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005108 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005109
5110 // Optionally embed the -cc1as level arguments into the debug info, for build
5111 // analysis.
5112 if (getToolChain().UseDwarfDebugFlags()) {
5113 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005114 for (const auto &Arg : Args)
5115 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005116
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005117 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005118 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5119 Flags += Exec;
5120 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005121 SmallString<128> EscapedArg;
5122 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005123 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005124 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005125 }
5126 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005127 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005128 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005129
5130 // FIXME: Add -static support, once we have it.
5131
Daniel Sanders7f933f42015-01-30 17:35:23 +00005132 // Add target specific flags.
5133 switch(getToolChain().getArch()) {
5134 default:
5135 break;
5136
5137 case llvm::Triple::mips:
5138 case llvm::Triple::mipsel:
5139 case llvm::Triple::mips64:
5140 case llvm::Triple::mips64el:
5141 AddMIPSTargetArgs(Args, CmdArgs);
5142 break;
5143 }
5144
David Blaikie372d9502014-01-17 03:17:40 +00005145 // Consume all the warning flags. Usually this would be handled more
5146 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5147 // doesn't handle that so rather than warning about unused flags that are
5148 // actually used, we'll lie by omission instead.
5149 // FIXME: Stop lying and consume only the appropriate driver flags
5150 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5151 ie = Args.filtered_end();
5152 it != ie; ++it)
5153 (*it)->claim();
5154
David Blaikie9260ed62013-07-25 21:19:01 +00005155 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5156 getToolChain().getDriver());
5157
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005158 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005159
5160 assert(Output.isFilename() && "Unexpected lipo output.");
5161 CmdArgs.push_back("-o");
5162 CmdArgs.push_back(Output.getFilename());
5163
Daniel Dunbarb440f562010-08-02 02:38:21 +00005164 assert(Input.isFilename() && "Invalid input.");
5165 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005166
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005167 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005168 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005169
5170 // Handle the debug info splitting at object creation time if we're
5171 // creating an object.
5172 // TODO: Currently only works on linux with newer objcopy.
5173 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005174 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005175 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5176 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005177}
5178
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005179void GnuTool::anchor() {}
5180
Daniel Dunbara3246a02009-03-18 08:07:30 +00005181void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005182 const InputInfo &Output,
5183 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005184 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005185 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005186 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005187 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005188
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005189 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005190 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005191 // Don't forward any -g arguments to assembly steps.
5192 if (isa<AssembleJobAction>(JA) &&
5193 A->getOption().matches(options::OPT_g_Group))
5194 continue;
5195
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005196 // Don't forward any -W arguments to assembly and link steps.
5197 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5198 A->getOption().matches(options::OPT_W_Group))
5199 continue;
5200
Daniel Dunbar2da02722009-03-19 07:55:12 +00005201 // It is unfortunate that we have to claim here, as this means
5202 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005203 // platforms using a generic gcc, even if we are just using gcc
5204 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005205 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005206 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005207 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005208 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005209
Daniel Dunbar4e295052010-01-25 22:35:08 +00005210 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005211
5212 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005213 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005214 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005215 CmdArgs.push_back(
5216 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005217 }
5218
Daniel Dunbar5716d872009-05-02 21:41:52 +00005219 // Try to force gcc to match the tool chain we want, if we recognize
5220 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005221 //
5222 // FIXME: The triple class should directly provide the information we want
5223 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005224 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005225 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005226 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005227 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5228 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005229 CmdArgs.push_back("-m64");
5230
Daniel Dunbarb440f562010-08-02 02:38:21 +00005231 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005232 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005233 CmdArgs.push_back(Output.getFilename());
5234 } else {
5235 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005236 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005237 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005238
Tony Linthicum76329bf2011-12-12 21:14:55 +00005239 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5240 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005241
5242 // Only pass -x if gcc will understand it; otherwise hope gcc
5243 // understands the suffix correctly. The main use case this would go
5244 // wrong in is for linker inputs if they happened to have an odd
5245 // suffix; really the only way to get this to happen is a command
5246 // like '-x foobar a.c' which will treat a.c like a linker input.
5247 //
5248 // FIXME: For the linker case specifically, can we safely convert
5249 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005250 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005251 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005252 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5253 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005254 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005255 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005256 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005257 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005258 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005259 else if (II.getType() == types::TY_ModuleFile)
5260 D.Diag(diag::err_drv_no_module_support)
5261 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005262
Daniel Dunbara3246a02009-03-18 08:07:30 +00005263 if (types::canTypeBeUserSpecified(II.getType())) {
5264 CmdArgs.push_back("-x");
5265 CmdArgs.push_back(types::getTypeName(II.getType()));
5266 }
5267
Daniel Dunbarb440f562010-08-02 02:38:21 +00005268 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005269 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005270 else {
5271 const Arg &A = II.getInputArg();
5272
5273 // Reverse translate some rewritten options.
5274 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5275 CmdArgs.push_back("-lstdc++");
5276 continue;
5277 }
5278
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005279 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005280 A.render(Args, CmdArgs);
5281 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005282 }
5283
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005284 const std::string customGCCName = D.getCCCGenericGCCName();
5285 const char *GCCName;
5286 if (!customGCCName.empty())
5287 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005288 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005289 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005290 } else
5291 GCCName = "gcc";
5292
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005293 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005294 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005296}
5297
Daniel Dunbar4e295052010-01-25 22:35:08 +00005298void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5299 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005300 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005301}
5302
Daniel Dunbar4e295052010-01-25 22:35:08 +00005303void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5304 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005305 const Driver &D = getToolChain().getDriver();
5306
Eric Christophercc7ff502015-01-29 00:56:17 +00005307 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005308 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005309 case types::TY_LLVM_IR:
5310 case types::TY_LTO_IR:
5311 case types::TY_LLVM_BC:
5312 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005313 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005314 break;
5315 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005316 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005317 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005318 case types::TY_Nothing:
5319 CmdArgs.push_back("-fsyntax-only");
5320 break;
5321 default:
5322 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005323 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005324}
5325
Daniel Dunbar4e295052010-01-25 22:35:08 +00005326void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5327 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005328 // The types are (hopefully) good enough.
5329}
5330
Tony Linthicum76329bf2011-12-12 21:14:55 +00005331// Hexagon tools start.
5332void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5333 ArgStringList &CmdArgs) const {
5334
5335}
5336void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5337 const InputInfo &Output,
5338 const InputInfoList &Inputs,
5339 const ArgList &Args,
5340 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005341 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005342
5343 const Driver &D = getToolChain().getDriver();
5344 ArgStringList CmdArgs;
5345
5346 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005347 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005348 CmdArgs.push_back(Args.MakeArgString(MarchString));
5349
5350 RenderExtraToolArgs(JA, CmdArgs);
5351
5352 if (Output.isFilename()) {
5353 CmdArgs.push_back("-o");
5354 CmdArgs.push_back(Output.getFilename());
5355 } else {
5356 assert(Output.isNothing() && "Unexpected output");
5357 CmdArgs.push_back("-fsyntax-only");
5358 }
5359
Matthew Curtise8f80a12012-12-06 17:49:03 +00005360 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5361 if (!SmallDataThreshold.empty())
5362 CmdArgs.push_back(
5363 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005364
Matthew Curtise5df3812012-12-07 17:23:04 +00005365 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5366 options::OPT_Xassembler);
5367
Tony Linthicum76329bf2011-12-12 21:14:55 +00005368 // Only pass -x if gcc will understand it; otherwise hope gcc
5369 // understands the suffix correctly. The main use case this would go
5370 // wrong in is for linker inputs if they happened to have an odd
5371 // suffix; really the only way to get this to happen is a command
5372 // like '-x foobar a.c' which will treat a.c like a linker input.
5373 //
5374 // FIXME: For the linker case specifically, can we safely convert
5375 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005376 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005377 // Don't try to pass LLVM or AST inputs to a generic gcc.
5378 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5379 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5380 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5381 << getToolChain().getTripleString();
5382 else if (II.getType() == types::TY_AST)
5383 D.Diag(clang::diag::err_drv_no_ast_support)
5384 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005385 else if (II.getType() == types::TY_ModuleFile)
5386 D.Diag(diag::err_drv_no_module_support)
5387 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005388
5389 if (II.isFilename())
5390 CmdArgs.push_back(II.getFilename());
5391 else
5392 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5393 II.getInputArg().render(Args, CmdArgs);
5394 }
5395
5396 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005397 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005398 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005399}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005400
Tony Linthicum76329bf2011-12-12 21:14:55 +00005401void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5402 ArgStringList &CmdArgs) const {
5403 // The types are (hopefully) good enough.
5404}
5405
5406void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5407 const InputInfo &Output,
5408 const InputInfoList &Inputs,
5409 const ArgList &Args,
5410 const char *LinkingOutput) const {
5411
Matthew Curtise689b052012-12-06 15:46:07 +00005412 const toolchains::Hexagon_TC& ToolChain =
5413 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5414 const Driver &D = ToolChain.getDriver();
5415
Tony Linthicum76329bf2011-12-12 21:14:55 +00005416 ArgStringList CmdArgs;
5417
Matthew Curtise689b052012-12-06 15:46:07 +00005418 //----------------------------------------------------------------------------
5419 //
5420 //----------------------------------------------------------------------------
5421 bool hasStaticArg = Args.hasArg(options::OPT_static);
5422 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005423 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005424 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5425 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5426 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5427 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005428
Matthew Curtise689b052012-12-06 15:46:07 +00005429 //----------------------------------------------------------------------------
5430 // Silence warnings for various options
5431 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005432
Matthew Curtise689b052012-12-06 15:46:07 +00005433 Args.ClaimAllArgs(options::OPT_g_Group);
5434 Args.ClaimAllArgs(options::OPT_emit_llvm);
5435 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5436 // handled somewhere else.
5437 Args.ClaimAllArgs(options::OPT_static_libgcc);
5438
5439 //----------------------------------------------------------------------------
5440 //
5441 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005442 for (const auto &Opt : ToolChain.ExtraOpts)
5443 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005444
Matthew Curtisf10a5952012-12-06 14:16:43 +00005445 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5446 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005447
Matthew Curtise689b052012-12-06 15:46:07 +00005448 if (buildingLib) {
5449 CmdArgs.push_back("-shared");
5450 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5451 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005452 }
5453
Matthew Curtise689b052012-12-06 15:46:07 +00005454 if (hasStaticArg)
5455 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005456
Matthew Curtise8f80a12012-12-06 17:49:03 +00005457 if (buildPIE && !buildingLib)
5458 CmdArgs.push_back("-pie");
5459
5460 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5461 if (!SmallDataThreshold.empty()) {
5462 CmdArgs.push_back(
5463 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5464 }
5465
Matthew Curtise689b052012-12-06 15:46:07 +00005466 //----------------------------------------------------------------------------
5467 //
5468 //----------------------------------------------------------------------------
5469 CmdArgs.push_back("-o");
5470 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005471
Matthew Curtise689b052012-12-06 15:46:07 +00005472 const std::string MarchSuffix = "/" + MarchString;
5473 const std::string G0Suffix = "/G0";
5474 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005475 const std::string RootDir =
5476 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005477 const std::string StartFilesDir = RootDir
5478 + "hexagon/lib"
5479 + (buildingLib
5480 ? MarchG0Suffix : MarchSuffix);
5481
5482 //----------------------------------------------------------------------------
5483 // moslib
5484 //----------------------------------------------------------------------------
5485 std::vector<std::string> oslibs;
5486 bool hasStandalone= false;
5487
5488 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5489 ie = Args.filtered_end(); it != ie; ++it) {
5490 (*it)->claim();
5491 oslibs.push_back((*it)->getValue());
5492 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005493 }
Matthew Curtise689b052012-12-06 15:46:07 +00005494 if (oslibs.empty()) {
5495 oslibs.push_back("standalone");
5496 hasStandalone = true;
5497 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005498
Matthew Curtise689b052012-12-06 15:46:07 +00005499 //----------------------------------------------------------------------------
5500 // Start Files
5501 //----------------------------------------------------------------------------
5502 if (incStdLib && incStartFiles) {
5503
5504 if (!buildingLib) {
5505 if (hasStandalone) {
5506 CmdArgs.push_back(
5507 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5508 }
5509 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5510 }
5511 std::string initObj = useShared ? "/initS.o" : "/init.o";
5512 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5513 }
5514
5515 //----------------------------------------------------------------------------
5516 // Library Search Paths
5517 //----------------------------------------------------------------------------
5518 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005519 for (const auto &LibPath : LibPaths)
5520 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005521
5522 //----------------------------------------------------------------------------
5523 //
5524 //----------------------------------------------------------------------------
5525 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5526 Args.AddAllArgs(CmdArgs, options::OPT_e);
5527 Args.AddAllArgs(CmdArgs, options::OPT_s);
5528 Args.AddAllArgs(CmdArgs, options::OPT_t);
5529 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5530
5531 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5532
5533 //----------------------------------------------------------------------------
5534 // Libraries
5535 //----------------------------------------------------------------------------
5536 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005537 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005538 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5539 CmdArgs.push_back("-lm");
5540 }
5541
5542 CmdArgs.push_back("--start-group");
5543
5544 if (!buildingLib) {
5545 for(std::vector<std::string>::iterator i = oslibs.begin(),
5546 e = oslibs.end(); i != e; ++i)
5547 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5548 CmdArgs.push_back("-lc");
5549 }
5550 CmdArgs.push_back("-lgcc");
5551
5552 CmdArgs.push_back("--end-group");
5553 }
5554
5555 //----------------------------------------------------------------------------
5556 // End files
5557 //----------------------------------------------------------------------------
5558 if (incStdLib && incStartFiles) {
5559 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5560 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5561 }
5562
5563 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005564 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5565 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005566}
5567// Hexagon tools end.
5568
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005569/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005570const char *arm::getARMCPUForMArch(const ArgList &Args,
5571 const llvm::Triple &Triple) {
5572 StringRef MArch;
5573 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5574 // Otherwise, if we have -march= choose the base CPU for that arch.
5575 MArch = A->getValue();
5576 } else {
5577 // Otherwise, use the Arch from the triple.
5578 MArch = Triple.getArchName();
5579 }
5580
5581 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005582 if (MArch == "native") {
5583 std::string CPU = llvm::sys::getHostCPUName();
5584 if (CPU != "generic") {
5585 // Translate the native cpu into the architecture. The switch below will
5586 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005587 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005588 }
5589 }
5590
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005591 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005592}
5593
5594/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005595StringRef arm::getARMTargetCPU(const ArgList &Args,
5596 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005597 // FIXME: Warn on inconsistent use of -mcpu and -march.
5598 // If we have -mcpu=, use that.
5599 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5600 StringRef MCPU = A->getValue();
5601 // Handle -mcpu=native.
5602 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005603 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005604 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005605 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005606 }
5607
5608 return getARMCPUForMArch(Args, Triple);
5609}
5610
5611/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5612/// CPU.
5613//
5614// FIXME: This is redundant with -mcpu, why does LLVM use this.
5615// FIXME: tblgen this, or kill it!
5616const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5617 return llvm::StringSwitch<const char *>(CPU)
5618 .Case("strongarm", "v4")
5619 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5620 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5621 .Cases("arm920", "arm920t", "arm922t", "v4t")
5622 .Cases("arm940t", "ep9312","v4t")
5623 .Cases("arm10tdmi", "arm1020t", "v5")
5624 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5625 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5626 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005627 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5628 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5629 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005630 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005631 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005632 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005633 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005634 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5635 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005636 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005637 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005638 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005639 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005640 .Default("");
5641}
5642
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005643void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5644 if (Args.hasArg(options::OPT_r))
5645 return;
5646
5647 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5648 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5649 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005650 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005651 .Default("--be8");
5652
5653 if (LinkFlag)
5654 CmdArgs.push_back(LinkFlag);
5655}
5656
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005657mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5658 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5659 .Case("mips1", NanLegacy)
5660 .Case("mips2", NanLegacy)
5661 .Case("mips3", NanLegacy)
5662 .Case("mips4", NanLegacy)
5663 .Case("mips5", NanLegacy)
5664 .Case("mips32", NanLegacy)
5665 .Case("mips32r2", NanLegacy)
5666 .Case("mips32r3", NanLegacy | Nan2008)
5667 .Case("mips32r5", NanLegacy | Nan2008)
5668 .Case("mips32r6", Nan2008)
5669 .Case("mips64", NanLegacy)
5670 .Case("mips64r2", NanLegacy)
5671 .Case("mips64r3", NanLegacy | Nan2008)
5672 .Case("mips64r5", NanLegacy | Nan2008)
5673 .Case("mips64r6", Nan2008)
5674 .Default(NanLegacy);
5675}
5676
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005677bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5678 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5679 return A && (A->getValue() == StringRef(Value));
5680}
5681
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005682bool mips::isUCLibc(const ArgList &Args) {
5683 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005684 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005685}
5686
Daniel Sanders2bf13662014-07-10 14:40:57 +00005687bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005688 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5689 return llvm::StringSwitch<bool>(NaNArg->getValue())
5690 .Case("2008", true)
5691 .Case("legacy", false)
5692 .Default(false);
5693
5694 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005695 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5696 .Cases("mips32r6", "mips64r6", true)
5697 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005698
5699 return false;
5700}
5701
Daniel Sanders379d44b2014-07-16 11:52:23 +00005702bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5703 StringRef ABIName) {
5704 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005705 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005706 return false;
5707
5708 if (ABIName != "32")
5709 return false;
5710
5711 return llvm::StringSwitch<bool>(CPUName)
5712 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005713 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5714 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005715 .Default(false);
5716}
5717
Tim Northover157d9112014-01-16 08:48:16 +00005718llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005719 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5720 // archs which Darwin doesn't use.
5721
5722 // The matching this routine does is fairly pointless, since it is neither the
5723 // complete architecture list, nor a reasonable subset. The problem is that
5724 // historically the driver driver accepts this and also ties its -march=
5725 // handling to the architecture name, so we need to be careful before removing
5726 // support for it.
5727
5728 // This code must be kept in sync with Clang's Darwin specific argument
5729 // translation.
5730
5731 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5732 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5733 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5734 .Case("ppc64", llvm::Triple::ppc64)
5735 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5736 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5737 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005738 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005739 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005740 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005741 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005742 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005743 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005744 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005745 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005746 .Case("nvptx", llvm::Triple::nvptx)
5747 .Case("nvptx64", llvm::Triple::nvptx64)
5748 .Case("amdil", llvm::Triple::amdil)
5749 .Case("spir", llvm::Triple::spir)
5750 .Default(llvm::Triple::UnknownArch);
5751}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005752
Tim Northover157d9112014-01-16 08:48:16 +00005753void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5754 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5755 T.setArch(Arch);
5756
5757 if (Str == "x86_64h")
5758 T.setArchName(Str);
5759 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5760 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005761 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005762 }
5763}
5764
Bob Wilsondecc03e2012-11-23 06:14:39 +00005765const char *Clang::getBaseInputName(const ArgList &Args,
5766 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005767 return Args.MakeArgString(
5768 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005769}
5770
Bob Wilsondecc03e2012-11-23 06:14:39 +00005771const char *Clang::getBaseInputStem(const ArgList &Args,
5772 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005773 const char *Str = getBaseInputName(Args, Inputs);
5774
Chris Lattner906bb902011-01-16 08:14:11 +00005775 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005776 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005777
5778 return Str;
5779}
5780
Bob Wilsondecc03e2012-11-23 06:14:39 +00005781const char *Clang::getDependencyFileName(const ArgList &Args,
5782 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005783 // FIXME: Think about this more.
5784 std::string Res;
5785
5786 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005787 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005788 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005789 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005790 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005791 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005792 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005793}
5794
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005795void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5796 const InputInfo &Output,
5797 const InputInfoList &Inputs,
5798 const ArgList &Args,
5799 const char *LinkingOutput) const {
5800 const ToolChain &ToolChain = getToolChain();
5801 const Driver &D = ToolChain.getDriver();
5802 ArgStringList CmdArgs;
5803
5804 // Silence warning for "clang -g foo.o -o foo"
5805 Args.ClaimAllArgs(options::OPT_g_Group);
5806 // and "clang -emit-llvm foo.o -o foo"
5807 Args.ClaimAllArgs(options::OPT_emit_llvm);
5808 // and for "clang -w foo.o -o foo". Other warning options are already
5809 // handled somewhere else.
5810 Args.ClaimAllArgs(options::OPT_w);
5811
5812 if (!D.SysRoot.empty())
5813 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5814
5815 // CloudABI only supports static linkage.
5816 CmdArgs.push_back("-Bstatic");
5817 CmdArgs.push_back("--eh-frame-hdr");
5818 CmdArgs.push_back("--gc-sections");
5819
5820 if (Output.isFilename()) {
5821 CmdArgs.push_back("-o");
5822 CmdArgs.push_back(Output.getFilename());
5823 } else {
5824 assert(Output.isNothing() && "Invalid output.");
5825 }
5826
5827 if (!Args.hasArg(options::OPT_nostdlib) &&
5828 !Args.hasArg(options::OPT_nostartfiles)) {
5829 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5831 }
5832
5833 Args.AddAllArgs(CmdArgs, options::OPT_L);
5834 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5835 for (const auto &Path : Paths)
5836 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5837 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5838 Args.AddAllArgs(CmdArgs, options::OPT_e);
5839 Args.AddAllArgs(CmdArgs, options::OPT_s);
5840 Args.AddAllArgs(CmdArgs, options::OPT_t);
5841 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5842 Args.AddAllArgs(CmdArgs, options::OPT_r);
5843
5844 if (D.IsUsingLTO(ToolChain, Args))
5845 AddGoldPlugin(ToolChain, Args, CmdArgs);
5846
5847 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5848
5849 if (!Args.hasArg(options::OPT_nostdlib) &&
5850 !Args.hasArg(options::OPT_nodefaultlibs)) {
5851 if (D.CCCIsCXX())
5852 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5853 CmdArgs.push_back("-lc");
5854 CmdArgs.push_back("-lcompiler_rt");
5855 }
5856
5857 if (!Args.hasArg(options::OPT_nostdlib) &&
5858 !Args.hasArg(options::OPT_nostartfiles))
5859 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5860
5861 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5862 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5863}
5864
Daniel Dunbarbe220842009-03-20 16:06:39 +00005865void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005866 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005867 const InputInfoList &Inputs,
5868 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005869 const char *LinkingOutput) const {
5870 ArgStringList CmdArgs;
5871
5872 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5873 const InputInfo &Input = Inputs[0];
5874
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005875 // Determine the original source input.
5876 const Action *SourceAction = &JA;
5877 while (SourceAction->getKind() != Action::InputClass) {
5878 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5879 SourceAction = SourceAction->getInputs()[0];
5880 }
5881
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005882 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005883 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005884 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5885 // FIXME: at run-time detect assembler capabilities or rely on version
5886 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005887 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005888 const llvm::Triple &T(getToolChain().getTriple());
5889 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005890 CmdArgs.push_back("-Q");
5891 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005892
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005893 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005894 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005895 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005896 if (Args.hasArg(options::OPT_gstabs))
5897 CmdArgs.push_back("--gstabs");
5898 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005899 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005900 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005901
Daniel Dunbarbe220842009-03-20 16:06:39 +00005902 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005903 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005904
Daniel Dunbar6d484762010-07-22 01:47:22 +00005905 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005906 if (getToolChain().getArch() == llvm::Triple::x86 ||
5907 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005908 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5909 CmdArgs.push_back("-force_cpusubtype_ALL");
5910
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005911 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005912 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005913 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005914 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005915 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005916 CmdArgs.push_back("-static");
5917
Daniel Dunbarbe220842009-03-20 16:06:39 +00005918 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5919 options::OPT_Xassembler);
5920
5921 assert(Output.isFilename() && "Unexpected lipo output.");
5922 CmdArgs.push_back("-o");
5923 CmdArgs.push_back(Output.getFilename());
5924
Daniel Dunbarb440f562010-08-02 02:38:21 +00005925 assert(Input.isFilename() && "Invalid input.");
5926 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005927
5928 // asm_final spec is empty.
5929
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005930 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005931 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005932 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005933}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005934
Tim Northover157d9112014-01-16 08:48:16 +00005935void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005936
Tim Northover157d9112014-01-16 08:48:16 +00005937void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5938 ArgStringList &CmdArgs) const {
5939 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005940
Daniel Dunbarc1964212009-03-26 16:23:12 +00005941 // Derived from darwin_arch spec.
5942 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005943 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005944
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005945 // FIXME: Is this needed anymore?
5946 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005947 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005948}
5949
Bill Wendling3b2000f2012-10-02 18:02:50 +00005950bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5951 // We only need to generate a temp path for LTO if we aren't compiling object
5952 // files. When compiling source files, we run 'dsymutil' after linking. We
5953 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005954 for (const auto &Input : Inputs)
5955 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005956 return true;
5957
5958 return false;
5959}
5960
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005961void darwin::Link::AddLinkArgs(Compilation &C,
5962 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005963 ArgStringList &CmdArgs,
5964 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005965 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005966 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005967
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005968 unsigned Version[3] = { 0, 0, 0 };
5969 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5970 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005971 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005972 Version[1], Version[2], HadExtra) ||
5973 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005974 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005975 << A->getAsString(Args);
5976 }
5977
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005978 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005979 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005980 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5981 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005982
Bob Wilson3d27dad2013-08-02 22:25:34 +00005983 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5984 CmdArgs.push_back("-export_dynamic");
5985
Bob Wilsonb111ec92015-03-02 19:01:14 +00005986 // If we are using App Extension restrictions, pass a flag to the linker
5987 // telling it that the compiled code has been audited.
5988 if (Args.hasFlag(options::OPT_fapplication_extension,
5989 options::OPT_fno_application_extension, false))
5990 CmdArgs.push_back("-application_extension");
5991
Bill Wendling313b6bf2012-11-16 23:03:00 +00005992 // If we are using LTO, then automatically create a temporary file path for
5993 // the linker to use, so that it's lifetime will extend past a possible
5994 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00005995 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
5996 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00005997 const char *TmpPath = C.getArgs().MakeArgString(
5998 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5999 C.addTempFile(TmpPath);
6000 CmdArgs.push_back("-object_path_lto");
6001 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006002 }
6003
Daniel Dunbarc1964212009-03-26 16:23:12 +00006004 // Derived from the "link" spec.
6005 Args.AddAllArgs(CmdArgs, options::OPT_static);
6006 if (!Args.hasArg(options::OPT_static))
6007 CmdArgs.push_back("-dynamic");
6008 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6009 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6010 // here. How do we wish to handle such things?
6011 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006012
Daniel Dunbarc1964212009-03-26 16:23:12 +00006013 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006014 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006015 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006016 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006017
6018 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6019 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6020 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6021
6022 Arg *A;
6023 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6024 (A = Args.getLastArg(options::OPT_current__version)) ||
6025 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006026 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006027 << A->getAsString(Args) << "-dynamiclib";
6028
6029 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6030 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6031 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6032 } else {
6033 CmdArgs.push_back("-dylib");
6034
6035 Arg *A;
6036 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6037 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6038 (A = Args.getLastArg(options::OPT_client__name)) ||
6039 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6040 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6041 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006042 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006043 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006044
Daniel Dunbarc1964212009-03-26 16:23:12 +00006045 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6046 "-dylib_compatibility_version");
6047 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6048 "-dylib_current_version");
6049
Tim Northover157d9112014-01-16 08:48:16 +00006050 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006051
6052 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6053 "-dylib_install_name");
6054 }
6055
6056 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6057 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6058 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006059 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006060 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006061 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6062 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6063 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6064 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6065 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6066 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006067 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006068 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6069 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6070 Args.AddAllArgs(CmdArgs, options::OPT_init);
6071
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006072 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006073 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006074
Daniel Dunbarc1964212009-03-26 16:23:12 +00006075 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6076 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6077 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6078 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6079 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006080
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006081 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6082 options::OPT_fno_pie,
6083 options::OPT_fno_PIE)) {
6084 if (A->getOption().matches(options::OPT_fpie) ||
6085 A->getOption().matches(options::OPT_fPIE))
6086 CmdArgs.push_back("-pie");
6087 else
6088 CmdArgs.push_back("-no_pie");
6089 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006090
6091 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6092 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6093 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6094 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6095 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6096 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6097 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6098 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6099 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6100 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6101 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6102 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6103 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6104 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6105 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6106 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006107
Daniel Dunbar84384642011-05-02 21:03:47 +00006108 // Give --sysroot= preference, over the Apple specific behavior to also use
6109 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006110 StringRef sysroot = C.getSysRoot();
6111 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006112 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006113 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006114 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6115 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006116 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006117 }
6118
Daniel Dunbarc1964212009-03-26 16:23:12 +00006119 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6120 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6121 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6122 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6123 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006124 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006125 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6126 Args.AddAllArgs(CmdArgs, options::OPT_y);
6127 Args.AddLastArg(CmdArgs, options::OPT_w);
6128 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6129 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6130 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6131 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6132 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6133 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6134 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6135 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6136 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6137 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6138 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6139 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6140}
6141
Alexey Bataev186b28a2014-03-06 05:43:53 +00006142enum LibOpenMP {
6143 LibUnknown,
6144 LibGOMP,
6145 LibIOMP5
6146};
6147
Daniel Dunbarc1964212009-03-26 16:23:12 +00006148void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006149 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006150 const InputInfoList &Inputs,
6151 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006152 const char *LinkingOutput) const {
6153 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006154
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006155 // If the number of arguments surpasses the system limits, we will encode the
6156 // input files in a separate file, shortening the command line. To this end,
6157 // build a list of input file names that can be passed via a file with the
6158 // -filelist linker option.
6159 llvm::opt::ArgStringList InputFileList;
6160
Daniel Dunbarc1964212009-03-26 16:23:12 +00006161 // The logic here is derived from gcc's behavior; most of which
6162 // comes from specs (starting with link_command). Consult gcc for
6163 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006164 ArgStringList CmdArgs;
6165
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006166 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6167 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6168 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006169 for (const auto &Arg : Args)
6170 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006171 const char *Exec =
6172 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6173 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006174 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006175 return;
6176 }
6177
Daniel Dunbarc1964212009-03-26 16:23:12 +00006178 // I'm not sure why this particular decomposition exists in gcc, but
6179 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006180 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006181
Daniel Dunbarc1964212009-03-26 16:23:12 +00006182 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6183 Args.AddAllArgs(CmdArgs, options::OPT_s);
6184 Args.AddAllArgs(CmdArgs, options::OPT_t);
6185 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6186 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006187 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006188 Args.AddAllArgs(CmdArgs, options::OPT_r);
6189
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006190 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6191 // members of static archive libraries which implement Objective-C classes or
6192 // categories.
6193 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6194 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006195
Daniel Dunbarc1964212009-03-26 16:23:12 +00006196 CmdArgs.push_back("-o");
6197 CmdArgs.push_back(Output.getFilename());
6198
Chad Rosier06fd3c62012-05-16 23:45:12 +00006199 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006200 !Args.hasArg(options::OPT_nostartfiles))
6201 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006202
6203 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006204
Alexey Bataev186b28a2014-03-06 05:43:53 +00006205 LibOpenMP UsedOpenMPLib = LibUnknown;
6206 if (Args.hasArg(options::OPT_fopenmp)) {
6207 UsedOpenMPLib = LibGOMP;
6208 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6209 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6210 .Case("libgomp", LibGOMP)
6211 .Case("libiomp5", LibIOMP5)
6212 .Default(LibUnknown);
6213 if (UsedOpenMPLib == LibUnknown)
6214 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6215 << A->getOption().getName() << A->getValue();
6216 }
6217 switch (UsedOpenMPLib) {
6218 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006219 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006220 break;
6221 case LibIOMP5:
6222 CmdArgs.push_back("-liomp5");
6223 break;
6224 case LibUnknown:
6225 break;
6226 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006227
Douglas Gregor9295df02012-05-15 21:00:27 +00006228 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006229 // Build the input file for -filelist (list of linker input files) in case we
6230 // need it later
6231 for (const auto &II : Inputs) {
6232 if (!II.isFilename()) {
6233 // This is a linker input argument.
6234 // We cannot mix input arguments and file names in a -filelist input, thus
6235 // we prematurely stop our list (remaining files shall be passed as
6236 // arguments).
6237 if (InputFileList.size() > 0)
6238 break;
6239
6240 continue;
6241 }
6242
6243 InputFileList.push_back(II.getFilename());
6244 }
6245
Bob Wilson16d93952012-05-15 18:57:39 +00006246 if (isObjCRuntimeLinked(Args) &&
6247 !Args.hasArg(options::OPT_nostdlib) &&
6248 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006249 // We use arclite library for both ARC and subscripting support.
6250 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6251
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006252 CmdArgs.push_back("-framework");
6253 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006254 // Link libobj.
6255 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006256 }
John McCall31168b02011-06-15 23:02:42 +00006257
Daniel Dunbarc1964212009-03-26 16:23:12 +00006258 if (LinkingOutput) {
6259 CmdArgs.push_back("-arch_multiple");
6260 CmdArgs.push_back("-final_output");
6261 CmdArgs.push_back(LinkingOutput);
6262 }
6263
Daniel Dunbarc1964212009-03-26 16:23:12 +00006264 if (Args.hasArg(options::OPT_fnested_functions))
6265 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006266
Daniel Dunbarc1964212009-03-26 16:23:12 +00006267 if (!Args.hasArg(options::OPT_nostdlib) &&
6268 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006269 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006270 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006271
Daniel Dunbarc1964212009-03-26 16:23:12 +00006272 // link_ssp spec is empty.
6273
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006274 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006275 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006276 }
6277
Chad Rosier06fd3c62012-05-16 23:45:12 +00006278 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006279 !Args.hasArg(options::OPT_nostartfiles)) {
6280 // endfile_spec is empty.
6281 }
6282
6283 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6284 Args.AddAllArgs(CmdArgs, options::OPT_F);
6285
Steven Wu3ffb61b2015-02-06 18:08:29 +00006286 // -iframework should be forwarded as -F.
6287 for (auto it = Args.filtered_begin(options::OPT_iframework),
6288 ie = Args.filtered_end(); it != ie; ++it)
6289 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6290 (*it)->getValue()));
6291
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006292 if (!Args.hasArg(options::OPT_nostdlib) &&
6293 !Args.hasArg(options::OPT_nodefaultlibs)) {
6294 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6295 if (A->getValue() == StringRef("Accelerate")) {
6296 CmdArgs.push_back("-framework");
6297 CmdArgs.push_back("Accelerate");
6298 }
6299 }
6300 }
6301
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006302 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006303 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006304 std::unique_ptr<Command> Cmd =
6305 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6306 Cmd->setInputFileList(std::move(InputFileList));
6307 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006308}
6309
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006310void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006311 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006312 const InputInfoList &Inputs,
6313 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006314 const char *LinkingOutput) const {
6315 ArgStringList CmdArgs;
6316
6317 CmdArgs.push_back("-create");
6318 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006319
6320 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006321 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006322
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006323 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006324 assert(II.isFilename() && "Unexpected lipo input.");
6325 CmdArgs.push_back(II.getFilename());
6326 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006327
6328 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006329 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006330}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006331
Daniel Dunbar88299622010-06-04 18:28:36 +00006332void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006333 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006334 const InputInfoList &Inputs,
6335 const ArgList &Args,
6336 const char *LinkingOutput) const {
6337 ArgStringList CmdArgs;
6338
Daniel Dunbareb86b042011-05-09 17:23:16 +00006339 CmdArgs.push_back("-o");
6340 CmdArgs.push_back(Output.getFilename());
6341
Daniel Dunbar88299622010-06-04 18:28:36 +00006342 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6343 const InputInfo &Input = Inputs[0];
6344 assert(Input.isFilename() && "Unexpected dsymutil input.");
6345 CmdArgs.push_back(Input.getFilename());
6346
Daniel Dunbar88299622010-06-04 18:28:36 +00006347 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006348 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006349 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006350}
6351
Eric Christopher551ef452011-08-23 17:56:55 +00006352void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006353 const InputInfo &Output,
6354 const InputInfoList &Inputs,
6355 const ArgList &Args,
6356 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006357 ArgStringList CmdArgs;
6358 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006359 CmdArgs.push_back("--debug-info");
6360 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006361 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006362
6363 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6364 const InputInfo &Input = Inputs[0];
6365 assert(Input.isFilename() && "Unexpected verify input");
6366
6367 // Grabbing the output of the earlier dsymutil run.
6368 CmdArgs.push_back(Input.getFilename());
6369
6370 const char *Exec =
6371 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006372 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006373}
6374
David Chisnallf571cde2012-02-15 13:39:01 +00006375void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6376 const InputInfo &Output,
6377 const InputInfoList &Inputs,
6378 const ArgList &Args,
6379 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006380 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006381 ArgStringList CmdArgs;
6382
6383 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6384 options::OPT_Xassembler);
6385
6386 CmdArgs.push_back("-o");
6387 CmdArgs.push_back(Output.getFilename());
6388
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006389 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006390 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006391
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006392 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006393 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006394}
6395
David Chisnallf571cde2012-02-15 13:39:01 +00006396void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6397 const InputInfo &Output,
6398 const InputInfoList &Inputs,
6399 const ArgList &Args,
6400 const char *LinkingOutput) const {
6401 // FIXME: Find a real GCC, don't hard-code versions here
6402 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6403 const llvm::Triple &T = getToolChain().getTriple();
6404 std::string LibPath = "/usr/lib/";
6405 llvm::Triple::ArchType Arch = T.getArch();
6406 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006407 case llvm::Triple::x86:
6408 GCCLibPath +=
6409 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6410 break;
6411 case llvm::Triple::x86_64:
6412 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6413 GCCLibPath += "/4.5.2/amd64/";
6414 LibPath += "amd64/";
6415 break;
6416 default:
6417 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006418 }
6419
6420 ArgStringList CmdArgs;
6421
David Chisnall272a0712012-02-29 15:06:12 +00006422 // Demangle C++ names in errors
6423 CmdArgs.push_back("-C");
6424
David Chisnallf571cde2012-02-15 13:39:01 +00006425 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6426 (!Args.hasArg(options::OPT_shared))) {
6427 CmdArgs.push_back("-e");
6428 CmdArgs.push_back("_start");
6429 }
6430
6431 if (Args.hasArg(options::OPT_static)) {
6432 CmdArgs.push_back("-Bstatic");
6433 CmdArgs.push_back("-dn");
6434 } else {
6435 CmdArgs.push_back("-Bdynamic");
6436 if (Args.hasArg(options::OPT_shared)) {
6437 CmdArgs.push_back("-shared");
6438 } else {
6439 CmdArgs.push_back("--dynamic-linker");
6440 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6441 }
6442 }
6443
6444 if (Output.isFilename()) {
6445 CmdArgs.push_back("-o");
6446 CmdArgs.push_back(Output.getFilename());
6447 } else {
6448 assert(Output.isNothing() && "Invalid output.");
6449 }
6450
6451 if (!Args.hasArg(options::OPT_nostdlib) &&
6452 !Args.hasArg(options::OPT_nostartfiles)) {
6453 if (!Args.hasArg(options::OPT_shared)) {
6454 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6455 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006456 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006457 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6458 } else {
6459 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006460 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6461 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006462 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006463 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006464 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006465 }
6466
6467 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6468
6469 Args.AddAllArgs(CmdArgs, options::OPT_L);
6470 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6471 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006472 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006473
6474 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6475
6476 if (!Args.hasArg(options::OPT_nostdlib) &&
6477 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006478 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006479 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006480 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006481 if (!Args.hasArg(options::OPT_shared)) {
6482 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006483 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006484 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006485 }
David Chisnallf571cde2012-02-15 13:39:01 +00006486 }
6487
6488 if (!Args.hasArg(options::OPT_nostdlib) &&
6489 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006490 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006491 }
David Chisnall96de9932012-02-16 16:00:47 +00006492 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006493
Alexey Samsonov7811d192014-02-20 13:57:37 +00006494 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006495
6496 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006497 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006498 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006499}
6500
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006501void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006502 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006503 const InputInfoList &Inputs,
6504 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006505 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006506 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006507 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006508 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006509
Rafael Espindolacc126272014-02-28 01:55:21 +00006510 switch (getToolChain().getArch()) {
6511 case llvm::Triple::x86:
6512 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6513 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006514 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006515 break;
6516
6517 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006518 CmdArgs.push_back("-mppc");
6519 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006520 break;
6521
6522 case llvm::Triple::sparc:
6523 CmdArgs.push_back("-32");
6524 NeedsKPIC = true;
6525 break;
6526
6527 case llvm::Triple::sparcv9:
6528 CmdArgs.push_back("-64");
6529 CmdArgs.push_back("-Av9a");
6530 NeedsKPIC = true;
6531 break;
6532
6533 case llvm::Triple::mips64:
6534 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006535 StringRef CPUName;
6536 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006537 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006538
6539 CmdArgs.push_back("-mabi");
6540 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6541
6542 if (getToolChain().getArch() == llvm::Triple::mips64)
6543 CmdArgs.push_back("-EB");
6544 else
6545 CmdArgs.push_back("-EL");
6546
Rafael Espindolacc126272014-02-28 01:55:21 +00006547 NeedsKPIC = true;
6548 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006549 }
6550
Rafael Espindolacc126272014-02-28 01:55:21 +00006551 default:
6552 break;
6553 }
6554
6555 if (NeedsKPIC)
6556 addAssemblerKPIC(Args, CmdArgs);
6557
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006558 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6559 options::OPT_Xassembler);
6560
6561 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006562 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006563
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006564 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006565 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006566
6567 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006568 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006569 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006570}
6571
6572void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006573 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006574 const InputInfoList &Inputs,
6575 const ArgList &Args,
6576 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006577 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006578 ArgStringList CmdArgs;
6579
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006580 // Silence warning for "clang -g foo.o -o foo"
6581 Args.ClaimAllArgs(options::OPT_g_Group);
6582 // and "clang -emit-llvm foo.o -o foo"
6583 Args.ClaimAllArgs(options::OPT_emit_llvm);
6584 // and for "clang -w foo.o -o foo". Other warning options are already
6585 // handled somewhere else.
6586 Args.ClaimAllArgs(options::OPT_w);
6587
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006588 if (getToolChain().getArch() == llvm::Triple::mips64)
6589 CmdArgs.push_back("-EB");
6590 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6591 CmdArgs.push_back("-EL");
6592
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006593 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006594 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006595 CmdArgs.push_back("-e");
6596 CmdArgs.push_back("__start");
6597 }
6598
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006599 if (Args.hasArg(options::OPT_static)) {
6600 CmdArgs.push_back("-Bstatic");
6601 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006602 if (Args.hasArg(options::OPT_rdynamic))
6603 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006604 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006605 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006606 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006607 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006608 } else {
6609 CmdArgs.push_back("-dynamic-linker");
6610 CmdArgs.push_back("/usr/libexec/ld.so");
6611 }
6612 }
6613
Rafael Espindola044f7832013-06-05 04:28:55 +00006614 if (Args.hasArg(options::OPT_nopie))
6615 CmdArgs.push_back("-nopie");
6616
Daniel Dunbarb440f562010-08-02 02:38:21 +00006617 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006618 CmdArgs.push_back("-o");
6619 CmdArgs.push_back(Output.getFilename());
6620 } else {
6621 assert(Output.isNothing() && "Invalid output.");
6622 }
6623
6624 if (!Args.hasArg(options::OPT_nostdlib) &&
6625 !Args.hasArg(options::OPT_nostartfiles)) {
6626 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006627 if (Args.hasArg(options::OPT_pg))
6628 CmdArgs.push_back(Args.MakeArgString(
6629 getToolChain().GetFilePath("gcrt0.o")));
6630 else
6631 CmdArgs.push_back(Args.MakeArgString(
6632 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006633 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006634 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006635 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006636 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006637 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006638 }
6639 }
6640
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006641 std::string Triple = getToolChain().getTripleString();
6642 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006643 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006644 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006645 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006646
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006647 Args.AddAllArgs(CmdArgs, options::OPT_L);
6648 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6649 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006650 Args.AddAllArgs(CmdArgs, options::OPT_s);
6651 Args.AddAllArgs(CmdArgs, options::OPT_t);
6652 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6653 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006654
Daniel Dunbar54423b22010-09-17 00:24:54 +00006655 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006656
6657 if (!Args.hasArg(options::OPT_nostdlib) &&
6658 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006659 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006660 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006661 if (Args.hasArg(options::OPT_pg))
6662 CmdArgs.push_back("-lm_p");
6663 else
6664 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006665 }
6666
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006667 // FIXME: For some reason GCC passes -lgcc before adding
6668 // the default system libraries. Just mimic this for now.
6669 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006670
Eric Christopher17674ec2012-09-13 06:32:34 +00006671 if (Args.hasArg(options::OPT_pthread)) {
6672 if (!Args.hasArg(options::OPT_shared) &&
6673 Args.hasArg(options::OPT_pg))
6674 CmdArgs.push_back("-lpthread_p");
6675 else
6676 CmdArgs.push_back("-lpthread");
6677 }
6678
Chandler Carruth45661652011-12-17 22:32:42 +00006679 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006680 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006681 CmdArgs.push_back("-lc_p");
6682 else
6683 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006684 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006685
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006686 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006687 }
6688
6689 if (!Args.hasArg(options::OPT_nostdlib) &&
6690 !Args.hasArg(options::OPT_nostartfiles)) {
6691 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006692 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006693 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006694 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006695 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006696 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006697 }
6698
6699 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006700 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006702}
Ed Schoutene33194b2009-04-02 19:13:12 +00006703
Eli Friedman9fa28852012-08-08 23:57:20 +00006704void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6705 const InputInfo &Output,
6706 const InputInfoList &Inputs,
6707 const ArgList &Args,
6708 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006709 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006710 ArgStringList CmdArgs;
6711
6712 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6713 options::OPT_Xassembler);
6714
6715 CmdArgs.push_back("-o");
6716 CmdArgs.push_back(Output.getFilename());
6717
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006718 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006719 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006720
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006721 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006722 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006723}
6724
6725void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6726 const InputInfo &Output,
6727 const InputInfoList &Inputs,
6728 const ArgList &Args,
6729 const char *LinkingOutput) const {
6730 const Driver &D = getToolChain().getDriver();
6731 ArgStringList CmdArgs;
6732
6733 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6734 (!Args.hasArg(options::OPT_shared))) {
6735 CmdArgs.push_back("-e");
6736 CmdArgs.push_back("__start");
6737 }
6738
6739 if (Args.hasArg(options::OPT_static)) {
6740 CmdArgs.push_back("-Bstatic");
6741 } else {
6742 if (Args.hasArg(options::OPT_rdynamic))
6743 CmdArgs.push_back("-export-dynamic");
6744 CmdArgs.push_back("--eh-frame-hdr");
6745 CmdArgs.push_back("-Bdynamic");
6746 if (Args.hasArg(options::OPT_shared)) {
6747 CmdArgs.push_back("-shared");
6748 } else {
6749 CmdArgs.push_back("-dynamic-linker");
6750 CmdArgs.push_back("/usr/libexec/ld.so");
6751 }
6752 }
6753
6754 if (Output.isFilename()) {
6755 CmdArgs.push_back("-o");
6756 CmdArgs.push_back(Output.getFilename());
6757 } else {
6758 assert(Output.isNothing() && "Invalid output.");
6759 }
6760
6761 if (!Args.hasArg(options::OPT_nostdlib) &&
6762 !Args.hasArg(options::OPT_nostartfiles)) {
6763 if (!Args.hasArg(options::OPT_shared)) {
6764 if (Args.hasArg(options::OPT_pg))
6765 CmdArgs.push_back(Args.MakeArgString(
6766 getToolChain().GetFilePath("gcrt0.o")));
6767 else
6768 CmdArgs.push_back(Args.MakeArgString(
6769 getToolChain().GetFilePath("crt0.o")));
6770 CmdArgs.push_back(Args.MakeArgString(
6771 getToolChain().GetFilePath("crtbegin.o")));
6772 } else {
6773 CmdArgs.push_back(Args.MakeArgString(
6774 getToolChain().GetFilePath("crtbeginS.o")));
6775 }
6776 }
6777
6778 Args.AddAllArgs(CmdArgs, options::OPT_L);
6779 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6780 Args.AddAllArgs(CmdArgs, options::OPT_e);
6781
6782 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6783
6784 if (!Args.hasArg(options::OPT_nostdlib) &&
6785 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006786 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006787 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6788 if (Args.hasArg(options::OPT_pg))
6789 CmdArgs.push_back("-lm_p");
6790 else
6791 CmdArgs.push_back("-lm");
6792 }
6793
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006794 if (Args.hasArg(options::OPT_pthread)) {
6795 if (!Args.hasArg(options::OPT_shared) &&
6796 Args.hasArg(options::OPT_pg))
6797 CmdArgs.push_back("-lpthread_p");
6798 else
6799 CmdArgs.push_back("-lpthread");
6800 }
6801
Eli Friedman9fa28852012-08-08 23:57:20 +00006802 if (!Args.hasArg(options::OPT_shared)) {
6803 if (Args.hasArg(options::OPT_pg))
6804 CmdArgs.push_back("-lc_p");
6805 else
6806 CmdArgs.push_back("-lc");
6807 }
6808
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006809 StringRef MyArch;
6810 switch (getToolChain().getTriple().getArch()) {
6811 case llvm::Triple::arm:
6812 MyArch = "arm";
6813 break;
6814 case llvm::Triple::x86:
6815 MyArch = "i386";
6816 break;
6817 case llvm::Triple::x86_64:
6818 MyArch = "amd64";
6819 break;
6820 default:
6821 llvm_unreachable("Unsupported architecture");
6822 }
6823 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006824 }
6825
6826 if (!Args.hasArg(options::OPT_nostdlib) &&
6827 !Args.hasArg(options::OPT_nostartfiles)) {
6828 if (!Args.hasArg(options::OPT_shared))
6829 CmdArgs.push_back(Args.MakeArgString(
6830 getToolChain().GetFilePath("crtend.o")));
6831 else
6832 CmdArgs.push_back(Args.MakeArgString(
6833 getToolChain().GetFilePath("crtendS.o")));
6834 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006835
6836 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006837 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006838 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006839}
6840
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006841void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006842 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006843 const InputInfoList &Inputs,
6844 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006845 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006846 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006847 ArgStringList CmdArgs;
6848
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006849 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6850 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006851 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006852 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006853 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006854 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006855 else if (getToolChain().getArch() == llvm::Triple::mips ||
6856 getToolChain().getArch() == llvm::Triple::mipsel ||
6857 getToolChain().getArch() == llvm::Triple::mips64 ||
6858 getToolChain().getArch() == llvm::Triple::mips64el) {
6859 StringRef CPUName;
6860 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006861 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006862
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006863 CmdArgs.push_back("-march");
6864 CmdArgs.push_back(CPUName.data());
6865
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006866 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006867 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006868
6869 if (getToolChain().getArch() == llvm::Triple::mips ||
6870 getToolChain().getArch() == llvm::Triple::mips64)
6871 CmdArgs.push_back("-EB");
6872 else
6873 CmdArgs.push_back("-EL");
6874
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006875 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006876 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006877 getToolChain().getArch() == llvm::Triple::armeb ||
6878 getToolChain().getArch() == llvm::Triple::thumb ||
6879 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006880 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006881 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006882 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6883
6884 if (FloatABI == "hard") {
6885 CmdArgs.push_back("-mfpu=vfp");
6886 } else {
6887 CmdArgs.push_back("-mfpu=softvfp");
6888 }
6889
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006890 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006891 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006892 case llvm::Triple::GNUEABI:
6893 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006894 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006895 break;
6896
6897 default:
6898 CmdArgs.push_back("-matpcs");
6899 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006900 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006901 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006902 if (getToolChain().getArch() == llvm::Triple::sparc)
6903 CmdArgs.push_back("-Av8plusa");
6904 else
6905 CmdArgs.push_back("-Av9a");
6906
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006907 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006908 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006909
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006910 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6911 options::OPT_Xassembler);
6912
6913 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006914 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006915
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006916 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006917 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006918
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006919 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006921}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006922
6923void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006924 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006925 const InputInfoList &Inputs,
6926 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006927 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006928 const toolchains::FreeBSD& ToolChain =
6929 static_cast<const toolchains::FreeBSD&>(getToolChain());
6930 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006931 const bool IsPIE =
6932 !Args.hasArg(options::OPT_shared) &&
6933 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006934 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006935
6936 // Silence warning for "clang -g foo.o -o foo"
6937 Args.ClaimAllArgs(options::OPT_g_Group);
6938 // and "clang -emit-llvm foo.o -o foo"
6939 Args.ClaimAllArgs(options::OPT_emit_llvm);
6940 // and for "clang -w foo.o -o foo". Other warning options are already
6941 // handled somewhere else.
6942 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006943
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006944 if (!D.SysRoot.empty())
6945 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6946
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006947 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006948 CmdArgs.push_back("-pie");
6949
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006950 if (Args.hasArg(options::OPT_static)) {
6951 CmdArgs.push_back("-Bstatic");
6952 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006953 if (Args.hasArg(options::OPT_rdynamic))
6954 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006955 CmdArgs.push_back("--eh-frame-hdr");
6956 if (Args.hasArg(options::OPT_shared)) {
6957 CmdArgs.push_back("-Bshareable");
6958 } else {
6959 CmdArgs.push_back("-dynamic-linker");
6960 CmdArgs.push_back("/libexec/ld-elf.so.1");
6961 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006962 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6963 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006964 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6965 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6966 CmdArgs.push_back("--hash-style=both");
6967 }
6968 }
6969 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006970 }
6971
6972 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6973 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006974 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006975 CmdArgs.push_back("-m");
6976 CmdArgs.push_back("elf_i386_fbsd");
6977 }
6978
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006979 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006980 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006981 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006982 }
6983
Daniel Dunbarb440f562010-08-02 02:38:21 +00006984 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006985 CmdArgs.push_back("-o");
6986 CmdArgs.push_back(Output.getFilename());
6987 } else {
6988 assert(Output.isNothing() && "Invalid output.");
6989 }
6990
6991 if (!Args.hasArg(options::OPT_nostdlib) &&
6992 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006993 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006994 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006995 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006996 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006997 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006998 crt1 = "Scrt1.o";
6999 else
7000 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007001 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007002 if (crt1)
7003 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7004
7005 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7006
Craig Topper92fc2df2014-05-17 16:56:41 +00007007 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007008 if (Args.hasArg(options::OPT_static))
7009 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007010 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007011 crtbegin = "crtbeginS.o";
7012 else
7013 crtbegin = "crtbegin.o";
7014
7015 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007016 }
7017
7018 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007019 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007020 for (const auto &Path : Paths)
7021 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007022 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7023 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007024 Args.AddAllArgs(CmdArgs, options::OPT_s);
7025 Args.AddAllArgs(CmdArgs, options::OPT_t);
7026 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7027 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007028
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007029 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007030 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007031
Alexey Samsonov52550342014-09-15 19:58:40 +00007032 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007033 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007034
7035 if (!Args.hasArg(options::OPT_nostdlib) &&
7036 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007037 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007038 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007039 if (Args.hasArg(options::OPT_pg))
7040 CmdArgs.push_back("-lm_p");
7041 else
7042 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007043 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007044 if (NeedsSanitizerDeps)
7045 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007046 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7047 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007048 if (Args.hasArg(options::OPT_pg))
7049 CmdArgs.push_back("-lgcc_p");
7050 else
7051 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007052 if (Args.hasArg(options::OPT_static)) {
7053 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007054 } else if (Args.hasArg(options::OPT_pg)) {
7055 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007056 } else {
7057 CmdArgs.push_back("--as-needed");
7058 CmdArgs.push_back("-lgcc_s");
7059 CmdArgs.push_back("--no-as-needed");
7060 }
7061
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007062 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007063 if (Args.hasArg(options::OPT_pg))
7064 CmdArgs.push_back("-lpthread_p");
7065 else
7066 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007067 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007068
Roman Divacky66f22762011-02-10 16:59:40 +00007069 if (Args.hasArg(options::OPT_pg)) {
7070 if (Args.hasArg(options::OPT_shared))
7071 CmdArgs.push_back("-lc");
7072 else
7073 CmdArgs.push_back("-lc_p");
7074 CmdArgs.push_back("-lgcc_p");
7075 } else {
7076 CmdArgs.push_back("-lc");
7077 CmdArgs.push_back("-lgcc");
7078 }
7079
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007080 if (Args.hasArg(options::OPT_static)) {
7081 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007082 } else if (Args.hasArg(options::OPT_pg)) {
7083 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007084 } else {
7085 CmdArgs.push_back("--as-needed");
7086 CmdArgs.push_back("-lgcc_s");
7087 CmdArgs.push_back("--no-as-needed");
7088 }
7089 }
7090
7091 if (!Args.hasArg(options::OPT_nostdlib) &&
7092 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007093 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007094 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007095 else
7096 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007097 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007098 }
7099
Alexey Samsonov7811d192014-02-20 13:57:37 +00007100 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007101
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007102 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007103 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007104 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007105}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007106
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007107void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7108 const InputInfo &Output,
7109 const InputInfoList &Inputs,
7110 const ArgList &Args,
7111 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007112 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007113 ArgStringList CmdArgs;
7114
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007115 // GNU as needs different flags for creating the correct output format
7116 // on architectures with different ABIs or optional feature sets.
7117 switch (getToolChain().getArch()) {
7118 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007119 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007120 break;
7121 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007122 case llvm::Triple::armeb:
7123 case llvm::Triple::thumb:
7124 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007125 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007126 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007127 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007128 }
7129
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007130 case llvm::Triple::mips:
7131 case llvm::Triple::mipsel:
7132 case llvm::Triple::mips64:
7133 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007134 StringRef CPUName;
7135 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007136 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007137
7138 CmdArgs.push_back("-march");
7139 CmdArgs.push_back(CPUName.data());
7140
7141 CmdArgs.push_back("-mabi");
7142 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7143
7144 if (getToolChain().getArch() == llvm::Triple::mips ||
7145 getToolChain().getArch() == llvm::Triple::mips64)
7146 CmdArgs.push_back("-EB");
7147 else
7148 CmdArgs.push_back("-EL");
7149
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007150 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007151 break;
7152 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007153
7154 case llvm::Triple::sparc:
7155 CmdArgs.push_back("-32");
7156 addAssemblerKPIC(Args, CmdArgs);
7157 break;
7158
7159 case llvm::Triple::sparcv9:
7160 CmdArgs.push_back("-64");
7161 CmdArgs.push_back("-Av9");
7162 addAssemblerKPIC(Args, CmdArgs);
7163 break;
7164
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007165 default:
7166 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007167 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007168
7169 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7170 options::OPT_Xassembler);
7171
7172 CmdArgs.push_back("-o");
7173 CmdArgs.push_back(Output.getFilename());
7174
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007175 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007176 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007177
David Chisnallddbd68f2011-09-27 22:03:18 +00007178 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007179 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007180}
7181
7182void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7183 const InputInfo &Output,
7184 const InputInfoList &Inputs,
7185 const ArgList &Args,
7186 const char *LinkingOutput) const {
7187 const Driver &D = getToolChain().getDriver();
7188 ArgStringList CmdArgs;
7189
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007190 if (!D.SysRoot.empty())
7191 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7192
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007193 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007194 if (Args.hasArg(options::OPT_static)) {
7195 CmdArgs.push_back("-Bstatic");
7196 } else {
7197 if (Args.hasArg(options::OPT_rdynamic))
7198 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007199 if (Args.hasArg(options::OPT_shared)) {
7200 CmdArgs.push_back("-Bshareable");
7201 } else {
7202 CmdArgs.push_back("-dynamic-linker");
7203 CmdArgs.push_back("/libexec/ld.elf_so");
7204 }
7205 }
7206
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007207 // Many NetBSD architectures support more than one ABI.
7208 // Determine the correct emulation for ld.
7209 switch (getToolChain().getArch()) {
7210 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007211 CmdArgs.push_back("-m");
7212 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007213 break;
7214 case llvm::Triple::arm:
7215 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007216 CmdArgs.push_back("-m");
7217 switch (getToolChain().getTriple().getEnvironment()) {
7218 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007219 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007220 CmdArgs.push_back("armelf_nbsd_eabi");
7221 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007222 case llvm::Triple::EABIHF:
7223 case llvm::Triple::GNUEABIHF:
7224 CmdArgs.push_back("armelf_nbsd_eabihf");
7225 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007226 default:
7227 CmdArgs.push_back("armelf_nbsd");
7228 break;
7229 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007230 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007231 case llvm::Triple::armeb:
7232 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007233 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007234 CmdArgs.push_back("-m");
7235 switch (getToolChain().getTriple().getEnvironment()) {
7236 case llvm::Triple::EABI:
7237 case llvm::Triple::GNUEABI:
7238 CmdArgs.push_back("armelfb_nbsd_eabi");
7239 break;
7240 case llvm::Triple::EABIHF:
7241 case llvm::Triple::GNUEABIHF:
7242 CmdArgs.push_back("armelfb_nbsd_eabihf");
7243 break;
7244 default:
7245 CmdArgs.push_back("armelfb_nbsd");
7246 break;
7247 }
7248 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007249 case llvm::Triple::mips64:
7250 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007251 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007252 CmdArgs.push_back("-m");
7253 if (getToolChain().getArch() == llvm::Triple::mips64)
7254 CmdArgs.push_back("elf32btsmip");
7255 else
7256 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007257 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007258 CmdArgs.push_back("-m");
7259 if (getToolChain().getArch() == llvm::Triple::mips64)
7260 CmdArgs.push_back("elf64btsmip");
7261 else
7262 CmdArgs.push_back("elf64ltsmip");
7263 }
7264 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007265 case llvm::Triple::ppc:
7266 CmdArgs.push_back("-m");
7267 CmdArgs.push_back("elf32ppc_nbsd");
7268 break;
7269
7270 case llvm::Triple::ppc64:
7271 case llvm::Triple::ppc64le:
7272 CmdArgs.push_back("-m");
7273 CmdArgs.push_back("elf64ppc");
7274 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007275
7276 case llvm::Triple::sparc:
7277 CmdArgs.push_back("-m");
7278 CmdArgs.push_back("elf32_sparc");
7279 break;
7280
7281 case llvm::Triple::sparcv9:
7282 CmdArgs.push_back("-m");
7283 CmdArgs.push_back("elf64_sparc");
7284 break;
7285
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007286 default:
7287 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007288 }
7289
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007290 if (Output.isFilename()) {
7291 CmdArgs.push_back("-o");
7292 CmdArgs.push_back(Output.getFilename());
7293 } else {
7294 assert(Output.isNothing() && "Invalid output.");
7295 }
7296
7297 if (!Args.hasArg(options::OPT_nostdlib) &&
7298 !Args.hasArg(options::OPT_nostartfiles)) {
7299 if (!Args.hasArg(options::OPT_shared)) {
7300 CmdArgs.push_back(Args.MakeArgString(
7301 getToolChain().GetFilePath("crt0.o")));
7302 CmdArgs.push_back(Args.MakeArgString(
7303 getToolChain().GetFilePath("crti.o")));
7304 CmdArgs.push_back(Args.MakeArgString(
7305 getToolChain().GetFilePath("crtbegin.o")));
7306 } else {
7307 CmdArgs.push_back(Args.MakeArgString(
7308 getToolChain().GetFilePath("crti.o")));
7309 CmdArgs.push_back(Args.MakeArgString(
7310 getToolChain().GetFilePath("crtbeginS.o")));
7311 }
7312 }
7313
7314 Args.AddAllArgs(CmdArgs, options::OPT_L);
7315 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7316 Args.AddAllArgs(CmdArgs, options::OPT_e);
7317 Args.AddAllArgs(CmdArgs, options::OPT_s);
7318 Args.AddAllArgs(CmdArgs, options::OPT_t);
7319 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7320 Args.AddAllArgs(CmdArgs, options::OPT_r);
7321
7322 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7323
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007324 unsigned Major, Minor, Micro;
7325 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7326 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007327 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007328 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007329 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007330 case llvm::Triple::arm:
7331 case llvm::Triple::armeb:
7332 case llvm::Triple::thumb:
7333 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007334 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007335 case llvm::Triple::ppc64:
7336 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007337 case llvm::Triple::x86:
7338 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007339 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007340 break;
7341 default:
7342 break;
7343 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007344 }
7345
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007346 if (!Args.hasArg(options::OPT_nostdlib) &&
7347 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007348 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007349 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7350 CmdArgs.push_back("-lm");
7351 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007352 if (Args.hasArg(options::OPT_pthread))
7353 CmdArgs.push_back("-lpthread");
7354 CmdArgs.push_back("-lc");
7355
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007356 if (useLibgcc) {
7357 if (Args.hasArg(options::OPT_static)) {
7358 // libgcc_eh depends on libc, so resolve as much as possible,
7359 // pull in any new requirements from libc and then get the rest
7360 // of libgcc.
7361 CmdArgs.push_back("-lgcc_eh");
7362 CmdArgs.push_back("-lc");
7363 CmdArgs.push_back("-lgcc");
7364 } else {
7365 CmdArgs.push_back("-lgcc");
7366 CmdArgs.push_back("--as-needed");
7367 CmdArgs.push_back("-lgcc_s");
7368 CmdArgs.push_back("--no-as-needed");
7369 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007370 }
7371 }
7372
7373 if (!Args.hasArg(options::OPT_nostdlib) &&
7374 !Args.hasArg(options::OPT_nostartfiles)) {
7375 if (!Args.hasArg(options::OPT_shared))
7376 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7377 "crtend.o")));
7378 else
7379 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7380 "crtendS.o")));
7381 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7382 "crtn.o")));
7383 }
7384
Alexey Samsonov7811d192014-02-20 13:57:37 +00007385 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007386
Logan Chieneb9162f2014-06-26 14:23:45 +00007387 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007388 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007389}
7390
Thomas Schwinge4e555262013-03-28 19:04:25 +00007391void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7392 const InputInfo &Output,
7393 const InputInfoList &Inputs,
7394 const ArgList &Args,
7395 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007396 claimNoWarnArgs(Args);
7397
Rafael Espindola92b00932010-08-10 00:25:48 +00007398 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007399 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007400
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007401 switch (getToolChain().getArch()) {
7402 default:
7403 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007404 // Add --32/--64 to make sure we get the format we want.
7405 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007406 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007407 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007408 break;
7409 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007410 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7411 CmdArgs.push_back("--x32");
7412 else
7413 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007414 break;
7415 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007416 CmdArgs.push_back("-a32");
7417 CmdArgs.push_back("-mppc");
7418 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007419 break;
7420 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007421 CmdArgs.push_back("-a64");
7422 CmdArgs.push_back("-mppc64");
7423 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007424 break;
7425 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007426 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007427 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007428 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007429 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007430 break;
7431 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007432 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007433 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007434 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007435 break;
7436 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007437 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007438 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007439 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007440 break;
7441 case llvm::Triple::arm:
7442 case llvm::Triple::armeb:
7443 case llvm::Triple::thumb:
7444 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007445 const llvm::Triple &Triple = getToolChain().getTriple();
7446 switch (Triple.getSubArch()) {
7447 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007448 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007449 break;
7450 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007451 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007452 break;
7453 default:
7454 break;
7455 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007456
Tim Northover9c7e0352013-12-12 11:55:52 +00007457 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007458 getToolChain().getDriver(), Args,
7459 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007460 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007461
7462 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007463
7464 // FIXME: remove krait check when GNU tools support krait cpu
7465 // for now replace it with -march=armv7-a to avoid a lower
7466 // march from being picked in the absence of a cpu flag.
7467 Arg *A;
7468 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7469 StringRef(A->getValue()) == "krait")
7470 CmdArgs.push_back("-march=armv7-a");
7471 else
7472 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007473 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007474 break;
7475 }
7476 case llvm::Triple::mips:
7477 case llvm::Triple::mipsel:
7478 case llvm::Triple::mips64:
7479 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007480 StringRef CPUName;
7481 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007482 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007483 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007484
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007485 CmdArgs.push_back("-march");
7486 CmdArgs.push_back(CPUName.data());
7487
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007488 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007489 CmdArgs.push_back(ABIName.data());
7490
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007491 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7492 // or -mshared (not implemented) is in effect.
7493 bool IsPicOrPie = false;
7494 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7495 options::OPT_fpic, options::OPT_fno_pic,
7496 options::OPT_fPIE, options::OPT_fno_PIE,
7497 options::OPT_fpie, options::OPT_fno_pie)) {
7498 if (A->getOption().matches(options::OPT_fPIC) ||
7499 A->getOption().matches(options::OPT_fpic) ||
7500 A->getOption().matches(options::OPT_fPIE) ||
7501 A->getOption().matches(options::OPT_fpie))
7502 IsPicOrPie = true;
7503 }
7504 if (!IsPicOrPie)
7505 CmdArgs.push_back("-mno-shared");
7506
Daniel Sanders379d44b2014-07-16 11:52:23 +00007507 // LLVM doesn't support -mplt yet and acts as if it is always given.
7508 // However, -mplt has no effect with the N64 ABI.
7509 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007510
7511 if (getToolChain().getArch() == llvm::Triple::mips ||
7512 getToolChain().getArch() == llvm::Triple::mips64)
7513 CmdArgs.push_back("-EB");
7514 else
7515 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007516
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007517 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7518 if (StringRef(A->getValue()) == "2008")
7519 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7520 }
7521
Daniel Sanders379d44b2014-07-16 11:52:23 +00007522 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7523 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7524 options::OPT_mfp64)) {
7525 A->claim();
7526 A->render(Args, CmdArgs);
7527 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7528 ABIName))
7529 CmdArgs.push_back("-mfpxx");
7530
7531 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7532 // -mno-mips16 is actually -no-mips16.
7533 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7534 options::OPT_mno_mips16)) {
7535 if (A->getOption().matches(options::OPT_mips16)) {
7536 A->claim();
7537 A->render(Args, CmdArgs);
7538 } else {
7539 A->claim();
7540 CmdArgs.push_back("-no-mips16");
7541 }
7542 }
7543
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007544 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7545 options::OPT_mno_micromips);
7546 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7547 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7548
Simon Atanasyanbd986632013-11-26 11:58:04 +00007549 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7550 // Do not use AddLastArg because not all versions of MIPS assembler
7551 // support -mmsa / -mno-msa options.
7552 if (A->getOption().matches(options::OPT_mmsa))
7553 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7554 }
7555
Daniel Sanders379d44b2014-07-16 11:52:23 +00007556 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7557 options::OPT_msoft_float);
7558
7559 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7560 options::OPT_mno_odd_spreg);
7561
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007562 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007563 break;
7564 }
7565 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007566 // Always pass an -march option, since our default of z10 is later
7567 // than the GNU assembler's default.
7568 StringRef CPUName = getSystemZTargetCPU(Args);
7569 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007570 break;
7571 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007572 }
7573
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007574 if (NeedsKPIC)
7575 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007576
7577 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7578 options::OPT_Xassembler);
7579
7580 CmdArgs.push_back("-o");
7581 CmdArgs.push_back(Output.getFilename());
7582
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007583 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007584 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007586 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007587 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007588
7589 // Handle the debug info splitting at object creation time if we're
7590 // creating an object.
7591 // TODO: Currently only works on linux with newer objcopy.
7592 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007593 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007594 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7595 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007596}
7597
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007598static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007599 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007600 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007601 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7602 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007603 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007604 CmdArgs.push_back("-lgcc");
7605
Logan Chien3d3373c2012-11-19 12:04:11 +00007606 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007607 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007608 CmdArgs.push_back("-lgcc");
7609 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007610 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007611 CmdArgs.push_back("--as-needed");
7612 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007613 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007614 CmdArgs.push_back("--no-as-needed");
7615 }
7616
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007617 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007618 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007619 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007620 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007621
7622 // According to Android ABI, we have to link with libdl if we are
7623 // linking with non-static libgcc.
7624 //
7625 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7626 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7627 if (isAndroid && !StaticLibgcc)
7628 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007629}
7630
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007631static std::string getLinuxDynamicLinker(const ArgList &Args,
7632 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007633 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7634 if (ToolChain.getTriple().isArch64Bit())
7635 return "/system/bin/linker64";
7636 else
7637 return "/system/bin/linker";
7638 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7639 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007640 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007641 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007642 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007643 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007644 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007645 else if (ToolChain.getArch() == llvm::Triple::arm ||
7646 ToolChain.getArch() == llvm::Triple::thumb) {
7647 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7648 return "/lib/ld-linux-armhf.so.3";
7649 else
7650 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007651 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7652 ToolChain.getArch() == llvm::Triple::thumbeb) {
7653 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7654 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7655 else
7656 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007657 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007658 ToolChain.getArch() == llvm::Triple::mipsel ||
7659 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007660 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007661 StringRef CPUName;
7662 StringRef ABIName;
7663 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7664 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7665
7666 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7667 .Case("o32", "/lib")
7668 .Case("n32", "/lib32")
7669 .Case("n64", "/lib64")
7670 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007671 StringRef LibName;
7672 if (mips::isUCLibc(Args))
7673 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7674 else
7675 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007676
7677 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007678 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7679 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007680 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7681 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7682 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007683 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007684 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7685 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7686 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007687 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007688 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7689 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007690 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7691 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007692 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7693 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7694 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007695 else
7696 return "/lib64/ld-linux-x86-64.so.2";
7697}
7698
Renato Golinc4b49242014-02-13 10:01:16 +00007699static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007700 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007701 // Make use of compiler-rt if --rtlib option is used
7702 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7703
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007704 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007705 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007706 switch (TC.getTriple().getOS()) {
7707 default: llvm_unreachable("unsupported OS");
7708 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007709 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007710 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007711 break;
7712 }
Renato Golinc4b49242014-02-13 10:01:16 +00007713 break;
7714 case ToolChain::RLT_Libgcc:
7715 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7716 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007717 }
7718}
7719
Rafael Espindola1e085772014-08-15 17:14:35 +00007720static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7721 switch (T.getArch()) {
7722 case llvm::Triple::x86:
7723 return "elf_i386";
7724 case llvm::Triple::aarch64:
7725 return "aarch64linux";
7726 case llvm::Triple::aarch64_be:
7727 return "aarch64_be_linux";
7728 case llvm::Triple::arm:
7729 case llvm::Triple::thumb:
7730 return "armelf_linux_eabi";
7731 case llvm::Triple::armeb:
7732 case llvm::Triple::thumbeb:
7733 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7734 case llvm::Triple::ppc:
7735 return "elf32ppclinux";
7736 case llvm::Triple::ppc64:
7737 return "elf64ppc";
7738 case llvm::Triple::ppc64le:
7739 return "elf64lppc";
7740 case llvm::Triple::sparc:
7741 return "elf32_sparc";
7742 case llvm::Triple::sparcv9:
7743 return "elf64_sparc";
7744 case llvm::Triple::mips:
7745 return "elf32btsmip";
7746 case llvm::Triple::mipsel:
7747 return "elf32ltsmip";
7748 case llvm::Triple::mips64:
7749 if (mips::hasMipsAbiArg(Args, "n32"))
7750 return "elf32btsmipn32";
7751 return "elf64btsmip";
7752 case llvm::Triple::mips64el:
7753 if (mips::hasMipsAbiArg(Args, "n32"))
7754 return "elf32ltsmipn32";
7755 return "elf64ltsmip";
7756 case llvm::Triple::systemz:
7757 return "elf64_s390";
7758 case llvm::Triple::x86_64:
7759 if (T.getEnvironment() == llvm::Triple::GNUX32)
7760 return "elf32_x86_64";
7761 return "elf_x86_64";
7762 default:
7763 llvm_unreachable("Unexpected arch");
7764 }
7765}
7766
Thomas Schwinge4e555262013-03-28 19:04:25 +00007767void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7768 const InputInfo &Output,
7769 const InputInfoList &Inputs,
7770 const ArgList &Args,
7771 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007772 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007773 static_cast<const toolchains::Linux&>(getToolChain());
7774 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007775 const bool isAndroid =
7776 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007777 const bool IsPIE =
7778 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007779 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007780 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007781
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007782 ArgStringList CmdArgs;
7783
Rafael Espindolad1002f62010-11-15 18:28:16 +00007784 // Silence warning for "clang -g foo.o -o foo"
7785 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007786 // and "clang -emit-llvm foo.o -o foo"
7787 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007788 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007789 // handled somewhere else.
7790 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007791
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007792 if (!D.SysRoot.empty())
7793 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007794
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007795 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007796 CmdArgs.push_back("-pie");
7797
Rafael Espindola1c76c592010-11-07 22:57:16 +00007798 if (Args.hasArg(options::OPT_rdynamic))
7799 CmdArgs.push_back("-export-dynamic");
7800
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007801 if (Args.hasArg(options::OPT_s))
7802 CmdArgs.push_back("-s");
7803
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007804 if (ToolChain.getArch() == llvm::Triple::armeb ||
7805 ToolChain.getArch() == llvm::Triple::thumbeb)
7806 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7807
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007808 for (const auto &Opt : ToolChain.ExtraOpts)
7809 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007810
7811 if (!Args.hasArg(options::OPT_static)) {
7812 CmdArgs.push_back("--eh-frame-hdr");
7813 }
7814
7815 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007816 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007817
7818 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007819 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007820 ToolChain.getArch() == llvm::Triple::armeb ||
7821 ToolChain.getArch() == llvm::Triple::thumb ||
7822 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007823 CmdArgs.push_back("-Bstatic");
7824 else
7825 CmdArgs.push_back("-static");
7826 } else if (Args.hasArg(options::OPT_shared)) {
7827 CmdArgs.push_back("-shared");
7828 }
7829
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007830 if (ToolChain.getArch() == llvm::Triple::arm ||
7831 ToolChain.getArch() == llvm::Triple::armeb ||
7832 ToolChain.getArch() == llvm::Triple::thumb ||
7833 ToolChain.getArch() == llvm::Triple::thumbeb ||
7834 (!Args.hasArg(options::OPT_static) &&
7835 !Args.hasArg(options::OPT_shared))) {
7836 CmdArgs.push_back("-dynamic-linker");
7837 CmdArgs.push_back(Args.MakeArgString(
7838 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7839 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007840
7841 CmdArgs.push_back("-o");
7842 CmdArgs.push_back(Output.getFilename());
7843
Rafael Espindola81937ec2010-12-01 01:52:43 +00007844 if (!Args.hasArg(options::OPT_nostdlib) &&
7845 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007846 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007847 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007848 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007849 if (Args.hasArg(options::OPT_pg))
7850 crt1 = "gcrt1.o";
7851 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007852 crt1 = "Scrt1.o";
7853 else
7854 crt1 = "crt1.o";
7855 }
7856 if (crt1)
7857 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007858
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007859 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7860 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007861
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007862 const char *crtbegin;
7863 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007864 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007865 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007866 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007867 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007868 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007869 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007870 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007871 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007872
7873 // Add crtfastmath.o if available and fast math is enabled.
7874 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007875 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007876
7877 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007878 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007879
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007880 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007881
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007882 for (const auto &Path : Paths)
7883 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007884
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007885 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007886 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007887
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007888 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7889 CmdArgs.push_back("--no-demangle");
7890
Alexey Samsonov52550342014-09-15 19:58:40 +00007891 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007892 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007893 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007894 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007895
Hans Wennborg70850d82013-07-18 20:29:38 +00007896 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007897 !Args.hasArg(options::OPT_nostdlib) &&
7898 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007899 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7900 !Args.hasArg(options::OPT_static);
7901 if (OnlyLibstdcxxStatic)
7902 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007903 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007904 if (OnlyLibstdcxxStatic)
7905 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007906 CmdArgs.push_back("-lm");
7907 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007908 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7909 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007910
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007911 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007912 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7913 if (Args.hasArg(options::OPT_static))
7914 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007915
Alexey Samsonov52550342014-09-15 19:58:40 +00007916 if (NeedsSanitizerDeps)
7917 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7918
Alexey Bataev186b28a2014-03-06 05:43:53 +00007919 LibOpenMP UsedOpenMPLib = LibUnknown;
7920 if (Args.hasArg(options::OPT_fopenmp)) {
7921 UsedOpenMPLib = LibGOMP;
7922 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7923 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7924 .Case("libgomp", LibGOMP)
7925 .Case("libiomp5", LibIOMP5)
7926 .Default(LibUnknown);
7927 if (UsedOpenMPLib == LibUnknown)
7928 D.Diag(diag::err_drv_unsupported_option_argument)
7929 << A->getOption().getName() << A->getValue();
7930 }
7931 switch (UsedOpenMPLib) {
7932 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007933 CmdArgs.push_back("-lgomp");
7934
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007935 // FIXME: Exclude this for platforms with libgomp that don't require
7936 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007937 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007938 break;
7939 case LibIOMP5:
7940 CmdArgs.push_back("-liomp5");
7941 break;
7942 case LibUnknown:
7943 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007944 }
Renato Golinc4b49242014-02-13 10:01:16 +00007945 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007946
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007947 if ((Args.hasArg(options::OPT_pthread) ||
7948 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7949 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007950 CmdArgs.push_back("-lpthread");
7951
7952 CmdArgs.push_back("-lc");
7953
7954 if (Args.hasArg(options::OPT_static))
7955 CmdArgs.push_back("--end-group");
7956 else
Renato Golinc4b49242014-02-13 10:01:16 +00007957 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007958 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007959
Rafael Espindola81937ec2010-12-01 01:52:43 +00007960 if (!Args.hasArg(options::OPT_nostartfiles)) {
7961 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007962 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007963 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007964 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007965 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007966 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007967 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007968
Rafael Espindola81937ec2010-12-01 01:52:43 +00007969 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007970 if (!isAndroid)
7971 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007972 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007973 }
7974
David Blaikiec11bf802014-09-04 16:04:28 +00007975 C.addCommand(
7976 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007977}
7978
Derek Schuff6ab52fa2015-03-30 20:31:33 +00007979
7980// NaCl ARM assembly (inline or standalone) can be written with a set of macros
7981// for the various SFI requirements like register masking. The assembly tool
7982// inserts the file containing the macros as an input into all the assembly
7983// jobs.
7984void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
7985 const InputInfo &Output,
7986 const InputInfoList &Inputs,
7987 const ArgList &Args,
7988 const char *LinkingOutput) const {
7989 const toolchains::NaCl_TC& ToolChain =
7990 static_cast<const toolchains::NaCl_TC&>(getToolChain());
7991 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
7992 "nacl-arm-macros.s");
7993 InputInfoList NewInputs;
7994 NewInputs.push_back(NaClMacros);
7995 NewInputs.append(Inputs.begin(), Inputs.end());
7996 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
7997 LinkingOutput);
7998}
7999
8000
8001// This is quite similar to gnutools::link::ConstructJob with changes that
8002// we use static by default, do not yet support sanitizers or LTO, and a few
8003// others. Eventually we can support more of that and hopefully migrate back
8004// to gnutools::link.
8005void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8006 const InputInfo &Output,
8007 const InputInfoList &Inputs,
8008 const ArgList &Args,
8009 const char *LinkingOutput) const {
8010
8011 const toolchains::NaCl_TC& ToolChain =
8012 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8013 const Driver &D = ToolChain.getDriver();
8014 const bool IsStatic =
8015 !Args.hasArg(options::OPT_dynamic) &&
8016 !Args.hasArg(options::OPT_shared);
8017
8018 ArgStringList CmdArgs;
8019
8020 // Silence warning for "clang -g foo.o -o foo"
8021 Args.ClaimAllArgs(options::OPT_g_Group);
8022 // and "clang -emit-llvm foo.o -o foo"
8023 Args.ClaimAllArgs(options::OPT_emit_llvm);
8024 // and for "clang -w foo.o -o foo". Other warning options are already
8025 // handled somewhere else.
8026 Args.ClaimAllArgs(options::OPT_w);
8027
8028 if (!D.SysRoot.empty())
8029 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8030
8031 if (Args.hasArg(options::OPT_rdynamic))
8032 CmdArgs.push_back("-export-dynamic");
8033
8034 if (Args.hasArg(options::OPT_s))
8035 CmdArgs.push_back("-s");
8036
8037 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8038 // there is --build-id, which we do want.
8039 CmdArgs.push_back("--build-id");
8040
8041 if (!IsStatic)
8042 CmdArgs.push_back("--eh-frame-hdr");
8043
8044 CmdArgs.push_back("-m");
8045 if (ToolChain.getArch() == llvm::Triple::x86)
8046 CmdArgs.push_back("elf_i386_nacl");
8047 else if (ToolChain.getArch() == llvm::Triple::arm)
8048 CmdArgs.push_back("armelf_nacl");
8049 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8050 CmdArgs.push_back("elf_x86_64_nacl");
8051 else
8052 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8053 "Native Client";
8054
8055
8056 if (IsStatic)
8057 CmdArgs.push_back("-static");
8058 else if (Args.hasArg(options::OPT_shared))
8059 CmdArgs.push_back("-shared");
8060
8061 CmdArgs.push_back("-o");
8062 CmdArgs.push_back(Output.getFilename());
8063 if (!Args.hasArg(options::OPT_nostdlib) &&
8064 !Args.hasArg(options::OPT_nostartfiles)) {
8065 if (!Args.hasArg(options::OPT_shared))
8066 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8067 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8068
8069 const char *crtbegin;
8070 if (IsStatic)
8071 crtbegin = "crtbeginT.o";
8072 else if (Args.hasArg(options::OPT_shared))
8073 crtbegin = "crtbeginS.o";
8074 else
8075 crtbegin = "crtbegin.o";
8076 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8077 }
8078
8079 Args.AddAllArgs(CmdArgs, options::OPT_L);
8080 Args.AddAllArgs(CmdArgs, options::OPT_u);
8081
8082 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8083
8084 for (const auto &Path : Paths)
8085 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8086
8087 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8088 CmdArgs.push_back("--no-demangle");
8089
8090 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8091
8092 if (D.CCCIsCXX() &&
8093 !Args.hasArg(options::OPT_nostdlib) &&
8094 !Args.hasArg(options::OPT_nodefaultlibs)) {
8095 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8096 !IsStatic;
8097 if (OnlyLibstdcxxStatic)
8098 CmdArgs.push_back("-Bstatic");
8099 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8100 if (OnlyLibstdcxxStatic)
8101 CmdArgs.push_back("-Bdynamic");
8102 CmdArgs.push_back("-lm");
8103 }
8104
8105 if (!Args.hasArg(options::OPT_nostdlib)) {
8106 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8107 // Always use groups, since it has no effect on dynamic libraries.
8108 CmdArgs.push_back("--start-group");
8109 CmdArgs.push_back("-lc");
8110 // NaCl's libc++ currently requires libpthread, so just always include it
8111 // in the group for C++.
8112 if (Args.hasArg(options::OPT_pthread) ||
8113 Args.hasArg(options::OPT_pthreads) ||
8114 D.CCCIsCXX()) {
8115 CmdArgs.push_back("-lpthread");
8116 }
8117
8118 CmdArgs.push_back("-lgcc");
8119 CmdArgs.push_back("--as-needed");
8120 if (IsStatic)
8121 CmdArgs.push_back("-lgcc_eh");
8122 else
8123 CmdArgs.push_back("-lgcc_s");
8124 CmdArgs.push_back("--no-as-needed");
8125 CmdArgs.push_back("--end-group");
8126 }
8127
8128 if (!Args.hasArg(options::OPT_nostartfiles)) {
8129 const char *crtend;
8130 if (Args.hasArg(options::OPT_shared))
8131 crtend = "crtendS.o";
8132 else
8133 crtend = "crtend.o";
8134
8135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8137 }
8138 }
8139
8140 C.addCommand(llvm::make_unique<Command>(JA, *this,
8141 ToolChain.Linker.c_str(), CmdArgs));
8142}
8143
8144
Chris Lattner3e2ee142010-07-07 16:01:42 +00008145void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008146 const InputInfo &Output,
8147 const InputInfoList &Inputs,
8148 const ArgList &Args,
8149 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008150 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008151 ArgStringList CmdArgs;
8152
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008153 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008154
8155 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008156 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008157
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008158 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008159 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008160
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008161 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008162 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008163}
8164
8165void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008166 const InputInfo &Output,
8167 const InputInfoList &Inputs,
8168 const ArgList &Args,
8169 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008170 const Driver &D = getToolChain().getDriver();
8171 ArgStringList CmdArgs;
8172
Daniel Dunbarb440f562010-08-02 02:38:21 +00008173 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008174 CmdArgs.push_back("-o");
8175 CmdArgs.push_back(Output.getFilename());
8176 } else {
8177 assert(Output.isNothing() && "Invalid output.");
8178 }
8179
8180 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008181 !Args.hasArg(options::OPT_nostartfiles)) {
8182 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8183 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8184 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8185 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8186 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008187
8188 Args.AddAllArgs(CmdArgs, options::OPT_L);
8189 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8190 Args.AddAllArgs(CmdArgs, options::OPT_e);
8191
Daniel Dunbar54423b22010-09-17 00:24:54 +00008192 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008193
Alexey Samsonov7811d192014-02-20 13:57:37 +00008194 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008195
Chris Lattner3e2ee142010-07-07 16:01:42 +00008196 if (!Args.hasArg(options::OPT_nostdlib) &&
8197 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008198 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008199 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008200 CmdArgs.push_back("-lm");
8201 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008202 }
8203
8204 if (!Args.hasArg(options::OPT_nostdlib) &&
8205 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008206 if (Args.hasArg(options::OPT_pthread))
8207 CmdArgs.push_back("-lpthread");
8208 CmdArgs.push_back("-lc");
8209 CmdArgs.push_back("-lCompilerRT-Generic");
8210 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8211 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008212 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008213 }
8214
Logan Chieneb9162f2014-06-26 14:23:45 +00008215 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008216 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008217}
8218
Daniel Dunbarcc912342009-05-02 18:28:39 +00008219/// DragonFly Tools
8220
8221// For now, DragonFly Assemble does just about the same as for
8222// FreeBSD, but this may change soon.
8223void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008224 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008225 const InputInfoList &Inputs,
8226 const ArgList &Args,
8227 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008228 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008229 ArgStringList CmdArgs;
8230
8231 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8232 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008233 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008234 CmdArgs.push_back("--32");
8235
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008236 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008237
8238 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008239 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008240
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008241 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008242 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008243
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008244 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008245 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008246}
8247
8248void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008249 const InputInfo &Output,
8250 const InputInfoList &Inputs,
8251 const ArgList &Args,
8252 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008253 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008254 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008255 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008256
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008257 if (!D.SysRoot.empty())
8258 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8259
John McCall65b8da02013-04-11 22:55:55 +00008260 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008261 if (Args.hasArg(options::OPT_static)) {
8262 CmdArgs.push_back("-Bstatic");
8263 } else {
John McCall65b8da02013-04-11 22:55:55 +00008264 if (Args.hasArg(options::OPT_rdynamic))
8265 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008266 if (Args.hasArg(options::OPT_shared))
8267 CmdArgs.push_back("-Bshareable");
8268 else {
8269 CmdArgs.push_back("-dynamic-linker");
8270 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8271 }
John McCall65b8da02013-04-11 22:55:55 +00008272 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008273 }
8274
8275 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8276 // instruct ld in the base system to link 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("-m");
8279 CmdArgs.push_back("elf_i386");
8280 }
8281
Daniel Dunbarb440f562010-08-02 02:38:21 +00008282 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008283 CmdArgs.push_back("-o");
8284 CmdArgs.push_back(Output.getFilename());
8285 } else {
8286 assert(Output.isNothing() && "Invalid output.");
8287 }
8288
8289 if (!Args.hasArg(options::OPT_nostdlib) &&
8290 !Args.hasArg(options::OPT_nostartfiles)) {
8291 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008292 if (Args.hasArg(options::OPT_pg))
8293 CmdArgs.push_back(Args.MakeArgString(
8294 getToolChain().GetFilePath("gcrt1.o")));
8295 else {
8296 if (Args.hasArg(options::OPT_pie))
8297 CmdArgs.push_back(Args.MakeArgString(
8298 getToolChain().GetFilePath("Scrt1.o")));
8299 else
8300 CmdArgs.push_back(Args.MakeArgString(
8301 getToolChain().GetFilePath("crt1.o")));
8302 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008303 }
John McCall65b8da02013-04-11 22:55:55 +00008304 CmdArgs.push_back(Args.MakeArgString(
8305 getToolChain().GetFilePath("crti.o")));
8306 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8307 CmdArgs.push_back(Args.MakeArgString(
8308 getToolChain().GetFilePath("crtbeginS.o")));
8309 else
8310 CmdArgs.push_back(Args.MakeArgString(
8311 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008312 }
8313
8314 Args.AddAllArgs(CmdArgs, options::OPT_L);
8315 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8316 Args.AddAllArgs(CmdArgs, options::OPT_e);
8317
Daniel Dunbar54423b22010-09-17 00:24:54 +00008318 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008319
8320 if (!Args.hasArg(options::OPT_nostdlib) &&
8321 !Args.hasArg(options::OPT_nodefaultlibs)) {
8322 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8323 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008324 if (UseGCC47)
8325 CmdArgs.push_back("-L/usr/lib/gcc47");
8326 else
8327 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008328
8329 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008330 if (UseGCC47) {
8331 CmdArgs.push_back("-rpath");
8332 CmdArgs.push_back("/usr/lib/gcc47");
8333 } else {
8334 CmdArgs.push_back("-rpath");
8335 CmdArgs.push_back("/usr/lib/gcc44");
8336 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008337 }
8338
Hans Wennborg70850d82013-07-18 20:29:38 +00008339 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008340 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008341 CmdArgs.push_back("-lm");
8342 }
8343
Daniel Dunbarcc912342009-05-02 18:28:39 +00008344 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008345 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008346
8347 if (!Args.hasArg(options::OPT_nolibc)) {
8348 CmdArgs.push_back("-lc");
8349 }
8350
John McCall65b8da02013-04-11 22:55:55 +00008351 if (UseGCC47) {
8352 if (Args.hasArg(options::OPT_static) ||
8353 Args.hasArg(options::OPT_static_libgcc)) {
8354 CmdArgs.push_back("-lgcc");
8355 CmdArgs.push_back("-lgcc_eh");
8356 } else {
8357 if (Args.hasArg(options::OPT_shared_libgcc)) {
8358 CmdArgs.push_back("-lgcc_pic");
8359 if (!Args.hasArg(options::OPT_shared))
8360 CmdArgs.push_back("-lgcc");
8361 } else {
8362 CmdArgs.push_back("-lgcc");
8363 CmdArgs.push_back("--as-needed");
8364 CmdArgs.push_back("-lgcc_pic");
8365 CmdArgs.push_back("--no-as-needed");
8366 }
8367 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008368 } else {
John McCall65b8da02013-04-11 22:55:55 +00008369 if (Args.hasArg(options::OPT_shared)) {
8370 CmdArgs.push_back("-lgcc_pic");
8371 } else {
8372 CmdArgs.push_back("-lgcc");
8373 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008374 }
8375 }
8376
8377 if (!Args.hasArg(options::OPT_nostdlib) &&
8378 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008379 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008380 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008381 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008382 else
8383 CmdArgs.push_back(Args.MakeArgString(
8384 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008385 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008386 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008387 }
8388
Alexey Samsonov7811d192014-02-20 13:57:37 +00008389 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008390
Logan Chieneb9162f2014-06-26 14:23:45 +00008391 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008392 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008393}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008394
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008395// Try to find Exe from a Visual Studio distribution. This first tries to find
8396// an installed copy of Visual Studio and, failing that, looks in the PATH,
8397// making sure that whatever executable that's found is not a same-named exe
8398// from clang itself to prevent clang from falling back to itself.
8399static std::string FindVisualStudioExecutable(const ToolChain &TC,
8400 const char *Exe,
8401 const char *ClangProgramPath) {
8402 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8403 std::string visualStudioBinDir;
8404 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8405 visualStudioBinDir)) {
8406 SmallString<128> FilePath(visualStudioBinDir);
8407 llvm::sys::path::append(FilePath, Exe);
8408 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8409 return FilePath.str();
8410 }
8411
8412 return Exe;
8413}
8414
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008415void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8416 const InputInfo &Output,
8417 const InputInfoList &Inputs,
8418 const ArgList &Args,
8419 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008420 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008421 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008422
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008423 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8424 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008425 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8426 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008427
8428 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008429 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008430 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008431
Zachary Turner10d75b22014-10-22 20:40:43 +00008432 if (!llvm::sys::Process::GetEnv("LIB")) {
8433 // If the VC environment hasn't been configured (perhaps because the user
8434 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008435 // the environment variable is set however, assume the user knows what
8436 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008437 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008438 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008439 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8440 SmallString<128> LibDir(VisualStudioDir);
8441 llvm::sys::path::append(LibDir, "VC", "lib");
8442 switch (MSVC.getArch()) {
8443 case llvm::Triple::x86:
8444 // x86 just puts the libraries directly in lib
8445 break;
8446 case llvm::Triple::x86_64:
8447 llvm::sys::path::append(LibDir, "amd64");
8448 break;
8449 case llvm::Triple::arm:
8450 llvm::sys::path::append(LibDir, "arm");
8451 break;
8452 default:
8453 break;
8454 }
8455 CmdArgs.push_back(
8456 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8457 }
8458
8459 std::string WindowsSdkLibPath;
8460 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8461 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8462 WindowsSdkLibPath.c_str()));
8463 }
8464
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008465 CmdArgs.push_back("-nologo");
8466
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008467 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008468 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008469
Hans Wennborge4c47f22015-03-04 23:16:21 +00008470 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8471 options::OPT__SLASH_LDd,
8472 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008473 if (DLL) {
8474 CmdArgs.push_back(Args.MakeArgString("-dll"));
8475
8476 SmallString<128> ImplibName(Output.getFilename());
8477 llvm::sys::path::replace_extension(ImplibName, "lib");
8478 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008479 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008480 }
8481
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008482 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008483 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008484 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008485 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008486 static const char *CompilerRTComponents[] = {
8487 "asan_dynamic",
8488 "asan_dynamic_runtime_thunk",
8489 };
8490 for (const auto &Component : CompilerRTComponents)
8491 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008492 // Make sure the dynamic runtime thunk is not optimized out at link time
8493 // to ensure proper SEH handling.
8494 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008495 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008496 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008497 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008498 static const char *CompilerRTComponents[] = {
8499 "asan",
8500 "asan_cxx",
8501 };
8502 for (const auto &Component : CompilerRTComponents)
8503 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008504 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008505 }
8506
Hans Wennborg2e274592013-08-13 23:38:57 +00008507 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008508
Reid Kleckner337188f2014-09-16 19:22:00 +00008509 // Add filenames, libraries, and other linker inputs.
8510 for (const auto &Input : Inputs) {
8511 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008512 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008513 continue;
8514 }
8515
8516 const Arg &A = Input.getInputArg();
8517
8518 // Render -l options differently for the MSVC linker.
8519 if (A.getOption().matches(options::OPT_l)) {
8520 StringRef Lib = A.getValue();
8521 const char *LinkLibArg;
8522 if (Lib.endswith(".lib"))
8523 LinkLibArg = Args.MakeArgString(Lib);
8524 else
8525 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8526 CmdArgs.push_back(LinkLibArg);
8527 continue;
8528 }
8529
8530 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8531 // or -L. Render it, even if MSVC doesn't understand it.
8532 A.renderAsInput(Args, CmdArgs);
8533 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008534
Zachary Turner719f58c2014-12-01 23:06:47 +00008535 // We need to special case some linker paths. In the case of lld, we need to
8536 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8537 // linker, we need to use a special search algorithm.
8538 llvm::SmallString<128> linkPath;
8539 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8540 if (Linker.equals_lower("lld"))
8541 Linker = "lld-link";
8542
8543 if (Linker.equals_lower("link")) {
8544 // If we're using the MSVC linker, it's not sufficient to just use link
8545 // from the program PATH, because other environments like GnuWin32 install
8546 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008547 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008548 C.getDriver().getClangProgramPath());
8549 } else {
8550 linkPath = Linker;
8551 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008552 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008553 }
8554
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008555 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008557}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008558
8559void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8560 const InputInfo &Output,
8561 const InputInfoList &Inputs,
8562 const ArgList &Args,
8563 const char *LinkingOutput) const {
8564 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8565}
8566
David Blaikiec11bf802014-09-04 16:04:28 +00008567std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8568 Compilation &C, const JobAction &JA, const InputInfo &Output,
8569 const InputInfoList &Inputs, const ArgList &Args,
8570 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008571 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008572 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008573 CmdArgs.push_back("/c"); // Compile only.
8574 CmdArgs.push_back("/W0"); // No warnings.
8575
8576 // The goal is to be able to invoke this tool correctly based on
8577 // any flag accepted by clang-cl.
8578
8579 // These are spelled the same way in clang and cl.exe,.
8580 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8581 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008582
8583 // Optimization level.
8584 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8585 if (A->getOption().getID() == options::OPT_O0) {
8586 CmdArgs.push_back("/Od");
8587 } else {
8588 StringRef OptLevel = A->getValue();
8589 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8590 A->render(Args, CmdArgs);
8591 else if (OptLevel == "3")
8592 CmdArgs.push_back("/Ox");
8593 }
8594 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008595
Nico Weber3f8dafb2015-03-12 19:37:10 +00008596 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008597 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8598
David Majnemerf6072342014-07-01 22:24:56 +00008599 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8600 /*default=*/false))
8601 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008602 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8603 options::OPT_fno_function_sections))
8604 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8605 ? "/Gy"
8606 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008607 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8608 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008609 CmdArgs.push_back(
8610 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008611 if (Args.hasArg(options::OPT_fsyntax_only))
8612 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008613 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8614 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008615
Nico Weber3f8dafb2015-03-12 19:37:10 +00008616 std::vector<std::string> Includes =
8617 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008618 for (const auto &Include : Includes)
8619 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008620
Hans Wennborg87cfa712013-09-19 20:32:16 +00008621 // Flags that can simply be passed through.
8622 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8623 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008624 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008625
8626 // The order of these flags is relevant, so pick the last one.
8627 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8628 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8629 A->render(Args, CmdArgs);
8630
8631
8632 // Input filename.
8633 assert(Inputs.size() == 1);
8634 const InputInfo &II = Inputs[0];
8635 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8636 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8637 if (II.isFilename())
8638 CmdArgs.push_back(II.getFilename());
8639 else
8640 II.getInputArg().renderAsInput(Args, CmdArgs);
8641
8642 // Output filename.
8643 assert(Output.getType() == types::TY_Object);
8644 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8645 Output.getFilename());
8646 CmdArgs.push_back(Fo);
8647
Hans Wennborg188382e2013-09-20 18:16:35 +00008648 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008649 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8650 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008651 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8652 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008653}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008654
8655
8656/// XCore Tools
8657// We pass assemble and link construction to the xcc tool.
8658
8659void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8660 const InputInfo &Output,
8661 const InputInfoList &Inputs,
8662 const ArgList &Args,
8663 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008664 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008665 ArgStringList CmdArgs;
8666
8667 CmdArgs.push_back("-o");
8668 CmdArgs.push_back(Output.getFilename());
8669
8670 CmdArgs.push_back("-c");
8671
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008672 if (Args.hasArg(options::OPT_v))
8673 CmdArgs.push_back("-v");
8674
Robert Lytton894d25c2014-05-02 09:33:25 +00008675 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8676 if (!A->getOption().matches(options::OPT_g0))
8677 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008678
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008679 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8680 false))
8681 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008682
8683 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8684 options::OPT_Xassembler);
8685
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008686 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008687 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008688
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008689 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008691}
8692
8693void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8694 const InputInfo &Output,
8695 const InputInfoList &Inputs,
8696 const ArgList &Args,
8697 const char *LinkingOutput) const {
8698 ArgStringList CmdArgs;
8699
8700 if (Output.isFilename()) {
8701 CmdArgs.push_back("-o");
8702 CmdArgs.push_back(Output.getFilename());
8703 } else {
8704 assert(Output.isNothing() && "Invalid output.");
8705 }
8706
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008707 if (Args.hasArg(options::OPT_v))
8708 CmdArgs.push_back("-v");
8709
David Majnemer8de68642014-12-05 08:11:58 +00008710 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008711 CmdArgs.push_back("-fexceptions");
8712
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008713 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8714
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008715 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008717}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008718
8719void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8720 const InputInfo &Output,
8721 const InputInfoList &Inputs,
8722 const ArgList &Args,
8723 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008724 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008725 const auto &TC =
8726 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8727 ArgStringList CmdArgs;
8728 const char *Exec;
8729
8730 switch (TC.getArch()) {
8731 default: llvm_unreachable("unsupported architecture");
8732 case llvm::Triple::arm:
8733 case llvm::Triple::thumb:
8734 break;
8735 case llvm::Triple::x86:
8736 CmdArgs.push_back("--32");
8737 break;
8738 case llvm::Triple::x86_64:
8739 CmdArgs.push_back("--64");
8740 break;
8741 }
8742
8743 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8744
8745 CmdArgs.push_back("-o");
8746 CmdArgs.push_back(Output.getFilename());
8747
8748 for (const auto &Input : Inputs)
8749 CmdArgs.push_back(Input.getFilename());
8750
8751 const std::string Assembler = TC.GetProgramPath("as");
8752 Exec = Args.MakeArgString(Assembler);
8753
8754 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8755}
8756
8757void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8758 const InputInfo &Output,
8759 const InputInfoList &Inputs,
8760 const ArgList &Args,
8761 const char *LinkingOutput) const {
8762 const auto &TC =
8763 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8764 const llvm::Triple &T = TC.getTriple();
8765 const Driver &D = TC.getDriver();
8766 SmallString<128> EntryPoint;
8767 ArgStringList CmdArgs;
8768 const char *Exec;
8769
8770 // Silence warning for "clang -g foo.o -o foo"
8771 Args.ClaimAllArgs(options::OPT_g_Group);
8772 // and "clang -emit-llvm foo.o -o foo"
8773 Args.ClaimAllArgs(options::OPT_emit_llvm);
8774 // and for "clang -w foo.o -o foo"
8775 Args.ClaimAllArgs(options::OPT_w);
8776 // Other warning options are already handled somewhere else.
8777
8778 if (!D.SysRoot.empty())
8779 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8780
8781 if (Args.hasArg(options::OPT_pie))
8782 CmdArgs.push_back("-pie");
8783 if (Args.hasArg(options::OPT_rdynamic))
8784 CmdArgs.push_back("-export-dynamic");
8785 if (Args.hasArg(options::OPT_s))
8786 CmdArgs.push_back("--strip-all");
8787
8788 CmdArgs.push_back("-m");
8789 switch (TC.getArch()) {
8790 default: llvm_unreachable("unsupported architecture");
8791 case llvm::Triple::arm:
8792 case llvm::Triple::thumb:
8793 // FIXME: this is incorrect for WinCE
8794 CmdArgs.push_back("thumb2pe");
8795 break;
8796 case llvm::Triple::x86:
8797 CmdArgs.push_back("i386pe");
8798 EntryPoint.append("_");
8799 break;
8800 case llvm::Triple::x86_64:
8801 CmdArgs.push_back("i386pep");
8802 break;
8803 }
8804
8805 if (Args.hasArg(options::OPT_shared)) {
8806 switch (T.getArch()) {
8807 default: llvm_unreachable("unsupported architecture");
8808 case llvm::Triple::arm:
8809 case llvm::Triple::thumb:
8810 case llvm::Triple::x86_64:
8811 EntryPoint.append("_DllMainCRTStartup");
8812 break;
8813 case llvm::Triple::x86:
8814 EntryPoint.append("_DllMainCRTStartup@12");
8815 break;
8816 }
8817
8818 CmdArgs.push_back("-shared");
8819 CmdArgs.push_back("-Bdynamic");
8820
8821 CmdArgs.push_back("--enable-auto-image-base");
8822
8823 CmdArgs.push_back("--entry");
8824 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8825 } else {
8826 EntryPoint.append("mainCRTStartup");
8827
8828 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8829 : "-Bdynamic");
8830
8831 if (!Args.hasArg(options::OPT_nostdlib) &&
8832 !Args.hasArg(options::OPT_nostartfiles)) {
8833 CmdArgs.push_back("--entry");
8834 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8835 }
8836
8837 // FIXME: handle subsystem
8838 }
8839
8840 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008841 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008842
8843 CmdArgs.push_back("-o");
8844 CmdArgs.push_back(Output.getFilename());
8845
8846 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8847 SmallString<261> ImpLib(Output.getFilename());
8848 llvm::sys::path::replace_extension(ImpLib, ".lib");
8849
8850 CmdArgs.push_back("--out-implib");
8851 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8852 }
8853
8854 if (!Args.hasArg(options::OPT_nostdlib) &&
8855 !Args.hasArg(options::OPT_nostartfiles)) {
8856 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8857 const char *CRTBegin;
8858
8859 CRTBegin =
8860 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8861 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8862 }
8863
8864 Args.AddAllArgs(CmdArgs, options::OPT_L);
8865
8866 const auto &Paths = TC.getFilePaths();
8867 for (const auto &Path : Paths)
8868 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8869
8870 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8871
8872 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8873 !Args.hasArg(options::OPT_nodefaultlibs)) {
8874 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8875 !Args.hasArg(options::OPT_static);
8876 if (StaticCXX)
8877 CmdArgs.push_back("-Bstatic");
8878 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8879 if (StaticCXX)
8880 CmdArgs.push_back("-Bdynamic");
8881 }
8882
8883 if (!Args.hasArg(options::OPT_nostdlib)) {
8884 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8885 // TODO handle /MT[d] /MD[d]
8886 CmdArgs.push_back("-lmsvcrt");
8887 AddRunTimeLibs(TC, D, CmdArgs, Args);
8888 }
8889 }
8890
8891 const std::string Linker = TC.GetProgramPath("ld");
8892 Exec = Args.MakeArgString(Linker);
8893
8894 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8895}