blob: 3053d9bde7da29c64434370f6ec79042a7c09d5e [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("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001805
1806 if (Split.first == "armv8-a" ||
1807 Split.first == "armv8a") {
1808 // ok, no additional features.
1809 } else if (
1810 Split.first == "armv8.1-a" ||
1811 Split.first == "armv8.1a" ) {
1812 Features.push_back("+v8.1a");
1813 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001814 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001815 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001816
1817 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1818 return false;
1819
1820 return true;
1821}
1822
1823static bool
1824getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1825 const ArgList &Args,
1826 std::vector<const char *> &Features) {
1827 StringRef CPU;
1828 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1829 return false;
1830
1831 return true;
1832}
1833
1834static bool
1835getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1836 const ArgList &Args,
1837 std::vector<const char *> &Features) {
1838 // Handle CPU name is 'native'.
1839 if (Mtune == "native")
1840 Mtune = llvm::sys::getHostCPUName();
1841 if (Mtune == "cyclone") {
1842 Features.push_back("+zcm");
1843 Features.push_back("+zcz");
1844 }
1845 return true;
1846}
1847
1848static bool
1849getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1850 const ArgList &Args,
1851 std::vector<const char *> &Features) {
1852 StringRef CPU;
1853 std::vector<const char *> DecodedFeature;
1854 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1855 return false;
1856
1857 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1858}
1859
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001860static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1861 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001862 Arg *A;
1863 bool success = true;
1864 // Enable NEON by default.
1865 Features.push_back("+neon");
1866 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1867 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1868 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1869 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001870 else if (Args.hasArg(options::OPT_arch))
1871 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1872 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001873
1874 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1875 success =
1876 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1877 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1878 success =
1879 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001880 else if (Args.hasArg(options::OPT_arch))
1881 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1882 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001883
1884 if (!success)
1885 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001886
1887 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1888 Features.push_back("-fp-armv8");
1889 Features.push_back("-crypto");
1890 Features.push_back("-neon");
1891 }
Bradley Smith418c5932014-05-02 15:17:51 +00001892
1893 // En/disable crc
1894 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1895 options::OPT_mnocrc)) {
1896 if (A->getOption().matches(options::OPT_mcrc))
1897 Features.push_back("+crc");
1898 else
1899 Features.push_back("-crc");
1900 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001901}
1902
1903static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001904 const ArgList &Args, ArgStringList &CmdArgs,
1905 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001906 std::vector<const char *> Features;
1907 switch (Triple.getArch()) {
1908 default:
1909 break;
1910 case llvm::Triple::mips:
1911 case llvm::Triple::mipsel:
1912 case llvm::Triple::mips64:
1913 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001914 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001915 break;
1916
1917 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001918 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001919 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001920 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001921 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001922 break;
1923
1924 case llvm::Triple::ppc:
1925 case llvm::Triple::ppc64:
1926 case llvm::Triple::ppc64le:
1927 getPPCTargetFeatures(Args, Features);
1928 break;
1929 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001930 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001931 getSparcTargetFeatures(Args, Features);
1932 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001933 case llvm::Triple::systemz:
1934 getSystemZTargetFeatures(Args, Features);
1935 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001936 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001937 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001938 getAArch64TargetFeatures(D, Args, Features);
1939 break;
1940 case llvm::Triple::x86:
1941 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001942 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001943 break;
1944 }
Rafael Espindola43964802013-08-21 17:34:32 +00001945
1946 // Find the last of each feature.
1947 llvm::StringMap<unsigned> LastOpt;
1948 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1949 const char *Name = Features[I];
1950 assert(Name[0] == '-' || Name[0] == '+');
1951 LastOpt[Name + 1] = I;
1952 }
1953
1954 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1955 // If this feature was overridden, ignore it.
1956 const char *Name = Features[I];
1957 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1958 assert(LastI != LastOpt.end());
1959 unsigned Last = LastI->second;
1960 if (Last != I)
1961 continue;
1962
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001963 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001964 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001965 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001966}
1967
David Majnemerae394812014-12-09 00:12:30 +00001968static bool
1969shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1970 const llvm::Triple &Triple) {
1971 // We use the zero-cost exception tables for Objective-C if the non-fragile
1972 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1973 // later.
1974 if (runtime.isNonFragile())
1975 return true;
1976
1977 if (!Triple.isMacOSX())
1978 return false;
1979
1980 return (!Triple.isMacOSXVersionLT(10,5) &&
1981 (Triple.getArch() == llvm::Triple::x86_64 ||
1982 Triple.getArch() == llvm::Triple::arm));
1983}
1984
Nico Webere8e53112014-05-11 01:04:02 +00001985// exceptionSettings() exists to share the logic between -cc1 and linker
1986// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001987static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001988 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001989 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001990 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001991 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001992
David Majnemer8de68642014-12-05 08:11:58 +00001993 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001994}
1995
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001996/// Adds exception related arguments to the driver command arguments. There's a
1997/// master flag, -fexceptions and also language specific flags to enable/disable
1998/// C++ and Objective-C exceptions. This makes it possible to for example
1999/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002000static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002001 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002002 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002003 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002004 const Driver &D = TC.getDriver();
2005 const llvm::Triple &Triple = TC.getTriple();
2006
Chad Rosier4fab82c2012-03-26 22:04:46 +00002007 if (KernelOrKext) {
2008 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2009 // arguments now to avoid warnings about unused arguments.
2010 Args.ClaimAllArgs(options::OPT_fexceptions);
2011 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2012 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2013 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2014 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2015 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002016 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002017 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002018
David Majnemer8de68642014-12-05 08:11:58 +00002019 // Gather the exception settings from the command line arguments.
2020 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002021
David Majnemerae394812014-12-09 00:12:30 +00002022 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2023 // is not necessarily sensible, but follows GCC.
2024 if (types::isObjC(InputType) &&
2025 Args.hasFlag(options::OPT_fobjc_exceptions,
2026 options::OPT_fno_objc_exceptions,
2027 true)) {
2028 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002029
David Majnemerae394812014-12-09 00:12:30 +00002030 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002031 }
2032
2033 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002034 bool CXXExceptionsEnabled =
2035 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002036 Arg *ExceptionArg = Args.getLastArg(
2037 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2038 options::OPT_fexceptions, options::OPT_fno_exceptions);
2039 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002040 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002041 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2042 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002043
2044 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002045 if (Triple.isPS4CPU()) {
2046 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2047 assert(ExceptionArg &&
2048 "On the PS4 exceptions should only be enabled if passing "
2049 "an argument");
2050 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2051 const Arg *RTTIArg = TC.getRTTIArg();
2052 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2053 D.Diag(diag::err_drv_argument_not_allowed_with)
2054 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2055 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2056 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2057 } else
2058 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2059
Anders Carlssone96ab552011-02-28 02:27:16 +00002060 CmdArgs.push_back("-fcxx-exceptions");
2061
David Majnemer8de68642014-12-05 08:11:58 +00002062 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002063 }
2064 }
2065
David Majnemer8de68642014-12-05 08:11:58 +00002066 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002067 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002068}
2069
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002070static bool ShouldDisableAutolink(const ArgList &Args,
2071 const ToolChain &TC) {
2072 bool Default = true;
2073 if (TC.getTriple().isOSDarwin()) {
2074 // The native darwin assembler doesn't support the linker_option directives,
2075 // so we disable them if we think the .s file will be passed to it.
2076 Default = TC.useIntegratedAs();
2077 }
2078 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2079 Default);
2080}
2081
Ted Kremenek62093662013-03-12 17:02:12 +00002082static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2083 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002084 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2085 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002086 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002087 return !UseDwarfDirectory;
2088}
2089
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002090/// \brief Check whether the given input tree contains any compilation actions.
2091static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002092 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002093 return true;
2094
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002095 for (const auto &Act : *A)
2096 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002097 return true;
2098
2099 return false;
2100}
2101
2102/// \brief Check if -relax-all should be passed to the internal assembler.
2103/// This is done by default when compiling non-assembler source with -O0.
2104static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2105 bool RelaxDefault = true;
2106
2107 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2108 RelaxDefault = A->getOption().matches(options::OPT_O0);
2109
2110 if (RelaxDefault) {
2111 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002112 for (const auto &Act : C.getActions()) {
2113 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002114 RelaxDefault = true;
2115 break;
2116 }
2117 }
2118 }
2119
2120 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2121 RelaxDefault);
2122}
2123
David Blaikie9260ed62013-07-25 21:19:01 +00002124static void CollectArgsForIntegratedAssembler(Compilation &C,
2125 const ArgList &Args,
2126 ArgStringList &CmdArgs,
2127 const Driver &D) {
2128 if (UseRelaxAll(C, Args))
2129 CmdArgs.push_back("-mrelax-all");
2130
David Peixottodfb66142013-11-14 22:52:58 +00002131 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002132 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002133 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2134 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2135 // arg after parsing the '-I' arg.
2136 bool TakeNextArg = false;
2137
David Blaikie9260ed62013-07-25 21:19:01 +00002138 // When using an integrated assembler, translate -Wa, and -Xassembler
2139 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002140 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002141 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2142 options::OPT_Xassembler),
2143 ie = Args.filtered_end(); it != ie; ++it) {
2144 const Arg *A = *it;
2145 A->claim();
2146
2147 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2148 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002149 if (TakeNextArg) {
2150 CmdArgs.push_back(Value.data());
2151 TakeNextArg = false;
2152 continue;
2153 }
David Blaikie9260ed62013-07-25 21:19:01 +00002154
2155 if (Value == "-force_cpusubtype_ALL") {
2156 // Do nothing, this is the default and we don't support anything else.
2157 } else if (Value == "-L") {
2158 CmdArgs.push_back("-msave-temp-labels");
2159 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002160 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002161 } else if (Value == "--noexecstack") {
2162 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002163 } else if (Value == "-compress-debug-sections" ||
2164 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002165 CompressDebugSections = true;
2166 } else if (Value == "-nocompress-debug-sections" ||
2167 Value == "--nocompress-debug-sections") {
2168 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002169 } else if (Value.startswith("-I")) {
2170 CmdArgs.push_back(Value.data());
2171 // We need to consume the next argument if the current arg is a plain
2172 // -I. The next arg will be the include directory.
2173 if (Value == "-I")
2174 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002175 } else if (Value.startswith("-gdwarf-")) {
2176 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002177 } else {
2178 D.Diag(diag::err_drv_unsupported_option_argument)
2179 << A->getOption().getName() << Value;
2180 }
2181 }
2182 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002183 if (CompressDebugSections) {
2184 if (llvm::zlib::isAvailable())
2185 CmdArgs.push_back("-compress-debug-sections");
2186 else
2187 D.Diag(diag::warn_debug_compression_unavailable);
2188 }
David Blaikie9260ed62013-07-25 21:19:01 +00002189}
2190
Renato Goline807c122014-01-31 11:47:28 +00002191// Until ARM libraries are build separately, we have them all in one library
2192static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002193 // FIXME: handle 64-bit
2194 if (TC.getTriple().isOSWindows() &&
2195 !TC.getTriple().isWindowsItaniumEnvironment())
2196 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002197 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002198 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002199 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002200}
2201
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002202static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2203 // The runtimes are located in the OS-specific resource directory.
2204 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002205 const llvm::Triple &Triple = TC.getTriple();
2206 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002207 StringRef OSLibName =
2208 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002209 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002210 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002211}
2212
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002213static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002214 bool Shared = false) {
2215 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2216 ? "-android"
2217 : "";
2218
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002219 bool IsOSWindows = TC.getTriple().isOSWindows();
2220 StringRef Arch = getArchNameForCompilerRTLib(TC);
2221 const char *Prefix = IsOSWindows ? "" : "lib";
2222 const char *Suffix =
2223 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2224
2225 SmallString<128> Path = getCompilerRTLibDir(TC);
2226 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2227 Arch + Env + Suffix);
2228
2229 return Path;
2230}
2231
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002232// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002233// FIXME: Make sure we can also emit shared objects if they're requested
2234// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002235static void addClangRT(const ToolChain &TC, const ArgList &Args,
2236 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002237 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002238
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002239 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002240 // FIXME: why do we link against gcc when we are using compiler-rt?
2241 CmdArgs.push_back("-lgcc_s");
2242 if (TC.getDriver().CCCIsCXX())
2243 CmdArgs.push_back("-lgcc_eh");
2244 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002245}
2246
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002247static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2248 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002249 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2250 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002251 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002252 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002253 Args.hasArg(options::OPT_fcreate_profile) ||
2254 Args.hasArg(options::OPT_coverage)))
2255 return;
2256
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002257 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002258}
2259
Alexey Samsonov52550342014-09-15 19:58:40 +00002260static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2261 ArgStringList &CmdArgs, StringRef Sanitizer,
2262 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002263 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002264 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002265 if (!IsShared)
2266 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002267 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002268 if (!IsShared)
2269 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002270}
2271
Alexey Samsonov52550342014-09-15 19:58:40 +00002272// Tries to use a file with the list of dynamic symbols that need to be exported
2273// from the runtime library. Returns true if the file was found.
2274static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2275 ArgStringList &CmdArgs,
2276 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002277 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2278 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2279 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002280 return true;
2281 }
2282 return false;
2283}
2284
2285static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2286 ArgStringList &CmdArgs) {
2287 // Force linking against the system libraries sanitizers depends on
2288 // (see PR15823 why this is necessary).
2289 CmdArgs.push_back("--no-as-needed");
2290 CmdArgs.push_back("-lpthread");
2291 CmdArgs.push_back("-lrt");
2292 CmdArgs.push_back("-lm");
2293 // There's no libdl on FreeBSD.
2294 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2295 CmdArgs.push_back("-ldl");
2296}
2297
2298static void
2299collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2300 SmallVectorImpl<StringRef> &SharedRuntimes,
2301 SmallVectorImpl<StringRef> &StaticRuntimes,
2302 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2303 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2304 // Collect shared runtimes.
2305 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2306 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002307 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002308
Alexey Samsonov52550342014-09-15 19:58:40 +00002309 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002310 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002311 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2312 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002313 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002314 }
2315 if (SanArgs.needsAsanRt()) {
2316 if (SanArgs.needsSharedAsanRt()) {
2317 HelperStaticRuntimes.push_back("asan-preinit");
2318 } else {
2319 StaticRuntimes.push_back("asan");
2320 if (SanArgs.linkCXXRuntimes())
2321 StaticRuntimes.push_back("asan_cxx");
2322 }
2323 }
2324 if (SanArgs.needsDfsanRt())
2325 StaticRuntimes.push_back("dfsan");
2326 if (SanArgs.needsLsanRt())
2327 StaticRuntimes.push_back("lsan");
2328 if (SanArgs.needsMsanRt())
2329 StaticRuntimes.push_back("msan");
2330 if (SanArgs.needsTsanRt())
2331 StaticRuntimes.push_back("tsan");
Alexey Samsonov52550342014-09-15 19:58:40 +00002332 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002333 StaticRuntimes.push_back("ubsan_standalone");
2334 if (SanArgs.linkCXXRuntimes())
2335 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002336 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002337}
2338
Alexey Samsonov52550342014-09-15 19:58:40 +00002339// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2340// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2341static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002342 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002343 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2344 HelperStaticRuntimes;
2345 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2346 HelperStaticRuntimes);
2347 for (auto RT : SharedRuntimes)
2348 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2349 for (auto RT : HelperStaticRuntimes)
2350 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2351 bool AddExportDynamic = false;
2352 for (auto RT : StaticRuntimes) {
2353 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2354 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2355 }
2356 // If there is a static runtime with no dynamic list, force all the symbols
2357 // to be dynamic to be sure we export sanitizer interface functions.
2358 if (AddExportDynamic)
2359 CmdArgs.push_back("-export-dynamic");
2360 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002361}
2362
Reid Kleckner86ea7702015-02-04 23:45:07 +00002363static bool areOptimizationsEnabled(const ArgList &Args) {
2364 // Find the last -O arg and see if it is non-zero.
2365 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2366 return !A->getOption().matches(options::OPT_O0);
2367 // Defaults to -O0.
2368 return false;
2369}
2370
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002371static bool shouldUseFramePointerForTarget(const ArgList &Args,
2372 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002373 // XCore never wants frame pointers, regardless of OS.
2374 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002375 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002376 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002377
2378 if (Triple.isOSLinux()) {
2379 switch (Triple.getArch()) {
2380 // Don't use a frame pointer on linux if optimizing for certain targets.
2381 case llvm::Triple::mips64:
2382 case llvm::Triple::mips64el:
2383 case llvm::Triple::mips:
2384 case llvm::Triple::mipsel:
2385 case llvm::Triple::systemz:
2386 case llvm::Triple::x86:
2387 case llvm::Triple::x86_64:
2388 return !areOptimizationsEnabled(Args);
2389 default:
2390 return true;
2391 }
2392 }
2393
2394 if (Triple.isOSWindows()) {
2395 switch (Triple.getArch()) {
2396 case llvm::Triple::x86:
2397 return !areOptimizationsEnabled(Args);
2398 default:
2399 // All other supported Windows ISAs use xdata unwind information, so frame
2400 // pointers are not generally useful.
2401 return false;
2402 }
2403 }
2404
2405 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002406}
2407
Rafael Espindola224dd632011-12-14 21:02:23 +00002408static bool shouldUseFramePointer(const ArgList &Args,
2409 const llvm::Triple &Triple) {
2410 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2411 options::OPT_fomit_frame_pointer))
2412 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2413
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002414 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002415}
2416
Eric Christopherb7d97e92013-04-03 01:58:53 +00002417static bool shouldUseLeafFramePointer(const ArgList &Args,
2418 const llvm::Triple &Triple) {
2419 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2420 options::OPT_momit_leaf_frame_pointer))
2421 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2422
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002423 if (Triple.isPS4CPU())
2424 return false;
2425
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002426 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002427}
2428
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002429/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002430static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002431 SmallString<128> cwd;
2432 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002433 CmdArgs.push_back("-fdebug-compilation-dir");
2434 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002435 }
2436}
2437
Eric Christopherd3804002013-02-22 20:12:52 +00002438static const char *SplitDebugName(const ArgList &Args,
2439 const InputInfoList &Inputs) {
2440 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2441 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2442 SmallString<128> T(FinalOutput->getValue());
2443 llvm::sys::path::replace_extension(T, "dwo");
2444 return Args.MakeArgString(T);
2445 } else {
2446 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002447 SmallString<128> T(
2448 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002449 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2450 llvm::sys::path::replace_extension(F, "dwo");
2451 T += F;
2452 return Args.MakeArgString(F);
2453 }
2454}
2455
2456static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2457 const Tool &T, const JobAction &JA,
2458 const ArgList &Args, const InputInfo &Output,
2459 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002460 ArgStringList ExtractArgs;
2461 ExtractArgs.push_back("--extract-dwo");
2462
2463 ArgStringList StripArgs;
2464 StripArgs.push_back("--strip-dwo");
2465
2466 // Grabbing the output of the earlier compile step.
2467 StripArgs.push_back(Output.getFilename());
2468 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002469 ExtractArgs.push_back(OutFile);
2470
2471 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002472 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002473
2474 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002475 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002476
2477 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002478 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002479}
2480
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002481/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002482/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2483static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002484 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002485 if (A->getOption().matches(options::OPT_O4) ||
2486 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002487 return true;
2488
2489 if (A->getOption().matches(options::OPT_O0))
2490 return false;
2491
2492 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2493
Rafael Espindola91780de2013-08-26 14:05:41 +00002494 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002495 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002496 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002497 return true;
2498
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002499 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002500 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002501 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002502
2503 unsigned OptLevel = 0;
2504 if (S.getAsInteger(10, OptLevel))
2505 return false;
2506
2507 return OptLevel > 1;
2508 }
2509
2510 return false;
2511}
2512
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002513/// Add -x lang to \p CmdArgs for \p Input.
2514static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2515 ArgStringList &CmdArgs) {
2516 // When using -verify-pch, we don't want to provide the type
2517 // 'precompiled-header' if it was inferred from the file extension
2518 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2519 return;
2520
2521 CmdArgs.push_back("-x");
2522 if (Args.hasArg(options::OPT_rewrite_objc))
2523 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2524 else
2525 CmdArgs.push_back(types::getTypeName(Input.getType()));
2526}
2527
David Majnemerc371ff02015-03-22 08:39:22 +00002528static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002529 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002530 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002531
2532 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002533 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002534
2535 unsigned Build = 0, Factor = 1;
2536 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2537 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002538 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002539}
2540
Rafael Espindola577637a2015-01-03 00:06:04 +00002541// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002542// options that build systems might add but are unused when assembling or only
2543// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002544static void claimNoWarnArgs(const ArgList &Args) {
2545 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002546 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002547 Args.ClaimAllArgs(options::OPT_flto);
2548 Args.ClaimAllArgs(options::OPT_fno_lto);
2549}
2550
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002551static void appendUserToPath(SmallVectorImpl<char> &Result) {
2552#ifdef LLVM_ON_UNIX
2553 const char *Username = getenv("LOGNAME");
2554#else
2555 const char *Username = getenv("USERNAME");
2556#endif
2557 if (Username) {
2558 // Validate that LoginName can be used in a path, and get its length.
2559 size_t Len = 0;
2560 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002561 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002562 Username = nullptr;
2563 break;
2564 }
2565 }
2566
2567 if (Username && Len > 0) {
2568 Result.append(Username, Username + Len);
2569 return;
2570 }
2571 }
2572
2573 // Fallback to user id.
2574#ifdef LLVM_ON_UNIX
2575 std::string UID = llvm::utostr(getuid());
2576#else
2577 // FIXME: Windows seems to have an 'SID' that might work.
2578 std::string UID = "9999";
2579#endif
2580 Result.append(UID.begin(), UID.end());
2581}
2582
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002583void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002584 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002585 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002586 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002587 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002588 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2589 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002590 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002591 ArgStringList CmdArgs;
2592
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002593 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002594 bool IsWindowsCygnus =
2595 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002596 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2597
Daniel Dunbare521a892009-03-31 20:53:55 +00002598 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2599
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002600 // Invoke ourselves in -cc1 mode.
2601 //
2602 // FIXME: Implement custom jobs for internal actions.
2603 CmdArgs.push_back("-cc1");
2604
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002605 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002606 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002607 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002608 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002609
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002610 const llvm::Triple TT(TripleStr);
2611 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2612 TT.getArch() == llvm::Triple::thumb)) {
2613 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2614 unsigned Version;
2615 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2616 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002617 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2618 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002619 }
2620
Tim Northover336f1892014-03-29 13:16:12 +00002621 // Push all default warning arguments that are specific to
2622 // the given target. These come before user provided warning options
2623 // are provided.
2624 getToolChain().addClangWarningOptions(CmdArgs);
2625
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002626 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002627 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002628
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002629 if (isa<AnalyzeJobAction>(JA)) {
2630 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2631 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002632 } else if (isa<MigrateJobAction>(JA)) {
2633 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002634 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002635 if (Output.getType() == types::TY_Dependencies)
2636 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002637 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002638 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002639 if (Args.hasArg(options::OPT_rewrite_objc) &&
2640 !Args.hasArg(options::OPT_g_Group))
2641 CmdArgs.push_back("-P");
2642 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002643 } else if (isa<AssembleJobAction>(JA)) {
2644 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002645
David Blaikie9260ed62013-07-25 21:19:01 +00002646 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002647
2648 // Also ignore explicit -force_cpusubtype_ALL option.
2649 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002650 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002651 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002652 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002653
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002654 if (JA.getType() == types::TY_Nothing)
2655 CmdArgs.push_back("-fsyntax-only");
2656 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002657 CmdArgs.push_back("-emit-pch");
2658 else
2659 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002660 } else if (isa<VerifyPCHJobAction>(JA)) {
2661 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002662 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002663 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2664 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002665
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002666 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002667 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002668 } else if (JA.getType() == types::TY_LLVM_IR ||
2669 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002670 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002671 } else if (JA.getType() == types::TY_LLVM_BC ||
2672 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002673 CmdArgs.push_back("-emit-llvm-bc");
2674 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002675 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002676 } else if (JA.getType() == types::TY_AST) {
2677 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002678 } else if (JA.getType() == types::TY_ModuleFile) {
2679 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002680 } else if (JA.getType() == types::TY_RewrittenObjC) {
2681 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002682 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002683 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2684 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002685 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002686 } else {
2687 assert(JA.getType() == types::TY_PP_Asm &&
2688 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002689 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002690
2691 // Preserve use-list order by default when emitting bitcode, so that
2692 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2693 // same result as running passes here. For LTO, we don't need to preserve
2694 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002695 if (JA.getType() == types::TY_LLVM_BC)
2696 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002697 }
2698
Justin Bognera88f0122014-06-20 22:59:50 +00002699 // We normally speed up the clang process a bit by skipping destructors at
2700 // exit, but when we're generating diagnostics we can rely on some of the
2701 // cleanup.
2702 if (!C.isForDiagnostics())
2703 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002704
John McCallbb79b5f2010-02-13 03:50:24 +00002705 // Disable the verification pass in -asserts builds.
2706#ifdef NDEBUG
2707 CmdArgs.push_back("-disable-llvm-verifier");
2708#endif
2709
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002710 // Set the main file name, so that debug info works even with
2711 // -save-temps.
2712 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002713 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002714
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002715 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002716 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002717 if (Args.hasArg(options::OPT_static))
2718 CmdArgs.push_back("-static-define");
2719
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002720 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002721 // Enable region store model by default.
2722 CmdArgs.push_back("-analyzer-store=region");
2723
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002724 // Treat blocks as analysis entry points.
2725 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2726
Ted Kremenek49c79792011-03-24 00:28:47 +00002727 CmdArgs.push_back("-analyzer-eagerly-assume");
2728
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002729 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002730 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002731 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002732
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002733 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002734 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002735
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002736 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002737 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002738
2739 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002740
Jordan Rose10ad0812013-04-05 17:55:07 +00002741 if (types::isCXX(Inputs[0].getType()))
2742 CmdArgs.push_back("-analyzer-checker=cplusplus");
2743
Nico Webere8e53112014-05-11 01:04:02 +00002744 // Enable the following experimental checkers for testing.
2745 CmdArgs.push_back(
2746 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002747 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2748 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2749 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2750 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2751 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002752 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002753
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002754 // Set the output format. The default is plist, for (lame) historical
2755 // reasons.
2756 CmdArgs.push_back("-analyzer-output");
2757 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002758 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002759 else
2760 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002761
Ted Kremenekfe449a22010-03-22 22:32:05 +00002762 // Disable the presentation of standard compiler warnings when
2763 // using --analyze. We only want to show static analyzer diagnostics
2764 // or frontend errors.
2765 CmdArgs.push_back("-w");
2766
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002767 // Add -Xanalyzer arguments when running as analyzer.
2768 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002769 }
2770
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002771 CheckCodeGenerationOptions(D, Args);
2772
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002773 bool PIE = getToolChain().isPIEDefault();
2774 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002775 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002776
Alexey Bataev40e75222014-01-28 06:30:35 +00002777 // Android-specific defaults for PIC/PIE
2778 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2779 switch (getToolChain().getTriple().getArch()) {
2780 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002781 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002782 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002783 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002784 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002785 case llvm::Triple::mips:
2786 case llvm::Triple::mipsel:
2787 case llvm::Triple::mips64:
2788 case llvm::Triple::mips64el:
2789 PIC = true; // "-fpic"
2790 break;
2791
2792 case llvm::Triple::x86:
2793 case llvm::Triple::x86_64:
2794 PIC = true; // "-fPIC"
2795 IsPICLevelTwo = true;
2796 break;
2797
2798 default:
2799 break;
2800 }
2801 }
2802
Brad Smith5b05db82014-06-24 19:51:29 +00002803 // OpenBSD-specific defaults for PIE
2804 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2805 switch (getToolChain().getTriple().getArch()) {
2806 case llvm::Triple::mips64:
2807 case llvm::Triple::mips64el:
2808 case llvm::Triple::sparc:
2809 case llvm::Triple::x86:
2810 case llvm::Triple::x86_64:
2811 IsPICLevelTwo = false; // "-fpie"
2812 break;
2813
2814 case llvm::Triple::ppc:
2815 case llvm::Triple::sparcv9:
2816 IsPICLevelTwo = true; // "-fPIE"
2817 break;
2818
2819 default:
2820 break;
2821 }
2822 }
2823
Alexey Samsonov090301e2013-04-09 12:28:19 +00002824 // For the PIC and PIE flag options, this logic is different from the
2825 // legacy logic in very old versions of GCC, as that logic was just
2826 // a bug no one had ever fixed. This logic is both more rational and
2827 // consistent with GCC's new logic now that the bugs are fixed. The last
2828 // argument relating to either PIC or PIE wins, and no other argument is
2829 // used. If the last argument is any flavor of the '-fno-...' arguments,
2830 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2831 // at the same level.
2832 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2833 options::OPT_fpic, options::OPT_fno_pic,
2834 options::OPT_fPIE, options::OPT_fno_PIE,
2835 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002836 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2837 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002838 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002839 if (LastPICArg) {
2840 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002841 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2842 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2843 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2844 PIC = PIE || O.matches(options::OPT_fPIC) ||
2845 O.matches(options::OPT_fpic);
2846 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2847 O.matches(options::OPT_fPIC);
2848 } else {
2849 PIE = PIC = false;
2850 }
2851 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002852 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002853
Nick Lewycky609dd662013-10-11 03:33:53 +00002854 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002855 // specified while enabling PIC enabled level 1 PIC, just force it back to
2856 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2857 // informal testing).
2858 if (PIC && getToolChain().getTriple().isOSDarwin())
2859 IsPICLevelTwo |= getToolChain().isPICDefault();
2860
Chandler Carruthc0c04552012-04-08 16:40:35 +00002861 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2862 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002863 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002864 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002865 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002866 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002867 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002868
Chandler Carruth76a943b2012-11-19 03:52:03 +00002869 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2870 // This is a very special mode. It trumps the other modes, almost no one
2871 // uses it, and it isn't even valid on any OS but Darwin.
2872 if (!getToolChain().getTriple().isOSDarwin())
2873 D.Diag(diag::err_drv_unsupported_opt_for_target)
2874 << A->getSpelling() << getToolChain().getTriple().str();
2875
2876 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2877
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002878 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002879 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002880
Chandler Carruth76a943b2012-11-19 03:52:03 +00002881 // Only a forced PIC mode can cause the actual compile to have PIC defines
2882 // etc., no flags are sufficient. This behavior was selected to closely
2883 // match that of llvm-gcc and Apple GCC before that.
2884 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2885 CmdArgs.push_back("-pic-level");
2886 CmdArgs.push_back("2");
2887 }
2888 } else {
2889 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2890 // handled in Clang's IRGen by the -pie-level flag.
2891 CmdArgs.push_back("-mrelocation-model");
2892 CmdArgs.push_back(PIC ? "pic" : "static");
2893
2894 if (PIC) {
2895 CmdArgs.push_back("-pic-level");
2896 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2897 if (PIE) {
2898 CmdArgs.push_back("-pie-level");
2899 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2900 }
2901 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002902 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002903
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002904 CmdArgs.push_back("-mthread-model");
2905 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2906 CmdArgs.push_back(A->getValue());
2907 else
2908 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2909
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002910 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2911
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002912 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2913 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002914 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002915
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002916 // LLVM Code Generator Options.
2917
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002918 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2919 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2920 for (arg_iterator
2921 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2922 options::OPT_frewrite_map_file_EQ),
2923 MFE = Args.filtered_end();
2924 MFI != MFE; ++MFI) {
2925 CmdArgs.push_back("-frewrite-map-file");
2926 CmdArgs.push_back((*MFI)->getValue());
2927 (*MFI)->claim();
2928 }
2929 }
2930
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002931 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2932 StringRef v = A->getValue();
2933 CmdArgs.push_back("-mllvm");
2934 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2935 A->claim();
2936 }
2937
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002938 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2939 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002940 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002941 }
2942
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002943 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2944 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002945 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002946 D.Diag(diag::err_drv_unsupported_opt_for_target)
2947 << A->getSpelling() << getToolChain().getTriple().str();
2948 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2949 CmdArgs.push_back("-fpcc-struct-return");
2950 } else {
2951 assert(A->getOption().matches(options::OPT_freg_struct_return));
2952 CmdArgs.push_back("-freg-struct-return");
2953 }
2954 }
2955
Roman Divacky65b88cd2011-03-01 17:40:53 +00002956 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2957 CmdArgs.push_back("-mrtd");
2958
Rafael Espindola224dd632011-12-14 21:02:23 +00002959 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002960 CmdArgs.push_back("-mdisable-fp-elim");
2961 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2962 options::OPT_fno_zero_initialized_in_bss))
2963 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002964
2965 bool OFastEnabled = isOptimizationLevelFast(Args);
2966 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2967 // enabled. This alias option is being used to simplify the hasFlag logic.
2968 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2969 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002970 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2971 // doesn't do any TBAA.
2972 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002973 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002974 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002975 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002976 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2977 options::OPT_fno_struct_path_tbaa))
2978 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002979 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2980 false))
2981 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002982 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2983 options::OPT_fno_optimize_sibling_calls))
2984 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002985
Eric Christopher006208c2013-04-04 06:29:47 +00002986 // Handle segmented stacks.
2987 if (Args.hasArg(options::OPT_fsplit_stack))
2988 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002989
2990 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2991 // This alias option is being used to simplify the getLastArg logic.
2992 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2993 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002994
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002995 // Handle various floating point optimization flags, mapping them to the
2996 // appropriate LLVM code generation flags. The pattern for all of these is to
2997 // default off the codegen optimizations, and if any flag enables them and no
2998 // flag disables them after the flag enabling them, enable the codegen
2999 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003000 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003001 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003002 options::OPT_ffinite_math_only,
3003 options::OPT_fno_finite_math_only,
3004 options::OPT_fhonor_infinities,
3005 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003006 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3007 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003008 A->getOption().getID() != options::OPT_fhonor_infinities)
3009 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003010 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003011 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003012 options::OPT_ffinite_math_only,
3013 options::OPT_fno_finite_math_only,
3014 options::OPT_fhonor_nans,
3015 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003016 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3017 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003018 A->getOption().getID() != options::OPT_fhonor_nans)
3019 CmdArgs.push_back("-menable-no-nans");
3020
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003021 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3022 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003023 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003024 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003025 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003026 options::OPT_fno_math_errno)) {
3027 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3028 // However, turning *off* -ffast_math merely restores the toolchain default
3029 // (which may be false).
3030 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3031 A->getOption().getID() == options::OPT_ffast_math ||
3032 A->getOption().getID() == options::OPT_Ofast)
3033 MathErrno = false;
3034 else if (A->getOption().getID() == options::OPT_fmath_errno)
3035 MathErrno = true;
3036 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003037 if (MathErrno)
3038 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003039
3040 // There are several flags which require disabling very specific
3041 // optimizations. Any of these being disabled forces us to turn off the
3042 // entire set of LLVM optimizations, so collect them through all the flag
3043 // madness.
3044 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003045 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003046 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003047 options::OPT_funsafe_math_optimizations,
3048 options::OPT_fno_unsafe_math_optimizations,
3049 options::OPT_fassociative_math,
3050 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003051 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3052 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003053 A->getOption().getID() != options::OPT_fno_associative_math)
3054 AssociativeMath = true;
3055 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003056 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003057 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003058 options::OPT_funsafe_math_optimizations,
3059 options::OPT_fno_unsafe_math_optimizations,
3060 options::OPT_freciprocal_math,
3061 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003062 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3063 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003064 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3065 ReciprocalMath = true;
3066 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003067 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003068 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003069 options::OPT_funsafe_math_optimizations,
3070 options::OPT_fno_unsafe_math_optimizations,
3071 options::OPT_fsigned_zeros,
3072 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003073 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3074 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003075 A->getOption().getID() != options::OPT_fsigned_zeros)
3076 SignedZeros = false;
3077 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003078 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003079 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003080 options::OPT_funsafe_math_optimizations,
3081 options::OPT_fno_unsafe_math_optimizations,
3082 options::OPT_ftrapping_math,
3083 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003084 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3085 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003086 A->getOption().getID() != options::OPT_ftrapping_math)
3087 TrappingMath = false;
3088 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3089 !TrappingMath)
3090 CmdArgs.push_back("-menable-unsafe-fp-math");
3091
Sanjay Patel76c9e092015-01-23 16:40:50 +00003092 if (!SignedZeros)
3093 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003094
Sanjay Patel359b1052015-04-09 15:03:23 +00003095 if (ReciprocalMath)
3096 CmdArgs.push_back("-freciprocal-math");
3097
Lang Hamesaa53b932012-07-06 00:59:19 +00003098 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003099 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003100 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003101 options::OPT_ffp_contract)) {
3102 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003103 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003104 if (Val == "fast" || Val == "on" || Val == "off") {
3105 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3106 } else {
3107 D.Diag(diag::err_drv_unsupported_option_argument)
3108 << A->getOption().getName() << Val;
3109 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003110 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3111 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003112 // If fast-math is set then set the fp-contract mode to fast.
3113 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3114 }
3115 }
3116
Bob Wilson6a039162012-07-19 03:52:53 +00003117 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3118 // and if we find them, tell the frontend to provide the appropriate
3119 // preprocessor macros. This is distinct from enabling any optimizations as
3120 // these options induce language changes which must survive serialization
3121 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003122 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3123 options::OPT_fno_fast_math))
3124 if (!A->getOption().matches(options::OPT_fno_fast_math))
3125 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003126 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3127 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003128 if (A->getOption().matches(options::OPT_ffinite_math_only))
3129 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003130
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003131 // Decide whether to use verbose asm. Verbose assembly is the default on
3132 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003133 bool IsIntegratedAssemblerDefault =
3134 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003135 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003136 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003137 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003138 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003139
Rafael Espindola298059a2015-04-06 04:36:45 +00003140 bool UsingIntegratedAssembler =
3141 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3142 IsIntegratedAssemblerDefault);
3143 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003144 CmdArgs.push_back("-no-integrated-as");
3145
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003146 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3147 CmdArgs.push_back("-mdebug-pass");
3148 CmdArgs.push_back("Structure");
3149 }
3150 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3151 CmdArgs.push_back("-mdebug-pass");
3152 CmdArgs.push_back("Arguments");
3153 }
3154
John McCall8517abc2010-02-19 02:45:38 +00003155 // Enable -mconstructor-aliases except on darwin, where we have to
3156 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003157 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003158 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003159
John McCall7ef5cb32011-03-18 02:56:14 +00003160 // Darwin's kernel doesn't support guard variables; just die if we
3161 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003162 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003163 CmdArgs.push_back("-fforbid-guard-variables");
3164
Douglas Gregordbe39272011-02-01 15:15:22 +00003165 if (Args.hasArg(options::OPT_mms_bitfields)) {
3166 CmdArgs.push_back("-mms-bitfields");
3167 }
John McCall8517abc2010-02-19 02:45:38 +00003168
Daniel Dunbar306945d2009-09-16 06:17:29 +00003169 // This is a coarse approximation of what llvm-gcc actually does, both
3170 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3171 // complicated ways.
3172 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003173 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3174 options::OPT_fno_asynchronous_unwind_tables,
3175 (getToolChain().IsUnwindTablesDefault() ||
3176 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3177 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003178 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3179 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003180 CmdArgs.push_back("-munwind-tables");
3181
Chandler Carruth05fb5852012-11-21 23:40:23 +00003182 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003183
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003184 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3185 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003186 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003187 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003188
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003189 // FIXME: Handle -mtune=.
3190 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003191
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003192 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003193 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003194 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003195 }
3196
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003197 // Add the target cpu
3198 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3199 llvm::Triple ETriple(ETripleStr);
3200 std::string CPU = getCPUName(Args, ETriple);
3201 if (!CPU.empty()) {
3202 CmdArgs.push_back("-target-cpu");
3203 CmdArgs.push_back(Args.MakeArgString(CPU));
3204 }
3205
Rafael Espindolaeb265472013-08-21 21:59:03 +00003206 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3207 CmdArgs.push_back("-mfpmath");
3208 CmdArgs.push_back(A->getValue());
3209 }
3210
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003211 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003212 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003213
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003214 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003215 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003216 default:
3217 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003218
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003219 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003220 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003221 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003222 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003223 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003224 break;
3225
Tim Northover573cbee2014-05-24 12:52:07 +00003226 case llvm::Triple::aarch64:
3227 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003228 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003229 break;
3230
Eric Christopher0b26a612010-03-02 02:41:08 +00003231 case llvm::Triple::mips:
3232 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003233 case llvm::Triple::mips64:
3234 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003235 AddMIPSTargetArgs(Args, CmdArgs);
3236 break;
3237
Ulrich Weigand8afad612014-07-28 13:17:52 +00003238 case llvm::Triple::ppc:
3239 case llvm::Triple::ppc64:
3240 case llvm::Triple::ppc64le:
3241 AddPPCTargetArgs(Args, CmdArgs);
3242 break;
3243
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003244 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003245 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003246 AddSparcTargetArgs(Args, CmdArgs);
3247 break;
3248
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003249 case llvm::Triple::x86:
3250 case llvm::Triple::x86_64:
3251 AddX86TargetArgs(Args, CmdArgs);
3252 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003253
3254 case llvm::Triple::hexagon:
3255 AddHexagonTargetArgs(Args, CmdArgs);
3256 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003257 }
3258
Hans Wennborg75958c42013-08-08 00:17:41 +00003259 // Add clang-cl arguments.
3260 if (getToolChain().getDriver().IsCLMode())
3261 AddClangCLArgs(Args, CmdArgs);
3262
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003263 // Pass the linker version in use.
3264 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3265 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003266 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003267 }
3268
Eric Christopherb7d97e92013-04-03 01:58:53 +00003269 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003270 CmdArgs.push_back("-momit-leaf-frame-pointer");
3271
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003272 // Explicitly error on some things we know we don't support and can't just
3273 // ignore.
3274 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003275 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3276 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003277 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003278 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003279 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003280 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3281 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003282 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003283 << Unsupported->getOption().getName();
3284 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003285 }
3286
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003287 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003288 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003289 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003290 CmdArgs.push_back("-header-include-file");
3291 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3292 D.CCPrintHeadersFilename : "-");
3293 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003294 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003295 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003296
Chad Rosierbe10f982011-08-02 17:58:04 +00003297 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003298 CmdArgs.push_back("-diagnostic-log-file");
3299 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3300 D.CCLogDiagnosticsFilename : "-");
3301 }
3302
Manman Ren17bdb0f2013-11-20 20:22:14 +00003303 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3304 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003305 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003306 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003307 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3308 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003309 // FIXME: we should support specifying dwarf version with
3310 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003311 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003312 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003313 const llvm::Triple &Triple = getToolChain().getTriple();
3314 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003315 Triple.getOS() == llvm::Triple::FreeBSD ||
3316 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003317 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003318 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003319 CmdArgs.push_back("-gdwarf-2");
3320 else if (A->getOption().matches(options::OPT_gdwarf_3))
3321 CmdArgs.push_back("-gdwarf-3");
3322 else if (A->getOption().matches(options::OPT_gdwarf_4))
3323 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003324 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003325 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003326 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003327 const llvm::Triple &Triple = getToolChain().getTriple();
3328 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003329 Triple.getOS() == llvm::Triple::FreeBSD ||
3330 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003331 CmdArgs.push_back("-gdwarf-2");
3332 else
3333 CmdArgs.push_back("-g");
3334 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003335 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003336
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003337 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3338 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003339 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3340 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003341 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003342
Eric Christopher138c32b2013-09-13 22:37:55 +00003343 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003344 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3345 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003346 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003347 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003348 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003349 CmdArgs.push_back("-g");
3350 CmdArgs.push_back("-backend-option");
3351 CmdArgs.push_back("-split-dwarf=Enable");
3352 }
3353
Eric Christopher138c32b2013-09-13 22:37:55 +00003354 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3355 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3356 CmdArgs.push_back("-backend-option");
3357 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3358 }
Eric Christophereec89c22013-06-18 00:03:50 +00003359
Eric Christopher0d403d22014-02-14 01:27:03 +00003360 // -gdwarf-aranges turns on the emission of the aranges section in the
3361 // backend.
3362 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3363 CmdArgs.push_back("-backend-option");
3364 CmdArgs.push_back("-generate-arange-section");
3365 }
3366
David Blaikief36d9ba2014-01-27 18:52:43 +00003367 if (Args.hasFlag(options::OPT_fdebug_types_section,
3368 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003369 CmdArgs.push_back("-backend-option");
3370 CmdArgs.push_back("-generate-type-units");
3371 }
Eric Christophereec89c22013-06-18 00:03:50 +00003372
Ed Schouten6e576152015-03-26 17:50:28 +00003373 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3374 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3375
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003376 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003377 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003378 CmdArgs.push_back("-ffunction-sections");
3379 }
3380
3381 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003382 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003383 CmdArgs.push_back("-fdata-sections");
3384 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003385
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003386 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003387 options::OPT_fno_unique_section_names,
3388 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003389 CmdArgs.push_back("-fno-unique-section-names");
3390
Chris Lattner3c77a352010-06-22 00:03:40 +00003391 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3392
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003393 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3394 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3395 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3396 D.Diag(diag::err_drv_argument_not_allowed_with)
3397 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3398
3399 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3400
3401 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3402 A->render(Args, CmdArgs);
3403 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3404 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3405
Nick Lewycky207bce32011-04-21 23:44:07 +00003406 if (Args.hasArg(options::OPT_ftest_coverage) ||
3407 Args.hasArg(options::OPT_coverage))
3408 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003409 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3410 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003411 Args.hasArg(options::OPT_coverage))
3412 CmdArgs.push_back("-femit-coverage-data");
3413
Alex Lorenzee024992014-08-04 18:41:51 +00003414 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3415 !Args.hasArg(options::OPT_fprofile_instr_generate))
3416 D.Diag(diag::err_drv_argument_only_allowed_with)
3417 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3418
3419 if (Args.hasArg(options::OPT_fcoverage_mapping))
3420 CmdArgs.push_back("-fcoverage-mapping");
3421
Nick Lewycky480cb992011-05-04 20:46:58 +00003422 if (C.getArgs().hasArg(options::OPT_c) ||
3423 C.getArgs().hasArg(options::OPT_S)) {
3424 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003425 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003426 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003427 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003428 CoverageFilename = FinalOutput->getValue();
3429 } else {
3430 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3431 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003432 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003433 SmallString<128> Pwd;
3434 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003435 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003436 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003437 }
3438 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003439 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003440 }
3441 }
3442
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003443 // Pass options for controlling the default header search paths.
3444 if (Args.hasArg(options::OPT_nostdinc)) {
3445 CmdArgs.push_back("-nostdsysteminc");
3446 CmdArgs.push_back("-nobuiltininc");
3447 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003448 if (Args.hasArg(options::OPT_nostdlibinc))
3449 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003450 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3451 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3452 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003453
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003454 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003455 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003456 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003457
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003458 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3459
Ted Kremenekf7639e12012-03-06 20:06:33 +00003460 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003461 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003462 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003463 options::OPT_ccc_arcmt_modify,
3464 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003465 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003466 switch (A->getOption().getID()) {
3467 default:
3468 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003469 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003470 CmdArgs.push_back("-arcmt-check");
3471 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003472 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003473 CmdArgs.push_back("-arcmt-modify");
3474 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003475 case options::OPT_ccc_arcmt_migrate:
3476 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003477 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003478 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003479
3480 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3481 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003482 break;
John McCalld70fb982011-06-15 23:25:17 +00003483 }
3484 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003485 } else {
3486 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3487 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3488 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003489 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003490
Ted Kremenekf7639e12012-03-06 20:06:33 +00003491 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3492 if (ARCMTEnabled) {
3493 D.Diag(diag::err_drv_argument_not_allowed_with)
3494 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3495 }
3496 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003497 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003498
3499 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003500 options::OPT_objcmt_migrate_subscripting,
3501 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003502 // None specified, means enable them all.
3503 CmdArgs.push_back("-objcmt-migrate-literals");
3504 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003505 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003506 } else {
3507 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3508 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003509 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003510 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003511 } else {
3512 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3513 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3517 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003518 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3523 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3524 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003528 }
3529
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003530 // Add preprocessing options like -I, -D, etc. if we are using the
3531 // preprocessor.
3532 //
3533 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003534 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003535 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003536
Rafael Espindolaa7431922011-07-21 23:40:37 +00003537 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3538 // that "The compiler can only warn and ignore the option if not recognized".
3539 // When building with ccache, it will pass -D options to clang even on
3540 // preprocessed inputs and configure concludes that -fPIC is not supported.
3541 Args.ClaimAllArgs(options::OPT_D);
3542
Alp Toker7874bdc2013-11-15 20:40:58 +00003543 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003544 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3545 if (A->getOption().matches(options::OPT_O4)) {
3546 CmdArgs.push_back("-O3");
3547 D.Diag(diag::warn_O4_is_O3);
3548 } else {
3549 A->render(Args, CmdArgs);
3550 }
3551 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003552
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003553 // Warn about ignored options to clang.
3554 for (arg_iterator it = Args.filtered_begin(
3555 options::OPT_clang_ignored_gcc_optimization_f_Group),
3556 ie = Args.filtered_end(); it != ie; ++it) {
3557 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3558 }
3559
Rafael Espindola577637a2015-01-03 00:06:04 +00003560 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003561
Richard Smith3be1cb22014-08-07 00:24:21 +00003562 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003563 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003564 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3565 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003566 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003567 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003568
3569 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003570 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003571 //
3572 // If a std is supplied, only add -trigraphs if it follows the
3573 // option.
3574 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3575 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003576 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003577 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003578 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003579 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003580 else
3581 Std->render(Args, CmdArgs);
3582
Nico Weber00721502014-12-23 22:32:37 +00003583 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003584 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003585 options::OPT_ftrigraphs,
3586 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003587 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003588 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003589 } else {
3590 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003591 //
3592 // FIXME: Clang doesn't correctly handle -std= when the input language
3593 // doesn't match. For the time being just ignore this for C++ inputs;
3594 // eventually we want to do all the standard defaulting here instead of
3595 // splitting it between the driver and clang -cc1.
3596 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003597 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3598 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003599 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003600 CmdArgs.push_back("-std=c++11");
3601
Nico Weber00721502014-12-23 22:32:37 +00003602 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3603 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003604 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003605
Richard Smith282b4492013-09-04 22:50:31 +00003606 // GCC's behavior for -Wwrite-strings is a bit strange:
3607 // * In C, this "warning flag" changes the types of string literals from
3608 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3609 // for the discarded qualifier.
3610 // * In C++, this is just a normal warning flag.
3611 //
3612 // Implementing this warning correctly in C is hard, so we follow GCC's
3613 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3614 // a non-const char* in C, rather than using this crude hack.
3615 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003616 // FIXME: This should behave just like a warning flag, and thus should also
3617 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3618 Arg *WriteStrings =
3619 Args.getLastArg(options::OPT_Wwrite_strings,
3620 options::OPT_Wno_write_strings, options::OPT_w);
3621 if (WriteStrings &&
3622 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003623 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003624 }
3625
Chandler Carruth61fbf622011-04-23 09:27:53 +00003626 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003627 // during C++ compilation, which it is by default. GCC keeps this define even
3628 // in the presence of '-w', match this behavior bug-for-bug.
3629 if (types::isCXX(InputType) &&
3630 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3631 true)) {
3632 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003633 }
3634
Chandler Carruthe0391482010-05-22 02:21:53 +00003635 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3636 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3637 if (Asm->getOption().matches(options::OPT_fasm))
3638 CmdArgs.push_back("-fgnu-keywords");
3639 else
3640 CmdArgs.push_back("-fno-gnu-keywords");
3641 }
3642
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003643 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3644 CmdArgs.push_back("-fno-dwarf-directory-asm");
3645
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003646 if (ShouldDisableAutolink(Args, getToolChain()))
3647 CmdArgs.push_back("-fno-autolink");
3648
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003649 // Add in -fdebug-compilation-dir if necessary.
3650 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003651
Richard Smith9a568822011-11-21 19:36:32 +00003652 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3653 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003654 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003655 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003656 }
3657
Richard Smith79c927b2013-11-06 19:31:51 +00003658 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3659 CmdArgs.push_back("-foperator-arrow-depth");
3660 CmdArgs.push_back(A->getValue());
3661 }
3662
Richard Smith9a568822011-11-21 19:36:32 +00003663 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3664 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003665 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003666 }
3667
Richard Smitha3d3bd22013-05-08 02:12:03 +00003668 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3669 CmdArgs.push_back("-fconstexpr-steps");
3670 CmdArgs.push_back(A->getValue());
3671 }
3672
Richard Smithb3a14522013-02-22 01:59:51 +00003673 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3674 CmdArgs.push_back("-fbracket-depth");
3675 CmdArgs.push_back(A->getValue());
3676 }
3677
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003678 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3679 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003680 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003681 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003682 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3683 } else
3684 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003685 }
3686
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003687
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003688 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003689 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003690
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003691 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3692 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003693 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003694 }
David Chisnall5778fce2009-08-31 16:41:57 +00003695
Chris Lattnere23003d2010-01-09 21:54:33 +00003696 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3697 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003698 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003699 }
3700
Chris Lattnerb35583d2010-04-07 20:49:23 +00003701 CmdArgs.push_back("-ferror-limit");
3702 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003703 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003704 else
3705 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003706
Chandler Carrutha77a7272010-05-06 04:55:18 +00003707 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3708 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003709 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003710 }
3711
3712 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3713 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003714 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003715 }
3716
Richard Smithf6f003a2011-12-16 19:06:07 +00003717 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3718 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003719 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003720 }
3721
Nick Lewycky24653262014-12-16 21:39:02 +00003722 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3723 CmdArgs.push_back("-fspell-checking-limit");
3724 CmdArgs.push_back(A->getValue());
3725 }
3726
Daniel Dunbar2c978472009-11-04 06:24:47 +00003727 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003728 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003729 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003730 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003731 } else {
3732 // If -fmessage-length=N was not specified, determine whether this is a
3733 // terminal and, if so, implicitly define -fmessage-length appropriately.
3734 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003735 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003736 }
3737
John McCallb4a99d32013-02-19 01:57:35 +00003738 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3739 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3740 options::OPT_fvisibility_ms_compat)) {
3741 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3742 CmdArgs.push_back("-fvisibility");
3743 CmdArgs.push_back(A->getValue());
3744 } else {
3745 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3746 CmdArgs.push_back("-fvisibility");
3747 CmdArgs.push_back("hidden");
3748 CmdArgs.push_back("-ftype-visibility");
3749 CmdArgs.push_back("default");
3750 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003751 }
3752
Douglas Gregor08329632010-06-15 17:05:35 +00003753 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003754
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003755 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3756
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003757 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003758 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3759 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003760 CmdArgs.push_back("-ffreestanding");
3761
Daniel Dunbare357d562009-12-03 18:42:11 +00003762 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003763 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003764 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003765 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3766 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003767 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003768 // AltiVec language extensions aren't relevant for assembling.
3769 if (!isa<PreprocessJobAction>(JA) ||
3770 Output.getType() != types::TY_PP_Asm)
3771 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003772 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3773 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003774
Peter Collingbourne32701642013-11-01 18:16:25 +00003775 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3776 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003777
Eric Christopher459d2712013-02-19 06:16:53 +00003778 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003779 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003780 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003781 getToolChain().getArch() == llvm::Triple::ppc64 ||
3782 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003783 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003784 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003785
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003786 if (getToolChain().SupportsProfiling())
3787 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003788
3789 // -flax-vector-conversions is default.
3790 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3791 options::OPT_fno_lax_vector_conversions))
3792 CmdArgs.push_back("-fno-lax-vector-conversions");
3793
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003794 if (Args.getLastArg(options::OPT_fapple_kext))
3795 CmdArgs.push_back("-fapple-kext");
3796
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003797 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003798 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003799 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003800 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3801 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003802
3803 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3804 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003805 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003806 }
3807
Bob Wilson14adb362012-02-03 06:27:22 +00003808 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003809
Chandler Carruth6e501032011-03-27 00:04:55 +00003810 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3811 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3812 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3813 options::OPT_fno_wrapv)) {
3814 if (A->getOption().matches(options::OPT_fwrapv))
3815 CmdArgs.push_back("-fwrapv");
3816 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3817 options::OPT_fno_strict_overflow)) {
3818 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3819 CmdArgs.push_back("-fwrapv");
3820 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003821
3822 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3823 options::OPT_fno_reroll_loops))
3824 if (A->getOption().matches(options::OPT_freroll_loops))
3825 CmdArgs.push_back("-freroll-loops");
3826
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003827 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003828 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3829 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003830
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003831 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3832
Mahesha S6a682be42012-10-27 07:47:56 +00003833
Daniel Dunbar4930e332009-11-17 08:07:36 +00003834 // -stack-protector=0 is default.
3835 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003836 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3837 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003838 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003839 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003840 if (A->getOption().matches(options::OPT_fstack_protector)) {
3841 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3842 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3843 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003844 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003845 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003846 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003847 } else {
3848 StackProtectorLevel =
3849 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3850 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003851 if (StackProtectorLevel) {
3852 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003853 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003854 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003855
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003856 // --param ssp-buffer-size=
3857 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3858 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003859 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003860 if (Str.startswith("ssp-buffer-size=")) {
3861 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003862 CmdArgs.push_back("-stack-protector-buffer-size");
3863 // FIXME: Verify the argument is a valid integer.
3864 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003865 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003866 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003867 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003868 }
3869
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003870 // Translate -mstackrealign
3871 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3872 false)) {
3873 CmdArgs.push_back("-backend-option");
3874 CmdArgs.push_back("-force-align-stack");
3875 }
3876 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3877 false)) {
3878 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3879 }
3880
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003881 if (Args.hasArg(options::OPT_mstack_alignment)) {
3882 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3883 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003884 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003885
Hans Wennborg77dc2362015-01-20 19:45:50 +00003886 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3887 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3888
3889 if (!Size.empty())
3890 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3891 else
3892 CmdArgs.push_back("-mstack-probe-size=0");
3893 }
3894
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003895 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3896 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3897 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3898
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003899 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3900 options::OPT_mno_restrict_it)) {
3901 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3902 CmdArgs.push_back("-backend-option");
3903 CmdArgs.push_back("-arm-restrict-it");
3904 } else {
3905 CmdArgs.push_back("-backend-option");
3906 CmdArgs.push_back("-arm-no-restrict-it");
3907 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003908 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3909 TT.getArch() == llvm::Triple::thumb)) {
3910 // Windows on ARM expects restricted IT blocks
3911 CmdArgs.push_back("-backend-option");
3912 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003913 }
3914
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003915 if (TT.getArch() == llvm::Triple::arm ||
3916 TT.getArch() == llvm::Triple::thumb) {
3917 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3918 options::OPT_mno_long_calls)) {
3919 if (A->getOption().matches(options::OPT_mlong_calls)) {
3920 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003921 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003922 }
3923 }
3924 }
3925
Daniel Dunbard18049a2009-04-07 21:16:11 +00003926 // Forward -f options with positive and negative forms; we translate
3927 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003928 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3929 StringRef fname = A->getValue();
3930 if (!llvm::sys::fs::exists(fname))
3931 D.Diag(diag::err_drv_no_such_file) << fname;
3932 else
3933 A->render(Args, CmdArgs);
3934 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003935
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003936 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003937 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003938 CmdArgs.push_back("-fapple-kext");
3939 if (!Args.hasArg(options::OPT_fbuiltin))
3940 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003941 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003942 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003943 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003944 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003945 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003946
Nuno Lopes13c88c72009-12-16 16:59:22 +00003947 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3948 options::OPT_fno_assume_sane_operator_new))
3949 CmdArgs.push_back("-fno-assume-sane-operator-new");
3950
Daniel Dunbar4930e332009-11-17 08:07:36 +00003951 // -fblocks=0 is default.
3952 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003953 getToolChain().IsBlocksDefault()) ||
3954 (Args.hasArg(options::OPT_fgnu_runtime) &&
3955 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3956 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003957 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003958
3959 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3960 !getToolChain().hasBlocksRuntime())
3961 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003962 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003963
Richard Smithffb65082014-09-30 23:10:19 +00003964 // -fmodules enables modules (off by default).
3965 // Users can pass -fno-cxx-modules to turn off modules support for
3966 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003967 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003968 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3969 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3970 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003971 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003972 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003973 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003974 HaveModules = true;
3975 }
3976 }
3977
Daniel Jasper07e6c402013-08-05 20:26:17 +00003978 // -fmodule-maps enables module map processing (off by default) for header
3979 // checking. It is implied by -fmodules.
3980 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3981 false)) {
3982 CmdArgs.push_back("-fmodule-maps");
3983 }
3984
Daniel Jasperac42b752013-10-21 06:34:34 +00003985 // -fmodules-decluse checks that modules used are declared so (off by
3986 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003987 if (Args.hasFlag(options::OPT_fmodules_decluse,
3988 options::OPT_fno_modules_decluse,
3989 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003990 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003991 }
3992
Daniel Jasper962b38e2014-04-11 11:47:45 +00003993 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3994 // all #included headers are part of modules.
3995 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3996 options::OPT_fno_modules_strict_decluse,
3997 false)) {
3998 CmdArgs.push_back("-fmodules-strict-decluse");
3999 }
4000
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004001 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4002 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4003 options::OPT_fno_implicit_modules)) {
4004 CmdArgs.push_back("-fno-implicit-modules");
4005 }
4006
Daniel Jasperac42b752013-10-21 06:34:34 +00004007 // -fmodule-name specifies the module that is currently being built (or
4008 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004009 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004010
Richard Smith9887d792014-10-17 01:42:53 +00004011 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004012 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004013 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004014
Richard Smithe842a472014-10-22 02:05:46 +00004015 // -fmodule-file can be used to specify files containing precompiled modules.
4016 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4017
4018 // -fmodule-cache-path specifies where our implicitly-built module files
4019 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004020 SmallString<128> ModuleCachePath;
4021 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4022 ModuleCachePath = A->getValue();
4023 if (HaveModules) {
4024 if (C.isForDiagnostics()) {
4025 // When generating crash reports, we want to emit the modules along with
4026 // the reproduction sources, so we ignore any provided module path.
4027 ModuleCachePath = Output.getFilename();
4028 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4029 llvm::sys::path::append(ModuleCachePath, "modules");
4030 } else if (ModuleCachePath.empty()) {
4031 // No module path was provided: use the default.
4032 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4033 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004034 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4035 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004036 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4037 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004038 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004039 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4040 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4041 }
4042
4043 // When building modules and generating crashdumps, we need to dump a module
4044 // dependency VFS alongside the output.
4045 if (HaveModules && C.isForDiagnostics()) {
4046 SmallString<128> VFSDir(Output.getFilename());
4047 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004048 // Add the cache directory as a temp so the crash diagnostics pick it up.
4049 C.addTempFile(Args.MakeArgString(VFSDir));
4050
Justin Bognera88f0122014-06-20 22:59:50 +00004051 llvm::sys::path::append(VFSDir, "vfs");
4052 CmdArgs.push_back("-module-dependency-dir");
4053 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004054 }
4055
Richard Smith9887d792014-10-17 01:42:53 +00004056 if (HaveModules)
4057 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004058
Douglas Gregor35b04d62013-02-07 19:01:24 +00004059 // Pass through all -fmodules-ignore-macro arguments.
4060 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004061 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4062 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004063
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004064 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4065
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004066 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4067 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4068 D.Diag(diag::err_drv_argument_not_allowed_with)
4069 << A->getAsString(Args) << "-fbuild-session-timestamp";
4070
4071 llvm::sys::fs::file_status Status;
4072 if (llvm::sys::fs::status(A->getValue(), Status))
4073 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004074 CmdArgs.push_back(Args.MakeArgString(
4075 "-fbuild-session-timestamp=" +
4076 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004077 }
4078
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004079 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004080 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4081 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004082 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4083
4084 Args.AddLastArg(CmdArgs,
4085 options::OPT_fmodules_validate_once_per_build_session);
4086 }
4087
Ben Langmuirdcf73862014-03-12 00:06:17 +00004088 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4089
John McCalldfea9982010-04-09 19:12:06 +00004090 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004091 if (Args.hasFlag(options::OPT_fno_access_control,
4092 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004093 false))
John McCall3155f572010-04-09 19:03:51 +00004094 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004095
Anders Carlssond470fef2010-11-21 00:09:52 +00004096 // -felide-constructors is the default.
4097 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4098 options::OPT_felide_constructors,
4099 false))
4100 CmdArgs.push_back("-fno-elide-constructors");
4101
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004102 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004103
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004104 if (KernelOrKext || (types::isCXX(InputType) &&
4105 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4106 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004107 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004108
Tony Linthicum76329bf2011-12-12 21:14:55 +00004109 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004110 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004111 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004112 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004113 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004114 CmdArgs.push_back("-fshort-enums");
4115
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004116 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004117 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004118 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004119 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004120
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004121 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004122 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4123 options::OPT_fno_use_cxa_atexit,
4124 !IsWindowsCygnus && !IsWindowsGNU &&
4125 getToolChain().getArch() != llvm::Triple::hexagon &&
4126 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004127 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004128 CmdArgs.push_back("-fno-use-cxa-atexit");
4129
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004130 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004131 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004132 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004133 CmdArgs.push_back("-fms-extensions");
4134
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004135 // -fno-use-line-directives is default.
4136 if (Args.hasFlag(options::OPT_fuse_line_directives,
4137 options::OPT_fno_use_line_directives, false))
4138 CmdArgs.push_back("-fuse-line-directives");
4139
Francois Pichet1b4f1632011-09-17 04:32:15 +00004140 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004141 if (Args.hasFlag(options::OPT_fms_compatibility,
4142 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004143 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4144 options::OPT_fno_ms_extensions,
4145 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004146 CmdArgs.push_back("-fms-compatibility");
4147
David Majnemerc371ff02015-03-22 08:39:22 +00004148 // -fms-compatibility-version=18.00 is default.
4149 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004150 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004151 IsWindowsMSVC) ||
4152 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004153 Args.hasArg(options::OPT_fms_compatibility_version)) {
4154 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4155 const Arg *MSCompatibilityVersion =
4156 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004157
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004158 if (MSCVersion && MSCompatibilityVersion)
4159 D.Diag(diag::err_drv_argument_not_allowed_with)
4160 << MSCVersion->getAsString(Args)
4161 << MSCompatibilityVersion->getAsString(Args);
4162
David Majnemerc371ff02015-03-22 08:39:22 +00004163 if (MSCompatibilityVersion) {
4164 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4165 D.Diag(diag::err_drv_invalid_value)
4166 << MSCompatibilityVersion->getAsString(Args)
4167 << MSCompatibilityVersion->getValue();
4168 } else if (MSCVersion) {
4169 unsigned Version = 0;
4170 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4171 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4172 << MSCVersion->getValue();
4173 MSVT = getMSCompatibilityVersion(Version);
4174 } else {
4175 MSVT = VersionTuple(18);
4176 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004177
David Majnemerc371ff02015-03-22 08:39:22 +00004178 CmdArgs.push_back(
4179 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004180 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004181
Eric Christopher5ecce122013-02-18 00:38:31 +00004182 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004183 if (Args.hasFlag(options::OPT_fborland_extensions,
4184 options::OPT_fno_borland_extensions, false))
4185 CmdArgs.push_back("-fborland-extensions");
4186
David Majnemerc371ff02015-03-22 08:39:22 +00004187 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4188 // than 19.
4189 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4190 options::OPT_fno_threadsafe_statics,
4191 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4192 CmdArgs.push_back("-fno-threadsafe-statics");
4193
Francois Pichet02744872011-09-01 16:38:08 +00004194 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4195 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004196 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004197 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004198 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004199
Chandler Carruthe03aa552010-04-17 20:17:31 +00004200 // -fgnu-keywords default varies depending on language; only pass if
4201 // specified.
4202 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004203 options::OPT_fno_gnu_keywords))
4204 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004205
Rafael Espindola922a6242011-06-02 17:30:53 +00004206 if (Args.hasFlag(options::OPT_fgnu89_inline,
4207 options::OPT_fno_gnu89_inline,
4208 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004209 CmdArgs.push_back("-fgnu89-inline");
4210
Chad Rosier9c76d242012-03-15 22:31:42 +00004211 if (Args.hasArg(options::OPT_fno_inline))
4212 CmdArgs.push_back("-fno-inline");
4213
Chad Rosier64d6be92012-03-06 21:17:19 +00004214 if (Args.hasArg(options::OPT_fno_inline_functions))
4215 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004216
John McCall5fb5df92012-06-20 06:18:46 +00004217 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004218
John McCall5fb5df92012-06-20 06:18:46 +00004219 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004220 // legacy is the default. Except for deployment taget of 10.5,
4221 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4222 // gets ignored silently.
4223 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004224 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4225 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004226 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004227 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004228 if (getToolChain().UseObjCMixedDispatch())
4229 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4230 else
4231 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4232 }
4233 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004234
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004235 // When ObjectiveC legacy runtime is in effect on MacOSX,
4236 // turn on the option to do Array/Dictionary subscripting
4237 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004238 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4239 getToolChain().getTriple().isMacOSX() &&
4240 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4241 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004242 objcRuntime.isNeXTFamily())
4243 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4244
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004245 // -fencode-extended-block-signature=1 is default.
4246 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4247 CmdArgs.push_back("-fencode-extended-block-signature");
4248 }
4249
John McCall24fc0de2011-07-06 00:26:06 +00004250 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4251 // NOTE: This logic is duplicated in ToolChains.cpp.
4252 bool ARC = isObjCAutoRefCount(Args);
4253 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004254 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004255
John McCall24fc0de2011-07-06 00:26:06 +00004256 CmdArgs.push_back("-fobjc-arc");
4257
Chandler Carruth491db322011-11-04 07:34:47 +00004258 // FIXME: It seems like this entire block, and several around it should be
4259 // wrapped in isObjC, but for now we just use it here as this is where it
4260 // was being used previously.
4261 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4262 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4263 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4264 else
4265 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4266 }
4267
John McCall24fc0de2011-07-06 00:26:06 +00004268 // Allow the user to enable full exceptions code emission.
4269 // We define off for Objective-CC, on for Objective-C++.
4270 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4271 options::OPT_fno_objc_arc_exceptions,
4272 /*default*/ types::isCXX(InputType)))
4273 CmdArgs.push_back("-fobjc-arc-exceptions");
4274 }
4275
4276 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4277 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004278 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004279 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004280
John McCall24fc0de2011-07-06 00:26:06 +00004281 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4282 // takes precedence.
4283 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4284 if (!GCArg)
4285 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4286 if (GCArg) {
4287 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004288 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004289 << GCArg->getAsString(Args);
4290 } else if (getToolChain().SupportsObjCGC()) {
4291 GCArg->render(Args, CmdArgs);
4292 } else {
4293 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004294 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004295 << GCArg->getAsString(Args);
4296 }
4297 }
4298
Bob Wilsonb111ec92015-03-02 19:01:14 +00004299 if (Args.hasFlag(options::OPT_fapplication_extension,
4300 options::OPT_fno_application_extension, false))
4301 CmdArgs.push_back("-fapplication-extension");
4302
Reid Klecknerc542d372014-06-27 17:02:02 +00004303 // Handle GCC-style exception args.
4304 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004305 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004306 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004307
4308 if (getToolChain().UseSjLjExceptions())
4309 CmdArgs.push_back("-fsjlj-exceptions");
4310
4311 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004312 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4313 options::OPT_fno_assume_sane_operator_new))
4314 CmdArgs.push_back("-fno-assume-sane-operator-new");
4315
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004316 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4317 // most platforms.
4318 if (Args.hasFlag(options::OPT_fsized_deallocation,
4319 options::OPT_fno_sized_deallocation, false))
4320 CmdArgs.push_back("-fsized-deallocation");
4321
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004322 // -fconstant-cfstrings is default, and may be subject to argument translation
4323 // on Darwin.
4324 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4325 options::OPT_fno_constant_cfstrings) ||
4326 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4327 options::OPT_mno_constant_cfstrings))
4328 CmdArgs.push_back("-fno-constant-cfstrings");
4329
John Thompsoned4e2952009-11-05 20:14:16 +00004330 // -fshort-wchar default varies depending on platform; only
4331 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004332 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4333 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004334 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004335
Hans Wennborg28c96312013-07-31 23:39:13 +00004336 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004337 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004338 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004339 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004340 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004341
Daniel Dunbar096ed292011-10-05 21:04:55 +00004342 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4343 // -fno-pack-struct doesn't apply to -fpack-struct=.
4344 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004345 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004346 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004347 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004348 } else if (Args.hasFlag(options::OPT_fpack_struct,
4349 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004350 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004351 }
4352
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004353 // Handle -fmax-type-align=N and -fno-type-align
4354 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4355 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4356 if (!SkipMaxTypeAlign) {
4357 std::string MaxTypeAlignStr = "-fmax-type-align=";
4358 MaxTypeAlignStr += A->getValue();
4359 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4360 }
4361 } else if (getToolChain().getTriple().isOSDarwin()) {
4362 if (!SkipMaxTypeAlign) {
4363 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4364 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4365 }
4366 }
4367
Robert Lytton0e076492013-08-13 09:43:10 +00004368 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004369 if (!Args.hasArg(options::OPT_fcommon))
4370 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004371 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004372 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004373
Daniel Dunbard18049a2009-04-07 21:16:11 +00004374 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004375 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004376 CmdArgs.push_back("-fno-common");
4377
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004378 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004379 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004380 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004381 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004382 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004383 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4384
Daniel Dunbar6358d682010-10-15 22:30:42 +00004385 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4386 if (!Args.hasFlag(options::OPT_ffor_scope,
4387 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004388 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004389 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4390
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004391 // -finput_charset=UTF-8 is default. Reject others
4392 if (Arg *inputCharset = Args.getLastArg(
4393 options::OPT_finput_charset_EQ)) {
4394 StringRef value = inputCharset->getValue();
4395 if (value != "UTF-8")
4396 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4397 }
4398
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004399 // -fexec_charset=UTF-8 is default. Reject others
4400 if (Arg *execCharset = Args.getLastArg(
4401 options::OPT_fexec_charset_EQ)) {
4402 StringRef value = execCharset->getValue();
4403 if (value != "UTF-8")
4404 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4405 }
4406
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004407 // -fcaret-diagnostics is default.
4408 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4409 options::OPT_fno_caret_diagnostics, true))
4410 CmdArgs.push_back("-fno-caret-diagnostics");
4411
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004412 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004413 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004414 options::OPT_fno_diagnostics_fixit_info))
4415 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004416
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004417 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004418 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004419 options::OPT_fno_diagnostics_show_option))
4420 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004421
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004422 if (const Arg *A =
4423 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4424 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004425 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004426 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004427
Douglas Gregor643c9222011-05-21 17:07:29 +00004428 if (const Arg *A =
4429 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4430 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004431 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004432 }
4433
Chandler Carruthb6766f02011-03-27 01:50:55 +00004434 if (Arg *A = Args.getLastArg(
4435 options::OPT_fdiagnostics_show_note_include_stack,
4436 options::OPT_fno_diagnostics_show_note_include_stack)) {
4437 if (A->getOption().matches(
4438 options::OPT_fdiagnostics_show_note_include_stack))
4439 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4440 else
4441 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4442 }
4443
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004444 // Color diagnostics are the default, unless the terminal doesn't support
4445 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004446 // Support both clang's -f[no-]color-diagnostics and gcc's
4447 // -f[no-]diagnostics-colors[=never|always|auto].
4448 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004449 for (const auto &Arg : Args) {
4450 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004451 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4452 !O.matches(options::OPT_fdiagnostics_color) &&
4453 !O.matches(options::OPT_fno_color_diagnostics) &&
4454 !O.matches(options::OPT_fno_diagnostics_color) &&
4455 !O.matches(options::OPT_fdiagnostics_color_EQ))
4456 continue;
4457
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004458 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004459 if (O.matches(options::OPT_fcolor_diagnostics) ||
4460 O.matches(options::OPT_fdiagnostics_color)) {
4461 ShowColors = Colors_On;
4462 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4463 O.matches(options::OPT_fno_diagnostics_color)) {
4464 ShowColors = Colors_Off;
4465 } else {
4466 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004467 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004468 if (value == "always")
4469 ShowColors = Colors_On;
4470 else if (value == "never")
4471 ShowColors = Colors_Off;
4472 else if (value == "auto")
4473 ShowColors = Colors_Auto;
4474 else
4475 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4476 << ("-fdiagnostics-color=" + value).str();
4477 }
4478 }
4479 if (ShowColors == Colors_On ||
4480 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004481 CmdArgs.push_back("-fcolor-diagnostics");
4482
Nico Rieck7857d462013-09-11 00:38:02 +00004483 if (Args.hasArg(options::OPT_fansi_escape_codes))
4484 CmdArgs.push_back("-fansi-escape-codes");
4485
Daniel Dunbardb097022009-06-08 21:13:54 +00004486 if (!Args.hasFlag(options::OPT_fshow_source_location,
4487 options::OPT_fno_show_source_location))
4488 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004489
Douglas Gregor643c9222011-05-21 17:07:29 +00004490 if (!Args.hasFlag(options::OPT_fshow_column,
4491 options::OPT_fno_show_column,
4492 true))
4493 CmdArgs.push_back("-fno-show-column");
4494
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004495 if (!Args.hasFlag(options::OPT_fspell_checking,
4496 options::OPT_fno_spell_checking))
4497 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004498
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004499
Chad Rosierc8e56e82012-12-05 21:08:21 +00004500 // -fno-asm-blocks is default.
4501 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4502 false))
4503 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004504
Steven Wucb0d13f2015-01-16 23:05:28 +00004505 // -fgnu-inline-asm is default.
4506 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4507 options::OPT_fno_gnu_inline_asm, true))
4508 CmdArgs.push_back("-fno-gnu-inline-asm");
4509
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004510 // Enable vectorization per default according to the optimization level
4511 // selected. For optimization levels that want vectorization we use the alias
4512 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004513 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004514 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004515 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004516 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004517 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004518 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004519
Chad Rosier136d67d2014-04-28 19:30:57 +00004520 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004521 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4522 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004523 options::OPT_fslp_vectorize;
4524 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004525 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004526 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004527
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004528 // -fno-slp-vectorize-aggressive is default.
4529 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004530 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004531 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004532
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004533 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4534 A->render(Args, CmdArgs);
4535
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004536 // -fdollars-in-identifiers default varies depending on platform and
4537 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004538 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004539 options::OPT_fno_dollars_in_identifiers)) {
4540 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004541 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004542 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004543 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004544 }
4545
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004546 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4547 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004548 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004549 options::OPT_fno_unit_at_a_time)) {
4550 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004551 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004552 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004553
Eli Friedman055c9702011-11-02 01:53:16 +00004554 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4555 options::OPT_fno_apple_pragma_pack, false))
4556 CmdArgs.push_back("-fapple-pragma-pack");
4557
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004558 // le32-specific flags:
4559 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4560 // by default.
4561 if (getToolChain().getArch() == llvm::Triple::le32) {
4562 CmdArgs.push_back("-fno-math-builtin");
4563 }
4564
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004565 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004566 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004567 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004568#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004569 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004570 (getToolChain().getArch() == llvm::Triple::arm ||
4571 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004572 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4573 CmdArgs.push_back("-fno-builtin-strcat");
4574 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4575 CmdArgs.push_back("-fno-builtin-strcpy");
4576 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004577#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004578
Justin Bognera88f0122014-06-20 22:59:50 +00004579 // Enable rewrite includes if the user's asked for it or if we're generating
4580 // diagnostics.
4581 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4582 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004583 if (Args.hasFlag(options::OPT_frewrite_includes,
4584 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004585 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004586 CmdArgs.push_back("-frewrite-includes");
4587
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004588 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004589 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004590 options::OPT_traditional_cpp)) {
4591 if (isa<PreprocessJobAction>(JA))
4592 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004593 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004595 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004596
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004597 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004598 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004599
4600 // Handle serialized diagnostics.
4601 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4602 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004603 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004604 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004605
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004606 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4607 CmdArgs.push_back("-fretain-comments-from-system-headers");
4608
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004609 // Forward -fcomment-block-commands to -cc1.
4610 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004611 // Forward -fparse-all-comments to -cc1.
4612 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004613
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004614 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4615 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004616 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004617 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004618 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4619 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004620 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004621
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004622 // We translate this by hand to the -cc1 argument, since nightly test uses
4623 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004624 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004625 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004626 OptDisabled = true;
4627 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004628 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004629 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004630
Bob Wilson23a55f12014-12-21 07:00:00 +00004631 // With -save-temps, we want to save the unoptimized bitcode output from the
4632 // CompileJobAction, so disable optimizations if they are not already
4633 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004634 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004635 isa<CompileJobAction>(JA))
4636 CmdArgs.push_back("-disable-llvm-optzns");
4637
Daniel Dunbard67a3222009-03-30 06:36:42 +00004638 if (Output.getType() == types::TY_Dependencies) {
4639 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004640 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004641 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004642 CmdArgs.push_back(Output.getFilename());
4643 } else {
4644 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004645 }
4646
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004647 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004648 addDashXForInput(Args, II, CmdArgs);
4649
Daniel Dunbarb440f562010-08-02 02:38:21 +00004650 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004651 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004652 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004653 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004654 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004655
Chris Lattnere9d7d782009-11-03 19:50:27 +00004656 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4657
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004658 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004659
4660 // Optionally embed the -cc1 level arguments into the debug info, for build
4661 // analysis.
4662 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004663 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004664 for (const auto &Arg : Args)
4665 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004666
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004667 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004668 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004669 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004670 SmallString<128> EscapedArg;
4671 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004672 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004673 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004674 }
4675 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004676 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004677 }
4678
Eric Christopherd3804002013-02-22 20:12:52 +00004679 // Add the split debug info name to the command lines here so we
4680 // can propagate it to the backend.
4681 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004682 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004683 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4684 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004685 const char *SplitDwarfOut;
4686 if (SplitDwarf) {
4687 CmdArgs.push_back("-split-dwarf-file");
4688 SplitDwarfOut = SplitDebugName(Args, Inputs);
4689 CmdArgs.push_back(SplitDwarfOut);
4690 }
4691
4692 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004693 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004694 Output.getType() == types::TY_Object &&
4695 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004696 auto CLCommand =
4697 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4698 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4699 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004700 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004702 }
4703
Daniel Dunbar17731772009-03-23 19:03:36 +00004704
Eric Christopherf1545832013-02-22 23:50:16 +00004705 // Handle the debug info splitting at object creation time if we're
4706 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004707 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004708 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004709 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004710
Roman Divacky178e01602011-02-10 16:52:03 +00004711 if (Arg *A = Args.getLastArg(options::OPT_pg))
4712 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004713 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004714 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004715
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004716 // Claim some arguments which clang supports automatically.
4717
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004718 // -fpch-preprocess is used with gcc to add a special marker in the output to
4719 // include the PCH file. Clang's PTH solution is completely transparent, so we
4720 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004721 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004722
Daniel Dunbar17731772009-03-23 19:03:36 +00004723 // Claim some arguments which clang doesn't support, but we don't
4724 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004725 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4726 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004727
Rafael Espindolab0092d72013-09-04 19:37:35 +00004728 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004729 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004730}
4731
John McCall5fb5df92012-06-20 06:18:46 +00004732/// Add options related to the Objective-C runtime/ABI.
4733///
4734/// Returns true if the runtime is non-fragile.
4735ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4736 ArgStringList &cmdArgs,
4737 RewriteKind rewriteKind) const {
4738 // Look for the controlling runtime option.
4739 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4740 options::OPT_fgnu_runtime,
4741 options::OPT_fobjc_runtime_EQ);
4742
4743 // Just forward -fobjc-runtime= to the frontend. This supercedes
4744 // options about fragility.
4745 if (runtimeArg &&
4746 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4747 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004748 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004749 if (runtime.tryParse(value)) {
4750 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4751 << value;
4752 }
4753
4754 runtimeArg->render(args, cmdArgs);
4755 return runtime;
4756 }
4757
4758 // Otherwise, we'll need the ABI "version". Version numbers are
4759 // slightly confusing for historical reasons:
4760 // 1 - Traditional "fragile" ABI
4761 // 2 - Non-fragile ABI, version 1
4762 // 3 - Non-fragile ABI, version 2
4763 unsigned objcABIVersion = 1;
4764 // If -fobjc-abi-version= is present, use that to set the version.
4765 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004766 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004767 if (value == "1")
4768 objcABIVersion = 1;
4769 else if (value == "2")
4770 objcABIVersion = 2;
4771 else if (value == "3")
4772 objcABIVersion = 3;
4773 else
4774 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4775 << value;
4776 } else {
4777 // Otherwise, determine if we are using the non-fragile ABI.
4778 bool nonFragileABIIsDefault =
4779 (rewriteKind == RK_NonFragile ||
4780 (rewriteKind == RK_None &&
4781 getToolChain().IsObjCNonFragileABIDefault()));
4782 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4783 options::OPT_fno_objc_nonfragile_abi,
4784 nonFragileABIIsDefault)) {
4785 // Determine the non-fragile ABI version to use.
4786#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4787 unsigned nonFragileABIVersion = 1;
4788#else
4789 unsigned nonFragileABIVersion = 2;
4790#endif
4791
4792 if (Arg *abiArg = args.getLastArg(
4793 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004794 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004795 if (value == "1")
4796 nonFragileABIVersion = 1;
4797 else if (value == "2")
4798 nonFragileABIVersion = 2;
4799 else
4800 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4801 << value;
4802 }
4803
4804 objcABIVersion = 1 + nonFragileABIVersion;
4805 } else {
4806 objcABIVersion = 1;
4807 }
4808 }
4809
4810 // We don't actually care about the ABI version other than whether
4811 // it's non-fragile.
4812 bool isNonFragile = objcABIVersion != 1;
4813
4814 // If we have no runtime argument, ask the toolchain for its default runtime.
4815 // However, the rewriter only really supports the Mac runtime, so assume that.
4816 ObjCRuntime runtime;
4817 if (!runtimeArg) {
4818 switch (rewriteKind) {
4819 case RK_None:
4820 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4821 break;
4822 case RK_Fragile:
4823 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4824 break;
4825 case RK_NonFragile:
4826 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4827 break;
4828 }
4829
4830 // -fnext-runtime
4831 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4832 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004833 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004834 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4835
4836 // Otherwise, build for a generic macosx port.
4837 } else {
4838 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4839 }
4840
4841 // -fgnu-runtime
4842 } else {
4843 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004844 // Legacy behaviour is to target the gnustep runtime if we are i
4845 // non-fragile mode or the GCC runtime in fragile mode.
4846 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004847 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004848 else
4849 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004850 }
4851
4852 cmdArgs.push_back(args.MakeArgString(
4853 "-fobjc-runtime=" + runtime.getAsString()));
4854 return runtime;
4855}
4856
Reid Klecknerc542d372014-06-27 17:02:02 +00004857static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4858 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4859 I += HaveDash;
4860 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004861}
Reid Klecknerc542d372014-06-27 17:02:02 +00004862
4863struct EHFlags {
4864 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4865 bool Synch;
4866 bool Asynch;
4867 bool NoExceptC;
4868};
4869
4870/// /EH controls whether to run destructor cleanups when exceptions are
4871/// thrown. There are three modifiers:
4872/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4873/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4874/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4875/// - c: Assume that extern "C" functions are implicitly noexcept. This
4876/// modifier is an optimization, so we ignore it for now.
4877/// The default is /EHs-c-, meaning cleanups are disabled.
4878static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4879 EHFlags EH;
4880 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4881 for (auto EHVal : EHArgs) {
4882 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4883 switch (EHVal[I]) {
4884 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4885 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4886 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4887 default: break;
4888 }
4889 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4890 break;
4891 }
4892 }
4893 return EH;
4894}
4895
Hans Wennborg75958c42013-08-08 00:17:41 +00004896void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4897 unsigned RTOptionID = options::OPT__SLASH_MT;
4898
Hans Wennborgf1a74252013-09-10 20:18:04 +00004899 if (Args.hasArg(options::OPT__SLASH_LDd))
4900 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4901 // but defining _DEBUG is sticky.
4902 RTOptionID = options::OPT__SLASH_MTd;
4903
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004904 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004905 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004906
Hans Wennborg75958c42013-08-08 00:17:41 +00004907 switch(RTOptionID) {
4908 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004909 if (Args.hasArg(options::OPT__SLASH_LDd))
4910 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004911 CmdArgs.push_back("-D_MT");
4912 CmdArgs.push_back("-D_DLL");
4913 CmdArgs.push_back("--dependent-lib=msvcrt");
4914 break;
4915 case options::OPT__SLASH_MDd:
4916 CmdArgs.push_back("-D_DEBUG");
4917 CmdArgs.push_back("-D_MT");
4918 CmdArgs.push_back("-D_DLL");
4919 CmdArgs.push_back("--dependent-lib=msvcrtd");
4920 break;
4921 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004922 if (Args.hasArg(options::OPT__SLASH_LDd))
4923 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004924 CmdArgs.push_back("-D_MT");
4925 CmdArgs.push_back("--dependent-lib=libcmt");
4926 break;
4927 case options::OPT__SLASH_MTd:
4928 CmdArgs.push_back("-D_DEBUG");
4929 CmdArgs.push_back("-D_MT");
4930 CmdArgs.push_back("--dependent-lib=libcmtd");
4931 break;
4932 default:
4933 llvm_unreachable("Unexpected option ID.");
4934 }
4935
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004936 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4937 // users want. The /Za flag to cl.exe turns this off, but it's not
4938 // implemented in clang.
4939 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004940
Hans Wennborg8858a032014-07-21 23:42:07 +00004941 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4942 // would produce interleaved output, so ignore /showIncludes in such cases.
4943 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4944 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4945 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004946
David Majnemerf6072342014-07-01 22:24:56 +00004947 // This controls whether or not we emit RTTI data for polymorphic types.
4948 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4949 /*default=*/false))
4950 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004951
Reid Klecknerc542d372014-06-27 17:02:02 +00004952 const Driver &D = getToolChain().getDriver();
4953 EHFlags EH = parseClangCLEHFlags(D, Args);
4954 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004955 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004956 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004957 CmdArgs.push_back("-fexceptions");
4958 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004959
Hans Wennborge50cec32014-06-13 20:59:54 +00004960 // /EP should expand to -E -P.
4961 if (Args.hasArg(options::OPT__SLASH_EP)) {
4962 CmdArgs.push_back("-E");
4963 CmdArgs.push_back("-P");
4964 }
4965
David Majnemera5b195a2015-02-14 01:35:12 +00004966 unsigned VolatileOptionID;
4967 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4968 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4969 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4970 else
4971 VolatileOptionID = options::OPT__SLASH_volatile_iso;
4972
4973 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
4974 VolatileOptionID = A->getOption().getID();
4975
4976 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
4977 CmdArgs.push_back("-fms-volatile");
4978
David Majnemer86c318f2014-02-11 21:05:00 +00004979 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4980 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4981 if (MostGeneralArg && BestCaseArg)
4982 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4983 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4984
4985 if (MostGeneralArg) {
4986 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4987 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4988 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4989
4990 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4991 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4992 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4993 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4994 << FirstConflict->getAsString(Args)
4995 << SecondConflict->getAsString(Args);
4996
4997 if (SingleArg)
4998 CmdArgs.push_back("-fms-memptr-rep=single");
4999 else if (MultipleArg)
5000 CmdArgs.push_back("-fms-memptr-rep=multiple");
5001 else
5002 CmdArgs.push_back("-fms-memptr-rep=virtual");
5003 }
5004
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005005 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5006 A->render(Args, CmdArgs);
5007
Hans Wennborg81f74482013-09-10 01:07:07 +00005008 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5009 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005010 if (Args.hasArg(options::OPT__SLASH_fallback))
5011 CmdArgs.push_back("msvc-fallback");
5012 else
5013 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005014 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005015}
5016
Hans Wennborg1da044a2014-06-26 19:59:02 +00005017visualstudio::Compile *Clang::getCLFallback() const {
5018 if (!CLFallback)
5019 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5020 return CLFallback.get();
5021}
5022
Daniel Sanders7f933f42015-01-30 17:35:23 +00005023void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5024 ArgStringList &CmdArgs) const {
5025 StringRef CPUName;
5026 StringRef ABIName;
5027 const llvm::Triple &Triple = getToolChain().getTriple();
5028 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5029
5030 CmdArgs.push_back("-target-abi");
5031 CmdArgs.push_back(ABIName.data());
5032}
5033
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005034void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005035 const InputInfo &Output,
5036 const InputInfoList &Inputs,
5037 const ArgList &Args,
5038 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005039 ArgStringList CmdArgs;
5040
5041 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5042 const InputInfo &Input = Inputs[0];
5043
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005044 // Don't warn about "clang -w -c foo.s"
5045 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005046 // and "clang -emit-llvm -c foo.s"
5047 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005048
Rafael Espindola577637a2015-01-03 00:06:04 +00005049 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005050
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005051 // Invoke ourselves in -cc1as mode.
5052 //
5053 // FIXME: Implement custom jobs for internal actions.
5054 CmdArgs.push_back("-cc1as");
5055
5056 // Add the "effective" target triple.
5057 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005058 std::string TripleStr =
5059 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005060 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5061
5062 // Set the output mode, we currently only expect to be used as a real
5063 // assembler.
5064 CmdArgs.push_back("-filetype");
5065 CmdArgs.push_back("obj");
5066
Eric Christopher45f2e712012-12-18 00:31:10 +00005067 // Set the main file name, so that debug info works even with
5068 // -save-temps or preprocessed assembly.
5069 CmdArgs.push_back("-main-file-name");
5070 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
5071
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005072 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005073 const llvm::Triple &Triple = getToolChain().getTriple();
5074 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005075 if (!CPU.empty()) {
5076 CmdArgs.push_back("-target-cpu");
5077 CmdArgs.push_back(Args.MakeArgString(CPU));
5078 }
5079
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005080 // Add the target features
5081 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005082 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005083
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005084 // Ignore explicit -force_cpusubtype_ALL option.
5085 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005086
Eric Christopherfc3ee562012-01-10 00:38:01 +00005087 // Determine the original source input.
5088 const Action *SourceAction = &JA;
5089 while (SourceAction->getKind() != Action::InputClass) {
5090 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5091 SourceAction = SourceAction->getInputs()[0];
5092 }
5093
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005094 // Forward -g and handle debug info related flags, assuming we are dealing
5095 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005096 if (SourceAction->getType() == types::TY_Asm ||
5097 SourceAction->getType() == types::TY_PP_Asm) {
5098 Args.ClaimAllArgs(options::OPT_g_Group);
5099 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5100 if (!A->getOption().matches(options::OPT_g0))
5101 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005102
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005103 if (Args.hasArg(options::OPT_gdwarf_2))
5104 CmdArgs.push_back("-gdwarf-2");
5105 if (Args.hasArg(options::OPT_gdwarf_3))
5106 CmdArgs.push_back("-gdwarf-3");
5107 if (Args.hasArg(options::OPT_gdwarf_4))
5108 CmdArgs.push_back("-gdwarf-4");
5109
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005110 // Add the -fdebug-compilation-dir flag if needed.
5111 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005112
5113 // Set the AT_producer to the clang version when using the integrated
5114 // assembler on assembly source files.
5115 CmdArgs.push_back("-dwarf-debug-producer");
5116 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005117 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005118
5119 // Optionally embed the -cc1as level arguments into the debug info, for build
5120 // analysis.
5121 if (getToolChain().UseDwarfDebugFlags()) {
5122 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005123 for (const auto &Arg : Args)
5124 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005125
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005126 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005127 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5128 Flags += Exec;
5129 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005130 SmallString<128> EscapedArg;
5131 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005132 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005133 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005134 }
5135 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005136 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005137 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005138
5139 // FIXME: Add -static support, once we have it.
5140
Daniel Sanders7f933f42015-01-30 17:35:23 +00005141 // Add target specific flags.
5142 switch(getToolChain().getArch()) {
5143 default:
5144 break;
5145
5146 case llvm::Triple::mips:
5147 case llvm::Triple::mipsel:
5148 case llvm::Triple::mips64:
5149 case llvm::Triple::mips64el:
5150 AddMIPSTargetArgs(Args, CmdArgs);
5151 break;
5152 }
5153
David Blaikie372d9502014-01-17 03:17:40 +00005154 // Consume all the warning flags. Usually this would be handled more
5155 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5156 // doesn't handle that so rather than warning about unused flags that are
5157 // actually used, we'll lie by omission instead.
5158 // FIXME: Stop lying and consume only the appropriate driver flags
5159 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5160 ie = Args.filtered_end();
5161 it != ie; ++it)
5162 (*it)->claim();
5163
David Blaikie9260ed62013-07-25 21:19:01 +00005164 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5165 getToolChain().getDriver());
5166
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005167 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005168
5169 assert(Output.isFilename() && "Unexpected lipo output.");
5170 CmdArgs.push_back("-o");
5171 CmdArgs.push_back(Output.getFilename());
5172
Daniel Dunbarb440f562010-08-02 02:38:21 +00005173 assert(Input.isFilename() && "Invalid input.");
5174 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005175
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005176 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005177 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005178
5179 // Handle the debug info splitting at object creation time if we're
5180 // creating an object.
5181 // TODO: Currently only works on linux with newer objcopy.
5182 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005183 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005184 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5185 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005186}
5187
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005188void GnuTool::anchor() {}
5189
Daniel Dunbara3246a02009-03-18 08:07:30 +00005190void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005191 const InputInfo &Output,
5192 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005193 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005194 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005195 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005196 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005197
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005198 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005199 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005200 // Don't forward any -g arguments to assembly steps.
5201 if (isa<AssembleJobAction>(JA) &&
5202 A->getOption().matches(options::OPT_g_Group))
5203 continue;
5204
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005205 // Don't forward any -W arguments to assembly and link steps.
5206 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5207 A->getOption().matches(options::OPT_W_Group))
5208 continue;
5209
Daniel Dunbar2da02722009-03-19 07:55:12 +00005210 // It is unfortunate that we have to claim here, as this means
5211 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005212 // platforms using a generic gcc, even if we are just using gcc
5213 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005214 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005215 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005216 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005217 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005218
Daniel Dunbar4e295052010-01-25 22:35:08 +00005219 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005220
5221 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005222 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005223 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005224 CmdArgs.push_back(
5225 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005226 }
5227
Daniel Dunbar5716d872009-05-02 21:41:52 +00005228 // Try to force gcc to match the tool chain we want, if we recognize
5229 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005230 //
5231 // FIXME: The triple class should directly provide the information we want
5232 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005233 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005234 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005235 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005236 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5237 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005238 CmdArgs.push_back("-m64");
5239
Daniel Dunbarb440f562010-08-02 02:38:21 +00005240 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005241 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005242 CmdArgs.push_back(Output.getFilename());
5243 } else {
5244 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005245 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005246 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005247
Tony Linthicum76329bf2011-12-12 21:14:55 +00005248 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5249 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005250
5251 // Only pass -x if gcc will understand it; otherwise hope gcc
5252 // understands the suffix correctly. The main use case this would go
5253 // wrong in is for linker inputs if they happened to have an odd
5254 // suffix; really the only way to get this to happen is a command
5255 // like '-x foobar a.c' which will treat a.c like a linker input.
5256 //
5257 // FIXME: For the linker case specifically, can we safely convert
5258 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005259 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005260 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005261 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5262 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005263 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005264 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005265 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005266 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005267 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005268 else if (II.getType() == types::TY_ModuleFile)
5269 D.Diag(diag::err_drv_no_module_support)
5270 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005271
Daniel Dunbara3246a02009-03-18 08:07:30 +00005272 if (types::canTypeBeUserSpecified(II.getType())) {
5273 CmdArgs.push_back("-x");
5274 CmdArgs.push_back(types::getTypeName(II.getType()));
5275 }
5276
Daniel Dunbarb440f562010-08-02 02:38:21 +00005277 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005278 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005279 else {
5280 const Arg &A = II.getInputArg();
5281
5282 // Reverse translate some rewritten options.
5283 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5284 CmdArgs.push_back("-lstdc++");
5285 continue;
5286 }
5287
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005288 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005289 A.render(Args, CmdArgs);
5290 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005291 }
5292
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005293 const std::string customGCCName = D.getCCCGenericGCCName();
5294 const char *GCCName;
5295 if (!customGCCName.empty())
5296 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005297 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005298 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005299 } else
5300 GCCName = "gcc";
5301
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005302 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005303 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005304 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005305}
5306
Daniel Dunbar4e295052010-01-25 22:35:08 +00005307void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5308 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005309 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005310}
5311
Daniel Dunbar4e295052010-01-25 22:35:08 +00005312void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5313 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005314 const Driver &D = getToolChain().getDriver();
5315
Eric Christophercc7ff502015-01-29 00:56:17 +00005316 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005317 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005318 case types::TY_LLVM_IR:
5319 case types::TY_LTO_IR:
5320 case types::TY_LLVM_BC:
5321 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005322 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005323 break;
5324 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005325 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005326 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005327 case types::TY_Nothing:
5328 CmdArgs.push_back("-fsyntax-only");
5329 break;
5330 default:
5331 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005332 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005333}
5334
Daniel Dunbar4e295052010-01-25 22:35:08 +00005335void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5336 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005337 // The types are (hopefully) good enough.
5338}
5339
Tony Linthicum76329bf2011-12-12 21:14:55 +00005340// Hexagon tools start.
5341void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5342 ArgStringList &CmdArgs) const {
5343
5344}
5345void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5346 const InputInfo &Output,
5347 const InputInfoList &Inputs,
5348 const ArgList &Args,
5349 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005350 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005351
5352 const Driver &D = getToolChain().getDriver();
5353 ArgStringList CmdArgs;
5354
5355 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005356 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005357 CmdArgs.push_back(Args.MakeArgString(MarchString));
5358
5359 RenderExtraToolArgs(JA, CmdArgs);
5360
5361 if (Output.isFilename()) {
5362 CmdArgs.push_back("-o");
5363 CmdArgs.push_back(Output.getFilename());
5364 } else {
5365 assert(Output.isNothing() && "Unexpected output");
5366 CmdArgs.push_back("-fsyntax-only");
5367 }
5368
Matthew Curtise8f80a12012-12-06 17:49:03 +00005369 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5370 if (!SmallDataThreshold.empty())
5371 CmdArgs.push_back(
5372 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005373
Matthew Curtise5df3812012-12-07 17:23:04 +00005374 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5375 options::OPT_Xassembler);
5376
Tony Linthicum76329bf2011-12-12 21:14:55 +00005377 // Only pass -x if gcc will understand it; otherwise hope gcc
5378 // understands the suffix correctly. The main use case this would go
5379 // wrong in is for linker inputs if they happened to have an odd
5380 // suffix; really the only way to get this to happen is a command
5381 // like '-x foobar a.c' which will treat a.c like a linker input.
5382 //
5383 // FIXME: For the linker case specifically, can we safely convert
5384 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005385 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005386 // Don't try to pass LLVM or AST inputs to a generic gcc.
5387 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5388 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5389 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5390 << getToolChain().getTripleString();
5391 else if (II.getType() == types::TY_AST)
5392 D.Diag(clang::diag::err_drv_no_ast_support)
5393 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005394 else if (II.getType() == types::TY_ModuleFile)
5395 D.Diag(diag::err_drv_no_module_support)
5396 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005397
5398 if (II.isFilename())
5399 CmdArgs.push_back(II.getFilename());
5400 else
5401 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5402 II.getInputArg().render(Args, CmdArgs);
5403 }
5404
5405 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005406 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005407 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005408}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005409
Tony Linthicum76329bf2011-12-12 21:14:55 +00005410void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5411 ArgStringList &CmdArgs) const {
5412 // The types are (hopefully) good enough.
5413}
5414
5415void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5416 const InputInfo &Output,
5417 const InputInfoList &Inputs,
5418 const ArgList &Args,
5419 const char *LinkingOutput) const {
5420
Matthew Curtise689b052012-12-06 15:46:07 +00005421 const toolchains::Hexagon_TC& ToolChain =
5422 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5423 const Driver &D = ToolChain.getDriver();
5424
Tony Linthicum76329bf2011-12-12 21:14:55 +00005425 ArgStringList CmdArgs;
5426
Matthew Curtise689b052012-12-06 15:46:07 +00005427 //----------------------------------------------------------------------------
5428 //
5429 //----------------------------------------------------------------------------
5430 bool hasStaticArg = Args.hasArg(options::OPT_static);
5431 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005432 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005433 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5434 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5435 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5436 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005437
Matthew Curtise689b052012-12-06 15:46:07 +00005438 //----------------------------------------------------------------------------
5439 // Silence warnings for various options
5440 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005441
Matthew Curtise689b052012-12-06 15:46:07 +00005442 Args.ClaimAllArgs(options::OPT_g_Group);
5443 Args.ClaimAllArgs(options::OPT_emit_llvm);
5444 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5445 // handled somewhere else.
5446 Args.ClaimAllArgs(options::OPT_static_libgcc);
5447
5448 //----------------------------------------------------------------------------
5449 //
5450 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005451 for (const auto &Opt : ToolChain.ExtraOpts)
5452 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005453
Matthew Curtisf10a5952012-12-06 14:16:43 +00005454 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5455 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005456
Matthew Curtise689b052012-12-06 15:46:07 +00005457 if (buildingLib) {
5458 CmdArgs.push_back("-shared");
5459 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5460 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005461 }
5462
Matthew Curtise689b052012-12-06 15:46:07 +00005463 if (hasStaticArg)
5464 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005465
Matthew Curtise8f80a12012-12-06 17:49:03 +00005466 if (buildPIE && !buildingLib)
5467 CmdArgs.push_back("-pie");
5468
5469 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5470 if (!SmallDataThreshold.empty()) {
5471 CmdArgs.push_back(
5472 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5473 }
5474
Matthew Curtise689b052012-12-06 15:46:07 +00005475 //----------------------------------------------------------------------------
5476 //
5477 //----------------------------------------------------------------------------
5478 CmdArgs.push_back("-o");
5479 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005480
Matthew Curtise689b052012-12-06 15:46:07 +00005481 const std::string MarchSuffix = "/" + MarchString;
5482 const std::string G0Suffix = "/G0";
5483 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005484 const std::string RootDir =
5485 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005486 const std::string StartFilesDir = RootDir
5487 + "hexagon/lib"
5488 + (buildingLib
5489 ? MarchG0Suffix : MarchSuffix);
5490
5491 //----------------------------------------------------------------------------
5492 // moslib
5493 //----------------------------------------------------------------------------
5494 std::vector<std::string> oslibs;
5495 bool hasStandalone= false;
5496
5497 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5498 ie = Args.filtered_end(); it != ie; ++it) {
5499 (*it)->claim();
5500 oslibs.push_back((*it)->getValue());
5501 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005502 }
Matthew Curtise689b052012-12-06 15:46:07 +00005503 if (oslibs.empty()) {
5504 oslibs.push_back("standalone");
5505 hasStandalone = true;
5506 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005507
Matthew Curtise689b052012-12-06 15:46:07 +00005508 //----------------------------------------------------------------------------
5509 // Start Files
5510 //----------------------------------------------------------------------------
5511 if (incStdLib && incStartFiles) {
5512
5513 if (!buildingLib) {
5514 if (hasStandalone) {
5515 CmdArgs.push_back(
5516 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5517 }
5518 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5519 }
5520 std::string initObj = useShared ? "/initS.o" : "/init.o";
5521 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5522 }
5523
5524 //----------------------------------------------------------------------------
5525 // Library Search Paths
5526 //----------------------------------------------------------------------------
5527 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005528 for (const auto &LibPath : LibPaths)
5529 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005530
5531 //----------------------------------------------------------------------------
5532 //
5533 //----------------------------------------------------------------------------
5534 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5535 Args.AddAllArgs(CmdArgs, options::OPT_e);
5536 Args.AddAllArgs(CmdArgs, options::OPT_s);
5537 Args.AddAllArgs(CmdArgs, options::OPT_t);
5538 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5539
5540 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5541
5542 //----------------------------------------------------------------------------
5543 // Libraries
5544 //----------------------------------------------------------------------------
5545 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005546 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005547 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5548 CmdArgs.push_back("-lm");
5549 }
5550
5551 CmdArgs.push_back("--start-group");
5552
5553 if (!buildingLib) {
5554 for(std::vector<std::string>::iterator i = oslibs.begin(),
5555 e = oslibs.end(); i != e; ++i)
5556 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5557 CmdArgs.push_back("-lc");
5558 }
5559 CmdArgs.push_back("-lgcc");
5560
5561 CmdArgs.push_back("--end-group");
5562 }
5563
5564 //----------------------------------------------------------------------------
5565 // End files
5566 //----------------------------------------------------------------------------
5567 if (incStdLib && incStartFiles) {
5568 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5569 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5570 }
5571
5572 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005573 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5574 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005575}
5576// Hexagon tools end.
5577
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005578/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005579const char *arm::getARMCPUForMArch(const ArgList &Args,
5580 const llvm::Triple &Triple) {
5581 StringRef MArch;
5582 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5583 // Otherwise, if we have -march= choose the base CPU for that arch.
5584 MArch = A->getValue();
5585 } else {
5586 // Otherwise, use the Arch from the triple.
5587 MArch = Triple.getArchName();
5588 }
5589
5590 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005591 if (MArch == "native") {
5592 std::string CPU = llvm::sys::getHostCPUName();
5593 if (CPU != "generic") {
5594 // Translate the native cpu into the architecture. The switch below will
5595 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005596 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005597 }
5598 }
5599
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005600 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005601}
5602
5603/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005604StringRef arm::getARMTargetCPU(const ArgList &Args,
5605 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005606 // FIXME: Warn on inconsistent use of -mcpu and -march.
5607 // If we have -mcpu=, use that.
5608 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5609 StringRef MCPU = A->getValue();
5610 // Handle -mcpu=native.
5611 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005612 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005613 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005614 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005615 }
5616
5617 return getARMCPUForMArch(Args, Triple);
5618}
5619
5620/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5621/// CPU.
5622//
5623// FIXME: This is redundant with -mcpu, why does LLVM use this.
5624// FIXME: tblgen this, or kill it!
5625const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5626 return llvm::StringSwitch<const char *>(CPU)
5627 .Case("strongarm", "v4")
5628 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5629 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5630 .Cases("arm920", "arm920t", "arm922t", "v4t")
5631 .Cases("arm940t", "ep9312","v4t")
5632 .Cases("arm10tdmi", "arm1020t", "v5")
5633 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5634 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5635 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005636 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5637 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5638 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005639 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005640 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005641 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005642 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005643 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5644 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005645 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005646 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005647 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005648 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005649 .Default("");
5650}
5651
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005652void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5653 if (Args.hasArg(options::OPT_r))
5654 return;
5655
5656 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5657 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5658 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005659 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005660 .Default("--be8");
5661
5662 if (LinkFlag)
5663 CmdArgs.push_back(LinkFlag);
5664}
5665
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005666mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5667 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5668 .Case("mips1", NanLegacy)
5669 .Case("mips2", NanLegacy)
5670 .Case("mips3", NanLegacy)
5671 .Case("mips4", NanLegacy)
5672 .Case("mips5", NanLegacy)
5673 .Case("mips32", NanLegacy)
5674 .Case("mips32r2", NanLegacy)
5675 .Case("mips32r3", NanLegacy | Nan2008)
5676 .Case("mips32r5", NanLegacy | Nan2008)
5677 .Case("mips32r6", Nan2008)
5678 .Case("mips64", NanLegacy)
5679 .Case("mips64r2", NanLegacy)
5680 .Case("mips64r3", NanLegacy | Nan2008)
5681 .Case("mips64r5", NanLegacy | Nan2008)
5682 .Case("mips64r6", Nan2008)
5683 .Default(NanLegacy);
5684}
5685
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005686bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5687 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5688 return A && (A->getValue() == StringRef(Value));
5689}
5690
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005691bool mips::isUCLibc(const ArgList &Args) {
5692 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005693 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005694}
5695
Daniel Sanders2bf13662014-07-10 14:40:57 +00005696bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005697 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5698 return llvm::StringSwitch<bool>(NaNArg->getValue())
5699 .Case("2008", true)
5700 .Case("legacy", false)
5701 .Default(false);
5702
5703 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005704 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5705 .Cases("mips32r6", "mips64r6", true)
5706 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005707
5708 return false;
5709}
5710
Daniel Sanders379d44b2014-07-16 11:52:23 +00005711bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5712 StringRef ABIName) {
5713 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005714 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005715 return false;
5716
5717 if (ABIName != "32")
5718 return false;
5719
5720 return llvm::StringSwitch<bool>(CPUName)
5721 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005722 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5723 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005724 .Default(false);
5725}
5726
Tim Northover157d9112014-01-16 08:48:16 +00005727llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005728 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5729 // archs which Darwin doesn't use.
5730
5731 // The matching this routine does is fairly pointless, since it is neither the
5732 // complete architecture list, nor a reasonable subset. The problem is that
5733 // historically the driver driver accepts this and also ties its -march=
5734 // handling to the architecture name, so we need to be careful before removing
5735 // support for it.
5736
5737 // This code must be kept in sync with Clang's Darwin specific argument
5738 // translation.
5739
5740 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5741 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5742 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5743 .Case("ppc64", llvm::Triple::ppc64)
5744 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5745 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5746 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005747 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005748 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005749 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005750 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005751 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005752 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005753 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005754 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005755 .Case("nvptx", llvm::Triple::nvptx)
5756 .Case("nvptx64", llvm::Triple::nvptx64)
5757 .Case("amdil", llvm::Triple::amdil)
5758 .Case("spir", llvm::Triple::spir)
5759 .Default(llvm::Triple::UnknownArch);
5760}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005761
Tim Northover157d9112014-01-16 08:48:16 +00005762void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5763 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5764 T.setArch(Arch);
5765
5766 if (Str == "x86_64h")
5767 T.setArchName(Str);
5768 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5769 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005770 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005771 }
5772}
5773
Bob Wilsondecc03e2012-11-23 06:14:39 +00005774const char *Clang::getBaseInputName(const ArgList &Args,
5775 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005776 return Args.MakeArgString(
5777 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005778}
5779
Bob Wilsondecc03e2012-11-23 06:14:39 +00005780const char *Clang::getBaseInputStem(const ArgList &Args,
5781 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005782 const char *Str = getBaseInputName(Args, Inputs);
5783
Chris Lattner906bb902011-01-16 08:14:11 +00005784 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005785 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005786
5787 return Str;
5788}
5789
Bob Wilsondecc03e2012-11-23 06:14:39 +00005790const char *Clang::getDependencyFileName(const ArgList &Args,
5791 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005792 // FIXME: Think about this more.
5793 std::string Res;
5794
5795 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005796 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005797 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005798 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005799 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005800 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005801 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005802}
5803
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005804void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5805 const InputInfo &Output,
5806 const InputInfoList &Inputs,
5807 const ArgList &Args,
5808 const char *LinkingOutput) const {
5809 const ToolChain &ToolChain = getToolChain();
5810 const Driver &D = ToolChain.getDriver();
5811 ArgStringList CmdArgs;
5812
5813 // Silence warning for "clang -g foo.o -o foo"
5814 Args.ClaimAllArgs(options::OPT_g_Group);
5815 // and "clang -emit-llvm foo.o -o foo"
5816 Args.ClaimAllArgs(options::OPT_emit_llvm);
5817 // and for "clang -w foo.o -o foo". Other warning options are already
5818 // handled somewhere else.
5819 Args.ClaimAllArgs(options::OPT_w);
5820
5821 if (!D.SysRoot.empty())
5822 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5823
5824 // CloudABI only supports static linkage.
5825 CmdArgs.push_back("-Bstatic");
5826 CmdArgs.push_back("--eh-frame-hdr");
5827 CmdArgs.push_back("--gc-sections");
5828
5829 if (Output.isFilename()) {
5830 CmdArgs.push_back("-o");
5831 CmdArgs.push_back(Output.getFilename());
5832 } else {
5833 assert(Output.isNothing() && "Invalid output.");
5834 }
5835
5836 if (!Args.hasArg(options::OPT_nostdlib) &&
5837 !Args.hasArg(options::OPT_nostartfiles)) {
5838 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5839 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5840 }
5841
5842 Args.AddAllArgs(CmdArgs, options::OPT_L);
5843 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5844 for (const auto &Path : Paths)
5845 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5846 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5847 Args.AddAllArgs(CmdArgs, options::OPT_e);
5848 Args.AddAllArgs(CmdArgs, options::OPT_s);
5849 Args.AddAllArgs(CmdArgs, options::OPT_t);
5850 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5851 Args.AddAllArgs(CmdArgs, options::OPT_r);
5852
5853 if (D.IsUsingLTO(ToolChain, Args))
5854 AddGoldPlugin(ToolChain, Args, CmdArgs);
5855
5856 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5857
5858 if (!Args.hasArg(options::OPT_nostdlib) &&
5859 !Args.hasArg(options::OPT_nodefaultlibs)) {
5860 if (D.CCCIsCXX())
5861 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5862 CmdArgs.push_back("-lc");
5863 CmdArgs.push_back("-lcompiler_rt");
5864 }
5865
5866 if (!Args.hasArg(options::OPT_nostdlib) &&
5867 !Args.hasArg(options::OPT_nostartfiles))
5868 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5869
5870 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5872}
5873
Daniel Dunbarbe220842009-03-20 16:06:39 +00005874void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005875 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005876 const InputInfoList &Inputs,
5877 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005878 const char *LinkingOutput) const {
5879 ArgStringList CmdArgs;
5880
5881 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5882 const InputInfo &Input = Inputs[0];
5883
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005884 // Determine the original source input.
5885 const Action *SourceAction = &JA;
5886 while (SourceAction->getKind() != Action::InputClass) {
5887 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5888 SourceAction = SourceAction->getInputs()[0];
5889 }
5890
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005891 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005892 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005893 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5894 // FIXME: at run-time detect assembler capabilities or rely on version
5895 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005896 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005897 const llvm::Triple &T(getToolChain().getTriple());
5898 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005899 CmdArgs.push_back("-Q");
5900 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005901
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005902 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005903 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005904 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005905 if (Args.hasArg(options::OPT_gstabs))
5906 CmdArgs.push_back("--gstabs");
5907 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005908 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005909 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005910
Daniel Dunbarbe220842009-03-20 16:06:39 +00005911 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005912 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005913
Daniel Dunbar6d484762010-07-22 01:47:22 +00005914 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005915 if (getToolChain().getArch() == llvm::Triple::x86 ||
5916 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005917 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5918 CmdArgs.push_back("-force_cpusubtype_ALL");
5919
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005920 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005921 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005922 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005923 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005924 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005925 CmdArgs.push_back("-static");
5926
Daniel Dunbarbe220842009-03-20 16:06:39 +00005927 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5928 options::OPT_Xassembler);
5929
5930 assert(Output.isFilename() && "Unexpected lipo output.");
5931 CmdArgs.push_back("-o");
5932 CmdArgs.push_back(Output.getFilename());
5933
Daniel Dunbarb440f562010-08-02 02:38:21 +00005934 assert(Input.isFilename() && "Invalid input.");
5935 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005936
5937 // asm_final spec is empty.
5938
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005939 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005940 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005941 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005942}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005943
Tim Northover157d9112014-01-16 08:48:16 +00005944void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005945
Tim Northover157d9112014-01-16 08:48:16 +00005946void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5947 ArgStringList &CmdArgs) const {
5948 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005949
Daniel Dunbarc1964212009-03-26 16:23:12 +00005950 // Derived from darwin_arch spec.
5951 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005952 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005953
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005954 // FIXME: Is this needed anymore?
5955 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005956 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005957}
5958
Bill Wendling3b2000f2012-10-02 18:02:50 +00005959bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5960 // We only need to generate a temp path for LTO if we aren't compiling object
5961 // files. When compiling source files, we run 'dsymutil' after linking. We
5962 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005963 for (const auto &Input : Inputs)
5964 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005965 return true;
5966
5967 return false;
5968}
5969
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005970void darwin::Link::AddLinkArgs(Compilation &C,
5971 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005972 ArgStringList &CmdArgs,
5973 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005974 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005975 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005976
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005977 unsigned Version[3] = { 0, 0, 0 };
5978 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5979 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005980 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005981 Version[1], Version[2], HadExtra) ||
5982 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005983 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005984 << A->getAsString(Args);
5985 }
5986
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005987 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005988 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005989 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5990 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005991
Bob Wilson3d27dad2013-08-02 22:25:34 +00005992 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5993 CmdArgs.push_back("-export_dynamic");
5994
Bob Wilsonb111ec92015-03-02 19:01:14 +00005995 // If we are using App Extension restrictions, pass a flag to the linker
5996 // telling it that the compiled code has been audited.
5997 if (Args.hasFlag(options::OPT_fapplication_extension,
5998 options::OPT_fno_application_extension, false))
5999 CmdArgs.push_back("-application_extension");
6000
Bill Wendling313b6bf2012-11-16 23:03:00 +00006001 // If we are using LTO, then automatically create a temporary file path for
6002 // the linker to use, so that it's lifetime will extend past a possible
6003 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006004 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6005 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006006 const char *TmpPath = C.getArgs().MakeArgString(
6007 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6008 C.addTempFile(TmpPath);
6009 CmdArgs.push_back("-object_path_lto");
6010 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006011 }
6012
Daniel Dunbarc1964212009-03-26 16:23:12 +00006013 // Derived from the "link" spec.
6014 Args.AddAllArgs(CmdArgs, options::OPT_static);
6015 if (!Args.hasArg(options::OPT_static))
6016 CmdArgs.push_back("-dynamic");
6017 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6018 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6019 // here. How do we wish to handle such things?
6020 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006021
Daniel Dunbarc1964212009-03-26 16:23:12 +00006022 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006023 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006024 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006025 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006026
6027 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6028 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6029 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6030
6031 Arg *A;
6032 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6033 (A = Args.getLastArg(options::OPT_current__version)) ||
6034 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006035 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006036 << A->getAsString(Args) << "-dynamiclib";
6037
6038 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6039 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6040 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6041 } else {
6042 CmdArgs.push_back("-dylib");
6043
6044 Arg *A;
6045 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6046 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6047 (A = Args.getLastArg(options::OPT_client__name)) ||
6048 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6049 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6050 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006051 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006052 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006053
Daniel Dunbarc1964212009-03-26 16:23:12 +00006054 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6055 "-dylib_compatibility_version");
6056 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6057 "-dylib_current_version");
6058
Tim Northover157d9112014-01-16 08:48:16 +00006059 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006060
6061 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6062 "-dylib_install_name");
6063 }
6064
6065 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6066 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6067 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006068 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006069 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006070 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6071 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6072 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6073 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6074 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6075 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006076 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006077 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6078 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6079 Args.AddAllArgs(CmdArgs, options::OPT_init);
6080
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006081 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006082 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006083
Daniel Dunbarc1964212009-03-26 16:23:12 +00006084 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6085 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6086 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6087 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6088 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006089
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006090 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6091 options::OPT_fno_pie,
6092 options::OPT_fno_PIE)) {
6093 if (A->getOption().matches(options::OPT_fpie) ||
6094 A->getOption().matches(options::OPT_fPIE))
6095 CmdArgs.push_back("-pie");
6096 else
6097 CmdArgs.push_back("-no_pie");
6098 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006099
6100 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6101 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6102 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6103 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6104 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6105 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6106 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6107 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6108 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6109 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6110 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6111 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6112 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6113 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6114 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6115 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006116
Daniel Dunbar84384642011-05-02 21:03:47 +00006117 // Give --sysroot= preference, over the Apple specific behavior to also use
6118 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006119 StringRef sysroot = C.getSysRoot();
6120 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006121 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006122 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006123 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6124 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006125 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006126 }
6127
Daniel Dunbarc1964212009-03-26 16:23:12 +00006128 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6129 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6130 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6131 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6132 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006133 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006134 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6135 Args.AddAllArgs(CmdArgs, options::OPT_y);
6136 Args.AddLastArg(CmdArgs, options::OPT_w);
6137 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6138 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6139 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6140 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6141 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6142 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6143 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6144 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6145 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6146 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6147 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6148 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6149}
6150
Alexey Bataev186b28a2014-03-06 05:43:53 +00006151enum LibOpenMP {
6152 LibUnknown,
6153 LibGOMP,
6154 LibIOMP5
6155};
6156
Daniel Dunbarc1964212009-03-26 16:23:12 +00006157void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006158 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006159 const InputInfoList &Inputs,
6160 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006161 const char *LinkingOutput) const {
6162 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006163
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006164 // If the number of arguments surpasses the system limits, we will encode the
6165 // input files in a separate file, shortening the command line. To this end,
6166 // build a list of input file names that can be passed via a file with the
6167 // -filelist linker option.
6168 llvm::opt::ArgStringList InputFileList;
6169
Daniel Dunbarc1964212009-03-26 16:23:12 +00006170 // The logic here is derived from gcc's behavior; most of which
6171 // comes from specs (starting with link_command). Consult gcc for
6172 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006173 ArgStringList CmdArgs;
6174
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006175 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6176 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6177 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006178 for (const auto &Arg : Args)
6179 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006180 const char *Exec =
6181 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6182 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006183 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006184 return;
6185 }
6186
Daniel Dunbarc1964212009-03-26 16:23:12 +00006187 // I'm not sure why this particular decomposition exists in gcc, but
6188 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006189 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006190
Daniel Dunbarc1964212009-03-26 16:23:12 +00006191 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6192 Args.AddAllArgs(CmdArgs, options::OPT_s);
6193 Args.AddAllArgs(CmdArgs, options::OPT_t);
6194 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6195 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006196 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006197 Args.AddAllArgs(CmdArgs, options::OPT_r);
6198
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006199 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6200 // members of static archive libraries which implement Objective-C classes or
6201 // categories.
6202 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6203 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006204
Daniel Dunbarc1964212009-03-26 16:23:12 +00006205 CmdArgs.push_back("-o");
6206 CmdArgs.push_back(Output.getFilename());
6207
Chad Rosier06fd3c62012-05-16 23:45:12 +00006208 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006209 !Args.hasArg(options::OPT_nostartfiles))
6210 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006211
6212 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006213
Alexey Bataev186b28a2014-03-06 05:43:53 +00006214 LibOpenMP UsedOpenMPLib = LibUnknown;
6215 if (Args.hasArg(options::OPT_fopenmp)) {
6216 UsedOpenMPLib = LibGOMP;
6217 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6218 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6219 .Case("libgomp", LibGOMP)
6220 .Case("libiomp5", LibIOMP5)
6221 .Default(LibUnknown);
6222 if (UsedOpenMPLib == LibUnknown)
6223 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6224 << A->getOption().getName() << A->getValue();
6225 }
6226 switch (UsedOpenMPLib) {
6227 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006228 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006229 break;
6230 case LibIOMP5:
6231 CmdArgs.push_back("-liomp5");
6232 break;
6233 case LibUnknown:
6234 break;
6235 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006236
Douglas Gregor9295df02012-05-15 21:00:27 +00006237 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006238 // Build the input file for -filelist (list of linker input files) in case we
6239 // need it later
6240 for (const auto &II : Inputs) {
6241 if (!II.isFilename()) {
6242 // This is a linker input argument.
6243 // We cannot mix input arguments and file names in a -filelist input, thus
6244 // we prematurely stop our list (remaining files shall be passed as
6245 // arguments).
6246 if (InputFileList.size() > 0)
6247 break;
6248
6249 continue;
6250 }
6251
6252 InputFileList.push_back(II.getFilename());
6253 }
6254
Bob Wilson16d93952012-05-15 18:57:39 +00006255 if (isObjCRuntimeLinked(Args) &&
6256 !Args.hasArg(options::OPT_nostdlib) &&
6257 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006258 // We use arclite library for both ARC and subscripting support.
6259 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6260
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006261 CmdArgs.push_back("-framework");
6262 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006263 // Link libobj.
6264 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006265 }
John McCall31168b02011-06-15 23:02:42 +00006266
Daniel Dunbarc1964212009-03-26 16:23:12 +00006267 if (LinkingOutput) {
6268 CmdArgs.push_back("-arch_multiple");
6269 CmdArgs.push_back("-final_output");
6270 CmdArgs.push_back(LinkingOutput);
6271 }
6272
Daniel Dunbarc1964212009-03-26 16:23:12 +00006273 if (Args.hasArg(options::OPT_fnested_functions))
6274 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006275
Daniel Dunbarc1964212009-03-26 16:23:12 +00006276 if (!Args.hasArg(options::OPT_nostdlib) &&
6277 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006278 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006279 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006280
Daniel Dunbarc1964212009-03-26 16:23:12 +00006281 // link_ssp spec is empty.
6282
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006283 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006284 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006285 }
6286
Chad Rosier06fd3c62012-05-16 23:45:12 +00006287 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006288 !Args.hasArg(options::OPT_nostartfiles)) {
6289 // endfile_spec is empty.
6290 }
6291
6292 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6293 Args.AddAllArgs(CmdArgs, options::OPT_F);
6294
Steven Wu3ffb61b2015-02-06 18:08:29 +00006295 // -iframework should be forwarded as -F.
6296 for (auto it = Args.filtered_begin(options::OPT_iframework),
6297 ie = Args.filtered_end(); it != ie; ++it)
6298 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6299 (*it)->getValue()));
6300
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006301 if (!Args.hasArg(options::OPT_nostdlib) &&
6302 !Args.hasArg(options::OPT_nodefaultlibs)) {
6303 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6304 if (A->getValue() == StringRef("Accelerate")) {
6305 CmdArgs.push_back("-framework");
6306 CmdArgs.push_back("Accelerate");
6307 }
6308 }
6309 }
6310
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006311 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006312 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006313 std::unique_ptr<Command> Cmd =
6314 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6315 Cmd->setInputFileList(std::move(InputFileList));
6316 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006317}
6318
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006319void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006320 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006321 const InputInfoList &Inputs,
6322 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006323 const char *LinkingOutput) const {
6324 ArgStringList CmdArgs;
6325
6326 CmdArgs.push_back("-create");
6327 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006328
6329 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006330 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006331
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006332 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006333 assert(II.isFilename() && "Unexpected lipo input.");
6334 CmdArgs.push_back(II.getFilename());
6335 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006336
6337 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006338 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006339}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006340
Daniel Dunbar88299622010-06-04 18:28:36 +00006341void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006342 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006343 const InputInfoList &Inputs,
6344 const ArgList &Args,
6345 const char *LinkingOutput) const {
6346 ArgStringList CmdArgs;
6347
Daniel Dunbareb86b042011-05-09 17:23:16 +00006348 CmdArgs.push_back("-o");
6349 CmdArgs.push_back(Output.getFilename());
6350
Daniel Dunbar88299622010-06-04 18:28:36 +00006351 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6352 const InputInfo &Input = Inputs[0];
6353 assert(Input.isFilename() && "Unexpected dsymutil input.");
6354 CmdArgs.push_back(Input.getFilename());
6355
Daniel Dunbar88299622010-06-04 18:28:36 +00006356 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006357 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006358 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006359}
6360
Eric Christopher551ef452011-08-23 17:56:55 +00006361void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006362 const InputInfo &Output,
6363 const InputInfoList &Inputs,
6364 const ArgList &Args,
6365 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006366 ArgStringList CmdArgs;
6367 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006368 CmdArgs.push_back("--debug-info");
6369 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006370 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006371
6372 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6373 const InputInfo &Input = Inputs[0];
6374 assert(Input.isFilename() && "Unexpected verify input");
6375
6376 // Grabbing the output of the earlier dsymutil run.
6377 CmdArgs.push_back(Input.getFilename());
6378
6379 const char *Exec =
6380 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006381 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006382}
6383
David Chisnallf571cde2012-02-15 13:39:01 +00006384void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6385 const InputInfo &Output,
6386 const InputInfoList &Inputs,
6387 const ArgList &Args,
6388 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006389 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006390 ArgStringList CmdArgs;
6391
6392 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6393 options::OPT_Xassembler);
6394
6395 CmdArgs.push_back("-o");
6396 CmdArgs.push_back(Output.getFilename());
6397
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006398 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006399 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006400
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006401 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006402 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006403}
6404
David Chisnallf571cde2012-02-15 13:39:01 +00006405void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6406 const InputInfo &Output,
6407 const InputInfoList &Inputs,
6408 const ArgList &Args,
6409 const char *LinkingOutput) const {
6410 // FIXME: Find a real GCC, don't hard-code versions here
6411 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6412 const llvm::Triple &T = getToolChain().getTriple();
6413 std::string LibPath = "/usr/lib/";
6414 llvm::Triple::ArchType Arch = T.getArch();
6415 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006416 case llvm::Triple::x86:
6417 GCCLibPath +=
6418 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6419 break;
6420 case llvm::Triple::x86_64:
6421 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6422 GCCLibPath += "/4.5.2/amd64/";
6423 LibPath += "amd64/";
6424 break;
6425 default:
6426 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006427 }
6428
6429 ArgStringList CmdArgs;
6430
David Chisnall272a0712012-02-29 15:06:12 +00006431 // Demangle C++ names in errors
6432 CmdArgs.push_back("-C");
6433
David Chisnallf571cde2012-02-15 13:39:01 +00006434 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6435 (!Args.hasArg(options::OPT_shared))) {
6436 CmdArgs.push_back("-e");
6437 CmdArgs.push_back("_start");
6438 }
6439
6440 if (Args.hasArg(options::OPT_static)) {
6441 CmdArgs.push_back("-Bstatic");
6442 CmdArgs.push_back("-dn");
6443 } else {
6444 CmdArgs.push_back("-Bdynamic");
6445 if (Args.hasArg(options::OPT_shared)) {
6446 CmdArgs.push_back("-shared");
6447 } else {
6448 CmdArgs.push_back("--dynamic-linker");
6449 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6450 }
6451 }
6452
6453 if (Output.isFilename()) {
6454 CmdArgs.push_back("-o");
6455 CmdArgs.push_back(Output.getFilename());
6456 } else {
6457 assert(Output.isNothing() && "Invalid output.");
6458 }
6459
6460 if (!Args.hasArg(options::OPT_nostdlib) &&
6461 !Args.hasArg(options::OPT_nostartfiles)) {
6462 if (!Args.hasArg(options::OPT_shared)) {
6463 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6464 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006465 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006466 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6467 } else {
6468 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006469 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6470 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006471 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006472 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006473 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006474 }
6475
6476 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6477
6478 Args.AddAllArgs(CmdArgs, options::OPT_L);
6479 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6480 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006481 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006482
6483 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6484
6485 if (!Args.hasArg(options::OPT_nostdlib) &&
6486 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006487 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006488 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006489 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006490 if (!Args.hasArg(options::OPT_shared)) {
6491 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006492 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006493 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006494 }
David Chisnallf571cde2012-02-15 13:39:01 +00006495 }
6496
6497 if (!Args.hasArg(options::OPT_nostdlib) &&
6498 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006499 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006500 }
David Chisnall96de9932012-02-16 16:00:47 +00006501 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006502
Alexey Samsonov7811d192014-02-20 13:57:37 +00006503 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006504
6505 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006506 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006507 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006508}
6509
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006510void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006511 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006512 const InputInfoList &Inputs,
6513 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006514 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006515 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006516 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006517 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006518
Rafael Espindolacc126272014-02-28 01:55:21 +00006519 switch (getToolChain().getArch()) {
6520 case llvm::Triple::x86:
6521 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6522 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006523 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006524 break;
6525
6526 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006527 CmdArgs.push_back("-mppc");
6528 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006529 break;
6530
6531 case llvm::Triple::sparc:
6532 CmdArgs.push_back("-32");
6533 NeedsKPIC = true;
6534 break;
6535
6536 case llvm::Triple::sparcv9:
6537 CmdArgs.push_back("-64");
6538 CmdArgs.push_back("-Av9a");
6539 NeedsKPIC = true;
6540 break;
6541
6542 case llvm::Triple::mips64:
6543 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006544 StringRef CPUName;
6545 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006546 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006547
6548 CmdArgs.push_back("-mabi");
6549 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6550
6551 if (getToolChain().getArch() == llvm::Triple::mips64)
6552 CmdArgs.push_back("-EB");
6553 else
6554 CmdArgs.push_back("-EL");
6555
Rafael Espindolacc126272014-02-28 01:55:21 +00006556 NeedsKPIC = true;
6557 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006558 }
6559
Rafael Espindolacc126272014-02-28 01:55:21 +00006560 default:
6561 break;
6562 }
6563
6564 if (NeedsKPIC)
6565 addAssemblerKPIC(Args, CmdArgs);
6566
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006567 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6568 options::OPT_Xassembler);
6569
6570 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006571 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006572
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006573 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006574 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006575
6576 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006577 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006578 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006579}
6580
6581void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006582 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006583 const InputInfoList &Inputs,
6584 const ArgList &Args,
6585 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006586 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006587 ArgStringList CmdArgs;
6588
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006589 // Silence warning for "clang -g foo.o -o foo"
6590 Args.ClaimAllArgs(options::OPT_g_Group);
6591 // and "clang -emit-llvm foo.o -o foo"
6592 Args.ClaimAllArgs(options::OPT_emit_llvm);
6593 // and for "clang -w foo.o -o foo". Other warning options are already
6594 // handled somewhere else.
6595 Args.ClaimAllArgs(options::OPT_w);
6596
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006597 if (getToolChain().getArch() == llvm::Triple::mips64)
6598 CmdArgs.push_back("-EB");
6599 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6600 CmdArgs.push_back("-EL");
6601
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006602 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006603 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006604 CmdArgs.push_back("-e");
6605 CmdArgs.push_back("__start");
6606 }
6607
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006608 if (Args.hasArg(options::OPT_static)) {
6609 CmdArgs.push_back("-Bstatic");
6610 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006611 if (Args.hasArg(options::OPT_rdynamic))
6612 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006613 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006614 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006615 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006616 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006617 } else {
6618 CmdArgs.push_back("-dynamic-linker");
6619 CmdArgs.push_back("/usr/libexec/ld.so");
6620 }
6621 }
6622
Rafael Espindola044f7832013-06-05 04:28:55 +00006623 if (Args.hasArg(options::OPT_nopie))
6624 CmdArgs.push_back("-nopie");
6625
Daniel Dunbarb440f562010-08-02 02:38:21 +00006626 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006627 CmdArgs.push_back("-o");
6628 CmdArgs.push_back(Output.getFilename());
6629 } else {
6630 assert(Output.isNothing() && "Invalid output.");
6631 }
6632
6633 if (!Args.hasArg(options::OPT_nostdlib) &&
6634 !Args.hasArg(options::OPT_nostartfiles)) {
6635 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006636 if (Args.hasArg(options::OPT_pg))
6637 CmdArgs.push_back(Args.MakeArgString(
6638 getToolChain().GetFilePath("gcrt0.o")));
6639 else
6640 CmdArgs.push_back(Args.MakeArgString(
6641 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006642 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006643 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006644 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006645 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006646 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006647 }
6648 }
6649
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006650 std::string Triple = getToolChain().getTripleString();
6651 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006652 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006653 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006654 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006655
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006656 Args.AddAllArgs(CmdArgs, options::OPT_L);
6657 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6658 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006659 Args.AddAllArgs(CmdArgs, options::OPT_s);
6660 Args.AddAllArgs(CmdArgs, options::OPT_t);
6661 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6662 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006663
Daniel Dunbar54423b22010-09-17 00:24:54 +00006664 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006665
6666 if (!Args.hasArg(options::OPT_nostdlib) &&
6667 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006668 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006669 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006670 if (Args.hasArg(options::OPT_pg))
6671 CmdArgs.push_back("-lm_p");
6672 else
6673 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006674 }
6675
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006676 // FIXME: For some reason GCC passes -lgcc before adding
6677 // the default system libraries. Just mimic this for now.
6678 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006679
Eric Christopher17674ec2012-09-13 06:32:34 +00006680 if (Args.hasArg(options::OPT_pthread)) {
6681 if (!Args.hasArg(options::OPT_shared) &&
6682 Args.hasArg(options::OPT_pg))
6683 CmdArgs.push_back("-lpthread_p");
6684 else
6685 CmdArgs.push_back("-lpthread");
6686 }
6687
Chandler Carruth45661652011-12-17 22:32:42 +00006688 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006689 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006690 CmdArgs.push_back("-lc_p");
6691 else
6692 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006693 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006694
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006695 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006696 }
6697
6698 if (!Args.hasArg(options::OPT_nostdlib) &&
6699 !Args.hasArg(options::OPT_nostartfiles)) {
6700 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006701 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006702 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006703 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006704 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006705 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006706 }
6707
6708 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006709 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006710 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006711}
Ed Schoutene33194b2009-04-02 19:13:12 +00006712
Eli Friedman9fa28852012-08-08 23:57:20 +00006713void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6714 const InputInfo &Output,
6715 const InputInfoList &Inputs,
6716 const ArgList &Args,
6717 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006718 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006719 ArgStringList CmdArgs;
6720
6721 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6722 options::OPT_Xassembler);
6723
6724 CmdArgs.push_back("-o");
6725 CmdArgs.push_back(Output.getFilename());
6726
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006727 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006728 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006729
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006730 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006731 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006732}
6733
6734void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6735 const InputInfo &Output,
6736 const InputInfoList &Inputs,
6737 const ArgList &Args,
6738 const char *LinkingOutput) const {
6739 const Driver &D = getToolChain().getDriver();
6740 ArgStringList CmdArgs;
6741
6742 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6743 (!Args.hasArg(options::OPT_shared))) {
6744 CmdArgs.push_back("-e");
6745 CmdArgs.push_back("__start");
6746 }
6747
6748 if (Args.hasArg(options::OPT_static)) {
6749 CmdArgs.push_back("-Bstatic");
6750 } else {
6751 if (Args.hasArg(options::OPT_rdynamic))
6752 CmdArgs.push_back("-export-dynamic");
6753 CmdArgs.push_back("--eh-frame-hdr");
6754 CmdArgs.push_back("-Bdynamic");
6755 if (Args.hasArg(options::OPT_shared)) {
6756 CmdArgs.push_back("-shared");
6757 } else {
6758 CmdArgs.push_back("-dynamic-linker");
6759 CmdArgs.push_back("/usr/libexec/ld.so");
6760 }
6761 }
6762
6763 if (Output.isFilename()) {
6764 CmdArgs.push_back("-o");
6765 CmdArgs.push_back(Output.getFilename());
6766 } else {
6767 assert(Output.isNothing() && "Invalid output.");
6768 }
6769
6770 if (!Args.hasArg(options::OPT_nostdlib) &&
6771 !Args.hasArg(options::OPT_nostartfiles)) {
6772 if (!Args.hasArg(options::OPT_shared)) {
6773 if (Args.hasArg(options::OPT_pg))
6774 CmdArgs.push_back(Args.MakeArgString(
6775 getToolChain().GetFilePath("gcrt0.o")));
6776 else
6777 CmdArgs.push_back(Args.MakeArgString(
6778 getToolChain().GetFilePath("crt0.o")));
6779 CmdArgs.push_back(Args.MakeArgString(
6780 getToolChain().GetFilePath("crtbegin.o")));
6781 } else {
6782 CmdArgs.push_back(Args.MakeArgString(
6783 getToolChain().GetFilePath("crtbeginS.o")));
6784 }
6785 }
6786
6787 Args.AddAllArgs(CmdArgs, options::OPT_L);
6788 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6789 Args.AddAllArgs(CmdArgs, options::OPT_e);
6790
6791 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6792
6793 if (!Args.hasArg(options::OPT_nostdlib) &&
6794 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006795 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006796 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6797 if (Args.hasArg(options::OPT_pg))
6798 CmdArgs.push_back("-lm_p");
6799 else
6800 CmdArgs.push_back("-lm");
6801 }
6802
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006803 if (Args.hasArg(options::OPT_pthread)) {
6804 if (!Args.hasArg(options::OPT_shared) &&
6805 Args.hasArg(options::OPT_pg))
6806 CmdArgs.push_back("-lpthread_p");
6807 else
6808 CmdArgs.push_back("-lpthread");
6809 }
6810
Eli Friedman9fa28852012-08-08 23:57:20 +00006811 if (!Args.hasArg(options::OPT_shared)) {
6812 if (Args.hasArg(options::OPT_pg))
6813 CmdArgs.push_back("-lc_p");
6814 else
6815 CmdArgs.push_back("-lc");
6816 }
6817
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006818 StringRef MyArch;
6819 switch (getToolChain().getTriple().getArch()) {
6820 case llvm::Triple::arm:
6821 MyArch = "arm";
6822 break;
6823 case llvm::Triple::x86:
6824 MyArch = "i386";
6825 break;
6826 case llvm::Triple::x86_64:
6827 MyArch = "amd64";
6828 break;
6829 default:
6830 llvm_unreachable("Unsupported architecture");
6831 }
6832 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006833 }
6834
6835 if (!Args.hasArg(options::OPT_nostdlib) &&
6836 !Args.hasArg(options::OPT_nostartfiles)) {
6837 if (!Args.hasArg(options::OPT_shared))
6838 CmdArgs.push_back(Args.MakeArgString(
6839 getToolChain().GetFilePath("crtend.o")));
6840 else
6841 CmdArgs.push_back(Args.MakeArgString(
6842 getToolChain().GetFilePath("crtendS.o")));
6843 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006844
6845 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006846 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006847 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006848}
6849
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006850void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006851 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006852 const InputInfoList &Inputs,
6853 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006854 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006855 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006856 ArgStringList CmdArgs;
6857
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006858 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6859 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006860 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006861 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006862 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006863 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006864 else if (getToolChain().getArch() == llvm::Triple::mips ||
6865 getToolChain().getArch() == llvm::Triple::mipsel ||
6866 getToolChain().getArch() == llvm::Triple::mips64 ||
6867 getToolChain().getArch() == llvm::Triple::mips64el) {
6868 StringRef CPUName;
6869 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006870 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006871
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006872 CmdArgs.push_back("-march");
6873 CmdArgs.push_back(CPUName.data());
6874
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006875 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006876 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006877
6878 if (getToolChain().getArch() == llvm::Triple::mips ||
6879 getToolChain().getArch() == llvm::Triple::mips64)
6880 CmdArgs.push_back("-EB");
6881 else
6882 CmdArgs.push_back("-EL");
6883
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006884 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006885 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006886 getToolChain().getArch() == llvm::Triple::armeb ||
6887 getToolChain().getArch() == llvm::Triple::thumb ||
6888 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006889 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006890 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006891 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6892
6893 if (FloatABI == "hard") {
6894 CmdArgs.push_back("-mfpu=vfp");
6895 } else {
6896 CmdArgs.push_back("-mfpu=softvfp");
6897 }
6898
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006899 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006900 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006901 case llvm::Triple::GNUEABI:
6902 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006903 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006904 break;
6905
6906 default:
6907 CmdArgs.push_back("-matpcs");
6908 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006909 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006910 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006911 if (getToolChain().getArch() == llvm::Triple::sparc)
6912 CmdArgs.push_back("-Av8plusa");
6913 else
6914 CmdArgs.push_back("-Av9a");
6915
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006916 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006917 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006918
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6920 options::OPT_Xassembler);
6921
6922 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006923 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006924
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006925 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006926 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006927
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006928 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006929 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006930}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006931
6932void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006933 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006934 const InputInfoList &Inputs,
6935 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006936 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006937 const toolchains::FreeBSD& ToolChain =
6938 static_cast<const toolchains::FreeBSD&>(getToolChain());
6939 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006940 const bool IsPIE =
6941 !Args.hasArg(options::OPT_shared) &&
6942 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006943 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006944
6945 // Silence warning for "clang -g foo.o -o foo"
6946 Args.ClaimAllArgs(options::OPT_g_Group);
6947 // and "clang -emit-llvm foo.o -o foo"
6948 Args.ClaimAllArgs(options::OPT_emit_llvm);
6949 // and for "clang -w foo.o -o foo". Other warning options are already
6950 // handled somewhere else.
6951 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006952
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006953 if (!D.SysRoot.empty())
6954 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6955
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006956 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006957 CmdArgs.push_back("-pie");
6958
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006959 if (Args.hasArg(options::OPT_static)) {
6960 CmdArgs.push_back("-Bstatic");
6961 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006962 if (Args.hasArg(options::OPT_rdynamic))
6963 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006964 CmdArgs.push_back("--eh-frame-hdr");
6965 if (Args.hasArg(options::OPT_shared)) {
6966 CmdArgs.push_back("-Bshareable");
6967 } else {
6968 CmdArgs.push_back("-dynamic-linker");
6969 CmdArgs.push_back("/libexec/ld-elf.so.1");
6970 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006971 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6972 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006973 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6974 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6975 CmdArgs.push_back("--hash-style=both");
6976 }
6977 }
6978 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006979 }
6980
6981 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6982 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006983 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006984 CmdArgs.push_back("-m");
6985 CmdArgs.push_back("elf_i386_fbsd");
6986 }
6987
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006988 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006989 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006990 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006991 }
6992
Daniel Dunbarb440f562010-08-02 02:38:21 +00006993 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006994 CmdArgs.push_back("-o");
6995 CmdArgs.push_back(Output.getFilename());
6996 } else {
6997 assert(Output.isNothing() && "Invalid output.");
6998 }
6999
7000 if (!Args.hasArg(options::OPT_nostdlib) &&
7001 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007002 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007003 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007004 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007005 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007006 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007007 crt1 = "Scrt1.o";
7008 else
7009 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007010 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007011 if (crt1)
7012 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7013
7014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7015
Craig Topper92fc2df2014-05-17 16:56:41 +00007016 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007017 if (Args.hasArg(options::OPT_static))
7018 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007019 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007020 crtbegin = "crtbeginS.o";
7021 else
7022 crtbegin = "crtbegin.o";
7023
7024 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007025 }
7026
7027 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007028 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007029 for (const auto &Path : Paths)
7030 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007031 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7032 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007033 Args.AddAllArgs(CmdArgs, options::OPT_s);
7034 Args.AddAllArgs(CmdArgs, options::OPT_t);
7035 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7036 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007037
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007038 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007039 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007040
Alexey Samsonov52550342014-09-15 19:58:40 +00007041 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007042 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007043
7044 if (!Args.hasArg(options::OPT_nostdlib) &&
7045 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007046 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007047 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007048 if (Args.hasArg(options::OPT_pg))
7049 CmdArgs.push_back("-lm_p");
7050 else
7051 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007052 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007053 if (NeedsSanitizerDeps)
7054 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007055 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7056 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007057 if (Args.hasArg(options::OPT_pg))
7058 CmdArgs.push_back("-lgcc_p");
7059 else
7060 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007061 if (Args.hasArg(options::OPT_static)) {
7062 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007063 } else if (Args.hasArg(options::OPT_pg)) {
7064 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007065 } else {
7066 CmdArgs.push_back("--as-needed");
7067 CmdArgs.push_back("-lgcc_s");
7068 CmdArgs.push_back("--no-as-needed");
7069 }
7070
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007071 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007072 if (Args.hasArg(options::OPT_pg))
7073 CmdArgs.push_back("-lpthread_p");
7074 else
7075 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007076 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007077
Roman Divacky66f22762011-02-10 16:59:40 +00007078 if (Args.hasArg(options::OPT_pg)) {
7079 if (Args.hasArg(options::OPT_shared))
7080 CmdArgs.push_back("-lc");
7081 else
7082 CmdArgs.push_back("-lc_p");
7083 CmdArgs.push_back("-lgcc_p");
7084 } else {
7085 CmdArgs.push_back("-lc");
7086 CmdArgs.push_back("-lgcc");
7087 }
7088
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007089 if (Args.hasArg(options::OPT_static)) {
7090 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007091 } else if (Args.hasArg(options::OPT_pg)) {
7092 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007093 } else {
7094 CmdArgs.push_back("--as-needed");
7095 CmdArgs.push_back("-lgcc_s");
7096 CmdArgs.push_back("--no-as-needed");
7097 }
7098 }
7099
7100 if (!Args.hasArg(options::OPT_nostdlib) &&
7101 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007102 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007103 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007104 else
7105 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007106 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007107 }
7108
Alexey Samsonov7811d192014-02-20 13:57:37 +00007109 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007110
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007111 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007112 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007113 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007114}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007115
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007116void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7117 const InputInfo &Output,
7118 const InputInfoList &Inputs,
7119 const ArgList &Args,
7120 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007121 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007122 ArgStringList CmdArgs;
7123
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007124 // GNU as needs different flags for creating the correct output format
7125 // on architectures with different ABIs or optional feature sets.
7126 switch (getToolChain().getArch()) {
7127 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007128 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007129 break;
7130 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007131 case llvm::Triple::armeb:
7132 case llvm::Triple::thumb:
7133 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007134 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007135 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007136 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007137 }
7138
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007139 case llvm::Triple::mips:
7140 case llvm::Triple::mipsel:
7141 case llvm::Triple::mips64:
7142 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007143 StringRef CPUName;
7144 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007145 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007146
7147 CmdArgs.push_back("-march");
7148 CmdArgs.push_back(CPUName.data());
7149
7150 CmdArgs.push_back("-mabi");
7151 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7152
7153 if (getToolChain().getArch() == llvm::Triple::mips ||
7154 getToolChain().getArch() == llvm::Triple::mips64)
7155 CmdArgs.push_back("-EB");
7156 else
7157 CmdArgs.push_back("-EL");
7158
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007159 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007160 break;
7161 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007162
7163 case llvm::Triple::sparc:
7164 CmdArgs.push_back("-32");
7165 addAssemblerKPIC(Args, CmdArgs);
7166 break;
7167
7168 case llvm::Triple::sparcv9:
7169 CmdArgs.push_back("-64");
7170 CmdArgs.push_back("-Av9");
7171 addAssemblerKPIC(Args, CmdArgs);
7172 break;
7173
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007174 default:
7175 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007176 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007177
7178 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7179 options::OPT_Xassembler);
7180
7181 CmdArgs.push_back("-o");
7182 CmdArgs.push_back(Output.getFilename());
7183
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007184 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007185 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007186
David Chisnallddbd68f2011-09-27 22:03:18 +00007187 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007188 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007189}
7190
7191void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7192 const InputInfo &Output,
7193 const InputInfoList &Inputs,
7194 const ArgList &Args,
7195 const char *LinkingOutput) const {
7196 const Driver &D = getToolChain().getDriver();
7197 ArgStringList CmdArgs;
7198
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007199 if (!D.SysRoot.empty())
7200 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7201
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007202 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007203 if (Args.hasArg(options::OPT_static)) {
7204 CmdArgs.push_back("-Bstatic");
7205 } else {
7206 if (Args.hasArg(options::OPT_rdynamic))
7207 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007208 if (Args.hasArg(options::OPT_shared)) {
7209 CmdArgs.push_back("-Bshareable");
7210 } else {
7211 CmdArgs.push_back("-dynamic-linker");
7212 CmdArgs.push_back("/libexec/ld.elf_so");
7213 }
7214 }
7215
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007216 // Many NetBSD architectures support more than one ABI.
7217 // Determine the correct emulation for ld.
7218 switch (getToolChain().getArch()) {
7219 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007220 CmdArgs.push_back("-m");
7221 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007222 break;
7223 case llvm::Triple::arm:
7224 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007225 CmdArgs.push_back("-m");
7226 switch (getToolChain().getTriple().getEnvironment()) {
7227 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007228 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007229 CmdArgs.push_back("armelf_nbsd_eabi");
7230 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007231 case llvm::Triple::EABIHF:
7232 case llvm::Triple::GNUEABIHF:
7233 CmdArgs.push_back("armelf_nbsd_eabihf");
7234 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007235 default:
7236 CmdArgs.push_back("armelf_nbsd");
7237 break;
7238 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007239 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007240 case llvm::Triple::armeb:
7241 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007242 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007243 CmdArgs.push_back("-m");
7244 switch (getToolChain().getTriple().getEnvironment()) {
7245 case llvm::Triple::EABI:
7246 case llvm::Triple::GNUEABI:
7247 CmdArgs.push_back("armelfb_nbsd_eabi");
7248 break;
7249 case llvm::Triple::EABIHF:
7250 case llvm::Triple::GNUEABIHF:
7251 CmdArgs.push_back("armelfb_nbsd_eabihf");
7252 break;
7253 default:
7254 CmdArgs.push_back("armelfb_nbsd");
7255 break;
7256 }
7257 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007258 case llvm::Triple::mips64:
7259 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007260 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007261 CmdArgs.push_back("-m");
7262 if (getToolChain().getArch() == llvm::Triple::mips64)
7263 CmdArgs.push_back("elf32btsmip");
7264 else
7265 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007266 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007267 CmdArgs.push_back("-m");
7268 if (getToolChain().getArch() == llvm::Triple::mips64)
7269 CmdArgs.push_back("elf64btsmip");
7270 else
7271 CmdArgs.push_back("elf64ltsmip");
7272 }
7273 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007274 case llvm::Triple::ppc:
7275 CmdArgs.push_back("-m");
7276 CmdArgs.push_back("elf32ppc_nbsd");
7277 break;
7278
7279 case llvm::Triple::ppc64:
7280 case llvm::Triple::ppc64le:
7281 CmdArgs.push_back("-m");
7282 CmdArgs.push_back("elf64ppc");
7283 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007284
7285 case llvm::Triple::sparc:
7286 CmdArgs.push_back("-m");
7287 CmdArgs.push_back("elf32_sparc");
7288 break;
7289
7290 case llvm::Triple::sparcv9:
7291 CmdArgs.push_back("-m");
7292 CmdArgs.push_back("elf64_sparc");
7293 break;
7294
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007295 default:
7296 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007297 }
7298
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007299 if (Output.isFilename()) {
7300 CmdArgs.push_back("-o");
7301 CmdArgs.push_back(Output.getFilename());
7302 } else {
7303 assert(Output.isNothing() && "Invalid output.");
7304 }
7305
7306 if (!Args.hasArg(options::OPT_nostdlib) &&
7307 !Args.hasArg(options::OPT_nostartfiles)) {
7308 if (!Args.hasArg(options::OPT_shared)) {
7309 CmdArgs.push_back(Args.MakeArgString(
7310 getToolChain().GetFilePath("crt0.o")));
7311 CmdArgs.push_back(Args.MakeArgString(
7312 getToolChain().GetFilePath("crti.o")));
7313 CmdArgs.push_back(Args.MakeArgString(
7314 getToolChain().GetFilePath("crtbegin.o")));
7315 } else {
7316 CmdArgs.push_back(Args.MakeArgString(
7317 getToolChain().GetFilePath("crti.o")));
7318 CmdArgs.push_back(Args.MakeArgString(
7319 getToolChain().GetFilePath("crtbeginS.o")));
7320 }
7321 }
7322
7323 Args.AddAllArgs(CmdArgs, options::OPT_L);
7324 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7325 Args.AddAllArgs(CmdArgs, options::OPT_e);
7326 Args.AddAllArgs(CmdArgs, options::OPT_s);
7327 Args.AddAllArgs(CmdArgs, options::OPT_t);
7328 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7329 Args.AddAllArgs(CmdArgs, options::OPT_r);
7330
7331 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7332
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007333 unsigned Major, Minor, Micro;
7334 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7335 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007336 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007337 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007338 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007339 case llvm::Triple::arm:
7340 case llvm::Triple::armeb:
7341 case llvm::Triple::thumb:
7342 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007343 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007344 case llvm::Triple::ppc64:
7345 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007346 case llvm::Triple::x86:
7347 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007348 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007349 break;
7350 default:
7351 break;
7352 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007353 }
7354
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007355 if (!Args.hasArg(options::OPT_nostdlib) &&
7356 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007357 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007358 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7359 CmdArgs.push_back("-lm");
7360 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007361 if (Args.hasArg(options::OPT_pthread))
7362 CmdArgs.push_back("-lpthread");
7363 CmdArgs.push_back("-lc");
7364
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007365 if (useLibgcc) {
7366 if (Args.hasArg(options::OPT_static)) {
7367 // libgcc_eh depends on libc, so resolve as much as possible,
7368 // pull in any new requirements from libc and then get the rest
7369 // of libgcc.
7370 CmdArgs.push_back("-lgcc_eh");
7371 CmdArgs.push_back("-lc");
7372 CmdArgs.push_back("-lgcc");
7373 } else {
7374 CmdArgs.push_back("-lgcc");
7375 CmdArgs.push_back("--as-needed");
7376 CmdArgs.push_back("-lgcc_s");
7377 CmdArgs.push_back("--no-as-needed");
7378 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007379 }
7380 }
7381
7382 if (!Args.hasArg(options::OPT_nostdlib) &&
7383 !Args.hasArg(options::OPT_nostartfiles)) {
7384 if (!Args.hasArg(options::OPT_shared))
7385 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7386 "crtend.o")));
7387 else
7388 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7389 "crtendS.o")));
7390 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7391 "crtn.o")));
7392 }
7393
Alexey Samsonov7811d192014-02-20 13:57:37 +00007394 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007395
Logan Chieneb9162f2014-06-26 14:23:45 +00007396 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007398}
7399
Thomas Schwinge4e555262013-03-28 19:04:25 +00007400void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7401 const InputInfo &Output,
7402 const InputInfoList &Inputs,
7403 const ArgList &Args,
7404 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007405 claimNoWarnArgs(Args);
7406
Rafael Espindola92b00932010-08-10 00:25:48 +00007407 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007408 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007409
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007410 switch (getToolChain().getArch()) {
7411 default:
7412 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007413 // Add --32/--64 to make sure we get the format we want.
7414 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007415 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007416 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007417 break;
7418 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007419 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7420 CmdArgs.push_back("--x32");
7421 else
7422 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007423 break;
7424 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007425 CmdArgs.push_back("-a32");
7426 CmdArgs.push_back("-mppc");
7427 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007428 break;
7429 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007430 CmdArgs.push_back("-a64");
7431 CmdArgs.push_back("-mppc64");
7432 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007433 break;
7434 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007435 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007436 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007437 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007438 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007439 break;
7440 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007441 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007442 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007443 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007444 break;
7445 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007446 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007447 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007448 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007449 break;
7450 case llvm::Triple::arm:
7451 case llvm::Triple::armeb:
7452 case llvm::Triple::thumb:
7453 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007454 const llvm::Triple &Triple = getToolChain().getTriple();
7455 switch (Triple.getSubArch()) {
7456 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007457 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007458 break;
7459 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007460 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007461 break;
7462 default:
7463 break;
7464 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007465
Tim Northover9c7e0352013-12-12 11:55:52 +00007466 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007467 getToolChain().getDriver(), Args,
7468 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007469 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007470
7471 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007472
7473 // FIXME: remove krait check when GNU tools support krait cpu
7474 // for now replace it with -march=armv7-a to avoid a lower
7475 // march from being picked in the absence of a cpu flag.
7476 Arg *A;
7477 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7478 StringRef(A->getValue()) == "krait")
7479 CmdArgs.push_back("-march=armv7-a");
7480 else
7481 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007482 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007483 break;
7484 }
7485 case llvm::Triple::mips:
7486 case llvm::Triple::mipsel:
7487 case llvm::Triple::mips64:
7488 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007489 StringRef CPUName;
7490 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007491 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007492 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007493
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007494 CmdArgs.push_back("-march");
7495 CmdArgs.push_back(CPUName.data());
7496
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007497 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007498 CmdArgs.push_back(ABIName.data());
7499
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007500 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7501 // or -mshared (not implemented) is in effect.
7502 bool IsPicOrPie = false;
7503 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7504 options::OPT_fpic, options::OPT_fno_pic,
7505 options::OPT_fPIE, options::OPT_fno_PIE,
7506 options::OPT_fpie, options::OPT_fno_pie)) {
7507 if (A->getOption().matches(options::OPT_fPIC) ||
7508 A->getOption().matches(options::OPT_fpic) ||
7509 A->getOption().matches(options::OPT_fPIE) ||
7510 A->getOption().matches(options::OPT_fpie))
7511 IsPicOrPie = true;
7512 }
7513 if (!IsPicOrPie)
7514 CmdArgs.push_back("-mno-shared");
7515
Daniel Sanders379d44b2014-07-16 11:52:23 +00007516 // LLVM doesn't support -mplt yet and acts as if it is always given.
7517 // However, -mplt has no effect with the N64 ABI.
7518 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007519
7520 if (getToolChain().getArch() == llvm::Triple::mips ||
7521 getToolChain().getArch() == llvm::Triple::mips64)
7522 CmdArgs.push_back("-EB");
7523 else
7524 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007525
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007526 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7527 if (StringRef(A->getValue()) == "2008")
7528 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7529 }
7530
Daniel Sanders379d44b2014-07-16 11:52:23 +00007531 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7532 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7533 options::OPT_mfp64)) {
7534 A->claim();
7535 A->render(Args, CmdArgs);
7536 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7537 ABIName))
7538 CmdArgs.push_back("-mfpxx");
7539
7540 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7541 // -mno-mips16 is actually -no-mips16.
7542 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7543 options::OPT_mno_mips16)) {
7544 if (A->getOption().matches(options::OPT_mips16)) {
7545 A->claim();
7546 A->render(Args, CmdArgs);
7547 } else {
7548 A->claim();
7549 CmdArgs.push_back("-no-mips16");
7550 }
7551 }
7552
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007553 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7554 options::OPT_mno_micromips);
7555 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7556 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7557
Simon Atanasyanbd986632013-11-26 11:58:04 +00007558 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7559 // Do not use AddLastArg because not all versions of MIPS assembler
7560 // support -mmsa / -mno-msa options.
7561 if (A->getOption().matches(options::OPT_mmsa))
7562 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7563 }
7564
Daniel Sanders379d44b2014-07-16 11:52:23 +00007565 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7566 options::OPT_msoft_float);
7567
7568 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7569 options::OPT_mno_odd_spreg);
7570
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007571 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007572 break;
7573 }
7574 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007575 // Always pass an -march option, since our default of z10 is later
7576 // than the GNU assembler's default.
7577 StringRef CPUName = getSystemZTargetCPU(Args);
7578 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007579 break;
7580 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007581 }
7582
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007583 if (NeedsKPIC)
7584 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007585
7586 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7587 options::OPT_Xassembler);
7588
7589 CmdArgs.push_back("-o");
7590 CmdArgs.push_back(Output.getFilename());
7591
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007592 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007593 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007594
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007595 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007596 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007597
7598 // Handle the debug info splitting at object creation time if we're
7599 // creating an object.
7600 // TODO: Currently only works on linux with newer objcopy.
7601 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007602 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007603 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7604 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007605}
7606
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007607static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007608 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007609 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007610 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7611 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007612 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007613 CmdArgs.push_back("-lgcc");
7614
Logan Chien3d3373c2012-11-19 12:04:11 +00007615 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007616 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007617 CmdArgs.push_back("-lgcc");
7618 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007619 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007620 CmdArgs.push_back("--as-needed");
7621 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007622 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007623 CmdArgs.push_back("--no-as-needed");
7624 }
7625
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007626 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007627 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007628 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007629 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007630
7631 // According to Android ABI, we have to link with libdl if we are
7632 // linking with non-static libgcc.
7633 //
7634 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7635 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7636 if (isAndroid && !StaticLibgcc)
7637 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007638}
7639
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007640static std::string getLinuxDynamicLinker(const ArgList &Args,
7641 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007642 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7643 if (ToolChain.getTriple().isArch64Bit())
7644 return "/system/bin/linker64";
7645 else
7646 return "/system/bin/linker";
7647 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7648 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007649 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007650 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007651 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007652 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007653 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007654 else if (ToolChain.getArch() == llvm::Triple::arm ||
7655 ToolChain.getArch() == llvm::Triple::thumb) {
7656 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7657 return "/lib/ld-linux-armhf.so.3";
7658 else
7659 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007660 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7661 ToolChain.getArch() == llvm::Triple::thumbeb) {
7662 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7663 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7664 else
7665 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007666 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007667 ToolChain.getArch() == llvm::Triple::mipsel ||
7668 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007669 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007670 StringRef CPUName;
7671 StringRef ABIName;
7672 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7673 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7674
7675 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7676 .Case("o32", "/lib")
7677 .Case("n32", "/lib32")
7678 .Case("n64", "/lib64")
7679 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007680 StringRef LibName;
7681 if (mips::isUCLibc(Args))
7682 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7683 else
7684 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007685
7686 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007687 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7688 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007689 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7690 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7691 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007692 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007693 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7694 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7695 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007696 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007697 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7698 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007699 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7700 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007701 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7702 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7703 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007704 else
7705 return "/lib64/ld-linux-x86-64.so.2";
7706}
7707
Renato Golinc4b49242014-02-13 10:01:16 +00007708static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007709 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007710 // Make use of compiler-rt if --rtlib option is used
7711 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7712
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007713 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007714 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007715 switch (TC.getTriple().getOS()) {
7716 default: llvm_unreachable("unsupported OS");
7717 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007718 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007719 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007720 break;
7721 }
Renato Golinc4b49242014-02-13 10:01:16 +00007722 break;
7723 case ToolChain::RLT_Libgcc:
7724 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7725 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007726 }
7727}
7728
Rafael Espindola1e085772014-08-15 17:14:35 +00007729static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7730 switch (T.getArch()) {
7731 case llvm::Triple::x86:
7732 return "elf_i386";
7733 case llvm::Triple::aarch64:
7734 return "aarch64linux";
7735 case llvm::Triple::aarch64_be:
7736 return "aarch64_be_linux";
7737 case llvm::Triple::arm:
7738 case llvm::Triple::thumb:
7739 return "armelf_linux_eabi";
7740 case llvm::Triple::armeb:
7741 case llvm::Triple::thumbeb:
7742 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7743 case llvm::Triple::ppc:
7744 return "elf32ppclinux";
7745 case llvm::Triple::ppc64:
7746 return "elf64ppc";
7747 case llvm::Triple::ppc64le:
7748 return "elf64lppc";
7749 case llvm::Triple::sparc:
7750 return "elf32_sparc";
7751 case llvm::Triple::sparcv9:
7752 return "elf64_sparc";
7753 case llvm::Triple::mips:
7754 return "elf32btsmip";
7755 case llvm::Triple::mipsel:
7756 return "elf32ltsmip";
7757 case llvm::Triple::mips64:
7758 if (mips::hasMipsAbiArg(Args, "n32"))
7759 return "elf32btsmipn32";
7760 return "elf64btsmip";
7761 case llvm::Triple::mips64el:
7762 if (mips::hasMipsAbiArg(Args, "n32"))
7763 return "elf32ltsmipn32";
7764 return "elf64ltsmip";
7765 case llvm::Triple::systemz:
7766 return "elf64_s390";
7767 case llvm::Triple::x86_64:
7768 if (T.getEnvironment() == llvm::Triple::GNUX32)
7769 return "elf32_x86_64";
7770 return "elf_x86_64";
7771 default:
7772 llvm_unreachable("Unexpected arch");
7773 }
7774}
7775
Thomas Schwinge4e555262013-03-28 19:04:25 +00007776void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7777 const InputInfo &Output,
7778 const InputInfoList &Inputs,
7779 const ArgList &Args,
7780 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007781 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007782 static_cast<const toolchains::Linux&>(getToolChain());
7783 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007784 const bool isAndroid =
7785 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007786 const bool IsPIE =
7787 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007788 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007789 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007790
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007791 ArgStringList CmdArgs;
7792
Rafael Espindolad1002f62010-11-15 18:28:16 +00007793 // Silence warning for "clang -g foo.o -o foo"
7794 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007795 // and "clang -emit-llvm foo.o -o foo"
7796 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007797 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007798 // handled somewhere else.
7799 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007800
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007801 if (!D.SysRoot.empty())
7802 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007803
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007804 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007805 CmdArgs.push_back("-pie");
7806
Rafael Espindola1c76c592010-11-07 22:57:16 +00007807 if (Args.hasArg(options::OPT_rdynamic))
7808 CmdArgs.push_back("-export-dynamic");
7809
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007810 if (Args.hasArg(options::OPT_s))
7811 CmdArgs.push_back("-s");
7812
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007813 if (ToolChain.getArch() == llvm::Triple::armeb ||
7814 ToolChain.getArch() == llvm::Triple::thumbeb)
7815 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7816
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007817 for (const auto &Opt : ToolChain.ExtraOpts)
7818 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007819
7820 if (!Args.hasArg(options::OPT_static)) {
7821 CmdArgs.push_back("--eh-frame-hdr");
7822 }
7823
7824 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007825 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007826
7827 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007828 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007829 ToolChain.getArch() == llvm::Triple::armeb ||
7830 ToolChain.getArch() == llvm::Triple::thumb ||
7831 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007832 CmdArgs.push_back("-Bstatic");
7833 else
7834 CmdArgs.push_back("-static");
7835 } else if (Args.hasArg(options::OPT_shared)) {
7836 CmdArgs.push_back("-shared");
7837 }
7838
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007839 if (ToolChain.getArch() == llvm::Triple::arm ||
7840 ToolChain.getArch() == llvm::Triple::armeb ||
7841 ToolChain.getArch() == llvm::Triple::thumb ||
7842 ToolChain.getArch() == llvm::Triple::thumbeb ||
7843 (!Args.hasArg(options::OPT_static) &&
7844 !Args.hasArg(options::OPT_shared))) {
7845 CmdArgs.push_back("-dynamic-linker");
7846 CmdArgs.push_back(Args.MakeArgString(
7847 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7848 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007849
7850 CmdArgs.push_back("-o");
7851 CmdArgs.push_back(Output.getFilename());
7852
Rafael Espindola81937ec2010-12-01 01:52:43 +00007853 if (!Args.hasArg(options::OPT_nostdlib) &&
7854 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007855 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007856 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007857 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007858 if (Args.hasArg(options::OPT_pg))
7859 crt1 = "gcrt1.o";
7860 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007861 crt1 = "Scrt1.o";
7862 else
7863 crt1 = "crt1.o";
7864 }
7865 if (crt1)
7866 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007867
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007868 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7869 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007870
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007871 const char *crtbegin;
7872 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007873 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007874 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007875 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007876 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007877 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007878 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007879 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007880 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007881
7882 // Add crtfastmath.o if available and fast math is enabled.
7883 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007884 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007885
7886 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007887 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007888
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007889 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007890
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007891 for (const auto &Path : Paths)
7892 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007893
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007894 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007895 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007896
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007897 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7898 CmdArgs.push_back("--no-demangle");
7899
Alexey Samsonov52550342014-09-15 19:58:40 +00007900 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007901 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007902 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007903 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007904
Hans Wennborg70850d82013-07-18 20:29:38 +00007905 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007906 !Args.hasArg(options::OPT_nostdlib) &&
7907 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007908 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7909 !Args.hasArg(options::OPT_static);
7910 if (OnlyLibstdcxxStatic)
7911 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007912 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007913 if (OnlyLibstdcxxStatic)
7914 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007915 CmdArgs.push_back("-lm");
7916 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007917 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7918 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007919
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007920 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007921 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7922 if (Args.hasArg(options::OPT_static))
7923 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007924
Alexey Samsonov52550342014-09-15 19:58:40 +00007925 if (NeedsSanitizerDeps)
7926 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7927
Alexey Bataev186b28a2014-03-06 05:43:53 +00007928 LibOpenMP UsedOpenMPLib = LibUnknown;
7929 if (Args.hasArg(options::OPT_fopenmp)) {
7930 UsedOpenMPLib = LibGOMP;
7931 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7932 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7933 .Case("libgomp", LibGOMP)
7934 .Case("libiomp5", LibIOMP5)
7935 .Default(LibUnknown);
7936 if (UsedOpenMPLib == LibUnknown)
7937 D.Diag(diag::err_drv_unsupported_option_argument)
7938 << A->getOption().getName() << A->getValue();
7939 }
7940 switch (UsedOpenMPLib) {
7941 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007942 CmdArgs.push_back("-lgomp");
7943
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007944 // FIXME: Exclude this for platforms with libgomp that don't require
7945 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007946 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007947 break;
7948 case LibIOMP5:
7949 CmdArgs.push_back("-liomp5");
7950 break;
7951 case LibUnknown:
7952 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007953 }
Renato Golinc4b49242014-02-13 10:01:16 +00007954 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007955
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007956 if ((Args.hasArg(options::OPT_pthread) ||
7957 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7958 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007959 CmdArgs.push_back("-lpthread");
7960
7961 CmdArgs.push_back("-lc");
7962
7963 if (Args.hasArg(options::OPT_static))
7964 CmdArgs.push_back("--end-group");
7965 else
Renato Golinc4b49242014-02-13 10:01:16 +00007966 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007967 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007968
Rafael Espindola81937ec2010-12-01 01:52:43 +00007969 if (!Args.hasArg(options::OPT_nostartfiles)) {
7970 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007971 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007972 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007973 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007974 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007975 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007976 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007977
Rafael Espindola81937ec2010-12-01 01:52:43 +00007978 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007979 if (!isAndroid)
7980 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007981 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007982 }
7983
David Blaikiec11bf802014-09-04 16:04:28 +00007984 C.addCommand(
7985 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007986}
7987
Derek Schuff6ab52fa2015-03-30 20:31:33 +00007988
7989// NaCl ARM assembly (inline or standalone) can be written with a set of macros
7990// for the various SFI requirements like register masking. The assembly tool
7991// inserts the file containing the macros as an input into all the assembly
7992// jobs.
7993void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
7994 const InputInfo &Output,
7995 const InputInfoList &Inputs,
7996 const ArgList &Args,
7997 const char *LinkingOutput) const {
7998 const toolchains::NaCl_TC& ToolChain =
7999 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8000 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8001 "nacl-arm-macros.s");
8002 InputInfoList NewInputs;
8003 NewInputs.push_back(NaClMacros);
8004 NewInputs.append(Inputs.begin(), Inputs.end());
8005 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8006 LinkingOutput);
8007}
8008
8009
8010// This is quite similar to gnutools::link::ConstructJob with changes that
8011// we use static by default, do not yet support sanitizers or LTO, and a few
8012// others. Eventually we can support more of that and hopefully migrate back
8013// to gnutools::link.
8014void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8015 const InputInfo &Output,
8016 const InputInfoList &Inputs,
8017 const ArgList &Args,
8018 const char *LinkingOutput) const {
8019
8020 const toolchains::NaCl_TC& ToolChain =
8021 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8022 const Driver &D = ToolChain.getDriver();
8023 const bool IsStatic =
8024 !Args.hasArg(options::OPT_dynamic) &&
8025 !Args.hasArg(options::OPT_shared);
8026
8027 ArgStringList CmdArgs;
8028
8029 // Silence warning for "clang -g foo.o -o foo"
8030 Args.ClaimAllArgs(options::OPT_g_Group);
8031 // and "clang -emit-llvm foo.o -o foo"
8032 Args.ClaimAllArgs(options::OPT_emit_llvm);
8033 // and for "clang -w foo.o -o foo". Other warning options are already
8034 // handled somewhere else.
8035 Args.ClaimAllArgs(options::OPT_w);
8036
8037 if (!D.SysRoot.empty())
8038 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8039
8040 if (Args.hasArg(options::OPT_rdynamic))
8041 CmdArgs.push_back("-export-dynamic");
8042
8043 if (Args.hasArg(options::OPT_s))
8044 CmdArgs.push_back("-s");
8045
8046 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8047 // there is --build-id, which we do want.
8048 CmdArgs.push_back("--build-id");
8049
8050 if (!IsStatic)
8051 CmdArgs.push_back("--eh-frame-hdr");
8052
8053 CmdArgs.push_back("-m");
8054 if (ToolChain.getArch() == llvm::Triple::x86)
8055 CmdArgs.push_back("elf_i386_nacl");
8056 else if (ToolChain.getArch() == llvm::Triple::arm)
8057 CmdArgs.push_back("armelf_nacl");
8058 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8059 CmdArgs.push_back("elf_x86_64_nacl");
8060 else
8061 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8062 "Native Client";
8063
8064
8065 if (IsStatic)
8066 CmdArgs.push_back("-static");
8067 else if (Args.hasArg(options::OPT_shared))
8068 CmdArgs.push_back("-shared");
8069
8070 CmdArgs.push_back("-o");
8071 CmdArgs.push_back(Output.getFilename());
8072 if (!Args.hasArg(options::OPT_nostdlib) &&
8073 !Args.hasArg(options::OPT_nostartfiles)) {
8074 if (!Args.hasArg(options::OPT_shared))
8075 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8076 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8077
8078 const char *crtbegin;
8079 if (IsStatic)
8080 crtbegin = "crtbeginT.o";
8081 else if (Args.hasArg(options::OPT_shared))
8082 crtbegin = "crtbeginS.o";
8083 else
8084 crtbegin = "crtbegin.o";
8085 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8086 }
8087
8088 Args.AddAllArgs(CmdArgs, options::OPT_L);
8089 Args.AddAllArgs(CmdArgs, options::OPT_u);
8090
8091 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8092
8093 for (const auto &Path : Paths)
8094 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8095
8096 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8097 CmdArgs.push_back("--no-demangle");
8098
8099 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8100
8101 if (D.CCCIsCXX() &&
8102 !Args.hasArg(options::OPT_nostdlib) &&
8103 !Args.hasArg(options::OPT_nodefaultlibs)) {
8104 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8105 !IsStatic;
8106 if (OnlyLibstdcxxStatic)
8107 CmdArgs.push_back("-Bstatic");
8108 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8109 if (OnlyLibstdcxxStatic)
8110 CmdArgs.push_back("-Bdynamic");
8111 CmdArgs.push_back("-lm");
8112 }
8113
8114 if (!Args.hasArg(options::OPT_nostdlib)) {
8115 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8116 // Always use groups, since it has no effect on dynamic libraries.
8117 CmdArgs.push_back("--start-group");
8118 CmdArgs.push_back("-lc");
8119 // NaCl's libc++ currently requires libpthread, so just always include it
8120 // in the group for C++.
8121 if (Args.hasArg(options::OPT_pthread) ||
8122 Args.hasArg(options::OPT_pthreads) ||
8123 D.CCCIsCXX()) {
8124 CmdArgs.push_back("-lpthread");
8125 }
8126
8127 CmdArgs.push_back("-lgcc");
8128 CmdArgs.push_back("--as-needed");
8129 if (IsStatic)
8130 CmdArgs.push_back("-lgcc_eh");
8131 else
8132 CmdArgs.push_back("-lgcc_s");
8133 CmdArgs.push_back("--no-as-needed");
8134 CmdArgs.push_back("--end-group");
8135 }
8136
8137 if (!Args.hasArg(options::OPT_nostartfiles)) {
8138 const char *crtend;
8139 if (Args.hasArg(options::OPT_shared))
8140 crtend = "crtendS.o";
8141 else
8142 crtend = "crtend.o";
8143
8144 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8146 }
8147 }
8148
8149 C.addCommand(llvm::make_unique<Command>(JA, *this,
8150 ToolChain.Linker.c_str(), CmdArgs));
8151}
8152
8153
Chris Lattner3e2ee142010-07-07 16:01:42 +00008154void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008155 const InputInfo &Output,
8156 const InputInfoList &Inputs,
8157 const ArgList &Args,
8158 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008159 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008160 ArgStringList CmdArgs;
8161
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008162 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008163
8164 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008165 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008166
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008167 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008168 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008169
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008170 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008171 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008172}
8173
8174void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008175 const InputInfo &Output,
8176 const InputInfoList &Inputs,
8177 const ArgList &Args,
8178 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008179 const Driver &D = getToolChain().getDriver();
8180 ArgStringList CmdArgs;
8181
Daniel Dunbarb440f562010-08-02 02:38:21 +00008182 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008183 CmdArgs.push_back("-o");
8184 CmdArgs.push_back(Output.getFilename());
8185 } else {
8186 assert(Output.isNothing() && "Invalid output.");
8187 }
8188
8189 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008190 !Args.hasArg(options::OPT_nostartfiles)) {
8191 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8192 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8193 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8194 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8195 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008196
8197 Args.AddAllArgs(CmdArgs, options::OPT_L);
8198 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8199 Args.AddAllArgs(CmdArgs, options::OPT_e);
8200
Daniel Dunbar54423b22010-09-17 00:24:54 +00008201 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008202
Alexey Samsonov7811d192014-02-20 13:57:37 +00008203 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008204
Chris Lattner3e2ee142010-07-07 16:01:42 +00008205 if (!Args.hasArg(options::OPT_nostdlib) &&
8206 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008207 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008208 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008209 CmdArgs.push_back("-lm");
8210 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008211 }
8212
8213 if (!Args.hasArg(options::OPT_nostdlib) &&
8214 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008215 if (Args.hasArg(options::OPT_pthread))
8216 CmdArgs.push_back("-lpthread");
8217 CmdArgs.push_back("-lc");
8218 CmdArgs.push_back("-lCompilerRT-Generic");
8219 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8220 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008221 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008222 }
8223
Logan Chieneb9162f2014-06-26 14:23:45 +00008224 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008225 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008226}
8227
Daniel Dunbarcc912342009-05-02 18:28:39 +00008228/// DragonFly Tools
8229
8230// For now, DragonFly Assemble does just about the same as for
8231// FreeBSD, but this may change soon.
8232void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008233 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008234 const InputInfoList &Inputs,
8235 const ArgList &Args,
8236 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008237 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008238 ArgStringList CmdArgs;
8239
8240 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8241 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008242 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008243 CmdArgs.push_back("--32");
8244
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008245 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008246
8247 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008248 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008249
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008250 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008251 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008252
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008253 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008254 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008255}
8256
8257void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008258 const InputInfo &Output,
8259 const InputInfoList &Inputs,
8260 const ArgList &Args,
8261 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008262 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008263 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008264 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008265
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008266 if (!D.SysRoot.empty())
8267 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8268
John McCall65b8da02013-04-11 22:55:55 +00008269 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008270 if (Args.hasArg(options::OPT_static)) {
8271 CmdArgs.push_back("-Bstatic");
8272 } else {
John McCall65b8da02013-04-11 22:55:55 +00008273 if (Args.hasArg(options::OPT_rdynamic))
8274 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008275 if (Args.hasArg(options::OPT_shared))
8276 CmdArgs.push_back("-Bshareable");
8277 else {
8278 CmdArgs.push_back("-dynamic-linker");
8279 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8280 }
John McCall65b8da02013-04-11 22:55:55 +00008281 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008282 }
8283
8284 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8285 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008286 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008287 CmdArgs.push_back("-m");
8288 CmdArgs.push_back("elf_i386");
8289 }
8290
Daniel Dunbarb440f562010-08-02 02:38:21 +00008291 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008292 CmdArgs.push_back("-o");
8293 CmdArgs.push_back(Output.getFilename());
8294 } else {
8295 assert(Output.isNothing() && "Invalid output.");
8296 }
8297
8298 if (!Args.hasArg(options::OPT_nostdlib) &&
8299 !Args.hasArg(options::OPT_nostartfiles)) {
8300 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008301 if (Args.hasArg(options::OPT_pg))
8302 CmdArgs.push_back(Args.MakeArgString(
8303 getToolChain().GetFilePath("gcrt1.o")));
8304 else {
8305 if (Args.hasArg(options::OPT_pie))
8306 CmdArgs.push_back(Args.MakeArgString(
8307 getToolChain().GetFilePath("Scrt1.o")));
8308 else
8309 CmdArgs.push_back(Args.MakeArgString(
8310 getToolChain().GetFilePath("crt1.o")));
8311 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008312 }
John McCall65b8da02013-04-11 22:55:55 +00008313 CmdArgs.push_back(Args.MakeArgString(
8314 getToolChain().GetFilePath("crti.o")));
8315 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8316 CmdArgs.push_back(Args.MakeArgString(
8317 getToolChain().GetFilePath("crtbeginS.o")));
8318 else
8319 CmdArgs.push_back(Args.MakeArgString(
8320 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008321 }
8322
8323 Args.AddAllArgs(CmdArgs, options::OPT_L);
8324 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8325 Args.AddAllArgs(CmdArgs, options::OPT_e);
8326
Daniel Dunbar54423b22010-09-17 00:24:54 +00008327 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008328
8329 if (!Args.hasArg(options::OPT_nostdlib) &&
8330 !Args.hasArg(options::OPT_nodefaultlibs)) {
8331 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8332 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008333 if (UseGCC47)
8334 CmdArgs.push_back("-L/usr/lib/gcc47");
8335 else
8336 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008337
8338 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008339 if (UseGCC47) {
8340 CmdArgs.push_back("-rpath");
8341 CmdArgs.push_back("/usr/lib/gcc47");
8342 } else {
8343 CmdArgs.push_back("-rpath");
8344 CmdArgs.push_back("/usr/lib/gcc44");
8345 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008346 }
8347
Hans Wennborg70850d82013-07-18 20:29:38 +00008348 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008349 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008350 CmdArgs.push_back("-lm");
8351 }
8352
Daniel Dunbarcc912342009-05-02 18:28:39 +00008353 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008354 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008355
8356 if (!Args.hasArg(options::OPT_nolibc)) {
8357 CmdArgs.push_back("-lc");
8358 }
8359
John McCall65b8da02013-04-11 22:55:55 +00008360 if (UseGCC47) {
8361 if (Args.hasArg(options::OPT_static) ||
8362 Args.hasArg(options::OPT_static_libgcc)) {
8363 CmdArgs.push_back("-lgcc");
8364 CmdArgs.push_back("-lgcc_eh");
8365 } else {
8366 if (Args.hasArg(options::OPT_shared_libgcc)) {
8367 CmdArgs.push_back("-lgcc_pic");
8368 if (!Args.hasArg(options::OPT_shared))
8369 CmdArgs.push_back("-lgcc");
8370 } else {
8371 CmdArgs.push_back("-lgcc");
8372 CmdArgs.push_back("--as-needed");
8373 CmdArgs.push_back("-lgcc_pic");
8374 CmdArgs.push_back("--no-as-needed");
8375 }
8376 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008377 } else {
John McCall65b8da02013-04-11 22:55:55 +00008378 if (Args.hasArg(options::OPT_shared)) {
8379 CmdArgs.push_back("-lgcc_pic");
8380 } else {
8381 CmdArgs.push_back("-lgcc");
8382 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008383 }
8384 }
8385
8386 if (!Args.hasArg(options::OPT_nostdlib) &&
8387 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008388 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008389 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008390 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008391 else
8392 CmdArgs.push_back(Args.MakeArgString(
8393 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008394 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008395 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008396 }
8397
Alexey Samsonov7811d192014-02-20 13:57:37 +00008398 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008399
Logan Chieneb9162f2014-06-26 14:23:45 +00008400 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008401 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008402}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008403
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008404// Try to find Exe from a Visual Studio distribution. This first tries to find
8405// an installed copy of Visual Studio and, failing that, looks in the PATH,
8406// making sure that whatever executable that's found is not a same-named exe
8407// from clang itself to prevent clang from falling back to itself.
8408static std::string FindVisualStudioExecutable(const ToolChain &TC,
8409 const char *Exe,
8410 const char *ClangProgramPath) {
8411 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8412 std::string visualStudioBinDir;
8413 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8414 visualStudioBinDir)) {
8415 SmallString<128> FilePath(visualStudioBinDir);
8416 llvm::sys::path::append(FilePath, Exe);
8417 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8418 return FilePath.str();
8419 }
8420
8421 return Exe;
8422}
8423
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008424void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8425 const InputInfo &Output,
8426 const InputInfoList &Inputs,
8427 const ArgList &Args,
8428 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008429 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008430 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008431
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008432 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8433 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008434 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8435 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008436
8437 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008438 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008439 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008440
Zachary Turner10d75b22014-10-22 20:40:43 +00008441 if (!llvm::sys::Process::GetEnv("LIB")) {
8442 // If the VC environment hasn't been configured (perhaps because the user
8443 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008444 // the environment variable is set however, assume the user knows what
8445 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008446 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008447 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008448 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8449 SmallString<128> LibDir(VisualStudioDir);
8450 llvm::sys::path::append(LibDir, "VC", "lib");
8451 switch (MSVC.getArch()) {
8452 case llvm::Triple::x86:
8453 // x86 just puts the libraries directly in lib
8454 break;
8455 case llvm::Triple::x86_64:
8456 llvm::sys::path::append(LibDir, "amd64");
8457 break;
8458 case llvm::Triple::arm:
8459 llvm::sys::path::append(LibDir, "arm");
8460 break;
8461 default:
8462 break;
8463 }
8464 CmdArgs.push_back(
8465 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8466 }
8467
8468 std::string WindowsSdkLibPath;
8469 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8470 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8471 WindowsSdkLibPath.c_str()));
8472 }
8473
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008474 CmdArgs.push_back("-nologo");
8475
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008476 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008477 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008478
Hans Wennborge4c47f22015-03-04 23:16:21 +00008479 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8480 options::OPT__SLASH_LDd,
8481 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008482 if (DLL) {
8483 CmdArgs.push_back(Args.MakeArgString("-dll"));
8484
8485 SmallString<128> ImplibName(Output.getFilename());
8486 llvm::sys::path::replace_extension(ImplibName, "lib");
8487 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008488 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008489 }
8490
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008491 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008492 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008493 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008494 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008495 static const char *CompilerRTComponents[] = {
8496 "asan_dynamic",
8497 "asan_dynamic_runtime_thunk",
8498 };
8499 for (const auto &Component : CompilerRTComponents)
8500 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008501 // Make sure the dynamic runtime thunk is not optimized out at link time
8502 // to ensure proper SEH handling.
8503 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008504 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008505 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008506 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008507 static const char *CompilerRTComponents[] = {
8508 "asan",
8509 "asan_cxx",
8510 };
8511 for (const auto &Component : CompilerRTComponents)
8512 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008513 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008514 }
8515
Hans Wennborg2e274592013-08-13 23:38:57 +00008516 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008517
Reid Kleckner337188f2014-09-16 19:22:00 +00008518 // Add filenames, libraries, and other linker inputs.
8519 for (const auto &Input : Inputs) {
8520 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008521 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008522 continue;
8523 }
8524
8525 const Arg &A = Input.getInputArg();
8526
8527 // Render -l options differently for the MSVC linker.
8528 if (A.getOption().matches(options::OPT_l)) {
8529 StringRef Lib = A.getValue();
8530 const char *LinkLibArg;
8531 if (Lib.endswith(".lib"))
8532 LinkLibArg = Args.MakeArgString(Lib);
8533 else
8534 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8535 CmdArgs.push_back(LinkLibArg);
8536 continue;
8537 }
8538
8539 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8540 // or -L. Render it, even if MSVC doesn't understand it.
8541 A.renderAsInput(Args, CmdArgs);
8542 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008543
Zachary Turner719f58c2014-12-01 23:06:47 +00008544 // We need to special case some linker paths. In the case of lld, we need to
8545 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8546 // linker, we need to use a special search algorithm.
8547 llvm::SmallString<128> linkPath;
8548 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8549 if (Linker.equals_lower("lld"))
8550 Linker = "lld-link";
8551
8552 if (Linker.equals_lower("link")) {
8553 // If we're using the MSVC linker, it's not sufficient to just use link
8554 // from the program PATH, because other environments like GnuWin32 install
8555 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008556 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008557 C.getDriver().getClangProgramPath());
8558 } else {
8559 linkPath = Linker;
8560 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008561 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008562 }
8563
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008564 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008565 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008566}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008567
8568void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8569 const InputInfo &Output,
8570 const InputInfoList &Inputs,
8571 const ArgList &Args,
8572 const char *LinkingOutput) const {
8573 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8574}
8575
David Blaikiec11bf802014-09-04 16:04:28 +00008576std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8577 Compilation &C, const JobAction &JA, const InputInfo &Output,
8578 const InputInfoList &Inputs, const ArgList &Args,
8579 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008580 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008581 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008582 CmdArgs.push_back("/c"); // Compile only.
8583 CmdArgs.push_back("/W0"); // No warnings.
8584
8585 // The goal is to be able to invoke this tool correctly based on
8586 // any flag accepted by clang-cl.
8587
8588 // These are spelled the same way in clang and cl.exe,.
8589 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8590 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008591
8592 // Optimization level.
8593 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8594 if (A->getOption().getID() == options::OPT_O0) {
8595 CmdArgs.push_back("/Od");
8596 } else {
8597 StringRef OptLevel = A->getValue();
8598 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8599 A->render(Args, CmdArgs);
8600 else if (OptLevel == "3")
8601 CmdArgs.push_back("/Ox");
8602 }
8603 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008604
Nico Weber3f8dafb2015-03-12 19:37:10 +00008605 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008606 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8607
David Majnemerf6072342014-07-01 22:24:56 +00008608 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8609 /*default=*/false))
8610 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008611 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8612 options::OPT_fno_function_sections))
8613 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8614 ? "/Gy"
8615 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008616 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8617 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008618 CmdArgs.push_back(
8619 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008620 if (Args.hasArg(options::OPT_fsyntax_only))
8621 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008622 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8623 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008624
Nico Weber3f8dafb2015-03-12 19:37:10 +00008625 std::vector<std::string> Includes =
8626 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008627 for (const auto &Include : Includes)
8628 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008629
Hans Wennborg87cfa712013-09-19 20:32:16 +00008630 // Flags that can simply be passed through.
8631 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8632 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008633 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008634
8635 // The order of these flags is relevant, so pick the last one.
8636 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8637 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8638 A->render(Args, CmdArgs);
8639
8640
8641 // Input filename.
8642 assert(Inputs.size() == 1);
8643 const InputInfo &II = Inputs[0];
8644 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8645 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8646 if (II.isFilename())
8647 CmdArgs.push_back(II.getFilename());
8648 else
8649 II.getInputArg().renderAsInput(Args, CmdArgs);
8650
8651 // Output filename.
8652 assert(Output.getType() == types::TY_Object);
8653 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8654 Output.getFilename());
8655 CmdArgs.push_back(Fo);
8656
Hans Wennborg188382e2013-09-20 18:16:35 +00008657 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008658 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8659 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008660 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8661 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008662}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008663
8664
8665/// XCore Tools
8666// We pass assemble and link construction to the xcc tool.
8667
8668void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8669 const InputInfo &Output,
8670 const InputInfoList &Inputs,
8671 const ArgList &Args,
8672 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008673 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008674 ArgStringList CmdArgs;
8675
8676 CmdArgs.push_back("-o");
8677 CmdArgs.push_back(Output.getFilename());
8678
8679 CmdArgs.push_back("-c");
8680
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008681 if (Args.hasArg(options::OPT_v))
8682 CmdArgs.push_back("-v");
8683
Robert Lytton894d25c2014-05-02 09:33:25 +00008684 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8685 if (!A->getOption().matches(options::OPT_g0))
8686 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008687
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008688 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8689 false))
8690 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008691
8692 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8693 options::OPT_Xassembler);
8694
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008695 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008696 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008697
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008698 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008699 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008700}
8701
8702void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8703 const InputInfo &Output,
8704 const InputInfoList &Inputs,
8705 const ArgList &Args,
8706 const char *LinkingOutput) const {
8707 ArgStringList CmdArgs;
8708
8709 if (Output.isFilename()) {
8710 CmdArgs.push_back("-o");
8711 CmdArgs.push_back(Output.getFilename());
8712 } else {
8713 assert(Output.isNothing() && "Invalid output.");
8714 }
8715
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008716 if (Args.hasArg(options::OPT_v))
8717 CmdArgs.push_back("-v");
8718
David Majnemer8de68642014-12-05 08:11:58 +00008719 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008720 CmdArgs.push_back("-fexceptions");
8721
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008722 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8723
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008724 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008725 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008726}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008727
8728void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8729 const InputInfo &Output,
8730 const InputInfoList &Inputs,
8731 const ArgList &Args,
8732 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008733 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008734 const auto &TC =
8735 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8736 ArgStringList CmdArgs;
8737 const char *Exec;
8738
8739 switch (TC.getArch()) {
8740 default: llvm_unreachable("unsupported architecture");
8741 case llvm::Triple::arm:
8742 case llvm::Triple::thumb:
8743 break;
8744 case llvm::Triple::x86:
8745 CmdArgs.push_back("--32");
8746 break;
8747 case llvm::Triple::x86_64:
8748 CmdArgs.push_back("--64");
8749 break;
8750 }
8751
8752 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8753
8754 CmdArgs.push_back("-o");
8755 CmdArgs.push_back(Output.getFilename());
8756
8757 for (const auto &Input : Inputs)
8758 CmdArgs.push_back(Input.getFilename());
8759
8760 const std::string Assembler = TC.GetProgramPath("as");
8761 Exec = Args.MakeArgString(Assembler);
8762
8763 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8764}
8765
8766void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8767 const InputInfo &Output,
8768 const InputInfoList &Inputs,
8769 const ArgList &Args,
8770 const char *LinkingOutput) const {
8771 const auto &TC =
8772 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8773 const llvm::Triple &T = TC.getTriple();
8774 const Driver &D = TC.getDriver();
8775 SmallString<128> EntryPoint;
8776 ArgStringList CmdArgs;
8777 const char *Exec;
8778
8779 // Silence warning for "clang -g foo.o -o foo"
8780 Args.ClaimAllArgs(options::OPT_g_Group);
8781 // and "clang -emit-llvm foo.o -o foo"
8782 Args.ClaimAllArgs(options::OPT_emit_llvm);
8783 // and for "clang -w foo.o -o foo"
8784 Args.ClaimAllArgs(options::OPT_w);
8785 // Other warning options are already handled somewhere else.
8786
8787 if (!D.SysRoot.empty())
8788 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8789
8790 if (Args.hasArg(options::OPT_pie))
8791 CmdArgs.push_back("-pie");
8792 if (Args.hasArg(options::OPT_rdynamic))
8793 CmdArgs.push_back("-export-dynamic");
8794 if (Args.hasArg(options::OPT_s))
8795 CmdArgs.push_back("--strip-all");
8796
8797 CmdArgs.push_back("-m");
8798 switch (TC.getArch()) {
8799 default: llvm_unreachable("unsupported architecture");
8800 case llvm::Triple::arm:
8801 case llvm::Triple::thumb:
8802 // FIXME: this is incorrect for WinCE
8803 CmdArgs.push_back("thumb2pe");
8804 break;
8805 case llvm::Triple::x86:
8806 CmdArgs.push_back("i386pe");
8807 EntryPoint.append("_");
8808 break;
8809 case llvm::Triple::x86_64:
8810 CmdArgs.push_back("i386pep");
8811 break;
8812 }
8813
8814 if (Args.hasArg(options::OPT_shared)) {
8815 switch (T.getArch()) {
8816 default: llvm_unreachable("unsupported architecture");
8817 case llvm::Triple::arm:
8818 case llvm::Triple::thumb:
8819 case llvm::Triple::x86_64:
8820 EntryPoint.append("_DllMainCRTStartup");
8821 break;
8822 case llvm::Triple::x86:
8823 EntryPoint.append("_DllMainCRTStartup@12");
8824 break;
8825 }
8826
8827 CmdArgs.push_back("-shared");
8828 CmdArgs.push_back("-Bdynamic");
8829
8830 CmdArgs.push_back("--enable-auto-image-base");
8831
8832 CmdArgs.push_back("--entry");
8833 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8834 } else {
8835 EntryPoint.append("mainCRTStartup");
8836
8837 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8838 : "-Bdynamic");
8839
8840 if (!Args.hasArg(options::OPT_nostdlib) &&
8841 !Args.hasArg(options::OPT_nostartfiles)) {
8842 CmdArgs.push_back("--entry");
8843 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8844 }
8845
8846 // FIXME: handle subsystem
8847 }
8848
8849 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008850 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008851
8852 CmdArgs.push_back("-o");
8853 CmdArgs.push_back(Output.getFilename());
8854
8855 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8856 SmallString<261> ImpLib(Output.getFilename());
8857 llvm::sys::path::replace_extension(ImpLib, ".lib");
8858
8859 CmdArgs.push_back("--out-implib");
8860 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8861 }
8862
8863 if (!Args.hasArg(options::OPT_nostdlib) &&
8864 !Args.hasArg(options::OPT_nostartfiles)) {
8865 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8866 const char *CRTBegin;
8867
8868 CRTBegin =
8869 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8870 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8871 }
8872
8873 Args.AddAllArgs(CmdArgs, options::OPT_L);
8874
8875 const auto &Paths = TC.getFilePaths();
8876 for (const auto &Path : Paths)
8877 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8878
8879 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8880
8881 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8882 !Args.hasArg(options::OPT_nodefaultlibs)) {
8883 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8884 !Args.hasArg(options::OPT_static);
8885 if (StaticCXX)
8886 CmdArgs.push_back("-Bstatic");
8887 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8888 if (StaticCXX)
8889 CmdArgs.push_back("-Bdynamic");
8890 }
8891
8892 if (!Args.hasArg(options::OPT_nostdlib)) {
8893 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8894 // TODO handle /MT[d] /MD[d]
8895 CmdArgs.push_back("-lmsvcrt");
8896 AddRunTimeLibs(TC, D, CmdArgs, Args);
8897 }
8898 }
8899
8900 const std::string Linker = TC.GetProgramPath("ld");
8901 Exec = Args.MakeArgString(Linker);
8902
8903 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8904}