blob: 27e6427d0d4fa4ba4bb00c42fccfde47c8884b3f [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000035#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000037#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000039#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000040#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000041#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000042#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000043
Ben Langmuir3b7b5402015-02-03 19:28:37 +000044#ifdef LLVM_ON_UNIX
45#include <unistd.h> // For getuid().
46#endif
47
Daniel Dunbar1a093d22009-03-18 06:00:36 +000048using namespace clang::driver;
49using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000050using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000051using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000052
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000053static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
54 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
55 options::OPT_fpic, options::OPT_fno_pic,
56 options::OPT_fPIE, options::OPT_fno_PIE,
57 options::OPT_fpie, options::OPT_fno_pie);
58 if (!LastPICArg)
59 return;
60 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
61 LastPICArg->getOption().matches(options::OPT_fpic) ||
62 LastPICArg->getOption().matches(options::OPT_fPIE) ||
63 LastPICArg->getOption().matches(options::OPT_fpie)) {
64 CmdArgs.push_back("-KPIC");
65 }
66}
67
Daniel Dunbar64198ef2009-09-10 01:21:05 +000068/// CheckPreprocessingOptions - Perform some validation of preprocessing
69/// arguments that is shared with gcc.
70static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000071 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
72 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
73 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000074 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000075 << A->getBaseArg().getAsString(Args)
76 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
77 }
78 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000079}
80
Daniel Dunbar4eadb602009-09-10 01:21:12 +000081/// CheckCodeGenerationOptions - Perform some validation of code generation
82/// arguments that is shared with gcc.
83static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
84 // In gcc, only ARM checks this, but it seems reasonable to check universally.
85 if (Args.hasArg(options::OPT_static))
86 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
87 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000088 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000089 << A->getAsString(Args) << "-static";
90}
91
Bob Wilsond5aad2a2014-11-04 22:28:48 +000092// Add backslashes to escape spaces and other backslashes.
93// This is used for the space-separated argument list specified with
94// the -dwarf-debug-flags option.
95static void EscapeSpacesAndBackslashes(const char *Arg,
96 SmallVectorImpl<char> &Res) {
97 for ( ; *Arg; ++Arg) {
98 switch (*Arg) {
99 default: break;
100 case ' ':
101 case '\\':
102 Res.push_back('\\');
103 break;
104 }
105 Res.push_back(*Arg);
106 }
107}
108
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000109// Quote target names for inclusion in GNU Make dependency files.
110// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111static void QuoteTarget(StringRef Target,
112 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000113 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
114 switch (Target[i]) {
115 case ' ':
116 case '\t':
117 // Escape the preceding backslashes
118 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
119 Res.push_back('\\');
120
121 // Escape the space/tab
122 Res.push_back('\\');
123 break;
124 case '$':
125 Res.push_back('$');
126 break;
127 case '#':
128 Res.push_back('\\');
129 break;
130 default:
131 break;
132 }
133
134 Res.push_back(Target[i]);
135 }
136}
137
Bill Wendlingc0938f32012-03-12 22:10:06 +0000138static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000139 ArgStringList &CmdArgs,
140 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *EnvVar) {
142 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 bool CombinedArg = false;
144
Bill Wendling281ca292012-03-12 21:22:35 +0000145 if (!DirList)
146 return; // Nothing to do.
147
Chad Rosier616e8a52012-10-30 21:42:09 +0000148 StringRef Name(ArgName);
149 if (Name.equals("-I") || Name.equals("-L"))
150 CombinedArg = true;
151
Bill Wendling281ca292012-03-12 21:22:35 +0000152 StringRef Dirs(DirList);
153 if (Dirs.empty()) // Empty string should not add '.'.
154 return;
155
156 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000157 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000158 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000159 if (CombinedArg) {
160 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
161 } else {
162 CmdArgs.push_back(ArgName);
163 CmdArgs.push_back(".");
164 }
Bill Wendling281ca292012-03-12 21:22:35 +0000165 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000166 if (CombinedArg) {
167 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193static void AddLinkerInputs(const ToolChain &TC,
194 const InputInfoList &Inputs, const ArgList &Args,
195 ArgStringList &CmdArgs) {
196 const Driver &D = TC.getDriver();
197
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000198 // Add extra linker input arguments which are not treated as inputs
199 // (constructed via -Xarch_).
200 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000202 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000203 if (!TC.HasNativeLLVMSupport()) {
204 // Don't try to pass LLVM inputs unless we have native support.
205 if (II.getType() == types::TY_LLVM_IR ||
206 II.getType() == types::TY_LTO_IR ||
207 II.getType() == types::TY_LLVM_BC ||
208 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000209 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000210 << TC.getTripleString();
211 }
212
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 // Add filenames immediately.
214 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000215 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000216 continue;
217 }
218
219 // Otherwise, this is a linker input argument.
220 const Arg &A = II.getInputArg();
221
222 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000223 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000224 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000225 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000226 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000227 else if (A.getOption().matches(options::OPT_z)) {
228 // Pass -z prefix for gcc linker compatibility.
229 A.claim();
230 A.render(Args, CmdArgs);
231 } else {
232 A.renderAsInput(Args, CmdArgs);
233 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000234 }
Bill Wendling281ca292012-03-12 21:22:35 +0000235
236 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000237 // and only supported on native toolchains.
238 if (!TC.isCrossCompiling())
239 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000240}
241
John McCall31168b02011-06-15 23:02:42 +0000242/// \brief Determine whether Objective-C automated reference counting is
243/// enabled.
244static bool isObjCAutoRefCount(const ArgList &Args) {
245 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
246}
247
Ted Kremeneke65b0862012-03-06 20:05:56 +0000248/// \brief Determine whether we are linking the ObjC runtime.
249static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 if (isObjCAutoRefCount(Args)) {
251 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000252 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000253 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000254 return Args.hasArg(options::OPT_fobjc_link_runtime);
255}
256
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000257static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000258 // Don't forward inputs from the original command line. They are added from
259 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000260 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000261 !O.hasFlag(options::DriverOption) &&
262 !O.hasFlag(options::LinkerInput);
263}
264
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000265void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000267 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000268 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 ArgStringList &CmdArgs,
270 const InputInfo &Output,
271 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000273
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000274 CheckPreprocessingOptions(D, Args);
275
276 Args.AddLastArg(CmdArgs, options::OPT_C);
277 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000278
279 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000280 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 (A = Args.getLastArg(options::OPT_MD)) ||
282 (A = Args.getLastArg(options::OPT_MMD))) {
283 // Determine the output location.
284 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000285 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000286 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000287 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000288 } else if (Output.getType() == types::TY_Dependencies) {
289 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000290 } else if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 DepFile = "-";
293 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000294 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000295 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297 CmdArgs.push_back("-dependency-file");
298 CmdArgs.push_back(DepFile);
299
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
302 const char *DepTarget;
303
304 // If user provided -o, that is the dependency target, except
305 // when we are only generating a dependency file.
306 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
307 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000308 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309 } else {
310 // Otherwise derive from the base input.
311 //
312 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000314 llvm::sys::path::replace_extension(P, "o");
315 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
318 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 QuoteTarget(DepTarget, Quoted);
321 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322 }
323
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000324 if (A->getOption().matches(options::OPT_M) ||
325 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000327 if ((isa<PrecompileJobAction>(JA) &&
328 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
329 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000330 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331 }
332
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000333 if (Args.hasArg(options::OPT_MG)) {
334 if (!A || A->getOption().matches(options::OPT_MD) ||
335 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000336 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000337 CmdArgs.push_back("-MG");
338 }
339
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000340 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342
343 // Convert all -MQ <target> args to -MT <quoted target>
344 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
345 options::OPT_MQ),
346 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000347 const Arg *A = *it;
348 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349
Daniel Dunbara442fd52010-06-11 22:00:13 +0000350 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000351 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000352 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000353 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000354 CmdArgs.push_back(Args.MakeArgString(Quoted));
355
356 // -MT flag - no change
357 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000358 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000359 }
360 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000361
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 // Add -i* options, and automatically translate to
363 // -include-pch/-include-pth for transparent PCH support. It's
364 // wonky, but we include looking for .gch so we can support seamless
365 // replacement into a build system already set up to be generating
366 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000367 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000368 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
369 ie = Args.filtered_end(); it != ie; ++it) {
370 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000371
372 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000373 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
374 RenderedImplicitInclude = true;
375
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000376 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000377 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000379 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000380 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000381 SmallString<128> P(A->getValue());
382 // We want the files to have a name like foo.h.pch. Add a dummy extension
383 // so that replace_extension does the right thing.
384 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000385 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000387 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000388 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000389 }
390
Douglas Gregor111af7d2009-04-18 00:34:01 +0000391 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000392 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000393 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000394 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000395 }
396
Douglas Gregor111af7d2009-04-18 00:34:01 +0000397 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000398 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000399 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000400 FoundPCH = UsePCH;
401 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000402 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
404
405 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000406 if (IsFirstImplicitInclude) {
407 A->claim();
408 if (UsePCH)
409 CmdArgs.push_back("-include-pch");
410 else
411 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000413 continue;
414 } else {
415 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000417 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000418 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000419 }
420 }
421
422 // Not translated, render as usual.
423 A->claim();
424 A->render(Args, CmdArgs);
425 }
426
427 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000428 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
429 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000430
431 // Add -Wp, and -Xassembler if using the preprocessor.
432
433 // FIXME: There is a very unfortunate problem here, some troubled
434 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
435 // really support that we would have to parse and then translate
436 // those options. :(
437 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
438 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000439
440 // -I- is a deprecated GCC feature, reject it.
441 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000442 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000443
444 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
445 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000446 StringRef sysroot = C.getSysRoot();
447 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000448 if (!Args.hasArg(options::OPT_isysroot)) {
449 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000450 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000451 }
452 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000453
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000455 // FIXME: We should probably sink the logic for handling these from the
456 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000457 // CPATH - included following the user specified includes (but prior to
458 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000459 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000460 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000461 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000463 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000464 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000465 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000466 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000467 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000468
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000470 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000471 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000472
473 // Add system include arguments.
474 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000475}
476
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000477// FIXME: Move to target hook.
478static bool isSignedCharDefault(const llvm::Triple &Triple) {
479 switch (Triple.getArch()) {
480 default:
481 return true;
482
Tim Northover9bb857a2013-01-31 12:13:10 +0000483 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000484 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000485 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000486 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000487 case llvm::Triple::thumb:
488 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000489 if (Triple.isOSDarwin() || Triple.isOSWindows())
490 return true;
491 return false;
492
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000493 case llvm::Triple::ppc:
494 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000495 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000496 return true;
497 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000498
Bill Schmidt778d3872013-07-26 01:36:11 +0000499 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000500 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000501 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000502 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000503 }
504}
505
Robert Lytton0e076492013-08-13 09:43:10 +0000506static bool isNoCommonDefault(const llvm::Triple &Triple) {
507 switch (Triple.getArch()) {
508 default:
509 return false;
510
511 case llvm::Triple::xcore:
512 return true;
513 }
514}
515
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000516// Handle -mhwdiv=.
517static void getARMHWDivFeatures(const Driver &D, const Arg *A,
518 const ArgList &Args,
519 std::vector<const char *> &Features) {
520 StringRef HWDiv = A->getValue();
521 if (HWDiv == "arm") {
522 Features.push_back("+hwdiv-arm");
523 Features.push_back("-hwdiv");
524 } else if (HWDiv == "thumb") {
525 Features.push_back("-hwdiv-arm");
526 Features.push_back("+hwdiv");
527 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
528 Features.push_back("+hwdiv-arm");
529 Features.push_back("+hwdiv");
530 } else if (HWDiv == "none") {
531 Features.push_back("-hwdiv-arm");
532 Features.push_back("-hwdiv");
533 } else
534 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
535}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000536
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000537// Handle -mfpu=.
538//
539// FIXME: Centralize feature selection, defaulting shouldn't be also in the
540// frontend target.
541static void getARMFPUFeatures(const Driver &D, const Arg *A,
542 const ArgList &Args,
543 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000544 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000545
546 // Set the target features based on the FPU.
547 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
548 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000549 Features.push_back("-vfp2");
550 Features.push_back("-vfp3");
551 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000552 } else if (FPU == "vfp") {
553 Features.push_back("+vfp2");
554 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000555 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000556 Features.push_back("+vfp3");
557 Features.push_back("+d16");
558 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000559 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000560 Features.push_back("+vfp3");
561 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000562 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
563 Features.push_back("+vfp4");
564 Features.push_back("+d16");
565 Features.push_back("-neon");
566 } else if (FPU == "vfp4" || FPU == "vfpv4") {
567 Features.push_back("+vfp4");
568 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000569 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
570 Features.push_back("+vfp4");
571 Features.push_back("+d16");
572 Features.push_back("+fp-only-sp");
573 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000574 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
575 Features.push_back("+fp-armv8");
576 Features.push_back("+fp-only-sp");
577 Features.push_back("+d16");
578 Features.push_back("-neon");
579 Features.push_back("-crypto");
580 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
581 FPU == "fp5-d16" || FPU == "fpv5-d16") {
582 Features.push_back("+fp-armv8");
583 Features.push_back("+d16");
584 Features.push_back("-neon");
585 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000586 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("-neon");
589 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000590 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000591 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000593 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000594 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000595 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000596 Features.push_back("+neon");
597 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000598 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000599 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000600 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000601 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000602 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000603 } else if (FPU == "neon-vfpv4") {
604 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000605 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000606 } else if (FPU == "none") {
607 Features.push_back("-vfp2");
608 Features.push_back("-vfp3");
609 Features.push_back("-vfp4");
610 Features.push_back("-fp-armv8");
611 Features.push_back("-crypto");
612 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000613 } else
614 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
615}
616
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000617// Select the float ABI as determined by -msoft-float, -mhard-float, and
618// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000619StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000621 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000622 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
623 options::OPT_mhard_float,
624 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000625 if (A->getOption().matches(options::OPT_msoft_float))
626 FloatABI = "soft";
627 else if (A->getOption().matches(options::OPT_mhard_float))
628 FloatABI = "hard";
629 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000630 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000632 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 << A->getAsString(Args);
634 FloatABI = "soft";
635 }
636 }
637 }
638
639 // If unspecified, choose the default based on the platform.
640 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000641 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000642 case llvm::Triple::Darwin:
643 case llvm::Triple::MacOSX:
644 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 // Darwin defaults to "softfp" for v6 and v7.
646 //
647 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000649 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v6") ||
651 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000652 FloatABI = "softfp";
653 else
654 FloatABI = "soft";
655 break;
656 }
657
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000658 // FIXME: this is invalid for WindowsCE
659 case llvm::Triple::Win32:
660 FloatABI = "hard";
661 break;
662
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000663 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000664 switch(Triple.getEnvironment()) {
665 case llvm::Triple::GNUEABIHF:
666 FloatABI = "hard";
667 break;
668 default:
669 // FreeBSD defaults to soft float
670 FloatABI = "soft";
671 break;
672 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000673 break;
674
Daniel Dunbar78485922009-09-10 23:00:09 +0000675 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000676 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000677 case llvm::Triple::GNUEABIHF:
678 FloatABI = "hard";
679 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000680 case llvm::Triple::GNUEABI:
681 FloatABI = "softfp";
682 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000683 case llvm::Triple::EABIHF:
684 FloatABI = "hard";
685 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000686 case llvm::Triple::EABI:
687 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
688 FloatABI = "softfp";
689 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000690 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000691 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000692 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000693 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000694 FloatABI = "softfp";
695 else
696 FloatABI = "soft";
697 break;
698 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000699 default:
700 // Assume "soft", but warn the user we are guessing.
701 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000702 if (Triple.getOS() != llvm::Triple::UnknownOS ||
703 !Triple.isOSBinFormatMachO())
704 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000705 break;
706 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000707 }
708 }
709
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000710 return FloatABI;
711}
712
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000713static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
714 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000715 std::vector<const char *> &Features,
716 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000717 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
718 if (!ForAS) {
719 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
720 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
721 // stripped out by the ARM target. We should probably pass this a new
722 // -target-option, which is handled by the -cc1/-cc1as invocation.
723 //
724 // FIXME2: For consistency, it would be ideal if we set up the target
725 // machine state the same when using the frontend or the assembler. We don't
726 // currently do that for the assembler, we pass the options directly to the
727 // backend and never even instantiate the frontend TargetInfo. If we did,
728 // and used its handleTargetFeatures hook, then we could ensure the
729 // assembler and the frontend behave the same.
730
731 // Use software floating point operations?
732 if (FloatABI == "soft")
733 Features.push_back("+soft-float");
734
735 // Use software floating point argument passing?
736 if (FloatABI != "hard")
737 Features.push_back("+soft-float-abi");
738 }
739
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000740 // Honor -mfpu=.
741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000742 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000743 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
744 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000745
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000746 // Setting -msoft-float effectively disables NEON because of the GCC
747 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000748 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000749 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000750 // Also need to explicitly disable features which imply NEON.
751 Features.push_back("-crypto");
752 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000753
Eric Christopher269c2a22015-04-04 03:34:43 +0000754 // En/disable crc code generation.
755 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000756 if (A->getOption().matches(options::OPT_mcrc))
757 Features.push_back("+crc");
758 else
759 Features.push_back("-crc");
760 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000761}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000762
763void Clang::AddARMTargetArgs(const ArgList &Args,
764 ArgStringList &CmdArgs,
765 bool KernelOrKext) const {
766 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000767 // Get the effective triple, which takes into account the deployment target.
768 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
769 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000770 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000771
772 // Select the ABI to use.
773 //
774 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000775 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000776 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000777 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000778 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000779 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000780 // The backend is hardwired to assume AAPCS for M-class processors, ensure
781 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000782 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000783 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000784 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000785 ABIName = "aapcs";
786 } else {
787 ABIName = "apcs-gnu";
788 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000789 } else if (Triple.isOSWindows()) {
790 // FIXME: this is invalid for WindowsCE
791 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000792 } else {
793 // Select the default based on the platform.
794 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000795 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000796 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000797 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000798 ABIName = "aapcs-linux";
799 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000800 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000801 case llvm::Triple::EABI:
802 ABIName = "aapcs";
803 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000804 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000805 if (Triple.getOS() == llvm::Triple::NetBSD)
806 ABIName = "apcs-gnu";
807 else
808 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000809 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000810 }
811 }
812 CmdArgs.push_back("-target-abi");
813 CmdArgs.push_back(ABIName);
814
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000815 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000816 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 if (FloatABI == "soft") {
818 // Floating point operations and argument passing are soft.
819 //
820 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000821 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000822 CmdArgs.push_back("-mfloat-abi");
823 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000824 } else if (FloatABI == "softfp") {
825 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000826 CmdArgs.push_back("-mfloat-abi");
827 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000828 } else {
829 // Floating point operations and argument passing are hard.
830 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000831 CmdArgs.push_back("-mfloat-abi");
832 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000833 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000834
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000835 // Kernel code has more strict alignment requirements.
836 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000837 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000838 CmdArgs.push_back("-backend-option");
839 CmdArgs.push_back("-arm-long-calls");
840 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000841
Daniel Dunbar12100e22011-03-22 16:48:17 +0000842 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000843 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000844
845 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000846 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000847 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000848 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000849
Bob Wilson0874e532014-07-29 00:23:18 +0000850 // -mkernel implies -mstrict-align; don't add the redundant option.
851 if (!KernelOrKext) {
852 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
853 options::OPT_munaligned_access)) {
854 CmdArgs.push_back("-backend-option");
855 if (A->getOption().matches(options::OPT_mno_unaligned_access))
856 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000857 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000858 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000859 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000860 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000861 }
Bob Wilson0874e532014-07-29 00:23:18 +0000862 }
863 }
864
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000865 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000866 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
867 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000868 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000869 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000870 CmdArgs.push_back("-arm-global-merge=false");
871 else
872 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000873 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000874
Bob Wilson9c8af452013-04-11 18:53:25 +0000875 if (!Args.hasFlag(options::OPT_mimplicit_float,
876 options::OPT_mno_implicit_float,
877 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000878 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000879
Logan Chien749763e2014-04-03 13:12:44 +0000880 // llvm does not support reserving registers in general. There is support
881 // for reserving r9 on ARM though (defined as a platform-specific register
882 // in ARM EABI).
883 if (Args.hasArg(options::OPT_ffixed_r9)) {
884 CmdArgs.push_back("-backend-option");
885 CmdArgs.push_back("-arm-reserve-r9");
886 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000887}
888
Tim Northover573cbee2014-05-24 12:52:07 +0000889/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
890/// targeting.
891static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000892 Arg *A;
893 std::string CPU;
894 // If we have -mtune or -mcpu, use that.
895 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
896 CPU = A->getValue();
897 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
898 StringRef Mcpu = A->getValue();
899 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000900 }
901
Kevin Qin110db6f2014-07-18 07:03:22 +0000902 // Handle CPU name is 'native'.
903 if (CPU == "native")
904 return llvm::sys::getHostCPUName();
905 else if (CPU.size())
906 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000907
James Molloy9b1586b2014-04-17 12:51:17 +0000908 // Make sure we pick "cyclone" if -arch is used.
909 // FIXME: Should this be picked by checking the target triple instead?
910 if (Args.getLastArg(options::OPT_arch))
911 return "cyclone";
912
913 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000914}
915
Tim Northover573cbee2014-05-24 12:52:07 +0000916void Clang::AddAArch64TargetArgs(const ArgList &Args,
917 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000918 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
919 llvm::Triple Triple(TripleStr);
920
921 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
922 Args.hasArg(options::OPT_mkernel) ||
923 Args.hasArg(options::OPT_fapple_kext))
924 CmdArgs.push_back("-disable-red-zone");
925
926 if (!Args.hasFlag(options::OPT_mimplicit_float,
927 options::OPT_mno_implicit_float, true))
928 CmdArgs.push_back("-no-implicit-float");
929
Craig Topper92fc2df2014-05-17 16:56:41 +0000930 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000931 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
932 ABIName = A->getValue();
933 else if (Triple.isOSDarwin())
934 ABIName = "darwinpcs";
935 else
936 ABIName = "aapcs";
937
938 CmdArgs.push_back("-target-abi");
939 CmdArgs.push_back(ABIName);
940
Bob Wilson0874e532014-07-29 00:23:18 +0000941 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
942 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000943 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000944 if (A->getOption().matches(options::OPT_mno_unaligned_access))
945 CmdArgs.push_back("-aarch64-strict-align");
946 else
947 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000948 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000949
Bradley Smith9ff64332014-10-13 10:16:06 +0000950 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
951 options::OPT_mno_fix_cortex_a53_835769)) {
952 CmdArgs.push_back("-backend-option");
953 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
954 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
955 else
956 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000957 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
958 // Enabled A53 errata (835769) workaround by default on android
959 CmdArgs.push_back("-backend-option");
960 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000961 }
962
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000963 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000964 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
965 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000966 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000967 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000968 CmdArgs.push_back("-aarch64-global-merge=false");
969 else
970 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000971 }
Renato Golinb625f482015-01-25 23:17:48 +0000972
973 if (Args.hasArg(options::OPT_ffixed_x18)) {
974 CmdArgs.push_back("-backend-option");
975 CmdArgs.push_back("-aarch64-reserve-x18");
976 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000977}
978
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000979// Get CPU and ABI names. They are not independent
980// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000981void mips::getMipsCPUAndABI(const ArgList &Args,
982 const llvm::Triple &Triple,
983 StringRef &CPUName,
984 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000985 const char *DefMips32CPU = "mips32r2";
986 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000987
Daniel Sanders2bf13662014-07-10 14:40:57 +0000988 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
989 // default for mips64(el)?-img-linux-gnu.
990 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
991 Triple.getEnvironment() == llvm::Triple::GNU) {
992 DefMips32CPU = "mips32r6";
993 DefMips64CPU = "mips64r6";
994 }
995
Brad Smithba26f582015-01-06 02:53:17 +0000996 // MIPS3 is the default for mips64*-unknown-openbsd.
997 if (Triple.getOS() == llvm::Triple::OpenBSD)
998 DefMips64CPU = "mips3";
999
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001000 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001001 options::OPT_mcpu_EQ))
1002 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001003
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001004 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001005 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001006 // Convert a GNU style Mips ABI name to the name
1007 // accepted by LLVM Mips backend.
1008 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1009 .Case("32", "o32")
1010 .Case("64", "n64")
1011 .Default(ABIName);
1012 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001013
1014 // Setup default CPU and ABI names.
1015 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001016 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001017 default:
1018 llvm_unreachable("Unexpected triple arch name");
1019 case llvm::Triple::mips:
1020 case llvm::Triple::mipsel:
1021 CPUName = DefMips32CPU;
1022 break;
1023 case llvm::Triple::mips64:
1024 case llvm::Triple::mips64el:
1025 CPUName = DefMips64CPU;
1026 break;
1027 }
1028 }
1029
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001030 if (ABIName.empty()) {
1031 // Deduce ABI name from the target triple.
1032 if (Triple.getArch() == llvm::Triple::mips ||
1033 Triple.getArch() == llvm::Triple::mipsel)
1034 ABIName = "o32";
1035 else
1036 ABIName = "n64";
1037 }
1038
1039 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001040 // Deduce CPU name from ABI name.
1041 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001042 .Cases("o32", "eabi", DefMips32CPU)
1043 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001044 .Default("");
1045 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001046
1047 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001048}
1049
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001050// Convert ABI name to the GNU tools acceptable variant.
1051static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1052 return llvm::StringSwitch<llvm::StringRef>(ABI)
1053 .Case("o32", "32")
1054 .Case("n64", "64")
1055 .Default(ABI);
1056}
1057
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001058// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1059// and -mfloat-abi=.
1060static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001061 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001062 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001063 options::OPT_mhard_float,
1064 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001065 if (A->getOption().matches(options::OPT_msoft_float))
1066 FloatABI = "soft";
1067 else if (A->getOption().matches(options::OPT_mhard_float))
1068 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001069 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001070 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001071 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001072 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001073 FloatABI = "hard";
1074 }
1075 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001076 }
1077
1078 // If unspecified, choose the default based on the platform.
1079 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001080 // Assume "hard", because it's a default value used by gcc.
1081 // When we start to recognize specific target MIPS processors,
1082 // we will be able to select the default more correctly.
1083 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001084 }
1085
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001086 return FloatABI;
1087}
1088
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001089static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001090 std::vector<const char *> &Features,
1091 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001092 StringRef FeatureName) {
1093 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001094 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001095 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001096 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001097 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001098 }
1099}
1100
Daniel Sanders379d44b2014-07-16 11:52:23 +00001101static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1102 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001103 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001104 StringRef CPUName;
1105 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001106 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001107 ABIName = getGnuCompatibleMipsABIName(ABIName);
1108
Daniel Sandersfeb61302014-08-08 15:47:17 +00001109 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1110 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001111
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001112 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001113 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001114 // FIXME: Note, this is a hack. We need to pass the selected float
1115 // mode to the MipsTargetInfoBase to define appropriate macros there.
1116 // Now it is the only method.
1117 Features.push_back("+soft-float");
1118 }
1119
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001120 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001121 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001122 if (Val == "2008") {
1123 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1124 Features.push_back("+nan2008");
1125 else {
1126 Features.push_back("-nan2008");
1127 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1128 }
1129 } else if (Val == "legacy") {
1130 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1131 Features.push_back("-nan2008");
1132 else {
1133 Features.push_back("+nan2008");
1134 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1135 }
1136 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001137 D.Diag(diag::err_drv_unsupported_option_argument)
1138 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001139 }
1140
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001141 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1142 options::OPT_mdouble_float, "single-float");
1143 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1144 "mips16");
1145 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1146 options::OPT_mno_micromips, "micromips");
1147 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1148 "dsp");
1149 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1150 "dspr2");
1151 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1152 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001153
1154 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1155 // pass -mfpxx
1156 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1157 options::OPT_mfp64)) {
1158 if (A->getOption().matches(options::OPT_mfp32))
1159 Features.push_back(Args.MakeArgString("-fp64"));
1160 else if (A->getOption().matches(options::OPT_mfpxx)) {
1161 Features.push_back(Args.MakeArgString("+fpxx"));
1162 Features.push_back(Args.MakeArgString("+nooddspreg"));
1163 } else
1164 Features.push_back(Args.MakeArgString("+fp64"));
1165 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001166 Features.push_back(Args.MakeArgString("+fpxx"));
1167 Features.push_back(Args.MakeArgString("+nooddspreg"));
1168 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001169
Daniel Sanders28e5d392014-07-10 10:39:51 +00001170 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1171 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001172}
1173
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001174void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001175 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001176 const Driver &D = getToolChain().getDriver();
1177 StringRef CPUName;
1178 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001179 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001180 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001181
1182 CmdArgs.push_back("-target-abi");
1183 CmdArgs.push_back(ABIName.data());
1184
1185 StringRef FloatABI = getMipsFloatABI(D, Args);
1186
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001187 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001188 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001189 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001190 CmdArgs.push_back("-mfloat-abi");
1191 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001192 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001193 else {
1194 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001195 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001196 CmdArgs.push_back("-mfloat-abi");
1197 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001199
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001200 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1201 if (A->getOption().matches(options::OPT_mxgot)) {
1202 CmdArgs.push_back("-mllvm");
1203 CmdArgs.push_back("-mxgot");
1204 }
1205 }
1206
Simon Atanasyanc580b322013-05-11 06:33:44 +00001207 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1208 options::OPT_mno_ldc1_sdc1)) {
1209 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1210 CmdArgs.push_back("-mllvm");
1211 CmdArgs.push_back("-mno-ldc1-sdc1");
1212 }
1213 }
1214
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001215 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1216 options::OPT_mno_check_zero_division)) {
1217 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1218 CmdArgs.push_back("-mllvm");
1219 CmdArgs.push_back("-mno-check-zero-division");
1220 }
1221 }
1222
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001223 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001224 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001225 CmdArgs.push_back("-mllvm");
1226 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1227 A->claim();
1228 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001229}
1230
Hal Finkel8eb59282012-06-11 22:35:19 +00001231/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1232static std::string getPPCTargetCPU(const ArgList &Args) {
1233 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001234 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001235
1236 if (CPUName == "native") {
1237 std::string CPU = llvm::sys::getHostCPUName();
1238 if (!CPU.empty() && CPU != "generic")
1239 return CPU;
1240 else
1241 return "";
1242 }
1243
1244 return llvm::StringSwitch<const char *>(CPUName)
1245 .Case("common", "generic")
1246 .Case("440", "440")
1247 .Case("440fp", "440")
1248 .Case("450", "450")
1249 .Case("601", "601")
1250 .Case("602", "602")
1251 .Case("603", "603")
1252 .Case("603e", "603e")
1253 .Case("603ev", "603ev")
1254 .Case("604", "604")
1255 .Case("604e", "604e")
1256 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001258 .Case("G3", "g3")
1259 .Case("7400", "7400")
1260 .Case("G4", "g4")
1261 .Case("7450", "7450")
1262 .Case("G4+", "g4+")
1263 .Case("750", "750")
1264 .Case("970", "970")
1265 .Case("G5", "g5")
1266 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001267 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001268 .Case("e500mc", "e500mc")
1269 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001270 .Case("power3", "pwr3")
1271 .Case("power4", "pwr4")
1272 .Case("power5", "pwr5")
1273 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001274 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001275 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001276 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001277 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001278 .Case("pwr3", "pwr3")
1279 .Case("pwr4", "pwr4")
1280 .Case("pwr5", "pwr5")
1281 .Case("pwr5x", "pwr5x")
1282 .Case("pwr6", "pwr6")
1283 .Case("pwr6x", "pwr6x")
1284 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001285 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001286 .Case("powerpc", "ppc")
1287 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001288 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001289 .Default("");
1290 }
1291
1292 return "";
1293}
1294
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001295static void getPPCTargetFeatures(const ArgList &Args,
1296 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001297 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1298 ie = Args.filtered_end();
1299 it != ie; ++it) {
1300 StringRef Name = (*it)->getOption().getName();
1301 (*it)->claim();
1302
1303 // Skip over "-m".
1304 assert(Name.startswith("m") && "Invalid feature name.");
1305 Name = Name.substr(1);
1306
1307 bool IsNegative = Name.startswith("no-");
1308 if (IsNegative)
1309 Name = Name.substr(3);
1310
1311 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1312 // pass the correct option to the backend while calling the frontend
1313 // option the same.
1314 // TODO: Change the LLVM backend option maybe?
1315 if (Name == "mfcrf")
1316 Name = "mfocrf";
1317
1318 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1319 }
1320
1321 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001322 AddTargetFeature(Args, Features, options::OPT_faltivec,
1323 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001324}
1325
Ulrich Weigand8afad612014-07-28 13:17:52 +00001326void Clang::AddPPCTargetArgs(const ArgList &Args,
1327 ArgStringList &CmdArgs) const {
1328 // Select the ABI to use.
1329 const char *ABIName = nullptr;
1330 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1331 ABIName = A->getValue();
1332 } else if (getToolChain().getTriple().isOSLinux())
1333 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001334 case llvm::Triple::ppc64: {
1335 // When targeting a processor that supports QPX, or if QPX is
1336 // specifically enabled, default to using the ABI that supports QPX (so
1337 // long as it is not specifically disabled).
1338 bool HasQPX = false;
1339 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1340 HasQPX = A->getValue() == StringRef("a2q");
1341 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1342 if (HasQPX) {
1343 ABIName = "elfv1-qpx";
1344 break;
1345 }
1346
Ulrich Weigand8afad612014-07-28 13:17:52 +00001347 ABIName = "elfv1";
1348 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001349 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001350 case llvm::Triple::ppc64le:
1351 ABIName = "elfv2";
1352 break;
1353 default:
1354 break;
1355 }
1356
1357 if (ABIName) {
1358 CmdArgs.push_back("-target-abi");
1359 CmdArgs.push_back(ABIName);
1360 }
1361}
1362
1363bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1364 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1365 return A && (A->getValue() == StringRef(Value));
1366}
1367
Tom Stellard6674c702013-04-01 20:56:53 +00001368/// Get the (LLVM) name of the R600 gpu we are targeting.
1369static std::string getR600TargetGPU(const ArgList &Args) {
1370 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001371 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001372 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001373 .Cases("rv630", "rv635", "r600")
1374 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001375 .Case("rv740", "rv770")
1376 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001377 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001378 .Case("hemlock", "cypress")
1379 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001380 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001381 }
1382 return "";
1383}
1384
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001385static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001386 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001387 bool SoftFloatABI = true;
1388 if (Arg *A =
1389 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1390 if (A->getOption().matches(options::OPT_mhard_float))
1391 SoftFloatABI = false;
1392 }
1393 if (SoftFloatABI)
1394 Features.push_back("+soft-float");
1395}
1396
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001397void Clang::AddSparcTargetArgs(const ArgList &Args,
1398 ArgStringList &CmdArgs) const {
1399 const Driver &D = getToolChain().getDriver();
1400
Brad Smith10cd0f42014-07-11 20:12:08 +00001401 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001402 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001403 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1404 options::OPT_mhard_float)) {
1405 if (A->getOption().matches(options::OPT_msoft_float))
1406 FloatABI = "soft";
1407 else if (A->getOption().matches(options::OPT_mhard_float))
1408 FloatABI = "hard";
1409 }
1410
1411 // If unspecified, choose the default based on the platform.
1412 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001413 // Assume "soft", but warn the user we are guessing.
1414 FloatABI = "soft";
1415 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001416 }
1417
1418 if (FloatABI == "soft") {
1419 // Floating point operations and argument passing are soft.
1420 //
1421 // FIXME: This changes CPP defines, we need -target-soft-float.
1422 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423 } else {
1424 assert(FloatABI == "hard" && "Invalid float abi!");
1425 CmdArgs.push_back("-mhard-float");
1426 }
1427}
1428
Richard Sandiford4652d892013-07-19 16:51:51 +00001429static const char *getSystemZTargetCPU(const ArgList &Args) {
1430 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1431 return A->getValue();
1432 return "z10";
1433}
1434
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001435static void getSystemZTargetFeatures(const ArgList &Args,
1436 std::vector<const char *> &Features) {
1437 // -m(no-)htm overrides use of the transactional-execution facility.
1438 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1439 options::OPT_mno_htm)) {
1440 if (A->getOption().matches(options::OPT_mhtm))
1441 Features.push_back("+transactional-execution");
1442 else
1443 Features.push_back("-transactional-execution");
1444 }
1445}
1446
Chandler Carruth953fb082013-01-13 11:46:33 +00001447static const char *getX86TargetCPU(const ArgList &Args,
1448 const llvm::Triple &Triple) {
1449 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001450 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001451 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001452 return "core-avx2";
1453
Chandler Carruth953fb082013-01-13 11:46:33 +00001454 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001455 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001456
1457 // FIXME: Reject attempts to use -march=native unless the target matches
1458 // the host.
1459 //
1460 // FIXME: We should also incorporate the detected target features for use
1461 // with -native.
1462 std::string CPU = llvm::sys::getHostCPUName();
1463 if (!CPU.empty() && CPU != "generic")
1464 return Args.MakeArgString(CPU);
1465 }
1466
1467 // Select the default CPU if none was given (or detection failed).
1468
1469 if (Triple.getArch() != llvm::Triple::x86_64 &&
1470 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001471 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001472
1473 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1474
1475 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001476 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001477 if (Triple.getArchName() == "x86_64h")
1478 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001479 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001480 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001481
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001482 // Set up default CPU name for PS4 compilers.
1483 if (Triple.isPS4CPU())
1484 return "btver2";
1485
Alexey Bataev286d1b92014-01-31 04:07:13 +00001486 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001487 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001488 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001489
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001490 // Everything else goes to x86-64 in 64-bit mode.
1491 if (Is64Bit)
1492 return "x86-64";
1493
1494 switch (Triple.getOS()) {
1495 case llvm::Triple::FreeBSD:
1496 case llvm::Triple::NetBSD:
1497 case llvm::Triple::OpenBSD:
1498 return "i486";
1499 case llvm::Triple::Haiku:
1500 return "i586";
1501 case llvm::Triple::Bitrig:
1502 return "i686";
1503 default:
1504 // Fallback to p4.
1505 return "pentium4";
1506 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001507}
1508
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001509static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1510 switch(T.getArch()) {
1511 default:
1512 return "";
1513
Amara Emerson703da2e2013-10-31 09:32:33 +00001514 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001515 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001516 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001517
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001519 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001520 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001521 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001522 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001523
1524 case llvm::Triple::mips:
1525 case llvm::Triple::mipsel:
1526 case llvm::Triple::mips64:
1527 case llvm::Triple::mips64el: {
1528 StringRef CPUName;
1529 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001530 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001531 return CPUName;
1532 }
1533
1534 case llvm::Triple::ppc:
1535 case llvm::Triple::ppc64:
1536 case llvm::Triple::ppc64le: {
1537 std::string TargetCPUName = getPPCTargetCPU(Args);
1538 // LLVM may default to generating code for the native CPU,
1539 // but, like gcc, we default to a more generic option for
1540 // each architecture. (except on Darwin)
1541 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1542 if (T.getArch() == llvm::Triple::ppc64)
1543 TargetCPUName = "ppc64";
1544 else if (T.getArch() == llvm::Triple::ppc64le)
1545 TargetCPUName = "ppc64le";
1546 else
1547 TargetCPUName = "ppc";
1548 }
1549 return TargetCPUName;
1550 }
1551
1552 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001553 case llvm::Triple::sparcv9:
1554 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001555 return A->getValue();
1556 return "";
1557
1558 case llvm::Triple::x86:
1559 case llvm::Triple::x86_64:
1560 return getX86TargetCPU(Args, T);
1561
1562 case llvm::Triple::hexagon:
1563 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1564
1565 case llvm::Triple::systemz:
1566 return getSystemZTargetCPU(Args);
1567
1568 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001569 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001570 return getR600TargetGPU(Args);
1571 }
1572}
1573
Alp Tokerce365ca2013-12-02 12:43:03 +00001574static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1575 ArgStringList &CmdArgs) {
1576 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1577 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1578 // forward.
1579 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001580 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001581 CmdArgs.push_back(Args.MakeArgString(Plugin));
1582
1583 // Try to pass driver level flags relevant to LTO code generation down to
1584 // the plugin.
1585
1586 // Handle flags for selecting CPU variants.
1587 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1588 if (!CPU.empty())
1589 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1590}
1591
Eric Christopherc54920a2015-03-23 19:26:05 +00001592static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001593 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001594 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001595 // If -march=native, autodetect the feature list.
1596 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1597 if (StringRef(A->getValue()) == "native") {
1598 llvm::StringMap<bool> HostFeatures;
1599 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1600 for (auto &F : HostFeatures)
1601 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1602 F.first()));
1603 }
1604 }
1605
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 if (Triple.getArchName() == "x86_64h") {
1607 // x86_64h implies quite a few of the more modern subtarget features
1608 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1609 Features.push_back("-rdrnd");
1610 Features.push_back("-aes");
1611 Features.push_back("-pclmul");
1612 Features.push_back("-rtm");
1613 Features.push_back("-hle");
1614 Features.push_back("-fsgsbase");
1615 }
1616
Eric Christopherc54920a2015-03-23 19:26:05 +00001617 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001618 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001619 if (Triple.getArch() == llvm::Triple::x86_64) {
1620 Features.push_back("+sse4.2");
1621 Features.push_back("+popcnt");
1622 } else
1623 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001624 }
1625
Eric Christopherc54920a2015-03-23 19:26:05 +00001626 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001627 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1628 StringRef Arch = A->getValue();
1629 bool ArchUsed = false;
1630 // First, look for flags that are shared in x86 and x86-64.
1631 if (Triple.getArch() == llvm::Triple::x86_64 ||
1632 Triple.getArch() == llvm::Triple::x86) {
1633 if (Arch == "AVX" || Arch == "AVX2") {
1634 ArchUsed = true;
1635 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1636 }
1637 }
1638 // Then, look for x86-specific flags.
1639 if (Triple.getArch() == llvm::Triple::x86) {
1640 if (Arch == "IA32") {
1641 ArchUsed = true;
1642 } else if (Arch == "SSE" || Arch == "SSE2") {
1643 ArchUsed = true;
1644 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1645 }
1646 }
1647 if (!ArchUsed)
1648 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1649 }
1650
Jim Grosbach82eee262013-11-16 00:53:35 +00001651 // Now add any that the user explicitly requested on the command line,
1652 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001653 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1654 ie = Args.filtered_end();
1655 it != ie; ++it) {
1656 StringRef Name = (*it)->getOption().getName();
1657 (*it)->claim();
1658
1659 // Skip over "-m".
1660 assert(Name.startswith("m") && "Invalid feature name.");
1661 Name = Name.substr(1);
1662
1663 bool IsNegative = Name.startswith("no-");
1664 if (IsNegative)
1665 Name = Name.substr(3);
1666
1667 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1668 }
1669}
1670
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001671void Clang::AddX86TargetArgs(const ArgList &Args,
1672 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001673 if (!Args.hasFlag(options::OPT_mred_zone,
1674 options::OPT_mno_red_zone,
1675 true) ||
1676 Args.hasArg(options::OPT_mkernel) ||
1677 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001678 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001679
Bob Wilson2616e2e2013-02-10 16:01:41 +00001680 // Default to avoid implicit floating-point for kernel/kext code, but allow
1681 // that to be overridden with -mno-soft-float.
1682 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1683 Args.hasArg(options::OPT_fapple_kext));
1684 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1685 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001686 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001687 options::OPT_mno_implicit_float)) {
1688 const Option &O = A->getOption();
1689 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1690 O.matches(options::OPT_msoft_float));
1691 }
1692 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001693 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001694
1695 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1696 StringRef Value = A->getValue();
1697 if (Value == "intel" || Value == "att") {
1698 CmdArgs.push_back("-mllvm");
1699 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1700 } else {
1701 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1702 << A->getOption().getName() << Value;
1703 }
1704 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001705}
1706
Matthew Curtise8f80a12012-12-06 17:49:03 +00001707static inline bool HasPICArg(const ArgList &Args) {
1708 return Args.hasArg(options::OPT_fPIC)
1709 || Args.hasArg(options::OPT_fpic);
1710}
1711
1712static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1713 return Args.getLastArg(options::OPT_G,
1714 options::OPT_G_EQ,
1715 options::OPT_msmall_data_threshold_EQ);
1716}
1717
1718static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1719 std::string value;
1720 if (HasPICArg(Args))
1721 value = "0";
1722 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1723 value = A->getValue();
1724 A->claim();
1725 }
1726 return value;
1727}
1728
Tony Linthicum76329bf2011-12-12 21:14:55 +00001729void Clang::AddHexagonTargetArgs(const ArgList &Args,
1730 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001731 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001732 CmdArgs.push_back("-mqdsp6-compat");
1733 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001734
Matthew Curtise8f80a12012-12-06 17:49:03 +00001735 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1736 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001737 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001738 CmdArgs.push_back(Args.MakeArgString(
1739 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001740 }
1741
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001742 if (!Args.hasArg(options::OPT_fno_short_enums))
1743 CmdArgs.push_back("-fshort-enums");
1744 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1745 CmdArgs.push_back ("-mllvm");
1746 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1747 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001748 CmdArgs.push_back ("-mllvm");
1749 CmdArgs.push_back ("-machine-sink-split=0");
1750}
1751
Kevin Qin110db6f2014-07-18 07:03:22 +00001752// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001753static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001754 std::vector<const char *> &Features) {
1755 SmallVector<StringRef, 8> Split;
1756 text.split(Split, StringRef("+"), -1, false);
1757
1758 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1759 const char *result = llvm::StringSwitch<const char *>(Split[I])
1760 .Case("fp", "+fp-armv8")
1761 .Case("simd", "+neon")
1762 .Case("crc", "+crc")
1763 .Case("crypto", "+crypto")
1764 .Case("nofp", "-fp-armv8")
1765 .Case("nosimd", "-neon")
1766 .Case("nocrc", "-crc")
1767 .Case("nocrypto", "-crypto")
1768 .Default(nullptr);
1769 if (result)
1770 Features.push_back(result);
1771 else if (Split[I] == "neon" || Split[I] == "noneon")
1772 D.Diag(diag::err_drv_no_neon_modifier);
1773 else
1774 return false;
1775 }
1776 return true;
1777}
1778
1779// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1780// decode CPU and feature.
1781static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1782 std::vector<const char *> &Features) {
1783 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1784 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001785 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001786 Features.push_back("+neon");
1787 Features.push_back("+crc");
1788 Features.push_back("+crypto");
1789 } else if (CPU == "generic") {
1790 Features.push_back("+neon");
1791 } else {
1792 return false;
1793 }
1794
1795 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1796 return false;
1797
1798 return true;
1799}
1800
1801static bool
1802getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1803 const ArgList &Args,
1804 std::vector<const char *> &Features) {
1805 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001806
1807 if (Split.first == "armv8-a" ||
1808 Split.first == "armv8a") {
1809 // ok, no additional features.
1810 } else if (
1811 Split.first == "armv8.1-a" ||
1812 Split.first == "armv8.1a" ) {
1813 Features.push_back("+v8.1a");
1814 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001815 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001816 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001817
1818 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1819 return false;
1820
1821 return true;
1822}
1823
1824static bool
1825getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1826 const ArgList &Args,
1827 std::vector<const char *> &Features) {
1828 StringRef CPU;
1829 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1830 return false;
1831
1832 return true;
1833}
1834
1835static bool
1836getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1837 const ArgList &Args,
1838 std::vector<const char *> &Features) {
1839 // Handle CPU name is 'native'.
1840 if (Mtune == "native")
1841 Mtune = llvm::sys::getHostCPUName();
1842 if (Mtune == "cyclone") {
1843 Features.push_back("+zcm");
1844 Features.push_back("+zcz");
1845 }
1846 return true;
1847}
1848
1849static bool
1850getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1851 const ArgList &Args,
1852 std::vector<const char *> &Features) {
1853 StringRef CPU;
1854 std::vector<const char *> DecodedFeature;
1855 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1856 return false;
1857
1858 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1859}
1860
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001861static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1862 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001863 Arg *A;
1864 bool success = true;
1865 // Enable NEON by default.
1866 Features.push_back("+neon");
1867 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1868 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1869 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1870 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001871 else if (Args.hasArg(options::OPT_arch))
1872 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1873 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001874
1875 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1876 success =
1877 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1878 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1879 success =
1880 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001881 else if (Args.hasArg(options::OPT_arch))
1882 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1883 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001884
1885 if (!success)
1886 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001887
1888 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1889 Features.push_back("-fp-armv8");
1890 Features.push_back("-crypto");
1891 Features.push_back("-neon");
1892 }
Bradley Smith418c5932014-05-02 15:17:51 +00001893
1894 // En/disable crc
1895 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1896 options::OPT_mnocrc)) {
1897 if (A->getOption().matches(options::OPT_mcrc))
1898 Features.push_back("+crc");
1899 else
1900 Features.push_back("-crc");
1901 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001902}
1903
1904static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001905 const ArgList &Args, ArgStringList &CmdArgs,
1906 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001907 std::vector<const char *> Features;
1908 switch (Triple.getArch()) {
1909 default:
1910 break;
1911 case llvm::Triple::mips:
1912 case llvm::Triple::mipsel:
1913 case llvm::Triple::mips64:
1914 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001915 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001916 break;
1917
1918 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001919 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001920 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001921 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001922 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001923 break;
1924
1925 case llvm::Triple::ppc:
1926 case llvm::Triple::ppc64:
1927 case llvm::Triple::ppc64le:
1928 getPPCTargetFeatures(Args, Features);
1929 break;
1930 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001931 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001932 getSparcTargetFeatures(Args, Features);
1933 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001934 case llvm::Triple::systemz:
1935 getSystemZTargetFeatures(Args, Features);
1936 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001937 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001938 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001939 getAArch64TargetFeatures(D, Args, Features);
1940 break;
1941 case llvm::Triple::x86:
1942 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001943 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001944 break;
1945 }
Rafael Espindola43964802013-08-21 17:34:32 +00001946
1947 // Find the last of each feature.
1948 llvm::StringMap<unsigned> LastOpt;
1949 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1950 const char *Name = Features[I];
1951 assert(Name[0] == '-' || Name[0] == '+');
1952 LastOpt[Name + 1] = I;
1953 }
1954
1955 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1956 // If this feature was overridden, ignore it.
1957 const char *Name = Features[I];
1958 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1959 assert(LastI != LastOpt.end());
1960 unsigned Last = LastI->second;
1961 if (Last != I)
1962 continue;
1963
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001964 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001965 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001966 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001967}
1968
David Majnemerae394812014-12-09 00:12:30 +00001969static bool
1970shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1971 const llvm::Triple &Triple) {
1972 // We use the zero-cost exception tables for Objective-C if the non-fragile
1973 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1974 // later.
1975 if (runtime.isNonFragile())
1976 return true;
1977
1978 if (!Triple.isMacOSX())
1979 return false;
1980
1981 return (!Triple.isMacOSXVersionLT(10,5) &&
1982 (Triple.getArch() == llvm::Triple::x86_64 ||
1983 Triple.getArch() == llvm::Triple::arm));
1984}
1985
Nico Webere8e53112014-05-11 01:04:02 +00001986// exceptionSettings() exists to share the logic between -cc1 and linker
1987// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001988static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001989 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001990 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001991 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001992 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001993
David Majnemer8de68642014-12-05 08:11:58 +00001994 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001995}
1996
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001997/// Adds exception related arguments to the driver command arguments. There's a
1998/// master flag, -fexceptions and also language specific flags to enable/disable
1999/// C++ and Objective-C exceptions. This makes it possible to for example
2000/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002001static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002002 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002003 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002004 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002005 const Driver &D = TC.getDriver();
2006 const llvm::Triple &Triple = TC.getTriple();
2007
Chad Rosier4fab82c2012-03-26 22:04:46 +00002008 if (KernelOrKext) {
2009 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2010 // arguments now to avoid warnings about unused arguments.
2011 Args.ClaimAllArgs(options::OPT_fexceptions);
2012 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2013 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2014 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2015 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2016 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002017 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002018 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002019
David Majnemer8de68642014-12-05 08:11:58 +00002020 // Gather the exception settings from the command line arguments.
2021 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002022
David Majnemerae394812014-12-09 00:12:30 +00002023 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2024 // is not necessarily sensible, but follows GCC.
2025 if (types::isObjC(InputType) &&
2026 Args.hasFlag(options::OPT_fobjc_exceptions,
2027 options::OPT_fno_objc_exceptions,
2028 true)) {
2029 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002030
David Majnemerae394812014-12-09 00:12:30 +00002031 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002032 }
2033
2034 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002035 bool CXXExceptionsEnabled =
2036 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002037 Arg *ExceptionArg = Args.getLastArg(
2038 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2039 options::OPT_fexceptions, options::OPT_fno_exceptions);
2040 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002041 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002042 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2043 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002044
2045 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002046 if (Triple.isPS4CPU()) {
2047 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2048 assert(ExceptionArg &&
2049 "On the PS4 exceptions should only be enabled if passing "
2050 "an argument");
2051 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2052 const Arg *RTTIArg = TC.getRTTIArg();
2053 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2054 D.Diag(diag::err_drv_argument_not_allowed_with)
2055 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2056 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2057 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2058 } else
2059 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2060
Anders Carlssone96ab552011-02-28 02:27:16 +00002061 CmdArgs.push_back("-fcxx-exceptions");
2062
David Majnemer8de68642014-12-05 08:11:58 +00002063 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002064 }
2065 }
2066
David Majnemer8de68642014-12-05 08:11:58 +00002067 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002068 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002069}
2070
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002071static bool ShouldDisableAutolink(const ArgList &Args,
2072 const ToolChain &TC) {
2073 bool Default = true;
2074 if (TC.getTriple().isOSDarwin()) {
2075 // The native darwin assembler doesn't support the linker_option directives,
2076 // so we disable them if we think the .s file will be passed to it.
2077 Default = TC.useIntegratedAs();
2078 }
2079 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2080 Default);
2081}
2082
Ted Kremenek62093662013-03-12 17:02:12 +00002083static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2084 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002085 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2086 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002087 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002088 return !UseDwarfDirectory;
2089}
2090
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002091/// \brief Check whether the given input tree contains any compilation actions.
2092static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002093 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002094 return true;
2095
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002096 for (const auto &Act : *A)
2097 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002098 return true;
2099
2100 return false;
2101}
2102
2103/// \brief Check if -relax-all should be passed to the internal assembler.
2104/// This is done by default when compiling non-assembler source with -O0.
2105static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2106 bool RelaxDefault = true;
2107
2108 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2109 RelaxDefault = A->getOption().matches(options::OPT_O0);
2110
2111 if (RelaxDefault) {
2112 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002113 for (const auto &Act : C.getActions()) {
2114 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002115 RelaxDefault = true;
2116 break;
2117 }
2118 }
2119 }
2120
2121 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2122 RelaxDefault);
2123}
2124
David Blaikie9260ed62013-07-25 21:19:01 +00002125static void CollectArgsForIntegratedAssembler(Compilation &C,
2126 const ArgList &Args,
2127 ArgStringList &CmdArgs,
2128 const Driver &D) {
2129 if (UseRelaxAll(C, Args))
2130 CmdArgs.push_back("-mrelax-all");
2131
David Peixottodfb66142013-11-14 22:52:58 +00002132 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002133 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002134 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2135 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2136 // arg after parsing the '-I' arg.
2137 bool TakeNextArg = false;
2138
David Blaikie9260ed62013-07-25 21:19:01 +00002139 // When using an integrated assembler, translate -Wa, and -Xassembler
2140 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002141 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002142 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2143 options::OPT_Xassembler),
2144 ie = Args.filtered_end(); it != ie; ++it) {
2145 const Arg *A = *it;
2146 A->claim();
2147
2148 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2149 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002150 if (TakeNextArg) {
2151 CmdArgs.push_back(Value.data());
2152 TakeNextArg = false;
2153 continue;
2154 }
David Blaikie9260ed62013-07-25 21:19:01 +00002155
2156 if (Value == "-force_cpusubtype_ALL") {
2157 // Do nothing, this is the default and we don't support anything else.
2158 } else if (Value == "-L") {
2159 CmdArgs.push_back("-msave-temp-labels");
2160 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002161 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002162 } else if (Value == "--noexecstack") {
2163 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002164 } else if (Value == "-compress-debug-sections" ||
2165 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002166 CompressDebugSections = true;
2167 } else if (Value == "-nocompress-debug-sections" ||
2168 Value == "--nocompress-debug-sections") {
2169 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002170 } else if (Value.startswith("-I")) {
2171 CmdArgs.push_back(Value.data());
2172 // We need to consume the next argument if the current arg is a plain
2173 // -I. The next arg will be the include directory.
2174 if (Value == "-I")
2175 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002176 } else if (Value.startswith("-gdwarf-")) {
2177 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002178 } else {
2179 D.Diag(diag::err_drv_unsupported_option_argument)
2180 << A->getOption().getName() << Value;
2181 }
2182 }
2183 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002184 if (CompressDebugSections) {
2185 if (llvm::zlib::isAvailable())
2186 CmdArgs.push_back("-compress-debug-sections");
2187 else
2188 D.Diag(diag::warn_debug_compression_unavailable);
2189 }
David Blaikie9260ed62013-07-25 21:19:01 +00002190}
2191
Renato Goline807c122014-01-31 11:47:28 +00002192// Until ARM libraries are build separately, we have them all in one library
2193static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002194 // FIXME: handle 64-bit
2195 if (TC.getTriple().isOSWindows() &&
2196 !TC.getTriple().isWindowsItaniumEnvironment())
2197 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002198 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002199 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002200 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002201}
2202
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002203static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2204 // The runtimes are located in the OS-specific resource directory.
2205 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002206 const llvm::Triple &Triple = TC.getTriple();
2207 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002208 StringRef OSLibName =
2209 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002210 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002211 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002212}
2213
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002214static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002215 bool Shared = false) {
2216 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2217 ? "-android"
2218 : "";
2219
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002220 bool IsOSWindows = TC.getTriple().isOSWindows();
2221 StringRef Arch = getArchNameForCompilerRTLib(TC);
2222 const char *Prefix = IsOSWindows ? "" : "lib";
2223 const char *Suffix =
2224 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2225
2226 SmallString<128> Path = getCompilerRTLibDir(TC);
2227 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2228 Arch + Env + Suffix);
2229
2230 return Path;
2231}
2232
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002233// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002234// FIXME: Make sure we can also emit shared objects if they're requested
2235// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002236static void addClangRT(const ToolChain &TC, const ArgList &Args,
2237 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002238 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002239
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002240 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002241 // FIXME: why do we link against gcc when we are using compiler-rt?
2242 CmdArgs.push_back("-lgcc_s");
2243 if (TC.getDriver().CCCIsCXX())
2244 CmdArgs.push_back("-lgcc_eh");
2245 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002246}
2247
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002248static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2249 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002250 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2251 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002252 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002253 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002254 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002255 Args.hasArg(options::OPT_fcreate_profile) ||
2256 Args.hasArg(options::OPT_coverage)))
2257 return;
2258
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002259 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002260}
2261
Alexey Samsonov52550342014-09-15 19:58:40 +00002262static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2263 ArgStringList &CmdArgs, StringRef Sanitizer,
2264 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002265 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002266 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002267 if (!IsShared)
2268 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002269 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002270 if (!IsShared)
2271 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002272}
2273
Alexey Samsonov52550342014-09-15 19:58:40 +00002274// Tries to use a file with the list of dynamic symbols that need to be exported
2275// from the runtime library. Returns true if the file was found.
2276static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2277 ArgStringList &CmdArgs,
2278 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002279 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2280 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2281 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002282 return true;
2283 }
2284 return false;
2285}
2286
2287static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2288 ArgStringList &CmdArgs) {
2289 // Force linking against the system libraries sanitizers depends on
2290 // (see PR15823 why this is necessary).
2291 CmdArgs.push_back("--no-as-needed");
2292 CmdArgs.push_back("-lpthread");
2293 CmdArgs.push_back("-lrt");
2294 CmdArgs.push_back("-lm");
2295 // There's no libdl on FreeBSD.
2296 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2297 CmdArgs.push_back("-ldl");
2298}
2299
2300static void
2301collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2302 SmallVectorImpl<StringRef> &SharedRuntimes,
2303 SmallVectorImpl<StringRef> &StaticRuntimes,
2304 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2305 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2306 // Collect shared runtimes.
2307 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2308 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002309 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002310
Alexey Samsonov52550342014-09-15 19:58:40 +00002311 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002312 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002313 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2314 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002315 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002316 }
2317 if (SanArgs.needsAsanRt()) {
2318 if (SanArgs.needsSharedAsanRt()) {
2319 HelperStaticRuntimes.push_back("asan-preinit");
2320 } else {
2321 StaticRuntimes.push_back("asan");
2322 if (SanArgs.linkCXXRuntimes())
2323 StaticRuntimes.push_back("asan_cxx");
2324 }
2325 }
2326 if (SanArgs.needsDfsanRt())
2327 StaticRuntimes.push_back("dfsan");
2328 if (SanArgs.needsLsanRt())
2329 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002330 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002331 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002332 if (SanArgs.linkCXXRuntimes())
2333 StaticRuntimes.push_back("msan_cxx");
2334 }
2335 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002336 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002337 if (SanArgs.linkCXXRuntimes())
2338 StaticRuntimes.push_back("tsan_cxx");
2339 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002340 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002341 StaticRuntimes.push_back("ubsan_standalone");
2342 if (SanArgs.linkCXXRuntimes())
2343 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002344 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002345}
2346
Alexey Samsonov52550342014-09-15 19:58:40 +00002347// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2348// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2349static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002350 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002351 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2352 HelperStaticRuntimes;
2353 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2354 HelperStaticRuntimes);
2355 for (auto RT : SharedRuntimes)
2356 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2357 for (auto RT : HelperStaticRuntimes)
2358 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2359 bool AddExportDynamic = false;
2360 for (auto RT : StaticRuntimes) {
2361 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2362 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2363 }
2364 // If there is a static runtime with no dynamic list, force all the symbols
2365 // to be dynamic to be sure we export sanitizer interface functions.
2366 if (AddExportDynamic)
2367 CmdArgs.push_back("-export-dynamic");
2368 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002369}
2370
Reid Kleckner86ea7702015-02-04 23:45:07 +00002371static bool areOptimizationsEnabled(const ArgList &Args) {
2372 // Find the last -O arg and see if it is non-zero.
2373 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2374 return !A->getOption().matches(options::OPT_O0);
2375 // Defaults to -O0.
2376 return false;
2377}
2378
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002379static bool shouldUseFramePointerForTarget(const ArgList &Args,
2380 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002381 // XCore never wants frame pointers, regardless of OS.
2382 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002383 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002384 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002385
2386 if (Triple.isOSLinux()) {
2387 switch (Triple.getArch()) {
2388 // Don't use a frame pointer on linux if optimizing for certain targets.
2389 case llvm::Triple::mips64:
2390 case llvm::Triple::mips64el:
2391 case llvm::Triple::mips:
2392 case llvm::Triple::mipsel:
2393 case llvm::Triple::systemz:
2394 case llvm::Triple::x86:
2395 case llvm::Triple::x86_64:
2396 return !areOptimizationsEnabled(Args);
2397 default:
2398 return true;
2399 }
2400 }
2401
2402 if (Triple.isOSWindows()) {
2403 switch (Triple.getArch()) {
2404 case llvm::Triple::x86:
2405 return !areOptimizationsEnabled(Args);
2406 default:
2407 // All other supported Windows ISAs use xdata unwind information, so frame
2408 // pointers are not generally useful.
2409 return false;
2410 }
2411 }
2412
2413 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002414}
2415
Rafael Espindola224dd632011-12-14 21:02:23 +00002416static bool shouldUseFramePointer(const ArgList &Args,
2417 const llvm::Triple &Triple) {
2418 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2419 options::OPT_fomit_frame_pointer))
2420 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2421
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002422 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002423}
2424
Eric Christopherb7d97e92013-04-03 01:58:53 +00002425static bool shouldUseLeafFramePointer(const ArgList &Args,
2426 const llvm::Triple &Triple) {
2427 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2428 options::OPT_momit_leaf_frame_pointer))
2429 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2430
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002431 if (Triple.isPS4CPU())
2432 return false;
2433
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002434 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002435}
2436
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002437/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002438static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002439 SmallString<128> cwd;
2440 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002441 CmdArgs.push_back("-fdebug-compilation-dir");
2442 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002443 }
2444}
2445
Eric Christopherd3804002013-02-22 20:12:52 +00002446static const char *SplitDebugName(const ArgList &Args,
2447 const InputInfoList &Inputs) {
2448 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2449 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2450 SmallString<128> T(FinalOutput->getValue());
2451 llvm::sys::path::replace_extension(T, "dwo");
2452 return Args.MakeArgString(T);
2453 } else {
2454 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002455 SmallString<128> T(
2456 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002457 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2458 llvm::sys::path::replace_extension(F, "dwo");
2459 T += F;
2460 return Args.MakeArgString(F);
2461 }
2462}
2463
2464static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2465 const Tool &T, const JobAction &JA,
2466 const ArgList &Args, const InputInfo &Output,
2467 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002468 ArgStringList ExtractArgs;
2469 ExtractArgs.push_back("--extract-dwo");
2470
2471 ArgStringList StripArgs;
2472 StripArgs.push_back("--strip-dwo");
2473
2474 // Grabbing the output of the earlier compile step.
2475 StripArgs.push_back(Output.getFilename());
2476 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002477 ExtractArgs.push_back(OutFile);
2478
2479 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002480 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002481
2482 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002483 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002484
2485 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002486 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002487}
2488
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002489/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002490/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2491static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002492 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002493 if (A->getOption().matches(options::OPT_O4) ||
2494 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002495 return true;
2496
2497 if (A->getOption().matches(options::OPT_O0))
2498 return false;
2499
2500 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2501
Rafael Espindola91780de2013-08-26 14:05:41 +00002502 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002503 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002504 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002505 return true;
2506
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002507 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002508 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002509 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002510
2511 unsigned OptLevel = 0;
2512 if (S.getAsInteger(10, OptLevel))
2513 return false;
2514
2515 return OptLevel > 1;
2516 }
2517
2518 return false;
2519}
2520
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002521/// Add -x lang to \p CmdArgs for \p Input.
2522static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2523 ArgStringList &CmdArgs) {
2524 // When using -verify-pch, we don't want to provide the type
2525 // 'precompiled-header' if it was inferred from the file extension
2526 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2527 return;
2528
2529 CmdArgs.push_back("-x");
2530 if (Args.hasArg(options::OPT_rewrite_objc))
2531 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2532 else
2533 CmdArgs.push_back(types::getTypeName(Input.getType()));
2534}
2535
David Majnemerc371ff02015-03-22 08:39:22 +00002536static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002537 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002538 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002539
2540 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002541 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002542
2543 unsigned Build = 0, Factor = 1;
2544 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2545 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002546 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002547}
2548
Rafael Espindola577637a2015-01-03 00:06:04 +00002549// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002550// options that build systems might add but are unused when assembling or only
2551// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002552static void claimNoWarnArgs(const ArgList &Args) {
2553 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002554 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002555 Args.ClaimAllArgs(options::OPT_flto);
2556 Args.ClaimAllArgs(options::OPT_fno_lto);
2557}
2558
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002559static void appendUserToPath(SmallVectorImpl<char> &Result) {
2560#ifdef LLVM_ON_UNIX
2561 const char *Username = getenv("LOGNAME");
2562#else
2563 const char *Username = getenv("USERNAME");
2564#endif
2565 if (Username) {
2566 // Validate that LoginName can be used in a path, and get its length.
2567 size_t Len = 0;
2568 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002569 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002570 Username = nullptr;
2571 break;
2572 }
2573 }
2574
2575 if (Username && Len > 0) {
2576 Result.append(Username, Username + Len);
2577 return;
2578 }
2579 }
2580
2581 // Fallback to user id.
2582#ifdef LLVM_ON_UNIX
2583 std::string UID = llvm::utostr(getuid());
2584#else
2585 // FIXME: Windows seems to have an 'SID' that might work.
2586 std::string UID = "9999";
2587#endif
2588 Result.append(UID.begin(), UID.end());
2589}
2590
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002591void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002592 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002593 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002594 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002595 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002596 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2597 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002598 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002599 ArgStringList CmdArgs;
2600
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002601 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002602 bool IsWindowsCygnus =
2603 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002604 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2605
Daniel Dunbare521a892009-03-31 20:53:55 +00002606 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2607
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002608 // Invoke ourselves in -cc1 mode.
2609 //
2610 // FIXME: Implement custom jobs for internal actions.
2611 CmdArgs.push_back("-cc1");
2612
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002613 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002614 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002615 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002616 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002617
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002618 const llvm::Triple TT(TripleStr);
2619 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2620 TT.getArch() == llvm::Triple::thumb)) {
2621 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2622 unsigned Version;
2623 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2624 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002625 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2626 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002627 }
2628
Tim Northover336f1892014-03-29 13:16:12 +00002629 // Push all default warning arguments that are specific to
2630 // the given target. These come before user provided warning options
2631 // are provided.
2632 getToolChain().addClangWarningOptions(CmdArgs);
2633
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002634 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002635 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002636
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002637 if (isa<AnalyzeJobAction>(JA)) {
2638 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2639 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002640 } else if (isa<MigrateJobAction>(JA)) {
2641 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002642 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002643 if (Output.getType() == types::TY_Dependencies)
2644 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002645 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002646 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002647 if (Args.hasArg(options::OPT_rewrite_objc) &&
2648 !Args.hasArg(options::OPT_g_Group))
2649 CmdArgs.push_back("-P");
2650 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002651 } else if (isa<AssembleJobAction>(JA)) {
2652 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002653
David Blaikie9260ed62013-07-25 21:19:01 +00002654 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002655
2656 // Also ignore explicit -force_cpusubtype_ALL option.
2657 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002658 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002659 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002660 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002661
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002662 if (JA.getType() == types::TY_Nothing)
2663 CmdArgs.push_back("-fsyntax-only");
2664 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002665 CmdArgs.push_back("-emit-pch");
2666 else
2667 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002668 } else if (isa<VerifyPCHJobAction>(JA)) {
2669 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002670 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002671 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2672 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002673
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002674 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002675 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002676 } else if (JA.getType() == types::TY_LLVM_IR ||
2677 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002678 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002679 } else if (JA.getType() == types::TY_LLVM_BC ||
2680 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002681 CmdArgs.push_back("-emit-llvm-bc");
2682 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002683 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002684 } else if (JA.getType() == types::TY_AST) {
2685 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002686 } else if (JA.getType() == types::TY_ModuleFile) {
2687 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002688 } else if (JA.getType() == types::TY_RewrittenObjC) {
2689 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002690 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002691 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2692 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002693 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002694 } else {
2695 assert(JA.getType() == types::TY_PP_Asm &&
2696 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002697 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002698
2699 // Preserve use-list order by default when emitting bitcode, so that
2700 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2701 // same result as running passes here. For LTO, we don't need to preserve
2702 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002703 if (JA.getType() == types::TY_LLVM_BC)
2704 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002705 }
2706
Justin Bognera88f0122014-06-20 22:59:50 +00002707 // We normally speed up the clang process a bit by skipping destructors at
2708 // exit, but when we're generating diagnostics we can rely on some of the
2709 // cleanup.
2710 if (!C.isForDiagnostics())
2711 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002712
John McCallbb79b5f2010-02-13 03:50:24 +00002713 // Disable the verification pass in -asserts builds.
2714#ifdef NDEBUG
2715 CmdArgs.push_back("-disable-llvm-verifier");
2716#endif
2717
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002718 // Set the main file name, so that debug info works even with
2719 // -save-temps.
2720 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002721 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002722
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002723 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002724 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002725 if (Args.hasArg(options::OPT_static))
2726 CmdArgs.push_back("-static-define");
2727
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002728 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002729 // Enable region store model by default.
2730 CmdArgs.push_back("-analyzer-store=region");
2731
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002732 // Treat blocks as analysis entry points.
2733 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2734
Ted Kremenek49c79792011-03-24 00:28:47 +00002735 CmdArgs.push_back("-analyzer-eagerly-assume");
2736
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002737 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002738 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002739 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002740
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002741 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002742 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002743
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002744 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002745 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002746
2747 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002748
Jordan Rose10ad0812013-04-05 17:55:07 +00002749 if (types::isCXX(Inputs[0].getType()))
2750 CmdArgs.push_back("-analyzer-checker=cplusplus");
2751
Nico Webere8e53112014-05-11 01:04:02 +00002752 // Enable the following experimental checkers for testing.
2753 CmdArgs.push_back(
2754 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002755 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2756 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2757 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2758 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2759 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002760 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002761
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002762 // Set the output format. The default is plist, for (lame) historical
2763 // reasons.
2764 CmdArgs.push_back("-analyzer-output");
2765 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002766 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002767 else
2768 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002769
Ted Kremenekfe449a22010-03-22 22:32:05 +00002770 // Disable the presentation of standard compiler warnings when
2771 // using --analyze. We only want to show static analyzer diagnostics
2772 // or frontend errors.
2773 CmdArgs.push_back("-w");
2774
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002775 // Add -Xanalyzer arguments when running as analyzer.
2776 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002777 }
2778
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002779 CheckCodeGenerationOptions(D, Args);
2780
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002781 bool PIE = getToolChain().isPIEDefault();
2782 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002783 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002784
Alexey Bataev40e75222014-01-28 06:30:35 +00002785 // Android-specific defaults for PIC/PIE
2786 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2787 switch (getToolChain().getTriple().getArch()) {
2788 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002789 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002790 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002791 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002792 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002793 case llvm::Triple::mips:
2794 case llvm::Triple::mipsel:
2795 case llvm::Triple::mips64:
2796 case llvm::Triple::mips64el:
2797 PIC = true; // "-fpic"
2798 break;
2799
2800 case llvm::Triple::x86:
2801 case llvm::Triple::x86_64:
2802 PIC = true; // "-fPIC"
2803 IsPICLevelTwo = true;
2804 break;
2805
2806 default:
2807 break;
2808 }
2809 }
2810
Brad Smith5b05db82014-06-24 19:51:29 +00002811 // OpenBSD-specific defaults for PIE
2812 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2813 switch (getToolChain().getTriple().getArch()) {
2814 case llvm::Triple::mips64:
2815 case llvm::Triple::mips64el:
2816 case llvm::Triple::sparc:
2817 case llvm::Triple::x86:
2818 case llvm::Triple::x86_64:
2819 IsPICLevelTwo = false; // "-fpie"
2820 break;
2821
2822 case llvm::Triple::ppc:
2823 case llvm::Triple::sparcv9:
2824 IsPICLevelTwo = true; // "-fPIE"
2825 break;
2826
2827 default:
2828 break;
2829 }
2830 }
2831
Alexey Samsonov090301e2013-04-09 12:28:19 +00002832 // For the PIC and PIE flag options, this logic is different from the
2833 // legacy logic in very old versions of GCC, as that logic was just
2834 // a bug no one had ever fixed. This logic is both more rational and
2835 // consistent with GCC's new logic now that the bugs are fixed. The last
2836 // argument relating to either PIC or PIE wins, and no other argument is
2837 // used. If the last argument is any flavor of the '-fno-...' arguments,
2838 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2839 // at the same level.
2840 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2841 options::OPT_fpic, options::OPT_fno_pic,
2842 options::OPT_fPIE, options::OPT_fno_PIE,
2843 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002844 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2845 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002846 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002847 if (LastPICArg) {
2848 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002849 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2850 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2851 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2852 PIC = PIE || O.matches(options::OPT_fPIC) ||
2853 O.matches(options::OPT_fpic);
2854 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2855 O.matches(options::OPT_fPIC);
2856 } else {
2857 PIE = PIC = false;
2858 }
2859 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002860 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002861
Nick Lewycky609dd662013-10-11 03:33:53 +00002862 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002863 // specified while enabling PIC enabled level 1 PIC, just force it back to
2864 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2865 // informal testing).
2866 if (PIC && getToolChain().getTriple().isOSDarwin())
2867 IsPICLevelTwo |= getToolChain().isPICDefault();
2868
Chandler Carruthc0c04552012-04-08 16:40:35 +00002869 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2870 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002871 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002872 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002873 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002874 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002875 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002876
Chandler Carruth76a943b2012-11-19 03:52:03 +00002877 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2878 // This is a very special mode. It trumps the other modes, almost no one
2879 // uses it, and it isn't even valid on any OS but Darwin.
2880 if (!getToolChain().getTriple().isOSDarwin())
2881 D.Diag(diag::err_drv_unsupported_opt_for_target)
2882 << A->getSpelling() << getToolChain().getTriple().str();
2883
2884 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2885
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002886 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002887 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002888
Chandler Carruth76a943b2012-11-19 03:52:03 +00002889 // Only a forced PIC mode can cause the actual compile to have PIC defines
2890 // etc., no flags are sufficient. This behavior was selected to closely
2891 // match that of llvm-gcc and Apple GCC before that.
2892 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2893 CmdArgs.push_back("-pic-level");
2894 CmdArgs.push_back("2");
2895 }
2896 } else {
2897 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2898 // handled in Clang's IRGen by the -pie-level flag.
2899 CmdArgs.push_back("-mrelocation-model");
2900 CmdArgs.push_back(PIC ? "pic" : "static");
2901
2902 if (PIC) {
2903 CmdArgs.push_back("-pic-level");
2904 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2905 if (PIE) {
2906 CmdArgs.push_back("-pie-level");
2907 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2908 }
2909 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002910 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002911
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002912 CmdArgs.push_back("-mthread-model");
2913 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2914 CmdArgs.push_back(A->getValue());
2915 else
2916 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2917
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002918 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2919
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002920 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2921 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002922 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002923
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002924 // LLVM Code Generator Options.
2925
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002926 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2927 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2928 for (arg_iterator
2929 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2930 options::OPT_frewrite_map_file_EQ),
2931 MFE = Args.filtered_end();
2932 MFI != MFE; ++MFI) {
2933 CmdArgs.push_back("-frewrite-map-file");
2934 CmdArgs.push_back((*MFI)->getValue());
2935 (*MFI)->claim();
2936 }
2937 }
2938
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002939 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2940 StringRef v = A->getValue();
2941 CmdArgs.push_back("-mllvm");
2942 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2943 A->claim();
2944 }
2945
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002946 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2947 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002948 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002949 }
2950
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002951 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2952 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002953 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002954 D.Diag(diag::err_drv_unsupported_opt_for_target)
2955 << A->getSpelling() << getToolChain().getTriple().str();
2956 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2957 CmdArgs.push_back("-fpcc-struct-return");
2958 } else {
2959 assert(A->getOption().matches(options::OPT_freg_struct_return));
2960 CmdArgs.push_back("-freg-struct-return");
2961 }
2962 }
2963
Roman Divacky65b88cd2011-03-01 17:40:53 +00002964 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2965 CmdArgs.push_back("-mrtd");
2966
Rafael Espindola224dd632011-12-14 21:02:23 +00002967 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002968 CmdArgs.push_back("-mdisable-fp-elim");
2969 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2970 options::OPT_fno_zero_initialized_in_bss))
2971 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002972
2973 bool OFastEnabled = isOptimizationLevelFast(Args);
2974 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2975 // enabled. This alias option is being used to simplify the hasFlag logic.
2976 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2977 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002978 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2979 // doesn't do any TBAA.
2980 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002981 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002982 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002983 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002984 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2985 options::OPT_fno_struct_path_tbaa))
2986 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002987 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2988 false))
2989 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002990 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2991 options::OPT_fno_optimize_sibling_calls))
2992 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002993
Eric Christopher006208c2013-04-04 06:29:47 +00002994 // Handle segmented stacks.
2995 if (Args.hasArg(options::OPT_fsplit_stack))
2996 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002997
2998 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2999 // This alias option is being used to simplify the getLastArg logic.
3000 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3001 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003002
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003003 // Handle various floating point optimization flags, mapping them to the
3004 // appropriate LLVM code generation flags. The pattern for all of these is to
3005 // default off the codegen optimizations, and if any flag enables them and no
3006 // flag disables them after the flag enabling them, enable the codegen
3007 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003008 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003009 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003010 options::OPT_ffinite_math_only,
3011 options::OPT_fno_finite_math_only,
3012 options::OPT_fhonor_infinities,
3013 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003014 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3015 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003016 A->getOption().getID() != options::OPT_fhonor_infinities)
3017 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003018 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003019 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003020 options::OPT_ffinite_math_only,
3021 options::OPT_fno_finite_math_only,
3022 options::OPT_fhonor_nans,
3023 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003024 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3025 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003026 A->getOption().getID() != options::OPT_fhonor_nans)
3027 CmdArgs.push_back("-menable-no-nans");
3028
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003029 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3030 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003031 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003032 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003033 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003034 options::OPT_fno_math_errno)) {
3035 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3036 // However, turning *off* -ffast_math merely restores the toolchain default
3037 // (which may be false).
3038 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3039 A->getOption().getID() == options::OPT_ffast_math ||
3040 A->getOption().getID() == options::OPT_Ofast)
3041 MathErrno = false;
3042 else if (A->getOption().getID() == options::OPT_fmath_errno)
3043 MathErrno = true;
3044 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003045 if (MathErrno)
3046 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003047
3048 // There are several flags which require disabling very specific
3049 // optimizations. Any of these being disabled forces us to turn off the
3050 // entire set of LLVM optimizations, so collect them through all the flag
3051 // madness.
3052 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003053 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003054 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003055 options::OPT_funsafe_math_optimizations,
3056 options::OPT_fno_unsafe_math_optimizations,
3057 options::OPT_fassociative_math,
3058 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003059 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3060 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003061 A->getOption().getID() != options::OPT_fno_associative_math)
3062 AssociativeMath = true;
3063 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003064 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003065 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003066 options::OPT_funsafe_math_optimizations,
3067 options::OPT_fno_unsafe_math_optimizations,
3068 options::OPT_freciprocal_math,
3069 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003070 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3071 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003072 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3073 ReciprocalMath = true;
3074 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003075 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003076 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003077 options::OPT_funsafe_math_optimizations,
3078 options::OPT_fno_unsafe_math_optimizations,
3079 options::OPT_fsigned_zeros,
3080 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003081 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3082 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003083 A->getOption().getID() != options::OPT_fsigned_zeros)
3084 SignedZeros = false;
3085 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003086 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003087 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003088 options::OPT_funsafe_math_optimizations,
3089 options::OPT_fno_unsafe_math_optimizations,
3090 options::OPT_ftrapping_math,
3091 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003092 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3093 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003094 A->getOption().getID() != options::OPT_ftrapping_math)
3095 TrappingMath = false;
3096 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3097 !TrappingMath)
3098 CmdArgs.push_back("-menable-unsafe-fp-math");
3099
Sanjay Patel76c9e092015-01-23 16:40:50 +00003100 if (!SignedZeros)
3101 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003102
Sanjay Patel359b1052015-04-09 15:03:23 +00003103 if (ReciprocalMath)
3104 CmdArgs.push_back("-freciprocal-math");
3105
Lang Hamesaa53b932012-07-06 00:59:19 +00003106 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003107 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003108 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003109 options::OPT_ffp_contract)) {
3110 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003111 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003112 if (Val == "fast" || Val == "on" || Val == "off") {
3113 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3114 } else {
3115 D.Diag(diag::err_drv_unsupported_option_argument)
3116 << A->getOption().getName() << Val;
3117 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003118 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3119 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003120 // If fast-math is set then set the fp-contract mode to fast.
3121 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3122 }
3123 }
3124
Bob Wilson6a039162012-07-19 03:52:53 +00003125 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3126 // and if we find them, tell the frontend to provide the appropriate
3127 // preprocessor macros. This is distinct from enabling any optimizations as
3128 // these options induce language changes which must survive serialization
3129 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003130 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3131 options::OPT_fno_fast_math))
3132 if (!A->getOption().matches(options::OPT_fno_fast_math))
3133 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003134 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3135 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003136 if (A->getOption().matches(options::OPT_ffinite_math_only))
3137 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003138
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003139 // Decide whether to use verbose asm. Verbose assembly is the default on
3140 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003141 bool IsIntegratedAssemblerDefault =
3142 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003143 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003144 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003145 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003146 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003147
Rafael Espindola298059a2015-04-06 04:36:45 +00003148 bool UsingIntegratedAssembler =
3149 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3150 IsIntegratedAssemblerDefault);
3151 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003152 CmdArgs.push_back("-no-integrated-as");
3153
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003154 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3155 CmdArgs.push_back("-mdebug-pass");
3156 CmdArgs.push_back("Structure");
3157 }
3158 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3159 CmdArgs.push_back("-mdebug-pass");
3160 CmdArgs.push_back("Arguments");
3161 }
3162
John McCall8517abc2010-02-19 02:45:38 +00003163 // Enable -mconstructor-aliases except on darwin, where we have to
3164 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003165 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003166 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003167
John McCall7ef5cb32011-03-18 02:56:14 +00003168 // Darwin's kernel doesn't support guard variables; just die if we
3169 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003170 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003171 CmdArgs.push_back("-fforbid-guard-variables");
3172
Douglas Gregordbe39272011-02-01 15:15:22 +00003173 if (Args.hasArg(options::OPT_mms_bitfields)) {
3174 CmdArgs.push_back("-mms-bitfields");
3175 }
John McCall8517abc2010-02-19 02:45:38 +00003176
Daniel Dunbar306945d2009-09-16 06:17:29 +00003177 // This is a coarse approximation of what llvm-gcc actually does, both
3178 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3179 // complicated ways.
3180 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003181 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3182 options::OPT_fno_asynchronous_unwind_tables,
3183 (getToolChain().IsUnwindTablesDefault() ||
3184 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3185 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003186 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3187 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003188 CmdArgs.push_back("-munwind-tables");
3189
Chandler Carruth05fb5852012-11-21 23:40:23 +00003190 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003191
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003192 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3193 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003194 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003195 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003196
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003197 // FIXME: Handle -mtune=.
3198 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003199
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003200 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003201 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003202 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003203 }
3204
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003205 // Add the target cpu
3206 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3207 llvm::Triple ETriple(ETripleStr);
3208 std::string CPU = getCPUName(Args, ETriple);
3209 if (!CPU.empty()) {
3210 CmdArgs.push_back("-target-cpu");
3211 CmdArgs.push_back(Args.MakeArgString(CPU));
3212 }
3213
Rafael Espindolaeb265472013-08-21 21:59:03 +00003214 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3215 CmdArgs.push_back("-mfpmath");
3216 CmdArgs.push_back(A->getValue());
3217 }
3218
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003219 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003220 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003221
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003222 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003223 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003224 default:
3225 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003226
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003227 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003228 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003229 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003230 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003231 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003232 break;
3233
Tim Northover573cbee2014-05-24 12:52:07 +00003234 case llvm::Triple::aarch64:
3235 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003236 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003237 break;
3238
Eric Christopher0b26a612010-03-02 02:41:08 +00003239 case llvm::Triple::mips:
3240 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003241 case llvm::Triple::mips64:
3242 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003243 AddMIPSTargetArgs(Args, CmdArgs);
3244 break;
3245
Ulrich Weigand8afad612014-07-28 13:17:52 +00003246 case llvm::Triple::ppc:
3247 case llvm::Triple::ppc64:
3248 case llvm::Triple::ppc64le:
3249 AddPPCTargetArgs(Args, CmdArgs);
3250 break;
3251
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003252 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003253 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003254 AddSparcTargetArgs(Args, CmdArgs);
3255 break;
3256
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003257 case llvm::Triple::x86:
3258 case llvm::Triple::x86_64:
3259 AddX86TargetArgs(Args, CmdArgs);
3260 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003261
3262 case llvm::Triple::hexagon:
3263 AddHexagonTargetArgs(Args, CmdArgs);
3264 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003265 }
3266
Hans Wennborg75958c42013-08-08 00:17:41 +00003267 // Add clang-cl arguments.
3268 if (getToolChain().getDriver().IsCLMode())
3269 AddClangCLArgs(Args, CmdArgs);
3270
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003271 // Pass the linker version in use.
3272 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3273 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003274 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003275 }
3276
Eric Christopherb7d97e92013-04-03 01:58:53 +00003277 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003278 CmdArgs.push_back("-momit-leaf-frame-pointer");
3279
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003280 // Explicitly error on some things we know we don't support and can't just
3281 // ignore.
3282 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003283 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3284 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003285 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003286 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003287 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003288 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3289 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003290 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003291 << Unsupported->getOption().getName();
3292 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003293 }
3294
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003295 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003296 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003297 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003298 CmdArgs.push_back("-header-include-file");
3299 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3300 D.CCPrintHeadersFilename : "-");
3301 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003302 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003303 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003304
Chad Rosierbe10f982011-08-02 17:58:04 +00003305 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003306 CmdArgs.push_back("-diagnostic-log-file");
3307 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3308 D.CCLogDiagnosticsFilename : "-");
3309 }
3310
Manman Ren17bdb0f2013-11-20 20:22:14 +00003311 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3312 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003313 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003314 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003315 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3316 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003317 // FIXME: we should support specifying dwarf version with
3318 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003319 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003320 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003321 const llvm::Triple &Triple = getToolChain().getTriple();
3322 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003323 Triple.getOS() == llvm::Triple::FreeBSD ||
3324 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003325 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003326 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003327 CmdArgs.push_back("-gdwarf-2");
3328 else if (A->getOption().matches(options::OPT_gdwarf_3))
3329 CmdArgs.push_back("-gdwarf-3");
3330 else if (A->getOption().matches(options::OPT_gdwarf_4))
3331 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003332 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003333 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003334 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003335 const llvm::Triple &Triple = getToolChain().getTriple();
3336 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003337 Triple.getOS() == llvm::Triple::FreeBSD ||
3338 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003339 CmdArgs.push_back("-gdwarf-2");
3340 else
3341 CmdArgs.push_back("-g");
3342 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003343 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003344
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003345 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3346 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003347 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3348 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003349 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003350
Eric Christopher138c32b2013-09-13 22:37:55 +00003351 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003352 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3353 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003354 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003355 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003356 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003357 CmdArgs.push_back("-g");
3358 CmdArgs.push_back("-backend-option");
3359 CmdArgs.push_back("-split-dwarf=Enable");
3360 }
3361
Eric Christopher138c32b2013-09-13 22:37:55 +00003362 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3363 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3364 CmdArgs.push_back("-backend-option");
3365 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3366 }
Eric Christophereec89c22013-06-18 00:03:50 +00003367
Eric Christopher0d403d22014-02-14 01:27:03 +00003368 // -gdwarf-aranges turns on the emission of the aranges section in the
3369 // backend.
3370 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3371 CmdArgs.push_back("-backend-option");
3372 CmdArgs.push_back("-generate-arange-section");
3373 }
3374
David Blaikief36d9ba2014-01-27 18:52:43 +00003375 if (Args.hasFlag(options::OPT_fdebug_types_section,
3376 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003377 CmdArgs.push_back("-backend-option");
3378 CmdArgs.push_back("-generate-type-units");
3379 }
Eric Christophereec89c22013-06-18 00:03:50 +00003380
Ed Schouten6e576152015-03-26 17:50:28 +00003381 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3382 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3383
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003384 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003385 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003386 CmdArgs.push_back("-ffunction-sections");
3387 }
3388
3389 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003390 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003391 CmdArgs.push_back("-fdata-sections");
3392 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003393
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003394 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003395 options::OPT_fno_unique_section_names,
3396 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003397 CmdArgs.push_back("-fno-unique-section-names");
3398
Chris Lattner3c77a352010-06-22 00:03:40 +00003399 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3400
Justin Bognera71e6812015-04-30 23:49:42 +00003401 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3402 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003403 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3404 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3405 D.Diag(diag::err_drv_argument_not_allowed_with)
3406 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3407
Justin Bognera71e6812015-04-30 23:49:42 +00003408 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3409 A->render(Args, CmdArgs);
3410 else
3411 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003412
3413 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3414 A->render(Args, CmdArgs);
3415 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3416 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3417
Nick Lewycky207bce32011-04-21 23:44:07 +00003418 if (Args.hasArg(options::OPT_ftest_coverage) ||
3419 Args.hasArg(options::OPT_coverage))
3420 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003421 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3422 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003423 Args.hasArg(options::OPT_coverage))
3424 CmdArgs.push_back("-femit-coverage-data");
3425
Alex Lorenzee024992014-08-04 18:41:51 +00003426 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003427 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3428 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003429 D.Diag(diag::err_drv_argument_only_allowed_with)
3430 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3431
3432 if (Args.hasArg(options::OPT_fcoverage_mapping))
3433 CmdArgs.push_back("-fcoverage-mapping");
3434
Nick Lewycky480cb992011-05-04 20:46:58 +00003435 if (C.getArgs().hasArg(options::OPT_c) ||
3436 C.getArgs().hasArg(options::OPT_S)) {
3437 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003438 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003439 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003440 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003441 CoverageFilename = FinalOutput->getValue();
3442 } else {
3443 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3444 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003445 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003446 SmallString<128> Pwd;
3447 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003448 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003449 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003450 }
3451 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003452 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003453 }
3454 }
3455
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003456 // Pass options for controlling the default header search paths.
3457 if (Args.hasArg(options::OPT_nostdinc)) {
3458 CmdArgs.push_back("-nostdsysteminc");
3459 CmdArgs.push_back("-nobuiltininc");
3460 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003461 if (Args.hasArg(options::OPT_nostdlibinc))
3462 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003463 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3464 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3465 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003466
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003467 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003468 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003469 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003470
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003471 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3472
Ted Kremenekf7639e12012-03-06 20:06:33 +00003473 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003474 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003475 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003476 options::OPT_ccc_arcmt_modify,
3477 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003478 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003479 switch (A->getOption().getID()) {
3480 default:
3481 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003482 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003483 CmdArgs.push_back("-arcmt-check");
3484 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003485 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003486 CmdArgs.push_back("-arcmt-modify");
3487 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003488 case options::OPT_ccc_arcmt_migrate:
3489 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003490 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003491 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003492
3493 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3494 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003495 break;
John McCalld70fb982011-06-15 23:25:17 +00003496 }
3497 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003498 } else {
3499 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3500 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3501 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003502 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003503
Ted Kremenekf7639e12012-03-06 20:06:33 +00003504 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3505 if (ARCMTEnabled) {
3506 D.Diag(diag::err_drv_argument_not_allowed_with)
3507 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3508 }
3509 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003510 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003511
3512 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003513 options::OPT_objcmt_migrate_subscripting,
3514 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003515 // None specified, means enable them all.
3516 CmdArgs.push_back("-objcmt-migrate-literals");
3517 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003518 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003519 } else {
3520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003523 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003524 } else {
3525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3528 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3529 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3533 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3534 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3535 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003541 }
3542
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003543 // Add preprocessing options like -I, -D, etc. if we are using the
3544 // preprocessor.
3545 //
3546 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003547 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003548 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003549
Rafael Espindolaa7431922011-07-21 23:40:37 +00003550 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3551 // that "The compiler can only warn and ignore the option if not recognized".
3552 // When building with ccache, it will pass -D options to clang even on
3553 // preprocessed inputs and configure concludes that -fPIC is not supported.
3554 Args.ClaimAllArgs(options::OPT_D);
3555
Alp Toker7874bdc2013-11-15 20:40:58 +00003556 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003557 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3558 if (A->getOption().matches(options::OPT_O4)) {
3559 CmdArgs.push_back("-O3");
3560 D.Diag(diag::warn_O4_is_O3);
3561 } else {
3562 A->render(Args, CmdArgs);
3563 }
3564 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003565
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003566 // Warn about ignored options to clang.
3567 for (arg_iterator it = Args.filtered_begin(
3568 options::OPT_clang_ignored_gcc_optimization_f_Group),
3569 ie = Args.filtered_end(); it != ie; ++it) {
3570 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3571 }
3572
Rafael Espindola577637a2015-01-03 00:06:04 +00003573 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003574
Richard Smith3be1cb22014-08-07 00:24:21 +00003575 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003576 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003577 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3578 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003579 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003580 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003581
3582 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003583 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003584 //
3585 // If a std is supplied, only add -trigraphs if it follows the
3586 // option.
3587 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3588 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003589 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003590 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003591 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003592 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003593 else
3594 Std->render(Args, CmdArgs);
3595
Nico Weber00721502014-12-23 22:32:37 +00003596 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003597 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003598 options::OPT_ftrigraphs,
3599 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003600 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003601 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003602 } else {
3603 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003604 //
3605 // FIXME: Clang doesn't correctly handle -std= when the input language
3606 // doesn't match. For the time being just ignore this for C++ inputs;
3607 // eventually we want to do all the standard defaulting here instead of
3608 // splitting it between the driver and clang -cc1.
3609 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003610 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3611 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003612 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003613 CmdArgs.push_back("-std=c++11");
3614
Nico Weber00721502014-12-23 22:32:37 +00003615 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3616 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003617 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003618
Richard Smith282b4492013-09-04 22:50:31 +00003619 // GCC's behavior for -Wwrite-strings is a bit strange:
3620 // * In C, this "warning flag" changes the types of string literals from
3621 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3622 // for the discarded qualifier.
3623 // * In C++, this is just a normal warning flag.
3624 //
3625 // Implementing this warning correctly in C is hard, so we follow GCC's
3626 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3627 // a non-const char* in C, rather than using this crude hack.
3628 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003629 // FIXME: This should behave just like a warning flag, and thus should also
3630 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3631 Arg *WriteStrings =
3632 Args.getLastArg(options::OPT_Wwrite_strings,
3633 options::OPT_Wno_write_strings, options::OPT_w);
3634 if (WriteStrings &&
3635 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003636 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003637 }
3638
Chandler Carruth61fbf622011-04-23 09:27:53 +00003639 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003640 // during C++ compilation, which it is by default. GCC keeps this define even
3641 // in the presence of '-w', match this behavior bug-for-bug.
3642 if (types::isCXX(InputType) &&
3643 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3644 true)) {
3645 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003646 }
3647
Chandler Carruthe0391482010-05-22 02:21:53 +00003648 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3649 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3650 if (Asm->getOption().matches(options::OPT_fasm))
3651 CmdArgs.push_back("-fgnu-keywords");
3652 else
3653 CmdArgs.push_back("-fno-gnu-keywords");
3654 }
3655
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003656 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3657 CmdArgs.push_back("-fno-dwarf-directory-asm");
3658
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003659 if (ShouldDisableAutolink(Args, getToolChain()))
3660 CmdArgs.push_back("-fno-autolink");
3661
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003662 // Add in -fdebug-compilation-dir if necessary.
3663 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003664
Richard Smith9a568822011-11-21 19:36:32 +00003665 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3666 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003667 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003668 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003669 }
3670
Richard Smith79c927b2013-11-06 19:31:51 +00003671 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3672 CmdArgs.push_back("-foperator-arrow-depth");
3673 CmdArgs.push_back(A->getValue());
3674 }
3675
Richard Smith9a568822011-11-21 19:36:32 +00003676 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3677 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003678 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003679 }
3680
Richard Smitha3d3bd22013-05-08 02:12:03 +00003681 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3682 CmdArgs.push_back("-fconstexpr-steps");
3683 CmdArgs.push_back(A->getValue());
3684 }
3685
Richard Smithb3a14522013-02-22 01:59:51 +00003686 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3687 CmdArgs.push_back("-fbracket-depth");
3688 CmdArgs.push_back(A->getValue());
3689 }
3690
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003691 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3692 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003693 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003694 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003695 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3696 } else
3697 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003698 }
3699
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003700
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003701 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003702 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003703
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003704 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3705 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003706 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003707 }
David Chisnall5778fce2009-08-31 16:41:57 +00003708
Chris Lattnere23003d2010-01-09 21:54:33 +00003709 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3710 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003711 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003712 }
3713
Chris Lattnerb35583d2010-04-07 20:49:23 +00003714 CmdArgs.push_back("-ferror-limit");
3715 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003716 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003717 else
3718 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003719
Chandler Carrutha77a7272010-05-06 04:55:18 +00003720 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3721 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003722 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003723 }
3724
3725 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3726 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003728 }
3729
Richard Smithf6f003a2011-12-16 19:06:07 +00003730 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3731 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003732 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003733 }
3734
Nick Lewycky24653262014-12-16 21:39:02 +00003735 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3736 CmdArgs.push_back("-fspell-checking-limit");
3737 CmdArgs.push_back(A->getValue());
3738 }
3739
Daniel Dunbar2c978472009-11-04 06:24:47 +00003740 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003741 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003742 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003743 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003744 } else {
3745 // If -fmessage-length=N was not specified, determine whether this is a
3746 // terminal and, if so, implicitly define -fmessage-length appropriately.
3747 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003748 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003749 }
3750
John McCallb4a99d32013-02-19 01:57:35 +00003751 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3752 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3753 options::OPT_fvisibility_ms_compat)) {
3754 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3755 CmdArgs.push_back("-fvisibility");
3756 CmdArgs.push_back(A->getValue());
3757 } else {
3758 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3759 CmdArgs.push_back("-fvisibility");
3760 CmdArgs.push_back("hidden");
3761 CmdArgs.push_back("-ftype-visibility");
3762 CmdArgs.push_back("default");
3763 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003764 }
3765
Douglas Gregor08329632010-06-15 17:05:35 +00003766 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003767
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003768 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3769
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003770 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003771 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3772 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003773 CmdArgs.push_back("-ffreestanding");
3774
Daniel Dunbare357d562009-12-03 18:42:11 +00003775 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003776 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003777 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003778 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3779 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003780 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003781 // AltiVec language extensions aren't relevant for assembling.
3782 if (!isa<PreprocessJobAction>(JA) ||
3783 Output.getType() != types::TY_PP_Asm)
3784 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003785 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3786 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003787
Peter Collingbourne32701642013-11-01 18:16:25 +00003788 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3789 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003790
Eric Christopher459d2712013-02-19 06:16:53 +00003791 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003792 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003793 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003794 getToolChain().getArch() == llvm::Triple::ppc64 ||
3795 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003796 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003797 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003798
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003799 if (getToolChain().SupportsProfiling())
3800 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003801
3802 // -flax-vector-conversions is default.
3803 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3804 options::OPT_fno_lax_vector_conversions))
3805 CmdArgs.push_back("-fno-lax-vector-conversions");
3806
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003807 if (Args.getLastArg(options::OPT_fapple_kext))
3808 CmdArgs.push_back("-fapple-kext");
3809
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003810 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003811 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003812 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003813 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3814 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003815
3816 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3817 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003818 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003819 }
3820
Bob Wilson14adb362012-02-03 06:27:22 +00003821 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003822
Chandler Carruth6e501032011-03-27 00:04:55 +00003823 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3824 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3825 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3826 options::OPT_fno_wrapv)) {
3827 if (A->getOption().matches(options::OPT_fwrapv))
3828 CmdArgs.push_back("-fwrapv");
3829 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3830 options::OPT_fno_strict_overflow)) {
3831 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3832 CmdArgs.push_back("-fwrapv");
3833 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003834
3835 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3836 options::OPT_fno_reroll_loops))
3837 if (A->getOption().matches(options::OPT_freroll_loops))
3838 CmdArgs.push_back("-freroll-loops");
3839
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003840 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003841 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3842 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003843
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003844 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3845
Mahesha S6a682be42012-10-27 07:47:56 +00003846
Daniel Dunbar4930e332009-11-17 08:07:36 +00003847 // -stack-protector=0 is default.
3848 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003849 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3850 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003851 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003852 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003853 if (A->getOption().matches(options::OPT_fstack_protector)) {
3854 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3855 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3856 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003857 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003858 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003859 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003860 } else {
3861 StackProtectorLevel =
3862 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3863 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003864 if (StackProtectorLevel) {
3865 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003866 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003867 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003868
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003869 // --param ssp-buffer-size=
3870 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3871 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003872 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003873 if (Str.startswith("ssp-buffer-size=")) {
3874 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003875 CmdArgs.push_back("-stack-protector-buffer-size");
3876 // FIXME: Verify the argument is a valid integer.
3877 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003878 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003879 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003880 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003881 }
3882
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003883 // Translate -mstackrealign
3884 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3885 false)) {
3886 CmdArgs.push_back("-backend-option");
3887 CmdArgs.push_back("-force-align-stack");
3888 }
3889 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3890 false)) {
3891 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3892 }
3893
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003894 if (Args.hasArg(options::OPT_mstack_alignment)) {
3895 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3896 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003897 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003898
Hans Wennborg77dc2362015-01-20 19:45:50 +00003899 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3900 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3901
3902 if (!Size.empty())
3903 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3904 else
3905 CmdArgs.push_back("-mstack-probe-size=0");
3906 }
3907
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003908 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3909 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3910 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3911
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003912 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3913 options::OPT_mno_restrict_it)) {
3914 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3915 CmdArgs.push_back("-backend-option");
3916 CmdArgs.push_back("-arm-restrict-it");
3917 } else {
3918 CmdArgs.push_back("-backend-option");
3919 CmdArgs.push_back("-arm-no-restrict-it");
3920 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003921 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3922 TT.getArch() == llvm::Triple::thumb)) {
3923 // Windows on ARM expects restricted IT blocks
3924 CmdArgs.push_back("-backend-option");
3925 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003926 }
3927
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003928 if (TT.getArch() == llvm::Triple::arm ||
3929 TT.getArch() == llvm::Triple::thumb) {
3930 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3931 options::OPT_mno_long_calls)) {
3932 if (A->getOption().matches(options::OPT_mlong_calls)) {
3933 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003934 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003935 }
3936 }
3937 }
3938
Daniel Dunbard18049a2009-04-07 21:16:11 +00003939 // Forward -f options with positive and negative forms; we translate
3940 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003941 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3942 StringRef fname = A->getValue();
3943 if (!llvm::sys::fs::exists(fname))
3944 D.Diag(diag::err_drv_no_such_file) << fname;
3945 else
3946 A->render(Args, CmdArgs);
3947 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003948
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003949 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003950 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003951 CmdArgs.push_back("-fapple-kext");
3952 if (!Args.hasArg(options::OPT_fbuiltin))
3953 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003954 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003955 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003956 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003957 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003958 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003959
Nuno Lopes13c88c72009-12-16 16:59:22 +00003960 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3961 options::OPT_fno_assume_sane_operator_new))
3962 CmdArgs.push_back("-fno-assume-sane-operator-new");
3963
Daniel Dunbar4930e332009-11-17 08:07:36 +00003964 // -fblocks=0 is default.
3965 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003966 getToolChain().IsBlocksDefault()) ||
3967 (Args.hasArg(options::OPT_fgnu_runtime) &&
3968 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3969 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003970 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003971
3972 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3973 !getToolChain().hasBlocksRuntime())
3974 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003975 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003976
Richard Smithffb65082014-09-30 23:10:19 +00003977 // -fmodules enables modules (off by default).
3978 // Users can pass -fno-cxx-modules to turn off modules support for
3979 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003980 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003981 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3982 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3983 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003984 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003985 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003986 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003987 HaveModules = true;
3988 }
3989 }
3990
Daniel Jasper07e6c402013-08-05 20:26:17 +00003991 // -fmodule-maps enables module map processing (off by default) for header
3992 // checking. It is implied by -fmodules.
3993 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3994 false)) {
3995 CmdArgs.push_back("-fmodule-maps");
3996 }
3997
Daniel Jasperac42b752013-10-21 06:34:34 +00003998 // -fmodules-decluse checks that modules used are declared so (off by
3999 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004000 if (Args.hasFlag(options::OPT_fmodules_decluse,
4001 options::OPT_fno_modules_decluse,
4002 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004003 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004004 }
4005
Daniel Jasper962b38e2014-04-11 11:47:45 +00004006 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4007 // all #included headers are part of modules.
4008 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4009 options::OPT_fno_modules_strict_decluse,
4010 false)) {
4011 CmdArgs.push_back("-fmodules-strict-decluse");
4012 }
4013
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004014 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4015 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4016 options::OPT_fno_implicit_modules)) {
4017 CmdArgs.push_back("-fno-implicit-modules");
4018 }
4019
Daniel Jasperac42b752013-10-21 06:34:34 +00004020 // -fmodule-name specifies the module that is currently being built (or
4021 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004022 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004023
Richard Smith9887d792014-10-17 01:42:53 +00004024 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004025 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004026 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004027
Richard Smithe842a472014-10-22 02:05:46 +00004028 // -fmodule-file can be used to specify files containing precompiled modules.
4029 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4030
4031 // -fmodule-cache-path specifies where our implicitly-built module files
4032 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004033 SmallString<128> ModuleCachePath;
4034 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4035 ModuleCachePath = A->getValue();
4036 if (HaveModules) {
4037 if (C.isForDiagnostics()) {
4038 // When generating crash reports, we want to emit the modules along with
4039 // the reproduction sources, so we ignore any provided module path.
4040 ModuleCachePath = Output.getFilename();
4041 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4042 llvm::sys::path::append(ModuleCachePath, "modules");
4043 } else if (ModuleCachePath.empty()) {
4044 // No module path was provided: use the default.
4045 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4046 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004047 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4048 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004049 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4050 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004051 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004052 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4053 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4054 }
4055
4056 // When building modules and generating crashdumps, we need to dump a module
4057 // dependency VFS alongside the output.
4058 if (HaveModules && C.isForDiagnostics()) {
4059 SmallString<128> VFSDir(Output.getFilename());
4060 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004061 // Add the cache directory as a temp so the crash diagnostics pick it up.
4062 C.addTempFile(Args.MakeArgString(VFSDir));
4063
Justin Bognera88f0122014-06-20 22:59:50 +00004064 llvm::sys::path::append(VFSDir, "vfs");
4065 CmdArgs.push_back("-module-dependency-dir");
4066 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004067 }
4068
Richard Smith9887d792014-10-17 01:42:53 +00004069 if (HaveModules)
4070 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004071
Douglas Gregor35b04d62013-02-07 19:01:24 +00004072 // Pass through all -fmodules-ignore-macro arguments.
4073 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004074 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4075 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004076
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004077 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4078
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004079 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4080 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4081 D.Diag(diag::err_drv_argument_not_allowed_with)
4082 << A->getAsString(Args) << "-fbuild-session-timestamp";
4083
4084 llvm::sys::fs::file_status Status;
4085 if (llvm::sys::fs::status(A->getValue(), Status))
4086 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004087 CmdArgs.push_back(Args.MakeArgString(
4088 "-fbuild-session-timestamp=" +
4089 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004090 }
4091
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004092 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004093 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4094 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004095 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4096
4097 Args.AddLastArg(CmdArgs,
4098 options::OPT_fmodules_validate_once_per_build_session);
4099 }
4100
Ben Langmuirdcf73862014-03-12 00:06:17 +00004101 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4102
John McCalldfea9982010-04-09 19:12:06 +00004103 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004104 if (Args.hasFlag(options::OPT_fno_access_control,
4105 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004106 false))
John McCall3155f572010-04-09 19:03:51 +00004107 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004108
Anders Carlssond470fef2010-11-21 00:09:52 +00004109 // -felide-constructors is the default.
4110 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4111 options::OPT_felide_constructors,
4112 false))
4113 CmdArgs.push_back("-fno-elide-constructors");
4114
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004115 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004116
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004117 if (KernelOrKext || (types::isCXX(InputType) &&
4118 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4119 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004120 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004121
Tony Linthicum76329bf2011-12-12 21:14:55 +00004122 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004123 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004124 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004125 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004126 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004127 CmdArgs.push_back("-fshort-enums");
4128
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004129 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004130 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004131 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004132 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004133
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004134 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004135 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4136 options::OPT_fno_use_cxa_atexit,
4137 !IsWindowsCygnus && !IsWindowsGNU &&
4138 getToolChain().getArch() != llvm::Triple::hexagon &&
4139 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004140 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004141 CmdArgs.push_back("-fno-use-cxa-atexit");
4142
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004143 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004144 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004145 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004146 CmdArgs.push_back("-fms-extensions");
4147
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004148 // -fno-use-line-directives is default.
4149 if (Args.hasFlag(options::OPT_fuse_line_directives,
4150 options::OPT_fno_use_line_directives, false))
4151 CmdArgs.push_back("-fuse-line-directives");
4152
Francois Pichet1b4f1632011-09-17 04:32:15 +00004153 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004154 if (Args.hasFlag(options::OPT_fms_compatibility,
4155 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004156 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4157 options::OPT_fno_ms_extensions,
4158 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004159 CmdArgs.push_back("-fms-compatibility");
4160
David Majnemerc371ff02015-03-22 08:39:22 +00004161 // -fms-compatibility-version=18.00 is default.
4162 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004163 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004164 IsWindowsMSVC) ||
4165 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004166 Args.hasArg(options::OPT_fms_compatibility_version)) {
4167 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4168 const Arg *MSCompatibilityVersion =
4169 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004170
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004171 if (MSCVersion && MSCompatibilityVersion)
4172 D.Diag(diag::err_drv_argument_not_allowed_with)
4173 << MSCVersion->getAsString(Args)
4174 << MSCompatibilityVersion->getAsString(Args);
4175
David Majnemerc371ff02015-03-22 08:39:22 +00004176 if (MSCompatibilityVersion) {
4177 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4178 D.Diag(diag::err_drv_invalid_value)
4179 << MSCompatibilityVersion->getAsString(Args)
4180 << MSCompatibilityVersion->getValue();
4181 } else if (MSCVersion) {
4182 unsigned Version = 0;
4183 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4184 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4185 << MSCVersion->getValue();
4186 MSVT = getMSCompatibilityVersion(Version);
4187 } else {
4188 MSVT = VersionTuple(18);
4189 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004190
David Majnemerc371ff02015-03-22 08:39:22 +00004191 CmdArgs.push_back(
4192 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004193 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004194
Eric Christopher5ecce122013-02-18 00:38:31 +00004195 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004196 if (Args.hasFlag(options::OPT_fborland_extensions,
4197 options::OPT_fno_borland_extensions, false))
4198 CmdArgs.push_back("-fborland-extensions");
4199
David Majnemerc371ff02015-03-22 08:39:22 +00004200 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4201 // than 19.
4202 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4203 options::OPT_fno_threadsafe_statics,
4204 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4205 CmdArgs.push_back("-fno-threadsafe-statics");
4206
Francois Pichet02744872011-09-01 16:38:08 +00004207 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4208 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004209 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004210 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004211 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004212
Chandler Carruthe03aa552010-04-17 20:17:31 +00004213 // -fgnu-keywords default varies depending on language; only pass if
4214 // specified.
4215 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004216 options::OPT_fno_gnu_keywords))
4217 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004218
Rafael Espindola922a6242011-06-02 17:30:53 +00004219 if (Args.hasFlag(options::OPT_fgnu89_inline,
4220 options::OPT_fno_gnu89_inline,
4221 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004222 CmdArgs.push_back("-fgnu89-inline");
4223
Chad Rosier9c76d242012-03-15 22:31:42 +00004224 if (Args.hasArg(options::OPT_fno_inline))
4225 CmdArgs.push_back("-fno-inline");
4226
Chad Rosier64d6be92012-03-06 21:17:19 +00004227 if (Args.hasArg(options::OPT_fno_inline_functions))
4228 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004229
John McCall5fb5df92012-06-20 06:18:46 +00004230 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004231
John McCall5fb5df92012-06-20 06:18:46 +00004232 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004233 // legacy is the default. Except for deployment taget of 10.5,
4234 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4235 // gets ignored silently.
4236 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004237 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4238 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004239 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004240 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004241 if (getToolChain().UseObjCMixedDispatch())
4242 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4243 else
4244 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4245 }
4246 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004247
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004248 // When ObjectiveC legacy runtime is in effect on MacOSX,
4249 // turn on the option to do Array/Dictionary subscripting
4250 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004251 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4252 getToolChain().getTriple().isMacOSX() &&
4253 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4254 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004255 objcRuntime.isNeXTFamily())
4256 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4257
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004258 // -fencode-extended-block-signature=1 is default.
4259 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4260 CmdArgs.push_back("-fencode-extended-block-signature");
4261 }
4262
John McCall24fc0de2011-07-06 00:26:06 +00004263 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4264 // NOTE: This logic is duplicated in ToolChains.cpp.
4265 bool ARC = isObjCAutoRefCount(Args);
4266 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004267 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004268
John McCall24fc0de2011-07-06 00:26:06 +00004269 CmdArgs.push_back("-fobjc-arc");
4270
Chandler Carruth491db322011-11-04 07:34:47 +00004271 // FIXME: It seems like this entire block, and several around it should be
4272 // wrapped in isObjC, but for now we just use it here as this is where it
4273 // was being used previously.
4274 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4275 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4276 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4277 else
4278 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4279 }
4280
John McCall24fc0de2011-07-06 00:26:06 +00004281 // Allow the user to enable full exceptions code emission.
4282 // We define off for Objective-CC, on for Objective-C++.
4283 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4284 options::OPT_fno_objc_arc_exceptions,
4285 /*default*/ types::isCXX(InputType)))
4286 CmdArgs.push_back("-fobjc-arc-exceptions");
4287 }
4288
4289 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4290 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004291 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004292 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004293
John McCall24fc0de2011-07-06 00:26:06 +00004294 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4295 // takes precedence.
4296 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4297 if (!GCArg)
4298 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4299 if (GCArg) {
4300 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004301 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004302 << GCArg->getAsString(Args);
4303 } else if (getToolChain().SupportsObjCGC()) {
4304 GCArg->render(Args, CmdArgs);
4305 } else {
4306 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004307 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004308 << GCArg->getAsString(Args);
4309 }
4310 }
4311
Bob Wilsonb111ec92015-03-02 19:01:14 +00004312 if (Args.hasFlag(options::OPT_fapplication_extension,
4313 options::OPT_fno_application_extension, false))
4314 CmdArgs.push_back("-fapplication-extension");
4315
Reid Klecknerc542d372014-06-27 17:02:02 +00004316 // Handle GCC-style exception args.
4317 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004318 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004319 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004320
4321 if (getToolChain().UseSjLjExceptions())
4322 CmdArgs.push_back("-fsjlj-exceptions");
4323
4324 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004325 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4326 options::OPT_fno_assume_sane_operator_new))
4327 CmdArgs.push_back("-fno-assume-sane-operator-new");
4328
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004329 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4330 // most platforms.
4331 if (Args.hasFlag(options::OPT_fsized_deallocation,
4332 options::OPT_fno_sized_deallocation, false))
4333 CmdArgs.push_back("-fsized-deallocation");
4334
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004335 // -fconstant-cfstrings is default, and may be subject to argument translation
4336 // on Darwin.
4337 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4338 options::OPT_fno_constant_cfstrings) ||
4339 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4340 options::OPT_mno_constant_cfstrings))
4341 CmdArgs.push_back("-fno-constant-cfstrings");
4342
John Thompsoned4e2952009-11-05 20:14:16 +00004343 // -fshort-wchar default varies depending on platform; only
4344 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004345 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4346 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004347 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004348
Hans Wennborg28c96312013-07-31 23:39:13 +00004349 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004350 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004351 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004352 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004353 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004354
Daniel Dunbar096ed292011-10-05 21:04:55 +00004355 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4356 // -fno-pack-struct doesn't apply to -fpack-struct=.
4357 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004358 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004359 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004360 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004361 } else if (Args.hasFlag(options::OPT_fpack_struct,
4362 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004363 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004364 }
4365
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004366 // Handle -fmax-type-align=N and -fno-type-align
4367 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4368 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4369 if (!SkipMaxTypeAlign) {
4370 std::string MaxTypeAlignStr = "-fmax-type-align=";
4371 MaxTypeAlignStr += A->getValue();
4372 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4373 }
4374 } else if (getToolChain().getTriple().isOSDarwin()) {
4375 if (!SkipMaxTypeAlign) {
4376 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4377 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4378 }
4379 }
4380
Robert Lytton0e076492013-08-13 09:43:10 +00004381 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004382 if (!Args.hasArg(options::OPT_fcommon))
4383 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004384 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004385 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004386
Daniel Dunbard18049a2009-04-07 21:16:11 +00004387 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004388 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004389 CmdArgs.push_back("-fno-common");
4390
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004391 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004392 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004393 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004394 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004395 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004396 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4397
Daniel Dunbar6358d682010-10-15 22:30:42 +00004398 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4399 if (!Args.hasFlag(options::OPT_ffor_scope,
4400 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004401 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004402 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4403
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004404 // -finput_charset=UTF-8 is default. Reject others
4405 if (Arg *inputCharset = Args.getLastArg(
4406 options::OPT_finput_charset_EQ)) {
4407 StringRef value = inputCharset->getValue();
4408 if (value != "UTF-8")
4409 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4410 }
4411
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004412 // -fexec_charset=UTF-8 is default. Reject others
4413 if (Arg *execCharset = Args.getLastArg(
4414 options::OPT_fexec_charset_EQ)) {
4415 StringRef value = execCharset->getValue();
4416 if (value != "UTF-8")
4417 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4418 }
4419
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004420 // -fcaret-diagnostics is default.
4421 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4422 options::OPT_fno_caret_diagnostics, true))
4423 CmdArgs.push_back("-fno-caret-diagnostics");
4424
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004425 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004426 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004427 options::OPT_fno_diagnostics_fixit_info))
4428 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004429
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004430 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004431 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004432 options::OPT_fno_diagnostics_show_option))
4433 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004434
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004435 if (const Arg *A =
4436 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4437 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004438 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004439 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004440
Douglas Gregor643c9222011-05-21 17:07:29 +00004441 if (const Arg *A =
4442 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4443 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004444 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004445 }
4446
Chandler Carruthb6766f02011-03-27 01:50:55 +00004447 if (Arg *A = Args.getLastArg(
4448 options::OPT_fdiagnostics_show_note_include_stack,
4449 options::OPT_fno_diagnostics_show_note_include_stack)) {
4450 if (A->getOption().matches(
4451 options::OPT_fdiagnostics_show_note_include_stack))
4452 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4453 else
4454 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4455 }
4456
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004457 // Color diagnostics are the default, unless the terminal doesn't support
4458 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004459 // Support both clang's -f[no-]color-diagnostics and gcc's
4460 // -f[no-]diagnostics-colors[=never|always|auto].
4461 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004462 for (const auto &Arg : Args) {
4463 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004464 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4465 !O.matches(options::OPT_fdiagnostics_color) &&
4466 !O.matches(options::OPT_fno_color_diagnostics) &&
4467 !O.matches(options::OPT_fno_diagnostics_color) &&
4468 !O.matches(options::OPT_fdiagnostics_color_EQ))
4469 continue;
4470
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004471 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004472 if (O.matches(options::OPT_fcolor_diagnostics) ||
4473 O.matches(options::OPT_fdiagnostics_color)) {
4474 ShowColors = Colors_On;
4475 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4476 O.matches(options::OPT_fno_diagnostics_color)) {
4477 ShowColors = Colors_Off;
4478 } else {
4479 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004480 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004481 if (value == "always")
4482 ShowColors = Colors_On;
4483 else if (value == "never")
4484 ShowColors = Colors_Off;
4485 else if (value == "auto")
4486 ShowColors = Colors_Auto;
4487 else
4488 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4489 << ("-fdiagnostics-color=" + value).str();
4490 }
4491 }
4492 if (ShowColors == Colors_On ||
4493 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004494 CmdArgs.push_back("-fcolor-diagnostics");
4495
Nico Rieck7857d462013-09-11 00:38:02 +00004496 if (Args.hasArg(options::OPT_fansi_escape_codes))
4497 CmdArgs.push_back("-fansi-escape-codes");
4498
Daniel Dunbardb097022009-06-08 21:13:54 +00004499 if (!Args.hasFlag(options::OPT_fshow_source_location,
4500 options::OPT_fno_show_source_location))
4501 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004502
Douglas Gregor643c9222011-05-21 17:07:29 +00004503 if (!Args.hasFlag(options::OPT_fshow_column,
4504 options::OPT_fno_show_column,
4505 true))
4506 CmdArgs.push_back("-fno-show-column");
4507
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004508 if (!Args.hasFlag(options::OPT_fspell_checking,
4509 options::OPT_fno_spell_checking))
4510 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004511
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004512
Chad Rosierc8e56e82012-12-05 21:08:21 +00004513 // -fno-asm-blocks is default.
4514 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4515 false))
4516 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004517
Steven Wucb0d13f2015-01-16 23:05:28 +00004518 // -fgnu-inline-asm is default.
4519 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4520 options::OPT_fno_gnu_inline_asm, true))
4521 CmdArgs.push_back("-fno-gnu-inline-asm");
4522
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004523 // Enable vectorization per default according to the optimization level
4524 // selected. For optimization levels that want vectorization we use the alias
4525 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004526 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004527 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004528 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004529 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004530 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004531 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004532
Chad Rosier136d67d2014-04-28 19:30:57 +00004533 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004534 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4535 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004536 options::OPT_fslp_vectorize;
4537 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004538 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004539 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004540
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004541 // -fno-slp-vectorize-aggressive is default.
4542 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004543 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004544 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004545
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004546 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4547 A->render(Args, CmdArgs);
4548
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004549 // -fdollars-in-identifiers default varies depending on platform and
4550 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004551 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004552 options::OPT_fno_dollars_in_identifiers)) {
4553 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004554 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004555 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004556 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004557 }
4558
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004559 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4560 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004561 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004562 options::OPT_fno_unit_at_a_time)) {
4563 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004564 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004565 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004566
Eli Friedman055c9702011-11-02 01:53:16 +00004567 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4568 options::OPT_fno_apple_pragma_pack, false))
4569 CmdArgs.push_back("-fapple-pragma-pack");
4570
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004571 // le32-specific flags:
4572 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4573 // by default.
4574 if (getToolChain().getArch() == llvm::Triple::le32) {
4575 CmdArgs.push_back("-fno-math-builtin");
4576 }
4577
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004578 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004579 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004580 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004581#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004582 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004583 (getToolChain().getArch() == llvm::Triple::arm ||
4584 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004585 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4586 CmdArgs.push_back("-fno-builtin-strcat");
4587 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4588 CmdArgs.push_back("-fno-builtin-strcpy");
4589 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004590#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004591
Justin Bognera88f0122014-06-20 22:59:50 +00004592 // Enable rewrite includes if the user's asked for it or if we're generating
4593 // diagnostics.
4594 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4595 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004596 if (Args.hasFlag(options::OPT_frewrite_includes,
4597 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004598 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004599 CmdArgs.push_back("-frewrite-includes");
4600
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004601 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004602 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004603 options::OPT_traditional_cpp)) {
4604 if (isa<PreprocessJobAction>(JA))
4605 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004606 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004607 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004608 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004609
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004610 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004611 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004612
4613 // Handle serialized diagnostics.
4614 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4615 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004616 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004617 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004618
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004619 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4620 CmdArgs.push_back("-fretain-comments-from-system-headers");
4621
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004622 // Forward -fcomment-block-commands to -cc1.
4623 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004624 // Forward -fparse-all-comments to -cc1.
4625 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004626
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004627 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4628 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004629 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004630 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004631 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4632 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004633 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004634
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004635 // We translate this by hand to the -cc1 argument, since nightly test uses
4636 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004637 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004638 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004639 OptDisabled = true;
4640 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004641 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004642 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004643
Bob Wilson23a55f12014-12-21 07:00:00 +00004644 // With -save-temps, we want to save the unoptimized bitcode output from the
4645 // CompileJobAction, so disable optimizations if they are not already
4646 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004647 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004648 isa<CompileJobAction>(JA))
4649 CmdArgs.push_back("-disable-llvm-optzns");
4650
Daniel Dunbard67a3222009-03-30 06:36:42 +00004651 if (Output.getType() == types::TY_Dependencies) {
4652 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004653 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004654 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004655 CmdArgs.push_back(Output.getFilename());
4656 } else {
4657 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004658 }
4659
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004660 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004661 addDashXForInput(Args, II, CmdArgs);
4662
Daniel Dunbarb440f562010-08-02 02:38:21 +00004663 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004664 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004665 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004666 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004667 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004668
Chris Lattnere9d7d782009-11-03 19:50:27 +00004669 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4670
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004671 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004672
4673 // Optionally embed the -cc1 level arguments into the debug info, for build
4674 // analysis.
4675 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004676 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004677 for (const auto &Arg : Args)
4678 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004679
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004680 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004681 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004682 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004683 SmallString<128> EscapedArg;
4684 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004685 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004686 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004687 }
4688 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004689 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004690 }
4691
Eric Christopherd3804002013-02-22 20:12:52 +00004692 // Add the split debug info name to the command lines here so we
4693 // can propagate it to the backend.
4694 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004695 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004696 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4697 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004698 const char *SplitDwarfOut;
4699 if (SplitDwarf) {
4700 CmdArgs.push_back("-split-dwarf-file");
4701 SplitDwarfOut = SplitDebugName(Args, Inputs);
4702 CmdArgs.push_back(SplitDwarfOut);
4703 }
4704
4705 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004706 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004707 Output.getType() == types::TY_Object &&
4708 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004709 auto CLCommand =
4710 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4711 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4712 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004713 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004714 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004715 }
4716
Daniel Dunbar17731772009-03-23 19:03:36 +00004717
Eric Christopherf1545832013-02-22 23:50:16 +00004718 // Handle the debug info splitting at object creation time if we're
4719 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004720 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004721 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004722 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004723
Roman Divacky178e01602011-02-10 16:52:03 +00004724 if (Arg *A = Args.getLastArg(options::OPT_pg))
4725 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004726 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004727 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004728
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004729 // Claim some arguments which clang supports automatically.
4730
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004731 // -fpch-preprocess is used with gcc to add a special marker in the output to
4732 // include the PCH file. Clang's PTH solution is completely transparent, so we
4733 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004734 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004735
Daniel Dunbar17731772009-03-23 19:03:36 +00004736 // Claim some arguments which clang doesn't support, but we don't
4737 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004738 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4739 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004740
Rafael Espindolab0092d72013-09-04 19:37:35 +00004741 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004742 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004743}
4744
John McCall5fb5df92012-06-20 06:18:46 +00004745/// Add options related to the Objective-C runtime/ABI.
4746///
4747/// Returns true if the runtime is non-fragile.
4748ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4749 ArgStringList &cmdArgs,
4750 RewriteKind rewriteKind) const {
4751 // Look for the controlling runtime option.
4752 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4753 options::OPT_fgnu_runtime,
4754 options::OPT_fobjc_runtime_EQ);
4755
4756 // Just forward -fobjc-runtime= to the frontend. This supercedes
4757 // options about fragility.
4758 if (runtimeArg &&
4759 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4760 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004761 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004762 if (runtime.tryParse(value)) {
4763 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4764 << value;
4765 }
4766
4767 runtimeArg->render(args, cmdArgs);
4768 return runtime;
4769 }
4770
4771 // Otherwise, we'll need the ABI "version". Version numbers are
4772 // slightly confusing for historical reasons:
4773 // 1 - Traditional "fragile" ABI
4774 // 2 - Non-fragile ABI, version 1
4775 // 3 - Non-fragile ABI, version 2
4776 unsigned objcABIVersion = 1;
4777 // If -fobjc-abi-version= is present, use that to set the version.
4778 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004779 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004780 if (value == "1")
4781 objcABIVersion = 1;
4782 else if (value == "2")
4783 objcABIVersion = 2;
4784 else if (value == "3")
4785 objcABIVersion = 3;
4786 else
4787 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4788 << value;
4789 } else {
4790 // Otherwise, determine if we are using the non-fragile ABI.
4791 bool nonFragileABIIsDefault =
4792 (rewriteKind == RK_NonFragile ||
4793 (rewriteKind == RK_None &&
4794 getToolChain().IsObjCNonFragileABIDefault()));
4795 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4796 options::OPT_fno_objc_nonfragile_abi,
4797 nonFragileABIIsDefault)) {
4798 // Determine the non-fragile ABI version to use.
4799#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4800 unsigned nonFragileABIVersion = 1;
4801#else
4802 unsigned nonFragileABIVersion = 2;
4803#endif
4804
4805 if (Arg *abiArg = args.getLastArg(
4806 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004807 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004808 if (value == "1")
4809 nonFragileABIVersion = 1;
4810 else if (value == "2")
4811 nonFragileABIVersion = 2;
4812 else
4813 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4814 << value;
4815 }
4816
4817 objcABIVersion = 1 + nonFragileABIVersion;
4818 } else {
4819 objcABIVersion = 1;
4820 }
4821 }
4822
4823 // We don't actually care about the ABI version other than whether
4824 // it's non-fragile.
4825 bool isNonFragile = objcABIVersion != 1;
4826
4827 // If we have no runtime argument, ask the toolchain for its default runtime.
4828 // However, the rewriter only really supports the Mac runtime, so assume that.
4829 ObjCRuntime runtime;
4830 if (!runtimeArg) {
4831 switch (rewriteKind) {
4832 case RK_None:
4833 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4834 break;
4835 case RK_Fragile:
4836 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4837 break;
4838 case RK_NonFragile:
4839 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4840 break;
4841 }
4842
4843 // -fnext-runtime
4844 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4845 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004846 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004847 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4848
4849 // Otherwise, build for a generic macosx port.
4850 } else {
4851 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4852 }
4853
4854 // -fgnu-runtime
4855 } else {
4856 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004857 // Legacy behaviour is to target the gnustep runtime if we are i
4858 // non-fragile mode or the GCC runtime in fragile mode.
4859 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004860 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004861 else
4862 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004863 }
4864
4865 cmdArgs.push_back(args.MakeArgString(
4866 "-fobjc-runtime=" + runtime.getAsString()));
4867 return runtime;
4868}
4869
Reid Klecknerc542d372014-06-27 17:02:02 +00004870static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4871 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4872 I += HaveDash;
4873 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004874}
Reid Klecknerc542d372014-06-27 17:02:02 +00004875
4876struct EHFlags {
4877 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4878 bool Synch;
4879 bool Asynch;
4880 bool NoExceptC;
4881};
4882
4883/// /EH controls whether to run destructor cleanups when exceptions are
4884/// thrown. There are three modifiers:
4885/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4886/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4887/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4888/// - c: Assume that extern "C" functions are implicitly noexcept. This
4889/// modifier is an optimization, so we ignore it for now.
4890/// The default is /EHs-c-, meaning cleanups are disabled.
4891static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4892 EHFlags EH;
4893 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4894 for (auto EHVal : EHArgs) {
4895 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4896 switch (EHVal[I]) {
4897 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4898 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4899 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4900 default: break;
4901 }
4902 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4903 break;
4904 }
4905 }
4906 return EH;
4907}
4908
Hans Wennborg75958c42013-08-08 00:17:41 +00004909void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4910 unsigned RTOptionID = options::OPT__SLASH_MT;
4911
Hans Wennborgf1a74252013-09-10 20:18:04 +00004912 if (Args.hasArg(options::OPT__SLASH_LDd))
4913 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4914 // but defining _DEBUG is sticky.
4915 RTOptionID = options::OPT__SLASH_MTd;
4916
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004917 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004918 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004919
Hans Wennborg75958c42013-08-08 00:17:41 +00004920 switch(RTOptionID) {
4921 case options::OPT__SLASH_MD:
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("-D_DLL");
4926 CmdArgs.push_back("--dependent-lib=msvcrt");
4927 break;
4928 case options::OPT__SLASH_MDd:
4929 CmdArgs.push_back("-D_DEBUG");
4930 CmdArgs.push_back("-D_MT");
4931 CmdArgs.push_back("-D_DLL");
4932 CmdArgs.push_back("--dependent-lib=msvcrtd");
4933 break;
4934 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004935 if (Args.hasArg(options::OPT__SLASH_LDd))
4936 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004937 CmdArgs.push_back("-D_MT");
4938 CmdArgs.push_back("--dependent-lib=libcmt");
4939 break;
4940 case options::OPT__SLASH_MTd:
4941 CmdArgs.push_back("-D_DEBUG");
4942 CmdArgs.push_back("-D_MT");
4943 CmdArgs.push_back("--dependent-lib=libcmtd");
4944 break;
4945 default:
4946 llvm_unreachable("Unexpected option ID.");
4947 }
4948
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004949 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4950 // users want. The /Za flag to cl.exe turns this off, but it's not
4951 // implemented in clang.
4952 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004953
Hans Wennborg8858a032014-07-21 23:42:07 +00004954 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4955 // would produce interleaved output, so ignore /showIncludes in such cases.
4956 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4957 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4958 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004959
David Majnemerf6072342014-07-01 22:24:56 +00004960 // This controls whether or not we emit RTTI data for polymorphic types.
4961 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4962 /*default=*/false))
4963 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004964
Reid Klecknerc542d372014-06-27 17:02:02 +00004965 const Driver &D = getToolChain().getDriver();
4966 EHFlags EH = parseClangCLEHFlags(D, Args);
4967 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004968 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004969 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004970 CmdArgs.push_back("-fexceptions");
4971 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004972
Hans Wennborge50cec32014-06-13 20:59:54 +00004973 // /EP should expand to -E -P.
4974 if (Args.hasArg(options::OPT__SLASH_EP)) {
4975 CmdArgs.push_back("-E");
4976 CmdArgs.push_back("-P");
4977 }
4978
David Majnemera5b195a2015-02-14 01:35:12 +00004979 unsigned VolatileOptionID;
4980 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4981 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4982 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4983 else
4984 VolatileOptionID = options::OPT__SLASH_volatile_iso;
4985
4986 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
4987 VolatileOptionID = A->getOption().getID();
4988
4989 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
4990 CmdArgs.push_back("-fms-volatile");
4991
David Majnemer86c318f2014-02-11 21:05:00 +00004992 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4993 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4994 if (MostGeneralArg && BestCaseArg)
4995 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4996 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4997
4998 if (MostGeneralArg) {
4999 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5000 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5001 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5002
5003 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5004 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5005 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5006 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5007 << FirstConflict->getAsString(Args)
5008 << SecondConflict->getAsString(Args);
5009
5010 if (SingleArg)
5011 CmdArgs.push_back("-fms-memptr-rep=single");
5012 else if (MultipleArg)
5013 CmdArgs.push_back("-fms-memptr-rep=multiple");
5014 else
5015 CmdArgs.push_back("-fms-memptr-rep=virtual");
5016 }
5017
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005018 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5019 A->render(Args, CmdArgs);
5020
Hans Wennborg81f74482013-09-10 01:07:07 +00005021 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5022 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005023 if (Args.hasArg(options::OPT__SLASH_fallback))
5024 CmdArgs.push_back("msvc-fallback");
5025 else
5026 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005027 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005028}
5029
Hans Wennborg1da044a2014-06-26 19:59:02 +00005030visualstudio::Compile *Clang::getCLFallback() const {
5031 if (!CLFallback)
5032 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5033 return CLFallback.get();
5034}
5035
Daniel Sanders7f933f42015-01-30 17:35:23 +00005036void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5037 ArgStringList &CmdArgs) const {
5038 StringRef CPUName;
5039 StringRef ABIName;
5040 const llvm::Triple &Triple = getToolChain().getTriple();
5041 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5042
5043 CmdArgs.push_back("-target-abi");
5044 CmdArgs.push_back(ABIName.data());
5045}
5046
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005047void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005048 const InputInfo &Output,
5049 const InputInfoList &Inputs,
5050 const ArgList &Args,
5051 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005052 ArgStringList CmdArgs;
5053
5054 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5055 const InputInfo &Input = Inputs[0];
5056
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005057 // Don't warn about "clang -w -c foo.s"
5058 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005059 // and "clang -emit-llvm -c foo.s"
5060 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005061
Rafael Espindola577637a2015-01-03 00:06:04 +00005062 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005063
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005064 // Invoke ourselves in -cc1as mode.
5065 //
5066 // FIXME: Implement custom jobs for internal actions.
5067 CmdArgs.push_back("-cc1as");
5068
5069 // Add the "effective" target triple.
5070 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005071 std::string TripleStr =
5072 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005073 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5074
5075 // Set the output mode, we currently only expect to be used as a real
5076 // assembler.
5077 CmdArgs.push_back("-filetype");
5078 CmdArgs.push_back("obj");
5079
Eric Christopher45f2e712012-12-18 00:31:10 +00005080 // Set the main file name, so that debug info works even with
5081 // -save-temps or preprocessed assembly.
5082 CmdArgs.push_back("-main-file-name");
5083 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
5084
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005085 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005086 const llvm::Triple &Triple = getToolChain().getTriple();
5087 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005088 if (!CPU.empty()) {
5089 CmdArgs.push_back("-target-cpu");
5090 CmdArgs.push_back(Args.MakeArgString(CPU));
5091 }
5092
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005093 // Add the target features
5094 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005095 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005096
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005097 // Ignore explicit -force_cpusubtype_ALL option.
5098 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005099
Eric Christopherfc3ee562012-01-10 00:38:01 +00005100 // Determine the original source input.
5101 const Action *SourceAction = &JA;
5102 while (SourceAction->getKind() != Action::InputClass) {
5103 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5104 SourceAction = SourceAction->getInputs()[0];
5105 }
5106
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005107 // Forward -g and handle debug info related flags, assuming we are dealing
5108 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005109 if (SourceAction->getType() == types::TY_Asm ||
5110 SourceAction->getType() == types::TY_PP_Asm) {
5111 Args.ClaimAllArgs(options::OPT_g_Group);
5112 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5113 if (!A->getOption().matches(options::OPT_g0))
5114 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005115
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005116 if (Args.hasArg(options::OPT_gdwarf_2))
5117 CmdArgs.push_back("-gdwarf-2");
5118 if (Args.hasArg(options::OPT_gdwarf_3))
5119 CmdArgs.push_back("-gdwarf-3");
5120 if (Args.hasArg(options::OPT_gdwarf_4))
5121 CmdArgs.push_back("-gdwarf-4");
5122
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005123 // Add the -fdebug-compilation-dir flag if needed.
5124 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005125
5126 // Set the AT_producer to the clang version when using the integrated
5127 // assembler on assembly source files.
5128 CmdArgs.push_back("-dwarf-debug-producer");
5129 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005130 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005131
5132 // Optionally embed the -cc1as level arguments into the debug info, for build
5133 // analysis.
5134 if (getToolChain().UseDwarfDebugFlags()) {
5135 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005136 for (const auto &Arg : Args)
5137 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005138
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005139 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005140 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5141 Flags += Exec;
5142 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005143 SmallString<128> EscapedArg;
5144 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005145 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005146 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005147 }
5148 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005149 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005150 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005151
5152 // FIXME: Add -static support, once we have it.
5153
Daniel Sanders7f933f42015-01-30 17:35:23 +00005154 // Add target specific flags.
5155 switch(getToolChain().getArch()) {
5156 default:
5157 break;
5158
5159 case llvm::Triple::mips:
5160 case llvm::Triple::mipsel:
5161 case llvm::Triple::mips64:
5162 case llvm::Triple::mips64el:
5163 AddMIPSTargetArgs(Args, CmdArgs);
5164 break;
5165 }
5166
David Blaikie372d9502014-01-17 03:17:40 +00005167 // Consume all the warning flags. Usually this would be handled more
5168 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5169 // doesn't handle that so rather than warning about unused flags that are
5170 // actually used, we'll lie by omission instead.
5171 // FIXME: Stop lying and consume only the appropriate driver flags
5172 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5173 ie = Args.filtered_end();
5174 it != ie; ++it)
5175 (*it)->claim();
5176
David Blaikie9260ed62013-07-25 21:19:01 +00005177 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5178 getToolChain().getDriver());
5179
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005180 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005181
5182 assert(Output.isFilename() && "Unexpected lipo output.");
5183 CmdArgs.push_back("-o");
5184 CmdArgs.push_back(Output.getFilename());
5185
Daniel Dunbarb440f562010-08-02 02:38:21 +00005186 assert(Input.isFilename() && "Invalid input.");
5187 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005188
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005189 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005190 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005191
5192 // Handle the debug info splitting at object creation time if we're
5193 // creating an object.
5194 // TODO: Currently only works on linux with newer objcopy.
5195 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005196 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005197 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5198 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005199}
5200
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005201void GnuTool::anchor() {}
5202
Daniel Dunbara3246a02009-03-18 08:07:30 +00005203void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005204 const InputInfo &Output,
5205 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005206 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005207 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005208 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005209 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005210
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005211 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005212 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005213 // Don't forward any -g arguments to assembly steps.
5214 if (isa<AssembleJobAction>(JA) &&
5215 A->getOption().matches(options::OPT_g_Group))
5216 continue;
5217
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005218 // Don't forward any -W arguments to assembly and link steps.
5219 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5220 A->getOption().matches(options::OPT_W_Group))
5221 continue;
5222
Daniel Dunbar2da02722009-03-19 07:55:12 +00005223 // It is unfortunate that we have to claim here, as this means
5224 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005225 // platforms using a generic gcc, even if we are just using gcc
5226 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005227 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005228 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005229 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005230 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005231
Daniel Dunbar4e295052010-01-25 22:35:08 +00005232 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005233
5234 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005235 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005236 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005237 CmdArgs.push_back(
5238 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005239 }
5240
Daniel Dunbar5716d872009-05-02 21:41:52 +00005241 // Try to force gcc to match the tool chain we want, if we recognize
5242 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005243 //
5244 // FIXME: The triple class should directly provide the information we want
5245 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005246 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005247 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005248 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005249 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5250 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005251 CmdArgs.push_back("-m64");
5252
Daniel Dunbarb440f562010-08-02 02:38:21 +00005253 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005254 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005255 CmdArgs.push_back(Output.getFilename());
5256 } else {
5257 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005258 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005259 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005260
Tony Linthicum76329bf2011-12-12 21:14:55 +00005261 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5262 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005263
5264 // Only pass -x if gcc will understand it; otherwise hope gcc
5265 // understands the suffix correctly. The main use case this would go
5266 // wrong in is for linker inputs if they happened to have an odd
5267 // suffix; really the only way to get this to happen is a command
5268 // like '-x foobar a.c' which will treat a.c like a linker input.
5269 //
5270 // FIXME: For the linker case specifically, can we safely convert
5271 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005272 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005273 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005274 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5275 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005276 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005277 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005278 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005279 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005280 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005281 else if (II.getType() == types::TY_ModuleFile)
5282 D.Diag(diag::err_drv_no_module_support)
5283 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005284
Daniel Dunbara3246a02009-03-18 08:07:30 +00005285 if (types::canTypeBeUserSpecified(II.getType())) {
5286 CmdArgs.push_back("-x");
5287 CmdArgs.push_back(types::getTypeName(II.getType()));
5288 }
5289
Daniel Dunbarb440f562010-08-02 02:38:21 +00005290 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005291 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005292 else {
5293 const Arg &A = II.getInputArg();
5294
5295 // Reverse translate some rewritten options.
5296 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5297 CmdArgs.push_back("-lstdc++");
5298 continue;
5299 }
5300
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005301 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005302 A.render(Args, CmdArgs);
5303 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005304 }
5305
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005306 const std::string customGCCName = D.getCCCGenericGCCName();
5307 const char *GCCName;
5308 if (!customGCCName.empty())
5309 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005310 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005311 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005312 } else
5313 GCCName = "gcc";
5314
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005315 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005316 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005318}
5319
Daniel Dunbar4e295052010-01-25 22:35:08 +00005320void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5321 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005322 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005323}
5324
Daniel Dunbar4e295052010-01-25 22:35:08 +00005325void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5326 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005327 const Driver &D = getToolChain().getDriver();
5328
Eric Christophercc7ff502015-01-29 00:56:17 +00005329 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005330 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005331 case types::TY_LLVM_IR:
5332 case types::TY_LTO_IR:
5333 case types::TY_LLVM_BC:
5334 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005335 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005336 break;
5337 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005338 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005339 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005340 case types::TY_Nothing:
5341 CmdArgs.push_back("-fsyntax-only");
5342 break;
5343 default:
5344 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005345 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005346}
5347
Daniel Dunbar4e295052010-01-25 22:35:08 +00005348void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5349 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005350 // The types are (hopefully) good enough.
5351}
5352
Tony Linthicum76329bf2011-12-12 21:14:55 +00005353// Hexagon tools start.
5354void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5355 ArgStringList &CmdArgs) const {
5356
5357}
5358void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5359 const InputInfo &Output,
5360 const InputInfoList &Inputs,
5361 const ArgList &Args,
5362 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005363 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005364
5365 const Driver &D = getToolChain().getDriver();
5366 ArgStringList CmdArgs;
5367
5368 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005369 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005370 CmdArgs.push_back(Args.MakeArgString(MarchString));
5371
5372 RenderExtraToolArgs(JA, CmdArgs);
5373
5374 if (Output.isFilename()) {
5375 CmdArgs.push_back("-o");
5376 CmdArgs.push_back(Output.getFilename());
5377 } else {
5378 assert(Output.isNothing() && "Unexpected output");
5379 CmdArgs.push_back("-fsyntax-only");
5380 }
5381
Matthew Curtise8f80a12012-12-06 17:49:03 +00005382 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5383 if (!SmallDataThreshold.empty())
5384 CmdArgs.push_back(
5385 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005386
Matthew Curtise5df3812012-12-07 17:23:04 +00005387 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5388 options::OPT_Xassembler);
5389
Tony Linthicum76329bf2011-12-12 21:14:55 +00005390 // Only pass -x if gcc will understand it; otherwise hope gcc
5391 // understands the suffix correctly. The main use case this would go
5392 // wrong in is for linker inputs if they happened to have an odd
5393 // suffix; really the only way to get this to happen is a command
5394 // like '-x foobar a.c' which will treat a.c like a linker input.
5395 //
5396 // FIXME: For the linker case specifically, can we safely convert
5397 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005398 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005399 // Don't try to pass LLVM or AST inputs to a generic gcc.
5400 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5401 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5402 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5403 << getToolChain().getTripleString();
5404 else if (II.getType() == types::TY_AST)
5405 D.Diag(clang::diag::err_drv_no_ast_support)
5406 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005407 else if (II.getType() == types::TY_ModuleFile)
5408 D.Diag(diag::err_drv_no_module_support)
5409 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005410
5411 if (II.isFilename())
5412 CmdArgs.push_back(II.getFilename());
5413 else
5414 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5415 II.getInputArg().render(Args, CmdArgs);
5416 }
5417
5418 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005419 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005421}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005422
Tony Linthicum76329bf2011-12-12 21:14:55 +00005423void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5424 ArgStringList &CmdArgs) const {
5425 // The types are (hopefully) good enough.
5426}
5427
5428void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5429 const InputInfo &Output,
5430 const InputInfoList &Inputs,
5431 const ArgList &Args,
5432 const char *LinkingOutput) const {
5433
Matthew Curtise689b052012-12-06 15:46:07 +00005434 const toolchains::Hexagon_TC& ToolChain =
5435 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5436 const Driver &D = ToolChain.getDriver();
5437
Tony Linthicum76329bf2011-12-12 21:14:55 +00005438 ArgStringList CmdArgs;
5439
Matthew Curtise689b052012-12-06 15:46:07 +00005440 //----------------------------------------------------------------------------
5441 //
5442 //----------------------------------------------------------------------------
5443 bool hasStaticArg = Args.hasArg(options::OPT_static);
5444 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005445 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005446 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5447 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5448 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5449 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005450
Matthew Curtise689b052012-12-06 15:46:07 +00005451 //----------------------------------------------------------------------------
5452 // Silence warnings for various options
5453 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005454
Matthew Curtise689b052012-12-06 15:46:07 +00005455 Args.ClaimAllArgs(options::OPT_g_Group);
5456 Args.ClaimAllArgs(options::OPT_emit_llvm);
5457 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5458 // handled somewhere else.
5459 Args.ClaimAllArgs(options::OPT_static_libgcc);
5460
5461 //----------------------------------------------------------------------------
5462 //
5463 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005464 for (const auto &Opt : ToolChain.ExtraOpts)
5465 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005466
Matthew Curtisf10a5952012-12-06 14:16:43 +00005467 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5468 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005469
Matthew Curtise689b052012-12-06 15:46:07 +00005470 if (buildingLib) {
5471 CmdArgs.push_back("-shared");
5472 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5473 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005474 }
5475
Matthew Curtise689b052012-12-06 15:46:07 +00005476 if (hasStaticArg)
5477 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005478
Matthew Curtise8f80a12012-12-06 17:49:03 +00005479 if (buildPIE && !buildingLib)
5480 CmdArgs.push_back("-pie");
5481
5482 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5483 if (!SmallDataThreshold.empty()) {
5484 CmdArgs.push_back(
5485 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5486 }
5487
Matthew Curtise689b052012-12-06 15:46:07 +00005488 //----------------------------------------------------------------------------
5489 //
5490 //----------------------------------------------------------------------------
5491 CmdArgs.push_back("-o");
5492 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005493
Matthew Curtise689b052012-12-06 15:46:07 +00005494 const std::string MarchSuffix = "/" + MarchString;
5495 const std::string G0Suffix = "/G0";
5496 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005497 const std::string RootDir =
5498 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005499 const std::string StartFilesDir = RootDir
5500 + "hexagon/lib"
5501 + (buildingLib
5502 ? MarchG0Suffix : MarchSuffix);
5503
5504 //----------------------------------------------------------------------------
5505 // moslib
5506 //----------------------------------------------------------------------------
5507 std::vector<std::string> oslibs;
5508 bool hasStandalone= false;
5509
5510 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5511 ie = Args.filtered_end(); it != ie; ++it) {
5512 (*it)->claim();
5513 oslibs.push_back((*it)->getValue());
5514 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005515 }
Matthew Curtise689b052012-12-06 15:46:07 +00005516 if (oslibs.empty()) {
5517 oslibs.push_back("standalone");
5518 hasStandalone = true;
5519 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005520
Matthew Curtise689b052012-12-06 15:46:07 +00005521 //----------------------------------------------------------------------------
5522 // Start Files
5523 //----------------------------------------------------------------------------
5524 if (incStdLib && incStartFiles) {
5525
5526 if (!buildingLib) {
5527 if (hasStandalone) {
5528 CmdArgs.push_back(
5529 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5530 }
5531 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5532 }
5533 std::string initObj = useShared ? "/initS.o" : "/init.o";
5534 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5535 }
5536
5537 //----------------------------------------------------------------------------
5538 // Library Search Paths
5539 //----------------------------------------------------------------------------
5540 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005541 for (const auto &LibPath : LibPaths)
5542 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005543
5544 //----------------------------------------------------------------------------
5545 //
5546 //----------------------------------------------------------------------------
5547 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5548 Args.AddAllArgs(CmdArgs, options::OPT_e);
5549 Args.AddAllArgs(CmdArgs, options::OPT_s);
5550 Args.AddAllArgs(CmdArgs, options::OPT_t);
5551 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5552
5553 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5554
5555 //----------------------------------------------------------------------------
5556 // Libraries
5557 //----------------------------------------------------------------------------
5558 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005559 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005560 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5561 CmdArgs.push_back("-lm");
5562 }
5563
5564 CmdArgs.push_back("--start-group");
5565
5566 if (!buildingLib) {
5567 for(std::vector<std::string>::iterator i = oslibs.begin(),
5568 e = oslibs.end(); i != e; ++i)
5569 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5570 CmdArgs.push_back("-lc");
5571 }
5572 CmdArgs.push_back("-lgcc");
5573
5574 CmdArgs.push_back("--end-group");
5575 }
5576
5577 //----------------------------------------------------------------------------
5578 // End files
5579 //----------------------------------------------------------------------------
5580 if (incStdLib && incStartFiles) {
5581 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5582 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5583 }
5584
5585 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005586 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5587 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005588}
5589// Hexagon tools end.
5590
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005591/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005592const char *arm::getARMCPUForMArch(const ArgList &Args,
5593 const llvm::Triple &Triple) {
5594 StringRef MArch;
5595 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5596 // Otherwise, if we have -march= choose the base CPU for that arch.
5597 MArch = A->getValue();
5598 } else {
5599 // Otherwise, use the Arch from the triple.
5600 MArch = Triple.getArchName();
5601 }
5602
5603 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005604 if (MArch == "native") {
5605 std::string CPU = llvm::sys::getHostCPUName();
5606 if (CPU != "generic") {
5607 // Translate the native cpu into the architecture. The switch below will
5608 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005609 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005610 }
5611 }
5612
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005613 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005614}
5615
5616/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005617StringRef arm::getARMTargetCPU(const ArgList &Args,
5618 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005619 // FIXME: Warn on inconsistent use of -mcpu and -march.
5620 // If we have -mcpu=, use that.
5621 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5622 StringRef MCPU = A->getValue();
5623 // Handle -mcpu=native.
5624 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005625 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005626 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005627 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005628 }
5629
5630 return getARMCPUForMArch(Args, Triple);
5631}
5632
5633/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5634/// CPU.
5635//
5636// FIXME: This is redundant with -mcpu, why does LLVM use this.
5637// FIXME: tblgen this, or kill it!
5638const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5639 return llvm::StringSwitch<const char *>(CPU)
5640 .Case("strongarm", "v4")
5641 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5642 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5643 .Cases("arm920", "arm920t", "arm922t", "v4t")
5644 .Cases("arm940t", "ep9312","v4t")
5645 .Cases("arm10tdmi", "arm1020t", "v5")
5646 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5647 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5648 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005649 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5650 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5651 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005652 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005653 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005654 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005655 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005656 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5657 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005658 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005659 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005660 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005661 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005662 .Default("");
5663}
5664
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005665void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5666 if (Args.hasArg(options::OPT_r))
5667 return;
5668
5669 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5670 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5671 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005672 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005673 .Default("--be8");
5674
5675 if (LinkFlag)
5676 CmdArgs.push_back(LinkFlag);
5677}
5678
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005679mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5680 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5681 .Case("mips1", NanLegacy)
5682 .Case("mips2", NanLegacy)
5683 .Case("mips3", NanLegacy)
5684 .Case("mips4", NanLegacy)
5685 .Case("mips5", NanLegacy)
5686 .Case("mips32", NanLegacy)
5687 .Case("mips32r2", NanLegacy)
5688 .Case("mips32r3", NanLegacy | Nan2008)
5689 .Case("mips32r5", NanLegacy | Nan2008)
5690 .Case("mips32r6", Nan2008)
5691 .Case("mips64", NanLegacy)
5692 .Case("mips64r2", NanLegacy)
5693 .Case("mips64r3", NanLegacy | Nan2008)
5694 .Case("mips64r5", NanLegacy | Nan2008)
5695 .Case("mips64r6", Nan2008)
5696 .Default(NanLegacy);
5697}
5698
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005699bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5700 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5701 return A && (A->getValue() == StringRef(Value));
5702}
5703
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005704bool mips::isUCLibc(const ArgList &Args) {
5705 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005706 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005707}
5708
Daniel Sanders2bf13662014-07-10 14:40:57 +00005709bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005710 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5711 return llvm::StringSwitch<bool>(NaNArg->getValue())
5712 .Case("2008", true)
5713 .Case("legacy", false)
5714 .Default(false);
5715
5716 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005717 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5718 .Cases("mips32r6", "mips64r6", true)
5719 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005720
5721 return false;
5722}
5723
Daniel Sanders379d44b2014-07-16 11:52:23 +00005724bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5725 StringRef ABIName) {
5726 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005727 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005728 return false;
5729
5730 if (ABIName != "32")
5731 return false;
5732
5733 return llvm::StringSwitch<bool>(CPUName)
5734 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005735 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5736 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005737 .Default(false);
5738}
5739
Tim Northover157d9112014-01-16 08:48:16 +00005740llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005741 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5742 // archs which Darwin doesn't use.
5743
5744 // The matching this routine does is fairly pointless, since it is neither the
5745 // complete architecture list, nor a reasonable subset. The problem is that
5746 // historically the driver driver accepts this and also ties its -march=
5747 // handling to the architecture name, so we need to be careful before removing
5748 // support for it.
5749
5750 // This code must be kept in sync with Clang's Darwin specific argument
5751 // translation.
5752
5753 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5754 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5755 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5756 .Case("ppc64", llvm::Triple::ppc64)
5757 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5758 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5759 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005760 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005761 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005762 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005763 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005764 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005765 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005766 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005767 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005768 .Case("nvptx", llvm::Triple::nvptx)
5769 .Case("nvptx64", llvm::Triple::nvptx64)
5770 .Case("amdil", llvm::Triple::amdil)
5771 .Case("spir", llvm::Triple::spir)
5772 .Default(llvm::Triple::UnknownArch);
5773}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005774
Tim Northover157d9112014-01-16 08:48:16 +00005775void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5776 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5777 T.setArch(Arch);
5778
5779 if (Str == "x86_64h")
5780 T.setArchName(Str);
5781 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5782 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005783 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005784 }
5785}
5786
Bob Wilsondecc03e2012-11-23 06:14:39 +00005787const char *Clang::getBaseInputName(const ArgList &Args,
5788 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005789 return Args.MakeArgString(
5790 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005791}
5792
Bob Wilsondecc03e2012-11-23 06:14:39 +00005793const char *Clang::getBaseInputStem(const ArgList &Args,
5794 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005795 const char *Str = getBaseInputName(Args, Inputs);
5796
Chris Lattner906bb902011-01-16 08:14:11 +00005797 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005798 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005799
5800 return Str;
5801}
5802
Bob Wilsondecc03e2012-11-23 06:14:39 +00005803const char *Clang::getDependencyFileName(const ArgList &Args,
5804 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005805 // FIXME: Think about this more.
5806 std::string Res;
5807
5808 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005809 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005810 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005811 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005812 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005813 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005814 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005815}
5816
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005817void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5818 const InputInfo &Output,
5819 const InputInfoList &Inputs,
5820 const ArgList &Args,
5821 const char *LinkingOutput) const {
5822 const ToolChain &ToolChain = getToolChain();
5823 const Driver &D = ToolChain.getDriver();
5824 ArgStringList CmdArgs;
5825
5826 // Silence warning for "clang -g foo.o -o foo"
5827 Args.ClaimAllArgs(options::OPT_g_Group);
5828 // and "clang -emit-llvm foo.o -o foo"
5829 Args.ClaimAllArgs(options::OPT_emit_llvm);
5830 // and for "clang -w foo.o -o foo". Other warning options are already
5831 // handled somewhere else.
5832 Args.ClaimAllArgs(options::OPT_w);
5833
5834 if (!D.SysRoot.empty())
5835 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5836
5837 // CloudABI only supports static linkage.
5838 CmdArgs.push_back("-Bstatic");
5839 CmdArgs.push_back("--eh-frame-hdr");
5840 CmdArgs.push_back("--gc-sections");
5841
5842 if (Output.isFilename()) {
5843 CmdArgs.push_back("-o");
5844 CmdArgs.push_back(Output.getFilename());
5845 } else {
5846 assert(Output.isNothing() && "Invalid output.");
5847 }
5848
5849 if (!Args.hasArg(options::OPT_nostdlib) &&
5850 !Args.hasArg(options::OPT_nostartfiles)) {
5851 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5852 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5853 }
5854
5855 Args.AddAllArgs(CmdArgs, options::OPT_L);
5856 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5857 for (const auto &Path : Paths)
5858 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5859 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5860 Args.AddAllArgs(CmdArgs, options::OPT_e);
5861 Args.AddAllArgs(CmdArgs, options::OPT_s);
5862 Args.AddAllArgs(CmdArgs, options::OPT_t);
5863 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5864 Args.AddAllArgs(CmdArgs, options::OPT_r);
5865
5866 if (D.IsUsingLTO(ToolChain, Args))
5867 AddGoldPlugin(ToolChain, Args, CmdArgs);
5868
5869 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5870
5871 if (!Args.hasArg(options::OPT_nostdlib) &&
5872 !Args.hasArg(options::OPT_nodefaultlibs)) {
5873 if (D.CCCIsCXX())
5874 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5875 CmdArgs.push_back("-lc");
5876 CmdArgs.push_back("-lcompiler_rt");
5877 }
5878
5879 if (!Args.hasArg(options::OPT_nostdlib) &&
5880 !Args.hasArg(options::OPT_nostartfiles))
5881 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5882
5883 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5884 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5885}
5886
Daniel Dunbarbe220842009-03-20 16:06:39 +00005887void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005888 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005889 const InputInfoList &Inputs,
5890 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005891 const char *LinkingOutput) const {
5892 ArgStringList CmdArgs;
5893
5894 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5895 const InputInfo &Input = Inputs[0];
5896
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005897 // Determine the original source input.
5898 const Action *SourceAction = &JA;
5899 while (SourceAction->getKind() != Action::InputClass) {
5900 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5901 SourceAction = SourceAction->getInputs()[0];
5902 }
5903
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005904 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005905 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005906 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5907 // FIXME: at run-time detect assembler capabilities or rely on version
5908 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005909 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005910 const llvm::Triple &T(getToolChain().getTriple());
5911 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005912 CmdArgs.push_back("-Q");
5913 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005914
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005915 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005916 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005917 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005918 if (Args.hasArg(options::OPT_gstabs))
5919 CmdArgs.push_back("--gstabs");
5920 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005921 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005922 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005923
Daniel Dunbarbe220842009-03-20 16:06:39 +00005924 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005925 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005926
Daniel Dunbar6d484762010-07-22 01:47:22 +00005927 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005928 if (getToolChain().getArch() == llvm::Triple::x86 ||
5929 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005930 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5931 CmdArgs.push_back("-force_cpusubtype_ALL");
5932
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005933 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005934 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005935 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005936 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005937 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005938 CmdArgs.push_back("-static");
5939
Daniel Dunbarbe220842009-03-20 16:06:39 +00005940 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5941 options::OPT_Xassembler);
5942
5943 assert(Output.isFilename() && "Unexpected lipo output.");
5944 CmdArgs.push_back("-o");
5945 CmdArgs.push_back(Output.getFilename());
5946
Daniel Dunbarb440f562010-08-02 02:38:21 +00005947 assert(Input.isFilename() && "Invalid input.");
5948 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005949
5950 // asm_final spec is empty.
5951
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005952 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005953 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005954 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005955}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005956
Tim Northover157d9112014-01-16 08:48:16 +00005957void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005958
Tim Northover157d9112014-01-16 08:48:16 +00005959void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5960 ArgStringList &CmdArgs) const {
5961 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005962
Daniel Dunbarc1964212009-03-26 16:23:12 +00005963 // Derived from darwin_arch spec.
5964 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005965 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005966
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005967 // FIXME: Is this needed anymore?
5968 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005969 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005970}
5971
Bill Wendling3b2000f2012-10-02 18:02:50 +00005972bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5973 // We only need to generate a temp path for LTO if we aren't compiling object
5974 // files. When compiling source files, we run 'dsymutil' after linking. We
5975 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005976 for (const auto &Input : Inputs)
5977 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005978 return true;
5979
5980 return false;
5981}
5982
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005983void darwin::Link::AddLinkArgs(Compilation &C,
5984 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005985 ArgStringList &CmdArgs,
5986 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005987 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005988 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005989
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005990 unsigned Version[3] = { 0, 0, 0 };
5991 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5992 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005993 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005994 Version[1], Version[2], HadExtra) ||
5995 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005996 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005997 << A->getAsString(Args);
5998 }
5999
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006000 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006001 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006002 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6003 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006004
Bob Wilson3d27dad2013-08-02 22:25:34 +00006005 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6006 CmdArgs.push_back("-export_dynamic");
6007
Bob Wilsonb111ec92015-03-02 19:01:14 +00006008 // If we are using App Extension restrictions, pass a flag to the linker
6009 // telling it that the compiled code has been audited.
6010 if (Args.hasFlag(options::OPT_fapplication_extension,
6011 options::OPT_fno_application_extension, false))
6012 CmdArgs.push_back("-application_extension");
6013
Bill Wendling313b6bf2012-11-16 23:03:00 +00006014 // If we are using LTO, then automatically create a temporary file path for
6015 // the linker to use, so that it's lifetime will extend past a possible
6016 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006017 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6018 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006019 const char *TmpPath = C.getArgs().MakeArgString(
6020 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6021 C.addTempFile(TmpPath);
6022 CmdArgs.push_back("-object_path_lto");
6023 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006024 }
6025
Daniel Dunbarc1964212009-03-26 16:23:12 +00006026 // Derived from the "link" spec.
6027 Args.AddAllArgs(CmdArgs, options::OPT_static);
6028 if (!Args.hasArg(options::OPT_static))
6029 CmdArgs.push_back("-dynamic");
6030 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6031 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6032 // here. How do we wish to handle such things?
6033 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006034
Daniel Dunbarc1964212009-03-26 16:23:12 +00006035 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006036 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006037 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006038 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006039
6040 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6041 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6042 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6043
6044 Arg *A;
6045 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6046 (A = Args.getLastArg(options::OPT_current__version)) ||
6047 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006048 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006049 << A->getAsString(Args) << "-dynamiclib";
6050
6051 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6052 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6053 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6054 } else {
6055 CmdArgs.push_back("-dylib");
6056
6057 Arg *A;
6058 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6059 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6060 (A = Args.getLastArg(options::OPT_client__name)) ||
6061 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6062 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6063 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006064 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006065 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006066
Daniel Dunbarc1964212009-03-26 16:23:12 +00006067 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6068 "-dylib_compatibility_version");
6069 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6070 "-dylib_current_version");
6071
Tim Northover157d9112014-01-16 08:48:16 +00006072 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006073
6074 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6075 "-dylib_install_name");
6076 }
6077
6078 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6079 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6080 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006081 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006082 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006083 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6084 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6085 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6086 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6087 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6088 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006089 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006090 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6091 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6092 Args.AddAllArgs(CmdArgs, options::OPT_init);
6093
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006094 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006095 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006096
Daniel Dunbarc1964212009-03-26 16:23:12 +00006097 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6098 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6099 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6100 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6101 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006102
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006103 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6104 options::OPT_fno_pie,
6105 options::OPT_fno_PIE)) {
6106 if (A->getOption().matches(options::OPT_fpie) ||
6107 A->getOption().matches(options::OPT_fPIE))
6108 CmdArgs.push_back("-pie");
6109 else
6110 CmdArgs.push_back("-no_pie");
6111 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006112
6113 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6114 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6115 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6116 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6117 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6118 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6119 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6120 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6121 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6122 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6123 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6124 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6125 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6126 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6127 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6128 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006129
Daniel Dunbar84384642011-05-02 21:03:47 +00006130 // Give --sysroot= preference, over the Apple specific behavior to also use
6131 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006132 StringRef sysroot = C.getSysRoot();
6133 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006134 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006135 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006136 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6137 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006138 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006139 }
6140
Daniel Dunbarc1964212009-03-26 16:23:12 +00006141 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6142 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6143 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6144 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6145 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006146 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006147 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6148 Args.AddAllArgs(CmdArgs, options::OPT_y);
6149 Args.AddLastArg(CmdArgs, options::OPT_w);
6150 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6151 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6152 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6153 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6154 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6155 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6156 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6157 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6158 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6159 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6160 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6161 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6162}
6163
Alexey Bataev186b28a2014-03-06 05:43:53 +00006164enum LibOpenMP {
6165 LibUnknown,
6166 LibGOMP,
6167 LibIOMP5
6168};
6169
Daniel Dunbarc1964212009-03-26 16:23:12 +00006170void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006171 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006172 const InputInfoList &Inputs,
6173 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006174 const char *LinkingOutput) const {
6175 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006176
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006177 // If the number of arguments surpasses the system limits, we will encode the
6178 // input files in a separate file, shortening the command line. To this end,
6179 // build a list of input file names that can be passed via a file with the
6180 // -filelist linker option.
6181 llvm::opt::ArgStringList InputFileList;
6182
Daniel Dunbarc1964212009-03-26 16:23:12 +00006183 // The logic here is derived from gcc's behavior; most of which
6184 // comes from specs (starting with link_command). Consult gcc for
6185 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006186 ArgStringList CmdArgs;
6187
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006188 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6189 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6190 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006191 for (const auto &Arg : Args)
6192 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006193 const char *Exec =
6194 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6195 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006196 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006197 return;
6198 }
6199
Daniel Dunbarc1964212009-03-26 16:23:12 +00006200 // I'm not sure why this particular decomposition exists in gcc, but
6201 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006202 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006203
Daniel Dunbarc1964212009-03-26 16:23:12 +00006204 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6205 Args.AddAllArgs(CmdArgs, options::OPT_s);
6206 Args.AddAllArgs(CmdArgs, options::OPT_t);
6207 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6208 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006209 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006210 Args.AddAllArgs(CmdArgs, options::OPT_r);
6211
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006212 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6213 // members of static archive libraries which implement Objective-C classes or
6214 // categories.
6215 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6216 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006217
Daniel Dunbarc1964212009-03-26 16:23:12 +00006218 CmdArgs.push_back("-o");
6219 CmdArgs.push_back(Output.getFilename());
6220
Chad Rosier06fd3c62012-05-16 23:45:12 +00006221 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006222 !Args.hasArg(options::OPT_nostartfiles))
6223 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006224
6225 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006226
Alexey Bataev186b28a2014-03-06 05:43:53 +00006227 LibOpenMP UsedOpenMPLib = LibUnknown;
6228 if (Args.hasArg(options::OPT_fopenmp)) {
6229 UsedOpenMPLib = LibGOMP;
6230 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6231 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6232 .Case("libgomp", LibGOMP)
6233 .Case("libiomp5", LibIOMP5)
6234 .Default(LibUnknown);
6235 if (UsedOpenMPLib == LibUnknown)
6236 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6237 << A->getOption().getName() << A->getValue();
6238 }
6239 switch (UsedOpenMPLib) {
6240 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006241 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006242 break;
6243 case LibIOMP5:
6244 CmdArgs.push_back("-liomp5");
6245 break;
6246 case LibUnknown:
6247 break;
6248 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006249
Douglas Gregor9295df02012-05-15 21:00:27 +00006250 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006251 // Build the input file for -filelist (list of linker input files) in case we
6252 // need it later
6253 for (const auto &II : Inputs) {
6254 if (!II.isFilename()) {
6255 // This is a linker input argument.
6256 // We cannot mix input arguments and file names in a -filelist input, thus
6257 // we prematurely stop our list (remaining files shall be passed as
6258 // arguments).
6259 if (InputFileList.size() > 0)
6260 break;
6261
6262 continue;
6263 }
6264
6265 InputFileList.push_back(II.getFilename());
6266 }
6267
Bob Wilson16d93952012-05-15 18:57:39 +00006268 if (isObjCRuntimeLinked(Args) &&
6269 !Args.hasArg(options::OPT_nostdlib) &&
6270 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006271 // We use arclite library for both ARC and subscripting support.
6272 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6273
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006274 CmdArgs.push_back("-framework");
6275 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006276 // Link libobj.
6277 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006278 }
John McCall31168b02011-06-15 23:02:42 +00006279
Daniel Dunbarc1964212009-03-26 16:23:12 +00006280 if (LinkingOutput) {
6281 CmdArgs.push_back("-arch_multiple");
6282 CmdArgs.push_back("-final_output");
6283 CmdArgs.push_back(LinkingOutput);
6284 }
6285
Daniel Dunbarc1964212009-03-26 16:23:12 +00006286 if (Args.hasArg(options::OPT_fnested_functions))
6287 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006288
Daniel Dunbarc1964212009-03-26 16:23:12 +00006289 if (!Args.hasArg(options::OPT_nostdlib) &&
6290 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006291 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006292 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006293
Daniel Dunbarc1964212009-03-26 16:23:12 +00006294 // link_ssp spec is empty.
6295
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006296 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006297 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006298 }
6299
Chad Rosier06fd3c62012-05-16 23:45:12 +00006300 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006301 !Args.hasArg(options::OPT_nostartfiles)) {
6302 // endfile_spec is empty.
6303 }
6304
6305 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6306 Args.AddAllArgs(CmdArgs, options::OPT_F);
6307
Steven Wu3ffb61b2015-02-06 18:08:29 +00006308 // -iframework should be forwarded as -F.
6309 for (auto it = Args.filtered_begin(options::OPT_iframework),
6310 ie = Args.filtered_end(); it != ie; ++it)
6311 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6312 (*it)->getValue()));
6313
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006314 if (!Args.hasArg(options::OPT_nostdlib) &&
6315 !Args.hasArg(options::OPT_nodefaultlibs)) {
6316 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6317 if (A->getValue() == StringRef("Accelerate")) {
6318 CmdArgs.push_back("-framework");
6319 CmdArgs.push_back("Accelerate");
6320 }
6321 }
6322 }
6323
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006324 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006325 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006326 std::unique_ptr<Command> Cmd =
6327 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6328 Cmd->setInputFileList(std::move(InputFileList));
6329 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006330}
6331
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006332void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006333 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006334 const InputInfoList &Inputs,
6335 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006336 const char *LinkingOutput) const {
6337 ArgStringList CmdArgs;
6338
6339 CmdArgs.push_back("-create");
6340 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006341
6342 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006343 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006344
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006345 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006346 assert(II.isFilename() && "Unexpected lipo input.");
6347 CmdArgs.push_back(II.getFilename());
6348 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006349
6350 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006351 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006352}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006353
Daniel Dunbar88299622010-06-04 18:28:36 +00006354void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006355 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006356 const InputInfoList &Inputs,
6357 const ArgList &Args,
6358 const char *LinkingOutput) const {
6359 ArgStringList CmdArgs;
6360
Daniel Dunbareb86b042011-05-09 17:23:16 +00006361 CmdArgs.push_back("-o");
6362 CmdArgs.push_back(Output.getFilename());
6363
Daniel Dunbar88299622010-06-04 18:28:36 +00006364 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6365 const InputInfo &Input = Inputs[0];
6366 assert(Input.isFilename() && "Unexpected dsymutil input.");
6367 CmdArgs.push_back(Input.getFilename());
6368
Daniel Dunbar88299622010-06-04 18:28:36 +00006369 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006370 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006371 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006372}
6373
Eric Christopher551ef452011-08-23 17:56:55 +00006374void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006375 const InputInfo &Output,
6376 const InputInfoList &Inputs,
6377 const ArgList &Args,
6378 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006379 ArgStringList CmdArgs;
6380 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006381 CmdArgs.push_back("--debug-info");
6382 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006383 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006384
6385 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6386 const InputInfo &Input = Inputs[0];
6387 assert(Input.isFilename() && "Unexpected verify input");
6388
6389 // Grabbing the output of the earlier dsymutil run.
6390 CmdArgs.push_back(Input.getFilename());
6391
6392 const char *Exec =
6393 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006394 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006395}
6396
David Chisnallf571cde2012-02-15 13:39:01 +00006397void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6398 const InputInfo &Output,
6399 const InputInfoList &Inputs,
6400 const ArgList &Args,
6401 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006402 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006403 ArgStringList CmdArgs;
6404
6405 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6406 options::OPT_Xassembler);
6407
6408 CmdArgs.push_back("-o");
6409 CmdArgs.push_back(Output.getFilename());
6410
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006411 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006412 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006413
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006414 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006415 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006416}
6417
David Chisnallf571cde2012-02-15 13:39:01 +00006418void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6419 const InputInfo &Output,
6420 const InputInfoList &Inputs,
6421 const ArgList &Args,
6422 const char *LinkingOutput) const {
6423 // FIXME: Find a real GCC, don't hard-code versions here
6424 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6425 const llvm::Triple &T = getToolChain().getTriple();
6426 std::string LibPath = "/usr/lib/";
6427 llvm::Triple::ArchType Arch = T.getArch();
6428 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006429 case llvm::Triple::x86:
6430 GCCLibPath +=
6431 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6432 break;
6433 case llvm::Triple::x86_64:
6434 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6435 GCCLibPath += "/4.5.2/amd64/";
6436 LibPath += "amd64/";
6437 break;
6438 default:
6439 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006440 }
6441
6442 ArgStringList CmdArgs;
6443
David Chisnall272a0712012-02-29 15:06:12 +00006444 // Demangle C++ names in errors
6445 CmdArgs.push_back("-C");
6446
David Chisnallf571cde2012-02-15 13:39:01 +00006447 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6448 (!Args.hasArg(options::OPT_shared))) {
6449 CmdArgs.push_back("-e");
6450 CmdArgs.push_back("_start");
6451 }
6452
6453 if (Args.hasArg(options::OPT_static)) {
6454 CmdArgs.push_back("-Bstatic");
6455 CmdArgs.push_back("-dn");
6456 } else {
6457 CmdArgs.push_back("-Bdynamic");
6458 if (Args.hasArg(options::OPT_shared)) {
6459 CmdArgs.push_back("-shared");
6460 } else {
6461 CmdArgs.push_back("--dynamic-linker");
6462 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6463 }
6464 }
6465
6466 if (Output.isFilename()) {
6467 CmdArgs.push_back("-o");
6468 CmdArgs.push_back(Output.getFilename());
6469 } else {
6470 assert(Output.isNothing() && "Invalid output.");
6471 }
6472
6473 if (!Args.hasArg(options::OPT_nostdlib) &&
6474 !Args.hasArg(options::OPT_nostartfiles)) {
6475 if (!Args.hasArg(options::OPT_shared)) {
6476 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6477 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006478 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006479 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6480 } else {
6481 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006482 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6483 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006484 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006485 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006486 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006487 }
6488
6489 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6490
6491 Args.AddAllArgs(CmdArgs, options::OPT_L);
6492 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6493 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006494 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006495
6496 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6497
6498 if (!Args.hasArg(options::OPT_nostdlib) &&
6499 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006500 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006501 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006502 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006503 if (!Args.hasArg(options::OPT_shared)) {
6504 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006505 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006506 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006507 }
David Chisnallf571cde2012-02-15 13:39:01 +00006508 }
6509
6510 if (!Args.hasArg(options::OPT_nostdlib) &&
6511 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006512 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006513 }
David Chisnall96de9932012-02-16 16:00:47 +00006514 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006515
Alexey Samsonov7811d192014-02-20 13:57:37 +00006516 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006517
6518 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006519 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006520 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006521}
6522
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006523void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006524 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006525 const InputInfoList &Inputs,
6526 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006527 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006528 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006529 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006530 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006531
Rafael Espindolacc126272014-02-28 01:55:21 +00006532 switch (getToolChain().getArch()) {
6533 case llvm::Triple::x86:
6534 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6535 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006536 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006537 break;
6538
6539 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006540 CmdArgs.push_back("-mppc");
6541 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006542 break;
6543
6544 case llvm::Triple::sparc:
6545 CmdArgs.push_back("-32");
6546 NeedsKPIC = true;
6547 break;
6548
6549 case llvm::Triple::sparcv9:
6550 CmdArgs.push_back("-64");
6551 CmdArgs.push_back("-Av9a");
6552 NeedsKPIC = true;
6553 break;
6554
6555 case llvm::Triple::mips64:
6556 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006557 StringRef CPUName;
6558 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006559 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006560
6561 CmdArgs.push_back("-mabi");
6562 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6563
6564 if (getToolChain().getArch() == llvm::Triple::mips64)
6565 CmdArgs.push_back("-EB");
6566 else
6567 CmdArgs.push_back("-EL");
6568
Rafael Espindolacc126272014-02-28 01:55:21 +00006569 NeedsKPIC = true;
6570 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006571 }
6572
Rafael Espindolacc126272014-02-28 01:55:21 +00006573 default:
6574 break;
6575 }
6576
6577 if (NeedsKPIC)
6578 addAssemblerKPIC(Args, CmdArgs);
6579
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006580 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6581 options::OPT_Xassembler);
6582
6583 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006584 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006586 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006587 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006588
6589 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006590 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006591 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006592}
6593
6594void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006595 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006596 const InputInfoList &Inputs,
6597 const ArgList &Args,
6598 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006599 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006600 ArgStringList CmdArgs;
6601
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006602 // Silence warning for "clang -g foo.o -o foo"
6603 Args.ClaimAllArgs(options::OPT_g_Group);
6604 // and "clang -emit-llvm foo.o -o foo"
6605 Args.ClaimAllArgs(options::OPT_emit_llvm);
6606 // and for "clang -w foo.o -o foo". Other warning options are already
6607 // handled somewhere else.
6608 Args.ClaimAllArgs(options::OPT_w);
6609
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006610 if (getToolChain().getArch() == llvm::Triple::mips64)
6611 CmdArgs.push_back("-EB");
6612 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6613 CmdArgs.push_back("-EL");
6614
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006615 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006616 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006617 CmdArgs.push_back("-e");
6618 CmdArgs.push_back("__start");
6619 }
6620
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006621 if (Args.hasArg(options::OPT_static)) {
6622 CmdArgs.push_back("-Bstatic");
6623 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006624 if (Args.hasArg(options::OPT_rdynamic))
6625 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006626 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006627 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006628 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006629 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006630 } else {
6631 CmdArgs.push_back("-dynamic-linker");
6632 CmdArgs.push_back("/usr/libexec/ld.so");
6633 }
6634 }
6635
Rafael Espindola044f7832013-06-05 04:28:55 +00006636 if (Args.hasArg(options::OPT_nopie))
6637 CmdArgs.push_back("-nopie");
6638
Daniel Dunbarb440f562010-08-02 02:38:21 +00006639 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006640 CmdArgs.push_back("-o");
6641 CmdArgs.push_back(Output.getFilename());
6642 } else {
6643 assert(Output.isNothing() && "Invalid output.");
6644 }
6645
6646 if (!Args.hasArg(options::OPT_nostdlib) &&
6647 !Args.hasArg(options::OPT_nostartfiles)) {
6648 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006649 if (Args.hasArg(options::OPT_pg))
6650 CmdArgs.push_back(Args.MakeArgString(
6651 getToolChain().GetFilePath("gcrt0.o")));
6652 else
6653 CmdArgs.push_back(Args.MakeArgString(
6654 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006655 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006656 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006657 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006658 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006659 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006660 }
6661 }
6662
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006663 std::string Triple = getToolChain().getTripleString();
6664 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006665 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006666 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006667 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006668
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006669 Args.AddAllArgs(CmdArgs, options::OPT_L);
6670 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6671 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006672 Args.AddAllArgs(CmdArgs, options::OPT_s);
6673 Args.AddAllArgs(CmdArgs, options::OPT_t);
6674 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6675 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006676
Daniel Dunbar54423b22010-09-17 00:24:54 +00006677 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006678
6679 if (!Args.hasArg(options::OPT_nostdlib) &&
6680 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006681 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006682 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006683 if (Args.hasArg(options::OPT_pg))
6684 CmdArgs.push_back("-lm_p");
6685 else
6686 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006687 }
6688
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006689 // FIXME: For some reason GCC passes -lgcc before adding
6690 // the default system libraries. Just mimic this for now.
6691 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006692
Eric Christopher17674ec2012-09-13 06:32:34 +00006693 if (Args.hasArg(options::OPT_pthread)) {
6694 if (!Args.hasArg(options::OPT_shared) &&
6695 Args.hasArg(options::OPT_pg))
6696 CmdArgs.push_back("-lpthread_p");
6697 else
6698 CmdArgs.push_back("-lpthread");
6699 }
6700
Chandler Carruth45661652011-12-17 22:32:42 +00006701 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006702 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006703 CmdArgs.push_back("-lc_p");
6704 else
6705 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006706 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006707
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006708 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006709 }
6710
6711 if (!Args.hasArg(options::OPT_nostdlib) &&
6712 !Args.hasArg(options::OPT_nostartfiles)) {
6713 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006714 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006715 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006716 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006717 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006718 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006719 }
6720
6721 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006722 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006723 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006724}
Ed Schoutene33194b2009-04-02 19:13:12 +00006725
Eli Friedman9fa28852012-08-08 23:57:20 +00006726void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6727 const InputInfo &Output,
6728 const InputInfoList &Inputs,
6729 const ArgList &Args,
6730 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006731 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006732 ArgStringList CmdArgs;
6733
6734 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6735 options::OPT_Xassembler);
6736
6737 CmdArgs.push_back("-o");
6738 CmdArgs.push_back(Output.getFilename());
6739
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006740 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006741 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006742
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006743 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006744 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006745}
6746
6747void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6748 const InputInfo &Output,
6749 const InputInfoList &Inputs,
6750 const ArgList &Args,
6751 const char *LinkingOutput) const {
6752 const Driver &D = getToolChain().getDriver();
6753 ArgStringList CmdArgs;
6754
6755 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6756 (!Args.hasArg(options::OPT_shared))) {
6757 CmdArgs.push_back("-e");
6758 CmdArgs.push_back("__start");
6759 }
6760
6761 if (Args.hasArg(options::OPT_static)) {
6762 CmdArgs.push_back("-Bstatic");
6763 } else {
6764 if (Args.hasArg(options::OPT_rdynamic))
6765 CmdArgs.push_back("-export-dynamic");
6766 CmdArgs.push_back("--eh-frame-hdr");
6767 CmdArgs.push_back("-Bdynamic");
6768 if (Args.hasArg(options::OPT_shared)) {
6769 CmdArgs.push_back("-shared");
6770 } else {
6771 CmdArgs.push_back("-dynamic-linker");
6772 CmdArgs.push_back("/usr/libexec/ld.so");
6773 }
6774 }
6775
6776 if (Output.isFilename()) {
6777 CmdArgs.push_back("-o");
6778 CmdArgs.push_back(Output.getFilename());
6779 } else {
6780 assert(Output.isNothing() && "Invalid output.");
6781 }
6782
6783 if (!Args.hasArg(options::OPT_nostdlib) &&
6784 !Args.hasArg(options::OPT_nostartfiles)) {
6785 if (!Args.hasArg(options::OPT_shared)) {
6786 if (Args.hasArg(options::OPT_pg))
6787 CmdArgs.push_back(Args.MakeArgString(
6788 getToolChain().GetFilePath("gcrt0.o")));
6789 else
6790 CmdArgs.push_back(Args.MakeArgString(
6791 getToolChain().GetFilePath("crt0.o")));
6792 CmdArgs.push_back(Args.MakeArgString(
6793 getToolChain().GetFilePath("crtbegin.o")));
6794 } else {
6795 CmdArgs.push_back(Args.MakeArgString(
6796 getToolChain().GetFilePath("crtbeginS.o")));
6797 }
6798 }
6799
6800 Args.AddAllArgs(CmdArgs, options::OPT_L);
6801 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6802 Args.AddAllArgs(CmdArgs, options::OPT_e);
6803
6804 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6805
6806 if (!Args.hasArg(options::OPT_nostdlib) &&
6807 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006808 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006809 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6810 if (Args.hasArg(options::OPT_pg))
6811 CmdArgs.push_back("-lm_p");
6812 else
6813 CmdArgs.push_back("-lm");
6814 }
6815
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006816 if (Args.hasArg(options::OPT_pthread)) {
6817 if (!Args.hasArg(options::OPT_shared) &&
6818 Args.hasArg(options::OPT_pg))
6819 CmdArgs.push_back("-lpthread_p");
6820 else
6821 CmdArgs.push_back("-lpthread");
6822 }
6823
Eli Friedman9fa28852012-08-08 23:57:20 +00006824 if (!Args.hasArg(options::OPT_shared)) {
6825 if (Args.hasArg(options::OPT_pg))
6826 CmdArgs.push_back("-lc_p");
6827 else
6828 CmdArgs.push_back("-lc");
6829 }
6830
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006831 StringRef MyArch;
6832 switch (getToolChain().getTriple().getArch()) {
6833 case llvm::Triple::arm:
6834 MyArch = "arm";
6835 break;
6836 case llvm::Triple::x86:
6837 MyArch = "i386";
6838 break;
6839 case llvm::Triple::x86_64:
6840 MyArch = "amd64";
6841 break;
6842 default:
6843 llvm_unreachable("Unsupported architecture");
6844 }
6845 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006846 }
6847
6848 if (!Args.hasArg(options::OPT_nostdlib) &&
6849 !Args.hasArg(options::OPT_nostartfiles)) {
6850 if (!Args.hasArg(options::OPT_shared))
6851 CmdArgs.push_back(Args.MakeArgString(
6852 getToolChain().GetFilePath("crtend.o")));
6853 else
6854 CmdArgs.push_back(Args.MakeArgString(
6855 getToolChain().GetFilePath("crtendS.o")));
6856 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006857
6858 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006859 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006860 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006861}
6862
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006863void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006864 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006865 const InputInfoList &Inputs,
6866 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006867 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006868 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006869 ArgStringList CmdArgs;
6870
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006871 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6872 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006873 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006874 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006875 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006876 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006877 else if (getToolChain().getArch() == llvm::Triple::mips ||
6878 getToolChain().getArch() == llvm::Triple::mipsel ||
6879 getToolChain().getArch() == llvm::Triple::mips64 ||
6880 getToolChain().getArch() == llvm::Triple::mips64el) {
6881 StringRef CPUName;
6882 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006883 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006884
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006885 CmdArgs.push_back("-march");
6886 CmdArgs.push_back(CPUName.data());
6887
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006888 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006889 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006890
6891 if (getToolChain().getArch() == llvm::Triple::mips ||
6892 getToolChain().getArch() == llvm::Triple::mips64)
6893 CmdArgs.push_back("-EB");
6894 else
6895 CmdArgs.push_back("-EL");
6896
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006897 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006898 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006899 getToolChain().getArch() == llvm::Triple::armeb ||
6900 getToolChain().getArch() == llvm::Triple::thumb ||
6901 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006902 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006903 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006904 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6905
6906 if (FloatABI == "hard") {
6907 CmdArgs.push_back("-mfpu=vfp");
6908 } else {
6909 CmdArgs.push_back("-mfpu=softvfp");
6910 }
6911
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006912 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006913 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006914 case llvm::Triple::GNUEABI:
6915 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006916 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006917 break;
6918
6919 default:
6920 CmdArgs.push_back("-matpcs");
6921 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006922 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006923 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006924 if (getToolChain().getArch() == llvm::Triple::sparc)
6925 CmdArgs.push_back("-Av8plusa");
6926 else
6927 CmdArgs.push_back("-Av9a");
6928
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006929 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006930 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006931
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006932 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6933 options::OPT_Xassembler);
6934
6935 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006936 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006937
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006938 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006939 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006940
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006941 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006942 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006943}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006944
6945void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006946 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006947 const InputInfoList &Inputs,
6948 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006949 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006950 const toolchains::FreeBSD& ToolChain =
6951 static_cast<const toolchains::FreeBSD&>(getToolChain());
6952 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006953 const bool IsPIE =
6954 !Args.hasArg(options::OPT_shared) &&
6955 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006956 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006957
6958 // Silence warning for "clang -g foo.o -o foo"
6959 Args.ClaimAllArgs(options::OPT_g_Group);
6960 // and "clang -emit-llvm foo.o -o foo"
6961 Args.ClaimAllArgs(options::OPT_emit_llvm);
6962 // and for "clang -w foo.o -o foo". Other warning options are already
6963 // handled somewhere else.
6964 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006965
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006966 if (!D.SysRoot.empty())
6967 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6968
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006969 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006970 CmdArgs.push_back("-pie");
6971
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006972 if (Args.hasArg(options::OPT_static)) {
6973 CmdArgs.push_back("-Bstatic");
6974 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006975 if (Args.hasArg(options::OPT_rdynamic))
6976 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006977 CmdArgs.push_back("--eh-frame-hdr");
6978 if (Args.hasArg(options::OPT_shared)) {
6979 CmdArgs.push_back("-Bshareable");
6980 } else {
6981 CmdArgs.push_back("-dynamic-linker");
6982 CmdArgs.push_back("/libexec/ld-elf.so.1");
6983 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006984 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6985 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006986 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6987 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6988 CmdArgs.push_back("--hash-style=both");
6989 }
6990 }
6991 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006992 }
6993
6994 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6995 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006996 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006997 CmdArgs.push_back("-m");
6998 CmdArgs.push_back("elf_i386_fbsd");
6999 }
7000
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007001 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007002 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007003 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007004 }
7005
Daniel Dunbarb440f562010-08-02 02:38:21 +00007006 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007007 CmdArgs.push_back("-o");
7008 CmdArgs.push_back(Output.getFilename());
7009 } else {
7010 assert(Output.isNothing() && "Invalid output.");
7011 }
7012
7013 if (!Args.hasArg(options::OPT_nostdlib) &&
7014 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007015 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007016 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007017 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007018 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007019 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007020 crt1 = "Scrt1.o";
7021 else
7022 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007023 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007024 if (crt1)
7025 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7026
7027 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7028
Craig Topper92fc2df2014-05-17 16:56:41 +00007029 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007030 if (Args.hasArg(options::OPT_static))
7031 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007032 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007033 crtbegin = "crtbeginS.o";
7034 else
7035 crtbegin = "crtbegin.o";
7036
7037 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007038 }
7039
7040 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007041 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007042 for (const auto &Path : Paths)
7043 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007044 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7045 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007046 Args.AddAllArgs(CmdArgs, options::OPT_s);
7047 Args.AddAllArgs(CmdArgs, options::OPT_t);
7048 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7049 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007050
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007051 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007052 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007053
Alexey Samsonov52550342014-09-15 19:58:40 +00007054 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007055 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007056
7057 if (!Args.hasArg(options::OPT_nostdlib) &&
7058 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007059 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007060 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007061 if (Args.hasArg(options::OPT_pg))
7062 CmdArgs.push_back("-lm_p");
7063 else
7064 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007065 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007066 if (NeedsSanitizerDeps)
7067 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007068 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7069 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007070 if (Args.hasArg(options::OPT_pg))
7071 CmdArgs.push_back("-lgcc_p");
7072 else
7073 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007074 if (Args.hasArg(options::OPT_static)) {
7075 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007076 } else if (Args.hasArg(options::OPT_pg)) {
7077 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007078 } else {
7079 CmdArgs.push_back("--as-needed");
7080 CmdArgs.push_back("-lgcc_s");
7081 CmdArgs.push_back("--no-as-needed");
7082 }
7083
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007084 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007085 if (Args.hasArg(options::OPT_pg))
7086 CmdArgs.push_back("-lpthread_p");
7087 else
7088 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007089 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007090
Roman Divacky66f22762011-02-10 16:59:40 +00007091 if (Args.hasArg(options::OPT_pg)) {
7092 if (Args.hasArg(options::OPT_shared))
7093 CmdArgs.push_back("-lc");
7094 else
7095 CmdArgs.push_back("-lc_p");
7096 CmdArgs.push_back("-lgcc_p");
7097 } else {
7098 CmdArgs.push_back("-lc");
7099 CmdArgs.push_back("-lgcc");
7100 }
7101
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007102 if (Args.hasArg(options::OPT_static)) {
7103 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007104 } else if (Args.hasArg(options::OPT_pg)) {
7105 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007106 } else {
7107 CmdArgs.push_back("--as-needed");
7108 CmdArgs.push_back("-lgcc_s");
7109 CmdArgs.push_back("--no-as-needed");
7110 }
7111 }
7112
7113 if (!Args.hasArg(options::OPT_nostdlib) &&
7114 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007115 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007116 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007117 else
7118 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007120 }
7121
Alexey Samsonov7811d192014-02-20 13:57:37 +00007122 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007123
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007124 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007125 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007126 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007127}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007128
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007129void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7130 const InputInfo &Output,
7131 const InputInfoList &Inputs,
7132 const ArgList &Args,
7133 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007134 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007135 ArgStringList CmdArgs;
7136
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007137 // GNU as needs different flags for creating the correct output format
7138 // on architectures with different ABIs or optional feature sets.
7139 switch (getToolChain().getArch()) {
7140 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007141 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007142 break;
7143 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007144 case llvm::Triple::armeb:
7145 case llvm::Triple::thumb:
7146 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007147 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007148 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007149 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007150 }
7151
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007152 case llvm::Triple::mips:
7153 case llvm::Triple::mipsel:
7154 case llvm::Triple::mips64:
7155 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007156 StringRef CPUName;
7157 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007158 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007159
7160 CmdArgs.push_back("-march");
7161 CmdArgs.push_back(CPUName.data());
7162
7163 CmdArgs.push_back("-mabi");
7164 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7165
7166 if (getToolChain().getArch() == llvm::Triple::mips ||
7167 getToolChain().getArch() == llvm::Triple::mips64)
7168 CmdArgs.push_back("-EB");
7169 else
7170 CmdArgs.push_back("-EL");
7171
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007172 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007173 break;
7174 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007175
7176 case llvm::Triple::sparc:
7177 CmdArgs.push_back("-32");
7178 addAssemblerKPIC(Args, CmdArgs);
7179 break;
7180
7181 case llvm::Triple::sparcv9:
7182 CmdArgs.push_back("-64");
7183 CmdArgs.push_back("-Av9");
7184 addAssemblerKPIC(Args, CmdArgs);
7185 break;
7186
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007187 default:
7188 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007189 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007190
7191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7192 options::OPT_Xassembler);
7193
7194 CmdArgs.push_back("-o");
7195 CmdArgs.push_back(Output.getFilename());
7196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007197 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007198 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007199
David Chisnallddbd68f2011-09-27 22:03:18 +00007200 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007201 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007202}
7203
7204void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7205 const InputInfo &Output,
7206 const InputInfoList &Inputs,
7207 const ArgList &Args,
7208 const char *LinkingOutput) const {
7209 const Driver &D = getToolChain().getDriver();
7210 ArgStringList CmdArgs;
7211
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007212 if (!D.SysRoot.empty())
7213 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7214
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007215 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007216 if (Args.hasArg(options::OPT_static)) {
7217 CmdArgs.push_back("-Bstatic");
7218 } else {
7219 if (Args.hasArg(options::OPT_rdynamic))
7220 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007221 if (Args.hasArg(options::OPT_shared)) {
7222 CmdArgs.push_back("-Bshareable");
7223 } else {
7224 CmdArgs.push_back("-dynamic-linker");
7225 CmdArgs.push_back("/libexec/ld.elf_so");
7226 }
7227 }
7228
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007229 // Many NetBSD architectures support more than one ABI.
7230 // Determine the correct emulation for ld.
7231 switch (getToolChain().getArch()) {
7232 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007233 CmdArgs.push_back("-m");
7234 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007235 break;
7236 case llvm::Triple::arm:
7237 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007238 CmdArgs.push_back("-m");
7239 switch (getToolChain().getTriple().getEnvironment()) {
7240 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007241 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007242 CmdArgs.push_back("armelf_nbsd_eabi");
7243 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007244 case llvm::Triple::EABIHF:
7245 case llvm::Triple::GNUEABIHF:
7246 CmdArgs.push_back("armelf_nbsd_eabihf");
7247 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007248 default:
7249 CmdArgs.push_back("armelf_nbsd");
7250 break;
7251 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007252 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007253 case llvm::Triple::armeb:
7254 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007255 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007256 CmdArgs.push_back("-m");
7257 switch (getToolChain().getTriple().getEnvironment()) {
7258 case llvm::Triple::EABI:
7259 case llvm::Triple::GNUEABI:
7260 CmdArgs.push_back("armelfb_nbsd_eabi");
7261 break;
7262 case llvm::Triple::EABIHF:
7263 case llvm::Triple::GNUEABIHF:
7264 CmdArgs.push_back("armelfb_nbsd_eabihf");
7265 break;
7266 default:
7267 CmdArgs.push_back("armelfb_nbsd");
7268 break;
7269 }
7270 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007271 case llvm::Triple::mips64:
7272 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007273 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007274 CmdArgs.push_back("-m");
7275 if (getToolChain().getArch() == llvm::Triple::mips64)
7276 CmdArgs.push_back("elf32btsmip");
7277 else
7278 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007279 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007280 CmdArgs.push_back("-m");
7281 if (getToolChain().getArch() == llvm::Triple::mips64)
7282 CmdArgs.push_back("elf64btsmip");
7283 else
7284 CmdArgs.push_back("elf64ltsmip");
7285 }
7286 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007287 case llvm::Triple::ppc:
7288 CmdArgs.push_back("-m");
7289 CmdArgs.push_back("elf32ppc_nbsd");
7290 break;
7291
7292 case llvm::Triple::ppc64:
7293 case llvm::Triple::ppc64le:
7294 CmdArgs.push_back("-m");
7295 CmdArgs.push_back("elf64ppc");
7296 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007297
7298 case llvm::Triple::sparc:
7299 CmdArgs.push_back("-m");
7300 CmdArgs.push_back("elf32_sparc");
7301 break;
7302
7303 case llvm::Triple::sparcv9:
7304 CmdArgs.push_back("-m");
7305 CmdArgs.push_back("elf64_sparc");
7306 break;
7307
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007308 default:
7309 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007310 }
7311
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007312 if (Output.isFilename()) {
7313 CmdArgs.push_back("-o");
7314 CmdArgs.push_back(Output.getFilename());
7315 } else {
7316 assert(Output.isNothing() && "Invalid output.");
7317 }
7318
7319 if (!Args.hasArg(options::OPT_nostdlib) &&
7320 !Args.hasArg(options::OPT_nostartfiles)) {
7321 if (!Args.hasArg(options::OPT_shared)) {
7322 CmdArgs.push_back(Args.MakeArgString(
7323 getToolChain().GetFilePath("crt0.o")));
7324 CmdArgs.push_back(Args.MakeArgString(
7325 getToolChain().GetFilePath("crti.o")));
7326 CmdArgs.push_back(Args.MakeArgString(
7327 getToolChain().GetFilePath("crtbegin.o")));
7328 } else {
7329 CmdArgs.push_back(Args.MakeArgString(
7330 getToolChain().GetFilePath("crti.o")));
7331 CmdArgs.push_back(Args.MakeArgString(
7332 getToolChain().GetFilePath("crtbeginS.o")));
7333 }
7334 }
7335
7336 Args.AddAllArgs(CmdArgs, options::OPT_L);
7337 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7338 Args.AddAllArgs(CmdArgs, options::OPT_e);
7339 Args.AddAllArgs(CmdArgs, options::OPT_s);
7340 Args.AddAllArgs(CmdArgs, options::OPT_t);
7341 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7342 Args.AddAllArgs(CmdArgs, options::OPT_r);
7343
7344 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7345
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007346 unsigned Major, Minor, Micro;
7347 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7348 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007349 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007350 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007351 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007352 case llvm::Triple::arm:
7353 case llvm::Triple::armeb:
7354 case llvm::Triple::thumb:
7355 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007356 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007357 case llvm::Triple::ppc64:
7358 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007359 case llvm::Triple::x86:
7360 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007361 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007362 break;
7363 default:
7364 break;
7365 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007366 }
7367
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007368 if (!Args.hasArg(options::OPT_nostdlib) &&
7369 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007370 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007371 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7372 CmdArgs.push_back("-lm");
7373 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007374 if (Args.hasArg(options::OPT_pthread))
7375 CmdArgs.push_back("-lpthread");
7376 CmdArgs.push_back("-lc");
7377
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007378 if (useLibgcc) {
7379 if (Args.hasArg(options::OPT_static)) {
7380 // libgcc_eh depends on libc, so resolve as much as possible,
7381 // pull in any new requirements from libc and then get the rest
7382 // of libgcc.
7383 CmdArgs.push_back("-lgcc_eh");
7384 CmdArgs.push_back("-lc");
7385 CmdArgs.push_back("-lgcc");
7386 } else {
7387 CmdArgs.push_back("-lgcc");
7388 CmdArgs.push_back("--as-needed");
7389 CmdArgs.push_back("-lgcc_s");
7390 CmdArgs.push_back("--no-as-needed");
7391 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007392 }
7393 }
7394
7395 if (!Args.hasArg(options::OPT_nostdlib) &&
7396 !Args.hasArg(options::OPT_nostartfiles)) {
7397 if (!Args.hasArg(options::OPT_shared))
7398 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7399 "crtend.o")));
7400 else
7401 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7402 "crtendS.o")));
7403 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7404 "crtn.o")));
7405 }
7406
Alexey Samsonov7811d192014-02-20 13:57:37 +00007407 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007408
Logan Chieneb9162f2014-06-26 14:23:45 +00007409 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007410 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007411}
7412
Thomas Schwinge4e555262013-03-28 19:04:25 +00007413void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7414 const InputInfo &Output,
7415 const InputInfoList &Inputs,
7416 const ArgList &Args,
7417 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007418 claimNoWarnArgs(Args);
7419
Rafael Espindola92b00932010-08-10 00:25:48 +00007420 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007421 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007422
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007423 switch (getToolChain().getArch()) {
7424 default:
7425 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007426 // Add --32/--64 to make sure we get the format we want.
7427 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007428 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007429 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007430 break;
7431 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007432 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7433 CmdArgs.push_back("--x32");
7434 else
7435 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007436 break;
7437 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007438 CmdArgs.push_back("-a32");
7439 CmdArgs.push_back("-mppc");
7440 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007441 break;
7442 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007443 CmdArgs.push_back("-a64");
7444 CmdArgs.push_back("-mppc64");
7445 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007446 break;
7447 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007448 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007449 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007450 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007451 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007452 break;
7453 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007454 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007455 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007456 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007457 break;
7458 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007459 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007460 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007461 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007462 break;
7463 case llvm::Triple::arm:
7464 case llvm::Triple::armeb:
7465 case llvm::Triple::thumb:
7466 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007467 const llvm::Triple &Triple = getToolChain().getTriple();
7468 switch (Triple.getSubArch()) {
7469 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007470 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007471 break;
7472 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007473 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007474 break;
7475 default:
7476 break;
7477 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007478
Tim Northover9c7e0352013-12-12 11:55:52 +00007479 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007480 getToolChain().getDriver(), Args,
7481 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007482 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007483
7484 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007485
7486 // FIXME: remove krait check when GNU tools support krait cpu
7487 // for now replace it with -march=armv7-a to avoid a lower
7488 // march from being picked in the absence of a cpu flag.
7489 Arg *A;
7490 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7491 StringRef(A->getValue()) == "krait")
7492 CmdArgs.push_back("-march=armv7-a");
7493 else
7494 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007495 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007496 break;
7497 }
7498 case llvm::Triple::mips:
7499 case llvm::Triple::mipsel:
7500 case llvm::Triple::mips64:
7501 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007502 StringRef CPUName;
7503 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007504 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007505 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007506
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007507 CmdArgs.push_back("-march");
7508 CmdArgs.push_back(CPUName.data());
7509
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007510 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007511 CmdArgs.push_back(ABIName.data());
7512
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007513 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7514 // or -mshared (not implemented) is in effect.
7515 bool IsPicOrPie = false;
7516 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7517 options::OPT_fpic, options::OPT_fno_pic,
7518 options::OPT_fPIE, options::OPT_fno_PIE,
7519 options::OPT_fpie, options::OPT_fno_pie)) {
7520 if (A->getOption().matches(options::OPT_fPIC) ||
7521 A->getOption().matches(options::OPT_fpic) ||
7522 A->getOption().matches(options::OPT_fPIE) ||
7523 A->getOption().matches(options::OPT_fpie))
7524 IsPicOrPie = true;
7525 }
7526 if (!IsPicOrPie)
7527 CmdArgs.push_back("-mno-shared");
7528
Daniel Sanders379d44b2014-07-16 11:52:23 +00007529 // LLVM doesn't support -mplt yet and acts as if it is always given.
7530 // However, -mplt has no effect with the N64 ABI.
7531 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007532
7533 if (getToolChain().getArch() == llvm::Triple::mips ||
7534 getToolChain().getArch() == llvm::Triple::mips64)
7535 CmdArgs.push_back("-EB");
7536 else
7537 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007538
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007539 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7540 if (StringRef(A->getValue()) == "2008")
7541 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7542 }
7543
Daniel Sanders379d44b2014-07-16 11:52:23 +00007544 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7545 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7546 options::OPT_mfp64)) {
7547 A->claim();
7548 A->render(Args, CmdArgs);
7549 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7550 ABIName))
7551 CmdArgs.push_back("-mfpxx");
7552
7553 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7554 // -mno-mips16 is actually -no-mips16.
7555 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7556 options::OPT_mno_mips16)) {
7557 if (A->getOption().matches(options::OPT_mips16)) {
7558 A->claim();
7559 A->render(Args, CmdArgs);
7560 } else {
7561 A->claim();
7562 CmdArgs.push_back("-no-mips16");
7563 }
7564 }
7565
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007566 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7567 options::OPT_mno_micromips);
7568 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7569 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7570
Simon Atanasyanbd986632013-11-26 11:58:04 +00007571 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7572 // Do not use AddLastArg because not all versions of MIPS assembler
7573 // support -mmsa / -mno-msa options.
7574 if (A->getOption().matches(options::OPT_mmsa))
7575 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7576 }
7577
Daniel Sanders379d44b2014-07-16 11:52:23 +00007578 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7579 options::OPT_msoft_float);
7580
7581 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7582 options::OPT_mno_odd_spreg);
7583
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007584 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007585 break;
7586 }
7587 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007588 // Always pass an -march option, since our default of z10 is later
7589 // than the GNU assembler's default.
7590 StringRef CPUName = getSystemZTargetCPU(Args);
7591 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007592 break;
7593 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007594 }
7595
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007596 if (NeedsKPIC)
7597 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007598
7599 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7600 options::OPT_Xassembler);
7601
7602 CmdArgs.push_back("-o");
7603 CmdArgs.push_back(Output.getFilename());
7604
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007605 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007606 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007607
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007608 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007609 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007610
7611 // Handle the debug info splitting at object creation time if we're
7612 // creating an object.
7613 // TODO: Currently only works on linux with newer objcopy.
7614 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007615 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007616 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7617 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007618}
7619
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007620static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007621 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007622 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007623 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7624 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007625 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007626 CmdArgs.push_back("-lgcc");
7627
Logan Chien3d3373c2012-11-19 12:04:11 +00007628 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007629 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007630 CmdArgs.push_back("-lgcc");
7631 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007632 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007633 CmdArgs.push_back("--as-needed");
7634 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007635 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007636 CmdArgs.push_back("--no-as-needed");
7637 }
7638
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007639 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007640 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007641 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007642 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007643
7644 // According to Android ABI, we have to link with libdl if we are
7645 // linking with non-static libgcc.
7646 //
7647 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7648 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7649 if (isAndroid && !StaticLibgcc)
7650 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007651}
7652
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007653static std::string getLinuxDynamicLinker(const ArgList &Args,
7654 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007655 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7656 if (ToolChain.getTriple().isArch64Bit())
7657 return "/system/bin/linker64";
7658 else
7659 return "/system/bin/linker";
7660 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7661 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007662 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007663 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007664 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007665 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007666 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007667 else if (ToolChain.getArch() == llvm::Triple::arm ||
7668 ToolChain.getArch() == llvm::Triple::thumb) {
7669 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7670 return "/lib/ld-linux-armhf.so.3";
7671 else
7672 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007673 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7674 ToolChain.getArch() == llvm::Triple::thumbeb) {
7675 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7676 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7677 else
7678 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007679 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007680 ToolChain.getArch() == llvm::Triple::mipsel ||
7681 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007682 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007683 StringRef CPUName;
7684 StringRef ABIName;
7685 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7686 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7687
7688 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7689 .Case("o32", "/lib")
7690 .Case("n32", "/lib32")
7691 .Case("n64", "/lib64")
7692 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007693 StringRef LibName;
7694 if (mips::isUCLibc(Args))
7695 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7696 else
7697 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007698
7699 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007700 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7701 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007702 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7703 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7704 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007705 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007706 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7707 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7708 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007709 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007710 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7711 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007712 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7713 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007714 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7715 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7716 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007717 else
7718 return "/lib64/ld-linux-x86-64.so.2";
7719}
7720
Renato Golinc4b49242014-02-13 10:01:16 +00007721static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007722 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007723 // Make use of compiler-rt if --rtlib option is used
7724 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7725
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007726 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007727 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007728 switch (TC.getTriple().getOS()) {
7729 default: llvm_unreachable("unsupported OS");
7730 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007731 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007732 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007733 break;
7734 }
Renato Golinc4b49242014-02-13 10:01:16 +00007735 break;
7736 case ToolChain::RLT_Libgcc:
7737 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7738 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007739 }
7740}
7741
Rafael Espindola1e085772014-08-15 17:14:35 +00007742static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7743 switch (T.getArch()) {
7744 case llvm::Triple::x86:
7745 return "elf_i386";
7746 case llvm::Triple::aarch64:
7747 return "aarch64linux";
7748 case llvm::Triple::aarch64_be:
7749 return "aarch64_be_linux";
7750 case llvm::Triple::arm:
7751 case llvm::Triple::thumb:
7752 return "armelf_linux_eabi";
7753 case llvm::Triple::armeb:
7754 case llvm::Triple::thumbeb:
7755 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7756 case llvm::Triple::ppc:
7757 return "elf32ppclinux";
7758 case llvm::Triple::ppc64:
7759 return "elf64ppc";
7760 case llvm::Triple::ppc64le:
7761 return "elf64lppc";
7762 case llvm::Triple::sparc:
7763 return "elf32_sparc";
7764 case llvm::Triple::sparcv9:
7765 return "elf64_sparc";
7766 case llvm::Triple::mips:
7767 return "elf32btsmip";
7768 case llvm::Triple::mipsel:
7769 return "elf32ltsmip";
7770 case llvm::Triple::mips64:
7771 if (mips::hasMipsAbiArg(Args, "n32"))
7772 return "elf32btsmipn32";
7773 return "elf64btsmip";
7774 case llvm::Triple::mips64el:
7775 if (mips::hasMipsAbiArg(Args, "n32"))
7776 return "elf32ltsmipn32";
7777 return "elf64ltsmip";
7778 case llvm::Triple::systemz:
7779 return "elf64_s390";
7780 case llvm::Triple::x86_64:
7781 if (T.getEnvironment() == llvm::Triple::GNUX32)
7782 return "elf32_x86_64";
7783 return "elf_x86_64";
7784 default:
7785 llvm_unreachable("Unexpected arch");
7786 }
7787}
7788
Thomas Schwinge4e555262013-03-28 19:04:25 +00007789void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7790 const InputInfo &Output,
7791 const InputInfoList &Inputs,
7792 const ArgList &Args,
7793 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007794 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007795 static_cast<const toolchains::Linux&>(getToolChain());
7796 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007797 const bool isAndroid =
7798 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007799 const bool IsPIE =
7800 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007801 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007802 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007803
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007804 ArgStringList CmdArgs;
7805
Rafael Espindolad1002f62010-11-15 18:28:16 +00007806 // Silence warning for "clang -g foo.o -o foo"
7807 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007808 // and "clang -emit-llvm foo.o -o foo"
7809 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007810 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007811 // handled somewhere else.
7812 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007813
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007814 if (!D.SysRoot.empty())
7815 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007816
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007817 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007818 CmdArgs.push_back("-pie");
7819
Rafael Espindola1c76c592010-11-07 22:57:16 +00007820 if (Args.hasArg(options::OPT_rdynamic))
7821 CmdArgs.push_back("-export-dynamic");
7822
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007823 if (Args.hasArg(options::OPT_s))
7824 CmdArgs.push_back("-s");
7825
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007826 if (ToolChain.getArch() == llvm::Triple::armeb ||
7827 ToolChain.getArch() == llvm::Triple::thumbeb)
7828 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7829
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007830 for (const auto &Opt : ToolChain.ExtraOpts)
7831 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007832
7833 if (!Args.hasArg(options::OPT_static)) {
7834 CmdArgs.push_back("--eh-frame-hdr");
7835 }
7836
7837 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007838 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007839
7840 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007841 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007842 ToolChain.getArch() == llvm::Triple::armeb ||
7843 ToolChain.getArch() == llvm::Triple::thumb ||
7844 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007845 CmdArgs.push_back("-Bstatic");
7846 else
7847 CmdArgs.push_back("-static");
7848 } else if (Args.hasArg(options::OPT_shared)) {
7849 CmdArgs.push_back("-shared");
7850 }
7851
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007852 if (ToolChain.getArch() == llvm::Triple::arm ||
7853 ToolChain.getArch() == llvm::Triple::armeb ||
7854 ToolChain.getArch() == llvm::Triple::thumb ||
7855 ToolChain.getArch() == llvm::Triple::thumbeb ||
7856 (!Args.hasArg(options::OPT_static) &&
7857 !Args.hasArg(options::OPT_shared))) {
7858 CmdArgs.push_back("-dynamic-linker");
7859 CmdArgs.push_back(Args.MakeArgString(
7860 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7861 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007862
7863 CmdArgs.push_back("-o");
7864 CmdArgs.push_back(Output.getFilename());
7865
Rafael Espindola81937ec2010-12-01 01:52:43 +00007866 if (!Args.hasArg(options::OPT_nostdlib) &&
7867 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007868 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007869 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007870 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007871 if (Args.hasArg(options::OPT_pg))
7872 crt1 = "gcrt1.o";
7873 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007874 crt1 = "Scrt1.o";
7875 else
7876 crt1 = "crt1.o";
7877 }
7878 if (crt1)
7879 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007880
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007881 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7882 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007883
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007884 const char *crtbegin;
7885 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007886 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007887 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007888 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007889 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007890 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007891 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007892 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007893 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007894
7895 // Add crtfastmath.o if available and fast math is enabled.
7896 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007897 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007898
7899 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007900 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007901
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007902 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007903
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007904 for (const auto &Path : Paths)
7905 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007906
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007907 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007908 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007909
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007910 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7911 CmdArgs.push_back("--no-demangle");
7912
Alexey Samsonov52550342014-09-15 19:58:40 +00007913 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007914 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007915 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007916 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007917
Hans Wennborg70850d82013-07-18 20:29:38 +00007918 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007919 !Args.hasArg(options::OPT_nostdlib) &&
7920 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007921 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7922 !Args.hasArg(options::OPT_static);
7923 if (OnlyLibstdcxxStatic)
7924 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007925 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007926 if (OnlyLibstdcxxStatic)
7927 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007928 CmdArgs.push_back("-lm");
7929 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007930 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7931 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007932
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007933 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007934 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7935 if (Args.hasArg(options::OPT_static))
7936 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007937
Alexey Samsonov52550342014-09-15 19:58:40 +00007938 if (NeedsSanitizerDeps)
7939 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7940
Alexey Bataev186b28a2014-03-06 05:43:53 +00007941 LibOpenMP UsedOpenMPLib = LibUnknown;
7942 if (Args.hasArg(options::OPT_fopenmp)) {
7943 UsedOpenMPLib = LibGOMP;
7944 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7945 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7946 .Case("libgomp", LibGOMP)
7947 .Case("libiomp5", LibIOMP5)
7948 .Default(LibUnknown);
7949 if (UsedOpenMPLib == LibUnknown)
7950 D.Diag(diag::err_drv_unsupported_option_argument)
7951 << A->getOption().getName() << A->getValue();
7952 }
7953 switch (UsedOpenMPLib) {
7954 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007955 CmdArgs.push_back("-lgomp");
7956
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007957 // FIXME: Exclude this for platforms with libgomp that don't require
7958 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007959 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007960 break;
7961 case LibIOMP5:
7962 CmdArgs.push_back("-liomp5");
7963 break;
7964 case LibUnknown:
7965 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007966 }
Renato Golinc4b49242014-02-13 10:01:16 +00007967 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007968
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007969 if ((Args.hasArg(options::OPT_pthread) ||
7970 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7971 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007972 CmdArgs.push_back("-lpthread");
7973
7974 CmdArgs.push_back("-lc");
7975
7976 if (Args.hasArg(options::OPT_static))
7977 CmdArgs.push_back("--end-group");
7978 else
Renato Golinc4b49242014-02-13 10:01:16 +00007979 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007980 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007981
Rafael Espindola81937ec2010-12-01 01:52:43 +00007982 if (!Args.hasArg(options::OPT_nostartfiles)) {
7983 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007984 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007985 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007986 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007987 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007988 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007989 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007990
Rafael Espindola81937ec2010-12-01 01:52:43 +00007991 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007992 if (!isAndroid)
7993 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007994 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007995 }
7996
David Blaikiec11bf802014-09-04 16:04:28 +00007997 C.addCommand(
7998 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007999}
8000
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008001
8002// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8003// for the various SFI requirements like register masking. The assembly tool
8004// inserts the file containing the macros as an input into all the assembly
8005// jobs.
8006void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8007 const InputInfo &Output,
8008 const InputInfoList &Inputs,
8009 const ArgList &Args,
8010 const char *LinkingOutput) const {
8011 const toolchains::NaCl_TC& ToolChain =
8012 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8013 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8014 "nacl-arm-macros.s");
8015 InputInfoList NewInputs;
8016 NewInputs.push_back(NaClMacros);
8017 NewInputs.append(Inputs.begin(), Inputs.end());
8018 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8019 LinkingOutput);
8020}
8021
8022
8023// This is quite similar to gnutools::link::ConstructJob with changes that
8024// we use static by default, do not yet support sanitizers or LTO, and a few
8025// others. Eventually we can support more of that and hopefully migrate back
8026// to gnutools::link.
8027void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8028 const InputInfo &Output,
8029 const InputInfoList &Inputs,
8030 const ArgList &Args,
8031 const char *LinkingOutput) const {
8032
8033 const toolchains::NaCl_TC& ToolChain =
8034 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8035 const Driver &D = ToolChain.getDriver();
8036 const bool IsStatic =
8037 !Args.hasArg(options::OPT_dynamic) &&
8038 !Args.hasArg(options::OPT_shared);
8039
8040 ArgStringList CmdArgs;
8041
8042 // Silence warning for "clang -g foo.o -o foo"
8043 Args.ClaimAllArgs(options::OPT_g_Group);
8044 // and "clang -emit-llvm foo.o -o foo"
8045 Args.ClaimAllArgs(options::OPT_emit_llvm);
8046 // and for "clang -w foo.o -o foo". Other warning options are already
8047 // handled somewhere else.
8048 Args.ClaimAllArgs(options::OPT_w);
8049
8050 if (!D.SysRoot.empty())
8051 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8052
8053 if (Args.hasArg(options::OPT_rdynamic))
8054 CmdArgs.push_back("-export-dynamic");
8055
8056 if (Args.hasArg(options::OPT_s))
8057 CmdArgs.push_back("-s");
8058
8059 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8060 // there is --build-id, which we do want.
8061 CmdArgs.push_back("--build-id");
8062
8063 if (!IsStatic)
8064 CmdArgs.push_back("--eh-frame-hdr");
8065
8066 CmdArgs.push_back("-m");
8067 if (ToolChain.getArch() == llvm::Triple::x86)
8068 CmdArgs.push_back("elf_i386_nacl");
8069 else if (ToolChain.getArch() == llvm::Triple::arm)
8070 CmdArgs.push_back("armelf_nacl");
8071 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8072 CmdArgs.push_back("elf_x86_64_nacl");
8073 else
8074 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8075 "Native Client";
8076
8077
8078 if (IsStatic)
8079 CmdArgs.push_back("-static");
8080 else if (Args.hasArg(options::OPT_shared))
8081 CmdArgs.push_back("-shared");
8082
8083 CmdArgs.push_back("-o");
8084 CmdArgs.push_back(Output.getFilename());
8085 if (!Args.hasArg(options::OPT_nostdlib) &&
8086 !Args.hasArg(options::OPT_nostartfiles)) {
8087 if (!Args.hasArg(options::OPT_shared))
8088 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8089 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8090
8091 const char *crtbegin;
8092 if (IsStatic)
8093 crtbegin = "crtbeginT.o";
8094 else if (Args.hasArg(options::OPT_shared))
8095 crtbegin = "crtbeginS.o";
8096 else
8097 crtbegin = "crtbegin.o";
8098 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8099 }
8100
8101 Args.AddAllArgs(CmdArgs, options::OPT_L);
8102 Args.AddAllArgs(CmdArgs, options::OPT_u);
8103
8104 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8105
8106 for (const auto &Path : Paths)
8107 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8108
8109 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8110 CmdArgs.push_back("--no-demangle");
8111
8112 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8113
8114 if (D.CCCIsCXX() &&
8115 !Args.hasArg(options::OPT_nostdlib) &&
8116 !Args.hasArg(options::OPT_nodefaultlibs)) {
8117 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8118 !IsStatic;
8119 if (OnlyLibstdcxxStatic)
8120 CmdArgs.push_back("-Bstatic");
8121 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8122 if (OnlyLibstdcxxStatic)
8123 CmdArgs.push_back("-Bdynamic");
8124 CmdArgs.push_back("-lm");
8125 }
8126
8127 if (!Args.hasArg(options::OPT_nostdlib)) {
8128 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8129 // Always use groups, since it has no effect on dynamic libraries.
8130 CmdArgs.push_back("--start-group");
8131 CmdArgs.push_back("-lc");
8132 // NaCl's libc++ currently requires libpthread, so just always include it
8133 // in the group for C++.
8134 if (Args.hasArg(options::OPT_pthread) ||
8135 Args.hasArg(options::OPT_pthreads) ||
8136 D.CCCIsCXX()) {
8137 CmdArgs.push_back("-lpthread");
8138 }
8139
8140 CmdArgs.push_back("-lgcc");
8141 CmdArgs.push_back("--as-needed");
8142 if (IsStatic)
8143 CmdArgs.push_back("-lgcc_eh");
8144 else
8145 CmdArgs.push_back("-lgcc_s");
8146 CmdArgs.push_back("--no-as-needed");
8147 CmdArgs.push_back("--end-group");
8148 }
8149
8150 if (!Args.hasArg(options::OPT_nostartfiles)) {
8151 const char *crtend;
8152 if (Args.hasArg(options::OPT_shared))
8153 crtend = "crtendS.o";
8154 else
8155 crtend = "crtend.o";
8156
8157 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8158 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8159 }
8160 }
8161
8162 C.addCommand(llvm::make_unique<Command>(JA, *this,
8163 ToolChain.Linker.c_str(), CmdArgs));
8164}
8165
8166
Chris Lattner3e2ee142010-07-07 16:01:42 +00008167void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008168 const InputInfo &Output,
8169 const InputInfoList &Inputs,
8170 const ArgList &Args,
8171 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008172 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008173 ArgStringList CmdArgs;
8174
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008175 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008176
8177 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008178 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008179
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008180 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008181 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008182
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008183 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008184 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008185}
8186
8187void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008188 const InputInfo &Output,
8189 const InputInfoList &Inputs,
8190 const ArgList &Args,
8191 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008192 const Driver &D = getToolChain().getDriver();
8193 ArgStringList CmdArgs;
8194
Daniel Dunbarb440f562010-08-02 02:38:21 +00008195 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008196 CmdArgs.push_back("-o");
8197 CmdArgs.push_back(Output.getFilename());
8198 } else {
8199 assert(Output.isNothing() && "Invalid output.");
8200 }
8201
8202 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008203 !Args.hasArg(options::OPT_nostartfiles)) {
8204 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8205 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8206 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8207 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8208 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008209
8210 Args.AddAllArgs(CmdArgs, options::OPT_L);
8211 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8212 Args.AddAllArgs(CmdArgs, options::OPT_e);
8213
Daniel Dunbar54423b22010-09-17 00:24:54 +00008214 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008215
Alexey Samsonov7811d192014-02-20 13:57:37 +00008216 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008217
Chris Lattner3e2ee142010-07-07 16:01:42 +00008218 if (!Args.hasArg(options::OPT_nostdlib) &&
8219 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008220 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008221 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008222 CmdArgs.push_back("-lm");
8223 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008224 }
8225
8226 if (!Args.hasArg(options::OPT_nostdlib) &&
8227 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008228 if (Args.hasArg(options::OPT_pthread))
8229 CmdArgs.push_back("-lpthread");
8230 CmdArgs.push_back("-lc");
8231 CmdArgs.push_back("-lCompilerRT-Generic");
8232 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8233 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008234 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008235 }
8236
Logan Chieneb9162f2014-06-26 14:23:45 +00008237 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008238 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008239}
8240
Daniel Dunbarcc912342009-05-02 18:28:39 +00008241/// DragonFly Tools
8242
8243// For now, DragonFly Assemble does just about the same as for
8244// FreeBSD, but this may change soon.
8245void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008246 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008247 const InputInfoList &Inputs,
8248 const ArgList &Args,
8249 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008250 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008251 ArgStringList CmdArgs;
8252
8253 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8254 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008255 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008256 CmdArgs.push_back("--32");
8257
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008258 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008259
8260 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008261 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008262
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008263 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008264 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008265
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008266 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008267 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008268}
8269
8270void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008271 const InputInfo &Output,
8272 const InputInfoList &Inputs,
8273 const ArgList &Args,
8274 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008275 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008276 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008277 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008278
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008279 if (!D.SysRoot.empty())
8280 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8281
John McCall65b8da02013-04-11 22:55:55 +00008282 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008283 if (Args.hasArg(options::OPT_static)) {
8284 CmdArgs.push_back("-Bstatic");
8285 } else {
John McCall65b8da02013-04-11 22:55:55 +00008286 if (Args.hasArg(options::OPT_rdynamic))
8287 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008288 if (Args.hasArg(options::OPT_shared))
8289 CmdArgs.push_back("-Bshareable");
8290 else {
8291 CmdArgs.push_back("-dynamic-linker");
8292 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8293 }
John McCall65b8da02013-04-11 22:55:55 +00008294 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008295 }
8296
8297 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8298 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008299 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008300 CmdArgs.push_back("-m");
8301 CmdArgs.push_back("elf_i386");
8302 }
8303
Daniel Dunbarb440f562010-08-02 02:38:21 +00008304 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008305 CmdArgs.push_back("-o");
8306 CmdArgs.push_back(Output.getFilename());
8307 } else {
8308 assert(Output.isNothing() && "Invalid output.");
8309 }
8310
8311 if (!Args.hasArg(options::OPT_nostdlib) &&
8312 !Args.hasArg(options::OPT_nostartfiles)) {
8313 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008314 if (Args.hasArg(options::OPT_pg))
8315 CmdArgs.push_back(Args.MakeArgString(
8316 getToolChain().GetFilePath("gcrt1.o")));
8317 else {
8318 if (Args.hasArg(options::OPT_pie))
8319 CmdArgs.push_back(Args.MakeArgString(
8320 getToolChain().GetFilePath("Scrt1.o")));
8321 else
8322 CmdArgs.push_back(Args.MakeArgString(
8323 getToolChain().GetFilePath("crt1.o")));
8324 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008325 }
John McCall65b8da02013-04-11 22:55:55 +00008326 CmdArgs.push_back(Args.MakeArgString(
8327 getToolChain().GetFilePath("crti.o")));
8328 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8329 CmdArgs.push_back(Args.MakeArgString(
8330 getToolChain().GetFilePath("crtbeginS.o")));
8331 else
8332 CmdArgs.push_back(Args.MakeArgString(
8333 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008334 }
8335
8336 Args.AddAllArgs(CmdArgs, options::OPT_L);
8337 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8338 Args.AddAllArgs(CmdArgs, options::OPT_e);
8339
Daniel Dunbar54423b22010-09-17 00:24:54 +00008340 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008341
8342 if (!Args.hasArg(options::OPT_nostdlib) &&
8343 !Args.hasArg(options::OPT_nodefaultlibs)) {
8344 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8345 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008346 if (UseGCC47)
8347 CmdArgs.push_back("-L/usr/lib/gcc47");
8348 else
8349 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008350
8351 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008352 if (UseGCC47) {
8353 CmdArgs.push_back("-rpath");
8354 CmdArgs.push_back("/usr/lib/gcc47");
8355 } else {
8356 CmdArgs.push_back("-rpath");
8357 CmdArgs.push_back("/usr/lib/gcc44");
8358 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008359 }
8360
Hans Wennborg70850d82013-07-18 20:29:38 +00008361 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008362 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008363 CmdArgs.push_back("-lm");
8364 }
8365
Daniel Dunbarcc912342009-05-02 18:28:39 +00008366 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008367 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008368
8369 if (!Args.hasArg(options::OPT_nolibc)) {
8370 CmdArgs.push_back("-lc");
8371 }
8372
John McCall65b8da02013-04-11 22:55:55 +00008373 if (UseGCC47) {
8374 if (Args.hasArg(options::OPT_static) ||
8375 Args.hasArg(options::OPT_static_libgcc)) {
8376 CmdArgs.push_back("-lgcc");
8377 CmdArgs.push_back("-lgcc_eh");
8378 } else {
8379 if (Args.hasArg(options::OPT_shared_libgcc)) {
8380 CmdArgs.push_back("-lgcc_pic");
8381 if (!Args.hasArg(options::OPT_shared))
8382 CmdArgs.push_back("-lgcc");
8383 } else {
8384 CmdArgs.push_back("-lgcc");
8385 CmdArgs.push_back("--as-needed");
8386 CmdArgs.push_back("-lgcc_pic");
8387 CmdArgs.push_back("--no-as-needed");
8388 }
8389 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008390 } else {
John McCall65b8da02013-04-11 22:55:55 +00008391 if (Args.hasArg(options::OPT_shared)) {
8392 CmdArgs.push_back("-lgcc_pic");
8393 } else {
8394 CmdArgs.push_back("-lgcc");
8395 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008396 }
8397 }
8398
8399 if (!Args.hasArg(options::OPT_nostdlib) &&
8400 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008401 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008402 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008403 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008404 else
8405 CmdArgs.push_back(Args.MakeArgString(
8406 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008407 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008408 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008409 }
8410
Alexey Samsonov7811d192014-02-20 13:57:37 +00008411 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008412
Logan Chieneb9162f2014-06-26 14:23:45 +00008413 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008414 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008415}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008416
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008417// Try to find Exe from a Visual Studio distribution. This first tries to find
8418// an installed copy of Visual Studio and, failing that, looks in the PATH,
8419// making sure that whatever executable that's found is not a same-named exe
8420// from clang itself to prevent clang from falling back to itself.
8421static std::string FindVisualStudioExecutable(const ToolChain &TC,
8422 const char *Exe,
8423 const char *ClangProgramPath) {
8424 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8425 std::string visualStudioBinDir;
8426 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8427 visualStudioBinDir)) {
8428 SmallString<128> FilePath(visualStudioBinDir);
8429 llvm::sys::path::append(FilePath, Exe);
8430 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8431 return FilePath.str();
8432 }
8433
8434 return Exe;
8435}
8436
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008437void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8438 const InputInfo &Output,
8439 const InputInfoList &Inputs,
8440 const ArgList &Args,
8441 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008442 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008443 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008444
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008445 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8446 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008447 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8448 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008449
8450 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008451 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008452 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008453
Zachary Turner10d75b22014-10-22 20:40:43 +00008454 if (!llvm::sys::Process::GetEnv("LIB")) {
8455 // If the VC environment hasn't been configured (perhaps because the user
8456 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008457 // the environment variable is set however, assume the user knows what
8458 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008459 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008460 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008461 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8462 SmallString<128> LibDir(VisualStudioDir);
8463 llvm::sys::path::append(LibDir, "VC", "lib");
8464 switch (MSVC.getArch()) {
8465 case llvm::Triple::x86:
8466 // x86 just puts the libraries directly in lib
8467 break;
8468 case llvm::Triple::x86_64:
8469 llvm::sys::path::append(LibDir, "amd64");
8470 break;
8471 case llvm::Triple::arm:
8472 llvm::sys::path::append(LibDir, "arm");
8473 break;
8474 default:
8475 break;
8476 }
8477 CmdArgs.push_back(
8478 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8479 }
8480
8481 std::string WindowsSdkLibPath;
8482 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8483 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8484 WindowsSdkLibPath.c_str()));
8485 }
8486
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008487 CmdArgs.push_back("-nologo");
8488
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008489 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008490 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008491
Hans Wennborge4c47f22015-03-04 23:16:21 +00008492 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8493 options::OPT__SLASH_LDd,
8494 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008495 if (DLL) {
8496 CmdArgs.push_back(Args.MakeArgString("-dll"));
8497
8498 SmallString<128> ImplibName(Output.getFilename());
8499 llvm::sys::path::replace_extension(ImplibName, "lib");
8500 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008501 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008502 }
8503
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008504 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008505 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008506 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008507 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008508 static const char *CompilerRTComponents[] = {
8509 "asan_dynamic",
8510 "asan_dynamic_runtime_thunk",
8511 };
8512 for (const auto &Component : CompilerRTComponents)
8513 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008514 // Make sure the dynamic runtime thunk is not optimized out at link time
8515 // to ensure proper SEH handling.
8516 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008517 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008518 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008519 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008520 static const char *CompilerRTComponents[] = {
8521 "asan",
8522 "asan_cxx",
8523 };
8524 for (const auto &Component : CompilerRTComponents)
8525 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008526 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008527 }
8528
Hans Wennborg2e274592013-08-13 23:38:57 +00008529 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008530
Reid Kleckner337188f2014-09-16 19:22:00 +00008531 // Add filenames, libraries, and other linker inputs.
8532 for (const auto &Input : Inputs) {
8533 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008534 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008535 continue;
8536 }
8537
8538 const Arg &A = Input.getInputArg();
8539
8540 // Render -l options differently for the MSVC linker.
8541 if (A.getOption().matches(options::OPT_l)) {
8542 StringRef Lib = A.getValue();
8543 const char *LinkLibArg;
8544 if (Lib.endswith(".lib"))
8545 LinkLibArg = Args.MakeArgString(Lib);
8546 else
8547 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8548 CmdArgs.push_back(LinkLibArg);
8549 continue;
8550 }
8551
8552 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8553 // or -L. Render it, even if MSVC doesn't understand it.
8554 A.renderAsInput(Args, CmdArgs);
8555 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008556
Zachary Turner719f58c2014-12-01 23:06:47 +00008557 // We need to special case some linker paths. In the case of lld, we need to
8558 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8559 // linker, we need to use a special search algorithm.
8560 llvm::SmallString<128> linkPath;
8561 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8562 if (Linker.equals_lower("lld"))
8563 Linker = "lld-link";
8564
8565 if (Linker.equals_lower("link")) {
8566 // If we're using the MSVC linker, it's not sufficient to just use link
8567 // from the program PATH, because other environments like GnuWin32 install
8568 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008569 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008570 C.getDriver().getClangProgramPath());
8571 } else {
8572 linkPath = Linker;
8573 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008574 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008575 }
8576
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008577 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008578 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008579}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008580
8581void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8582 const InputInfo &Output,
8583 const InputInfoList &Inputs,
8584 const ArgList &Args,
8585 const char *LinkingOutput) const {
8586 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8587}
8588
David Blaikiec11bf802014-09-04 16:04:28 +00008589std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8590 Compilation &C, const JobAction &JA, const InputInfo &Output,
8591 const InputInfoList &Inputs, const ArgList &Args,
8592 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008593 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008594 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008595 CmdArgs.push_back("/c"); // Compile only.
8596 CmdArgs.push_back("/W0"); // No warnings.
8597
8598 // The goal is to be able to invoke this tool correctly based on
8599 // any flag accepted by clang-cl.
8600
8601 // These are spelled the same way in clang and cl.exe,.
8602 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8603 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008604
8605 // Optimization level.
8606 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8607 if (A->getOption().getID() == options::OPT_O0) {
8608 CmdArgs.push_back("/Od");
8609 } else {
8610 StringRef OptLevel = A->getValue();
8611 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8612 A->render(Args, CmdArgs);
8613 else if (OptLevel == "3")
8614 CmdArgs.push_back("/Ox");
8615 }
8616 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008617
Nico Weber3f8dafb2015-03-12 19:37:10 +00008618 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008619 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8620
David Majnemerf6072342014-07-01 22:24:56 +00008621 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8622 /*default=*/false))
8623 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008624 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8625 options::OPT_fno_function_sections))
8626 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8627 ? "/Gy"
8628 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008629 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8630 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008631 CmdArgs.push_back(
8632 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008633 if (Args.hasArg(options::OPT_fsyntax_only))
8634 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008635 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8636 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008637
Nico Weber3f8dafb2015-03-12 19:37:10 +00008638 std::vector<std::string> Includes =
8639 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008640 for (const auto &Include : Includes)
8641 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008642
Hans Wennborg87cfa712013-09-19 20:32:16 +00008643 // Flags that can simply be passed through.
8644 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8645 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008646 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008647
8648 // The order of these flags is relevant, so pick the last one.
8649 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8650 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8651 A->render(Args, CmdArgs);
8652
8653
8654 // Input filename.
8655 assert(Inputs.size() == 1);
8656 const InputInfo &II = Inputs[0];
8657 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8658 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8659 if (II.isFilename())
8660 CmdArgs.push_back(II.getFilename());
8661 else
8662 II.getInputArg().renderAsInput(Args, CmdArgs);
8663
8664 // Output filename.
8665 assert(Output.getType() == types::TY_Object);
8666 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8667 Output.getFilename());
8668 CmdArgs.push_back(Fo);
8669
Hans Wennborg188382e2013-09-20 18:16:35 +00008670 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008671 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8672 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008673 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8674 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008675}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008676
8677
8678/// XCore Tools
8679// We pass assemble and link construction to the xcc tool.
8680
8681void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8682 const InputInfo &Output,
8683 const InputInfoList &Inputs,
8684 const ArgList &Args,
8685 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008686 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008687 ArgStringList CmdArgs;
8688
8689 CmdArgs.push_back("-o");
8690 CmdArgs.push_back(Output.getFilename());
8691
8692 CmdArgs.push_back("-c");
8693
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008694 if (Args.hasArg(options::OPT_v))
8695 CmdArgs.push_back("-v");
8696
Robert Lytton894d25c2014-05-02 09:33:25 +00008697 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8698 if (!A->getOption().matches(options::OPT_g0))
8699 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008700
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008701 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8702 false))
8703 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008704
8705 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8706 options::OPT_Xassembler);
8707
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008708 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008709 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008710
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008711 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008712 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008713}
8714
8715void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8716 const InputInfo &Output,
8717 const InputInfoList &Inputs,
8718 const ArgList &Args,
8719 const char *LinkingOutput) const {
8720 ArgStringList CmdArgs;
8721
8722 if (Output.isFilename()) {
8723 CmdArgs.push_back("-o");
8724 CmdArgs.push_back(Output.getFilename());
8725 } else {
8726 assert(Output.isNothing() && "Invalid output.");
8727 }
8728
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008729 if (Args.hasArg(options::OPT_v))
8730 CmdArgs.push_back("-v");
8731
David Majnemer8de68642014-12-05 08:11:58 +00008732 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008733 CmdArgs.push_back("-fexceptions");
8734
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008735 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8736
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008737 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008738 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008739}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008740
8741void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8742 const InputInfo &Output,
8743 const InputInfoList &Inputs,
8744 const ArgList &Args,
8745 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008746 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008747 const auto &TC =
8748 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8749 ArgStringList CmdArgs;
8750 const char *Exec;
8751
8752 switch (TC.getArch()) {
8753 default: llvm_unreachable("unsupported architecture");
8754 case llvm::Triple::arm:
8755 case llvm::Triple::thumb:
8756 break;
8757 case llvm::Triple::x86:
8758 CmdArgs.push_back("--32");
8759 break;
8760 case llvm::Triple::x86_64:
8761 CmdArgs.push_back("--64");
8762 break;
8763 }
8764
8765 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8766
8767 CmdArgs.push_back("-o");
8768 CmdArgs.push_back(Output.getFilename());
8769
8770 for (const auto &Input : Inputs)
8771 CmdArgs.push_back(Input.getFilename());
8772
8773 const std::string Assembler = TC.GetProgramPath("as");
8774 Exec = Args.MakeArgString(Assembler);
8775
8776 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8777}
8778
8779void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8780 const InputInfo &Output,
8781 const InputInfoList &Inputs,
8782 const ArgList &Args,
8783 const char *LinkingOutput) const {
8784 const auto &TC =
8785 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8786 const llvm::Triple &T = TC.getTriple();
8787 const Driver &D = TC.getDriver();
8788 SmallString<128> EntryPoint;
8789 ArgStringList CmdArgs;
8790 const char *Exec;
8791
8792 // Silence warning for "clang -g foo.o -o foo"
8793 Args.ClaimAllArgs(options::OPT_g_Group);
8794 // and "clang -emit-llvm foo.o -o foo"
8795 Args.ClaimAllArgs(options::OPT_emit_llvm);
8796 // and for "clang -w foo.o -o foo"
8797 Args.ClaimAllArgs(options::OPT_w);
8798 // Other warning options are already handled somewhere else.
8799
8800 if (!D.SysRoot.empty())
8801 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8802
8803 if (Args.hasArg(options::OPT_pie))
8804 CmdArgs.push_back("-pie");
8805 if (Args.hasArg(options::OPT_rdynamic))
8806 CmdArgs.push_back("-export-dynamic");
8807 if (Args.hasArg(options::OPT_s))
8808 CmdArgs.push_back("--strip-all");
8809
8810 CmdArgs.push_back("-m");
8811 switch (TC.getArch()) {
8812 default: llvm_unreachable("unsupported architecture");
8813 case llvm::Triple::arm:
8814 case llvm::Triple::thumb:
8815 // FIXME: this is incorrect for WinCE
8816 CmdArgs.push_back("thumb2pe");
8817 break;
8818 case llvm::Triple::x86:
8819 CmdArgs.push_back("i386pe");
8820 EntryPoint.append("_");
8821 break;
8822 case llvm::Triple::x86_64:
8823 CmdArgs.push_back("i386pep");
8824 break;
8825 }
8826
8827 if (Args.hasArg(options::OPT_shared)) {
8828 switch (T.getArch()) {
8829 default: llvm_unreachable("unsupported architecture");
8830 case llvm::Triple::arm:
8831 case llvm::Triple::thumb:
8832 case llvm::Triple::x86_64:
8833 EntryPoint.append("_DllMainCRTStartup");
8834 break;
8835 case llvm::Triple::x86:
8836 EntryPoint.append("_DllMainCRTStartup@12");
8837 break;
8838 }
8839
8840 CmdArgs.push_back("-shared");
8841 CmdArgs.push_back("-Bdynamic");
8842
8843 CmdArgs.push_back("--enable-auto-image-base");
8844
8845 CmdArgs.push_back("--entry");
8846 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8847 } else {
8848 EntryPoint.append("mainCRTStartup");
8849
8850 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8851 : "-Bdynamic");
8852
8853 if (!Args.hasArg(options::OPT_nostdlib) &&
8854 !Args.hasArg(options::OPT_nostartfiles)) {
8855 CmdArgs.push_back("--entry");
8856 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8857 }
8858
8859 // FIXME: handle subsystem
8860 }
8861
8862 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008863 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008864
8865 CmdArgs.push_back("-o");
8866 CmdArgs.push_back(Output.getFilename());
8867
8868 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8869 SmallString<261> ImpLib(Output.getFilename());
8870 llvm::sys::path::replace_extension(ImpLib, ".lib");
8871
8872 CmdArgs.push_back("--out-implib");
8873 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8874 }
8875
8876 if (!Args.hasArg(options::OPT_nostdlib) &&
8877 !Args.hasArg(options::OPT_nostartfiles)) {
8878 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8879 const char *CRTBegin;
8880
8881 CRTBegin =
8882 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8883 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8884 }
8885
8886 Args.AddAllArgs(CmdArgs, options::OPT_L);
8887
8888 const auto &Paths = TC.getFilePaths();
8889 for (const auto &Path : Paths)
8890 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8891
8892 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8893
8894 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8895 !Args.hasArg(options::OPT_nodefaultlibs)) {
8896 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8897 !Args.hasArg(options::OPT_static);
8898 if (StaticCXX)
8899 CmdArgs.push_back("-Bstatic");
8900 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8901 if (StaticCXX)
8902 CmdArgs.push_back("-Bdynamic");
8903 }
8904
8905 if (!Args.hasArg(options::OPT_nostdlib)) {
8906 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8907 // TODO handle /MT[d] /MD[d]
8908 CmdArgs.push_back("-lmsvcrt");
8909 AddRunTimeLibs(TC, D, CmdArgs, Args);
8910 }
8911 }
8912
8913 const std::string Linker = TC.GetProgramPath("ld");
8914 Exec = Args.MakeArgString(Linker);
8915
8916 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8917}