blob: 10837996a3ab35327630c3696bc60653d43cd726 [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) {
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000717 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000718 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.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000730
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000731 // 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 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000739
740 // 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) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002254 Args.hasArg(options::OPT_fcreate_profile) ||
2255 Args.hasArg(options::OPT_coverage)))
2256 return;
2257
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002258 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002259}
2260
Alexey Samsonov52550342014-09-15 19:58:40 +00002261static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2262 ArgStringList &CmdArgs, StringRef Sanitizer,
2263 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002264 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002265 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002266 if (!IsShared)
2267 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002268 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002269 if (!IsShared)
2270 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002271}
2272
Alexey Samsonov52550342014-09-15 19:58:40 +00002273// Tries to use a file with the list of dynamic symbols that need to be exported
2274// from the runtime library. Returns true if the file was found.
2275static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2276 ArgStringList &CmdArgs,
2277 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002278 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2279 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2280 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002281 return true;
2282 }
2283 return false;
2284}
2285
2286static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2287 ArgStringList &CmdArgs) {
2288 // Force linking against the system libraries sanitizers depends on
2289 // (see PR15823 why this is necessary).
2290 CmdArgs.push_back("--no-as-needed");
2291 CmdArgs.push_back("-lpthread");
2292 CmdArgs.push_back("-lrt");
2293 CmdArgs.push_back("-lm");
2294 // There's no libdl on FreeBSD.
2295 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2296 CmdArgs.push_back("-ldl");
2297}
2298
2299static void
2300collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2301 SmallVectorImpl<StringRef> &SharedRuntimes,
2302 SmallVectorImpl<StringRef> &StaticRuntimes,
2303 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2304 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2305 // Collect shared runtimes.
2306 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2307 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002308 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002309
Alexey Samsonov52550342014-09-15 19:58:40 +00002310 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002311 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002312 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2313 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002314 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002315 }
2316 if (SanArgs.needsAsanRt()) {
2317 if (SanArgs.needsSharedAsanRt()) {
2318 HelperStaticRuntimes.push_back("asan-preinit");
2319 } else {
2320 StaticRuntimes.push_back("asan");
2321 if (SanArgs.linkCXXRuntimes())
2322 StaticRuntimes.push_back("asan_cxx");
2323 }
2324 }
2325 if (SanArgs.needsDfsanRt())
2326 StaticRuntimes.push_back("dfsan");
2327 if (SanArgs.needsLsanRt())
2328 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002329 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002330 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002331 if (SanArgs.linkCXXRuntimes())
2332 StaticRuntimes.push_back("msan_cxx");
2333 }
2334 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002335 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002336 if (SanArgs.linkCXXRuntimes())
2337 StaticRuntimes.push_back("tsan_cxx");
2338 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002339 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002340 StaticRuntimes.push_back("ubsan_standalone");
2341 if (SanArgs.linkCXXRuntimes())
2342 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002343 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002344}
2345
Alexey Samsonov52550342014-09-15 19:58:40 +00002346// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2347// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2348static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002349 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002350 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2351 HelperStaticRuntimes;
2352 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2353 HelperStaticRuntimes);
2354 for (auto RT : SharedRuntimes)
2355 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2356 for (auto RT : HelperStaticRuntimes)
2357 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2358 bool AddExportDynamic = false;
2359 for (auto RT : StaticRuntimes) {
2360 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2361 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2362 }
2363 // If there is a static runtime with no dynamic list, force all the symbols
2364 // to be dynamic to be sure we export sanitizer interface functions.
2365 if (AddExportDynamic)
2366 CmdArgs.push_back("-export-dynamic");
2367 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002368}
2369
Reid Kleckner86ea7702015-02-04 23:45:07 +00002370static bool areOptimizationsEnabled(const ArgList &Args) {
2371 // Find the last -O arg and see if it is non-zero.
2372 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2373 return !A->getOption().matches(options::OPT_O0);
2374 // Defaults to -O0.
2375 return false;
2376}
2377
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002378static bool shouldUseFramePointerForTarget(const ArgList &Args,
2379 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002380 // XCore never wants frame pointers, regardless of OS.
2381 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002382 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002383 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002384
2385 if (Triple.isOSLinux()) {
2386 switch (Triple.getArch()) {
2387 // Don't use a frame pointer on linux if optimizing for certain targets.
2388 case llvm::Triple::mips64:
2389 case llvm::Triple::mips64el:
2390 case llvm::Triple::mips:
2391 case llvm::Triple::mipsel:
2392 case llvm::Triple::systemz:
2393 case llvm::Triple::x86:
2394 case llvm::Triple::x86_64:
2395 return !areOptimizationsEnabled(Args);
2396 default:
2397 return true;
2398 }
2399 }
2400
2401 if (Triple.isOSWindows()) {
2402 switch (Triple.getArch()) {
2403 case llvm::Triple::x86:
2404 return !areOptimizationsEnabled(Args);
2405 default:
2406 // All other supported Windows ISAs use xdata unwind information, so frame
2407 // pointers are not generally useful.
2408 return false;
2409 }
2410 }
2411
2412 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002413}
2414
Rafael Espindola224dd632011-12-14 21:02:23 +00002415static bool shouldUseFramePointer(const ArgList &Args,
2416 const llvm::Triple &Triple) {
2417 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2418 options::OPT_fomit_frame_pointer))
2419 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2420
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002421 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002422}
2423
Eric Christopherb7d97e92013-04-03 01:58:53 +00002424static bool shouldUseLeafFramePointer(const ArgList &Args,
2425 const llvm::Triple &Triple) {
2426 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2427 options::OPT_momit_leaf_frame_pointer))
2428 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2429
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002430 if (Triple.isPS4CPU())
2431 return false;
2432
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002433 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002434}
2435
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002436/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002437static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002438 SmallString<128> cwd;
2439 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002440 CmdArgs.push_back("-fdebug-compilation-dir");
2441 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002442 }
2443}
2444
Eric Christopherd3804002013-02-22 20:12:52 +00002445static const char *SplitDebugName(const ArgList &Args,
2446 const InputInfoList &Inputs) {
2447 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2448 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2449 SmallString<128> T(FinalOutput->getValue());
2450 llvm::sys::path::replace_extension(T, "dwo");
2451 return Args.MakeArgString(T);
2452 } else {
2453 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002454 SmallString<128> T(
2455 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002456 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2457 llvm::sys::path::replace_extension(F, "dwo");
2458 T += F;
2459 return Args.MakeArgString(F);
2460 }
2461}
2462
2463static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2464 const Tool &T, const JobAction &JA,
2465 const ArgList &Args, const InputInfo &Output,
2466 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002467 ArgStringList ExtractArgs;
2468 ExtractArgs.push_back("--extract-dwo");
2469
2470 ArgStringList StripArgs;
2471 StripArgs.push_back("--strip-dwo");
2472
2473 // Grabbing the output of the earlier compile step.
2474 StripArgs.push_back(Output.getFilename());
2475 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002476 ExtractArgs.push_back(OutFile);
2477
2478 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002479 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002480
2481 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002482 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002483
2484 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002485 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002486}
2487
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002488/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002489/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2490static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002491 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002492 if (A->getOption().matches(options::OPT_O4) ||
2493 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002494 return true;
2495
2496 if (A->getOption().matches(options::OPT_O0))
2497 return false;
2498
2499 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2500
Rafael Espindola91780de2013-08-26 14:05:41 +00002501 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002502 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002503 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002504 return true;
2505
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002506 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002507 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002508 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002509
2510 unsigned OptLevel = 0;
2511 if (S.getAsInteger(10, OptLevel))
2512 return false;
2513
2514 return OptLevel > 1;
2515 }
2516
2517 return false;
2518}
2519
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002520/// Add -x lang to \p CmdArgs for \p Input.
2521static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2522 ArgStringList &CmdArgs) {
2523 // When using -verify-pch, we don't want to provide the type
2524 // 'precompiled-header' if it was inferred from the file extension
2525 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2526 return;
2527
2528 CmdArgs.push_back("-x");
2529 if (Args.hasArg(options::OPT_rewrite_objc))
2530 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2531 else
2532 CmdArgs.push_back(types::getTypeName(Input.getType()));
2533}
2534
David Majnemerc371ff02015-03-22 08:39:22 +00002535static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002536 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002537 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002538
2539 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002540 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002541
2542 unsigned Build = 0, Factor = 1;
2543 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2544 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002545 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002546}
2547
Rafael Espindola577637a2015-01-03 00:06:04 +00002548// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002549// options that build systems might add but are unused when assembling or only
2550// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002551static void claimNoWarnArgs(const ArgList &Args) {
2552 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002553 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002554 Args.ClaimAllArgs(options::OPT_flto);
2555 Args.ClaimAllArgs(options::OPT_fno_lto);
2556}
2557
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002558static void appendUserToPath(SmallVectorImpl<char> &Result) {
2559#ifdef LLVM_ON_UNIX
2560 const char *Username = getenv("LOGNAME");
2561#else
2562 const char *Username = getenv("USERNAME");
2563#endif
2564 if (Username) {
2565 // Validate that LoginName can be used in a path, and get its length.
2566 size_t Len = 0;
2567 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002568 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002569 Username = nullptr;
2570 break;
2571 }
2572 }
2573
2574 if (Username && Len > 0) {
2575 Result.append(Username, Username + Len);
2576 return;
2577 }
2578 }
2579
2580 // Fallback to user id.
2581#ifdef LLVM_ON_UNIX
2582 std::string UID = llvm::utostr(getuid());
2583#else
2584 // FIXME: Windows seems to have an 'SID' that might work.
2585 std::string UID = "9999";
2586#endif
2587 Result.append(UID.begin(), UID.end());
2588}
2589
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002590void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002591 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002592 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002593 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002594 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002595 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2596 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002597 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002598 ArgStringList CmdArgs;
2599
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002600 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002601 bool IsWindowsCygnus =
2602 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002603 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2604
Daniel Dunbare521a892009-03-31 20:53:55 +00002605 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2606
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002607 // Invoke ourselves in -cc1 mode.
2608 //
2609 // FIXME: Implement custom jobs for internal actions.
2610 CmdArgs.push_back("-cc1");
2611
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002612 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002613 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002614 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002615 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002616
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002617 const llvm::Triple TT(TripleStr);
2618 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2619 TT.getArch() == llvm::Triple::thumb)) {
2620 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2621 unsigned Version;
2622 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2623 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002624 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2625 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002626 }
2627
Tim Northover336f1892014-03-29 13:16:12 +00002628 // Push all default warning arguments that are specific to
2629 // the given target. These come before user provided warning options
2630 // are provided.
2631 getToolChain().addClangWarningOptions(CmdArgs);
2632
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002633 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002634 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002635
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002636 if (isa<AnalyzeJobAction>(JA)) {
2637 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2638 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002639 } else if (isa<MigrateJobAction>(JA)) {
2640 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002641 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002642 if (Output.getType() == types::TY_Dependencies)
2643 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002644 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002645 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002646 if (Args.hasArg(options::OPT_rewrite_objc) &&
2647 !Args.hasArg(options::OPT_g_Group))
2648 CmdArgs.push_back("-P");
2649 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002650 } else if (isa<AssembleJobAction>(JA)) {
2651 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002652
David Blaikie9260ed62013-07-25 21:19:01 +00002653 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002654
2655 // Also ignore explicit -force_cpusubtype_ALL option.
2656 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002657 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002658 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002659 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002660
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002661 if (JA.getType() == types::TY_Nothing)
2662 CmdArgs.push_back("-fsyntax-only");
2663 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002664 CmdArgs.push_back("-emit-pch");
2665 else
2666 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002667 } else if (isa<VerifyPCHJobAction>(JA)) {
2668 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002669 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002670 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2671 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002672
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002673 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002674 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002675 } else if (JA.getType() == types::TY_LLVM_IR ||
2676 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002677 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002678 } else if (JA.getType() == types::TY_LLVM_BC ||
2679 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002680 CmdArgs.push_back("-emit-llvm-bc");
2681 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002682 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002683 } else if (JA.getType() == types::TY_AST) {
2684 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002685 } else if (JA.getType() == types::TY_ModuleFile) {
2686 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002687 } else if (JA.getType() == types::TY_RewrittenObjC) {
2688 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002689 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002690 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2691 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002692 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002693 } else {
2694 assert(JA.getType() == types::TY_PP_Asm &&
2695 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002696 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002697
2698 // Preserve use-list order by default when emitting bitcode, so that
2699 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2700 // same result as running passes here. For LTO, we don't need to preserve
2701 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002702 if (JA.getType() == types::TY_LLVM_BC)
2703 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002704 }
2705
Justin Bognera88f0122014-06-20 22:59:50 +00002706 // We normally speed up the clang process a bit by skipping destructors at
2707 // exit, but when we're generating diagnostics we can rely on some of the
2708 // cleanup.
2709 if (!C.isForDiagnostics())
2710 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002711
John McCallbb79b5f2010-02-13 03:50:24 +00002712 // Disable the verification pass in -asserts builds.
2713#ifdef NDEBUG
2714 CmdArgs.push_back("-disable-llvm-verifier");
2715#endif
2716
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002717 // Set the main file name, so that debug info works even with
2718 // -save-temps.
2719 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002720 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002721
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002722 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002723 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002724 if (Args.hasArg(options::OPT_static))
2725 CmdArgs.push_back("-static-define");
2726
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002727 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002728 // Enable region store model by default.
2729 CmdArgs.push_back("-analyzer-store=region");
2730
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002731 // Treat blocks as analysis entry points.
2732 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2733
Ted Kremenek49c79792011-03-24 00:28:47 +00002734 CmdArgs.push_back("-analyzer-eagerly-assume");
2735
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002736 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002737 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002738 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002739
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002740 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002741 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002742
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002743 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002744 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002745
2746 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002747
Jordan Rose10ad0812013-04-05 17:55:07 +00002748 if (types::isCXX(Inputs[0].getType()))
2749 CmdArgs.push_back("-analyzer-checker=cplusplus");
2750
Nico Webere8e53112014-05-11 01:04:02 +00002751 // Enable the following experimental checkers for testing.
2752 CmdArgs.push_back(
2753 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002754 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2755 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2756 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2757 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2758 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002759 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002760
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002761 // Set the output format. The default is plist, for (lame) historical
2762 // reasons.
2763 CmdArgs.push_back("-analyzer-output");
2764 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002765 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002766 else
2767 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002768
Ted Kremenekfe449a22010-03-22 22:32:05 +00002769 // Disable the presentation of standard compiler warnings when
2770 // using --analyze. We only want to show static analyzer diagnostics
2771 // or frontend errors.
2772 CmdArgs.push_back("-w");
2773
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002774 // Add -Xanalyzer arguments when running as analyzer.
2775 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002776 }
2777
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002778 CheckCodeGenerationOptions(D, Args);
2779
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002780 bool PIE = getToolChain().isPIEDefault();
2781 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002782 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002783
Alexey Bataev40e75222014-01-28 06:30:35 +00002784 // Android-specific defaults for PIC/PIE
2785 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2786 switch (getToolChain().getTriple().getArch()) {
2787 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002788 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002789 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002790 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002791 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002792 case llvm::Triple::mips:
2793 case llvm::Triple::mipsel:
2794 case llvm::Triple::mips64:
2795 case llvm::Triple::mips64el:
2796 PIC = true; // "-fpic"
2797 break;
2798
2799 case llvm::Triple::x86:
2800 case llvm::Triple::x86_64:
2801 PIC = true; // "-fPIC"
2802 IsPICLevelTwo = true;
2803 break;
2804
2805 default:
2806 break;
2807 }
2808 }
2809
Brad Smith5b05db82014-06-24 19:51:29 +00002810 // OpenBSD-specific defaults for PIE
2811 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2812 switch (getToolChain().getTriple().getArch()) {
2813 case llvm::Triple::mips64:
2814 case llvm::Triple::mips64el:
2815 case llvm::Triple::sparc:
2816 case llvm::Triple::x86:
2817 case llvm::Triple::x86_64:
2818 IsPICLevelTwo = false; // "-fpie"
2819 break;
2820
2821 case llvm::Triple::ppc:
2822 case llvm::Triple::sparcv9:
2823 IsPICLevelTwo = true; // "-fPIE"
2824 break;
2825
2826 default:
2827 break;
2828 }
2829 }
2830
Alexey Samsonov090301e2013-04-09 12:28:19 +00002831 // For the PIC and PIE flag options, this logic is different from the
2832 // legacy logic in very old versions of GCC, as that logic was just
2833 // a bug no one had ever fixed. This logic is both more rational and
2834 // consistent with GCC's new logic now that the bugs are fixed. The last
2835 // argument relating to either PIC or PIE wins, and no other argument is
2836 // used. If the last argument is any flavor of the '-fno-...' arguments,
2837 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2838 // at the same level.
2839 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2840 options::OPT_fpic, options::OPT_fno_pic,
2841 options::OPT_fPIE, options::OPT_fno_PIE,
2842 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002843 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2844 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002845 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002846 if (LastPICArg) {
2847 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002848 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2849 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2850 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2851 PIC = PIE || O.matches(options::OPT_fPIC) ||
2852 O.matches(options::OPT_fpic);
2853 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2854 O.matches(options::OPT_fPIC);
2855 } else {
2856 PIE = PIC = false;
2857 }
2858 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002859 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002860
Nick Lewycky609dd662013-10-11 03:33:53 +00002861 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002862 // specified while enabling PIC enabled level 1 PIC, just force it back to
2863 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2864 // informal testing).
2865 if (PIC && getToolChain().getTriple().isOSDarwin())
2866 IsPICLevelTwo |= getToolChain().isPICDefault();
2867
Chandler Carruthc0c04552012-04-08 16:40:35 +00002868 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2869 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002870 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002871 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002872 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002873 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002874 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002875
Chandler Carruth76a943b2012-11-19 03:52:03 +00002876 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2877 // This is a very special mode. It trumps the other modes, almost no one
2878 // uses it, and it isn't even valid on any OS but Darwin.
2879 if (!getToolChain().getTriple().isOSDarwin())
2880 D.Diag(diag::err_drv_unsupported_opt_for_target)
2881 << A->getSpelling() << getToolChain().getTriple().str();
2882
2883 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2884
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002885 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002886 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002887
Chandler Carruth76a943b2012-11-19 03:52:03 +00002888 // Only a forced PIC mode can cause the actual compile to have PIC defines
2889 // etc., no flags are sufficient. This behavior was selected to closely
2890 // match that of llvm-gcc and Apple GCC before that.
2891 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2892 CmdArgs.push_back("-pic-level");
2893 CmdArgs.push_back("2");
2894 }
2895 } else {
2896 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2897 // handled in Clang's IRGen by the -pie-level flag.
2898 CmdArgs.push_back("-mrelocation-model");
2899 CmdArgs.push_back(PIC ? "pic" : "static");
2900
2901 if (PIC) {
2902 CmdArgs.push_back("-pic-level");
2903 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2904 if (PIE) {
2905 CmdArgs.push_back("-pie-level");
2906 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2907 }
2908 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002909 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002910
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002911 CmdArgs.push_back("-mthread-model");
2912 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2913 CmdArgs.push_back(A->getValue());
2914 else
2915 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2916
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002917 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2918
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002919 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2920 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002921 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002922
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002923 // LLVM Code Generator Options.
2924
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002925 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2926 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2927 for (arg_iterator
2928 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2929 options::OPT_frewrite_map_file_EQ),
2930 MFE = Args.filtered_end();
2931 MFI != MFE; ++MFI) {
2932 CmdArgs.push_back("-frewrite-map-file");
2933 CmdArgs.push_back((*MFI)->getValue());
2934 (*MFI)->claim();
2935 }
2936 }
2937
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002938 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2939 StringRef v = A->getValue();
2940 CmdArgs.push_back("-mllvm");
2941 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2942 A->claim();
2943 }
2944
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002945 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2946 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002947 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002948 }
2949
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002950 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2951 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002952 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002953 D.Diag(diag::err_drv_unsupported_opt_for_target)
2954 << A->getSpelling() << getToolChain().getTriple().str();
2955 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2956 CmdArgs.push_back("-fpcc-struct-return");
2957 } else {
2958 assert(A->getOption().matches(options::OPT_freg_struct_return));
2959 CmdArgs.push_back("-freg-struct-return");
2960 }
2961 }
2962
Roman Divacky65b88cd2011-03-01 17:40:53 +00002963 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2964 CmdArgs.push_back("-mrtd");
2965
Rafael Espindola224dd632011-12-14 21:02:23 +00002966 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002967 CmdArgs.push_back("-mdisable-fp-elim");
2968 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2969 options::OPT_fno_zero_initialized_in_bss))
2970 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002971
2972 bool OFastEnabled = isOptimizationLevelFast(Args);
2973 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2974 // enabled. This alias option is being used to simplify the hasFlag logic.
2975 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2976 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002977 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2978 // doesn't do any TBAA.
2979 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002980 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002981 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002982 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002983 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2984 options::OPT_fno_struct_path_tbaa))
2985 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002986 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2987 false))
2988 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002989 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2990 options::OPT_fno_optimize_sibling_calls))
2991 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002992
Eric Christopher006208c2013-04-04 06:29:47 +00002993 // Handle segmented stacks.
2994 if (Args.hasArg(options::OPT_fsplit_stack))
2995 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002996
2997 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2998 // This alias option is being used to simplify the getLastArg logic.
2999 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3000 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003001
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003002 // Handle various floating point optimization flags, mapping them to the
3003 // appropriate LLVM code generation flags. The pattern for all of these is to
3004 // default off the codegen optimizations, and if any flag enables them and no
3005 // flag disables them after the flag enabling them, enable the codegen
3006 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003007 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003008 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003009 options::OPT_ffinite_math_only,
3010 options::OPT_fno_finite_math_only,
3011 options::OPT_fhonor_infinities,
3012 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003013 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3014 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003015 A->getOption().getID() != options::OPT_fhonor_infinities)
3016 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003017 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003018 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003019 options::OPT_ffinite_math_only,
3020 options::OPT_fno_finite_math_only,
3021 options::OPT_fhonor_nans,
3022 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003023 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3024 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003025 A->getOption().getID() != options::OPT_fhonor_nans)
3026 CmdArgs.push_back("-menable-no-nans");
3027
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003028 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3029 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003030 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003031 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003032 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003033 options::OPT_fno_math_errno)) {
3034 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3035 // However, turning *off* -ffast_math merely restores the toolchain default
3036 // (which may be false).
3037 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3038 A->getOption().getID() == options::OPT_ffast_math ||
3039 A->getOption().getID() == options::OPT_Ofast)
3040 MathErrno = false;
3041 else if (A->getOption().getID() == options::OPT_fmath_errno)
3042 MathErrno = true;
3043 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003044 if (MathErrno)
3045 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003046
3047 // There are several flags which require disabling very specific
3048 // optimizations. Any of these being disabled forces us to turn off the
3049 // entire set of LLVM optimizations, so collect them through all the flag
3050 // madness.
3051 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003052 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003053 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003054 options::OPT_funsafe_math_optimizations,
3055 options::OPT_fno_unsafe_math_optimizations,
3056 options::OPT_fassociative_math,
3057 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003058 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3059 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003060 A->getOption().getID() != options::OPT_fno_associative_math)
3061 AssociativeMath = true;
3062 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003063 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003064 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003065 options::OPT_funsafe_math_optimizations,
3066 options::OPT_fno_unsafe_math_optimizations,
3067 options::OPT_freciprocal_math,
3068 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003069 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3070 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003071 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3072 ReciprocalMath = true;
3073 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003074 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003075 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003076 options::OPT_funsafe_math_optimizations,
3077 options::OPT_fno_unsafe_math_optimizations,
3078 options::OPT_fsigned_zeros,
3079 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003080 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3081 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003082 A->getOption().getID() != options::OPT_fsigned_zeros)
3083 SignedZeros = false;
3084 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003085 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003086 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003087 options::OPT_funsafe_math_optimizations,
3088 options::OPT_fno_unsafe_math_optimizations,
3089 options::OPT_ftrapping_math,
3090 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003091 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3092 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003093 A->getOption().getID() != options::OPT_ftrapping_math)
3094 TrappingMath = false;
3095 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3096 !TrappingMath)
3097 CmdArgs.push_back("-menable-unsafe-fp-math");
3098
Sanjay Patel76c9e092015-01-23 16:40:50 +00003099 if (!SignedZeros)
3100 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003101
Sanjay Patel359b1052015-04-09 15:03:23 +00003102 if (ReciprocalMath)
3103 CmdArgs.push_back("-freciprocal-math");
3104
Lang Hamesaa53b932012-07-06 00:59:19 +00003105 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003106 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003107 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003108 options::OPT_ffp_contract)) {
3109 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003110 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003111 if (Val == "fast" || Val == "on" || Val == "off") {
3112 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3113 } else {
3114 D.Diag(diag::err_drv_unsupported_option_argument)
3115 << A->getOption().getName() << Val;
3116 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003117 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3118 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003119 // If fast-math is set then set the fp-contract mode to fast.
3120 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3121 }
3122 }
3123
Bob Wilson6a039162012-07-19 03:52:53 +00003124 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3125 // and if we find them, tell the frontend to provide the appropriate
3126 // preprocessor macros. This is distinct from enabling any optimizations as
3127 // these options induce language changes which must survive serialization
3128 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003129 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3130 options::OPT_fno_fast_math))
3131 if (!A->getOption().matches(options::OPT_fno_fast_math))
3132 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003133 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3134 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003135 if (A->getOption().matches(options::OPT_ffinite_math_only))
3136 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003137
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003138 // Decide whether to use verbose asm. Verbose assembly is the default on
3139 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003140 bool IsIntegratedAssemblerDefault =
3141 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003142 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003143 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003144 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003145 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003146
Rafael Espindola298059a2015-04-06 04:36:45 +00003147 bool UsingIntegratedAssembler =
3148 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3149 IsIntegratedAssemblerDefault);
3150 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003151 CmdArgs.push_back("-no-integrated-as");
3152
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003153 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3154 CmdArgs.push_back("-mdebug-pass");
3155 CmdArgs.push_back("Structure");
3156 }
3157 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3158 CmdArgs.push_back("-mdebug-pass");
3159 CmdArgs.push_back("Arguments");
3160 }
3161
John McCall8517abc2010-02-19 02:45:38 +00003162 // Enable -mconstructor-aliases except on darwin, where we have to
3163 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003164 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003165 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003166
John McCall7ef5cb32011-03-18 02:56:14 +00003167 // Darwin's kernel doesn't support guard variables; just die if we
3168 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003169 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003170 CmdArgs.push_back("-fforbid-guard-variables");
3171
Douglas Gregordbe39272011-02-01 15:15:22 +00003172 if (Args.hasArg(options::OPT_mms_bitfields)) {
3173 CmdArgs.push_back("-mms-bitfields");
3174 }
John McCall8517abc2010-02-19 02:45:38 +00003175
Daniel Dunbar306945d2009-09-16 06:17:29 +00003176 // This is a coarse approximation of what llvm-gcc actually does, both
3177 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3178 // complicated ways.
3179 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003180 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3181 options::OPT_fno_asynchronous_unwind_tables,
3182 (getToolChain().IsUnwindTablesDefault() ||
3183 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3184 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003185 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3186 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003187 CmdArgs.push_back("-munwind-tables");
3188
Chandler Carruth05fb5852012-11-21 23:40:23 +00003189 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003190
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003191 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3192 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003193 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003194 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003195
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003196 // FIXME: Handle -mtune=.
3197 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003198
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003199 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003200 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003201 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003202 }
3203
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003204 // Add the target cpu
3205 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3206 llvm::Triple ETriple(ETripleStr);
3207 std::string CPU = getCPUName(Args, ETriple);
3208 if (!CPU.empty()) {
3209 CmdArgs.push_back("-target-cpu");
3210 CmdArgs.push_back(Args.MakeArgString(CPU));
3211 }
3212
Rafael Espindolaeb265472013-08-21 21:59:03 +00003213 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3214 CmdArgs.push_back("-mfpmath");
3215 CmdArgs.push_back(A->getValue());
3216 }
3217
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003218 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003219 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003220
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003221 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003222 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003223 default:
3224 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003225
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003226 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003227 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003228 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003229 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003230 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003231 break;
3232
Tim Northover573cbee2014-05-24 12:52:07 +00003233 case llvm::Triple::aarch64:
3234 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003235 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003236 break;
3237
Eric Christopher0b26a612010-03-02 02:41:08 +00003238 case llvm::Triple::mips:
3239 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003240 case llvm::Triple::mips64:
3241 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003242 AddMIPSTargetArgs(Args, CmdArgs);
3243 break;
3244
Ulrich Weigand8afad612014-07-28 13:17:52 +00003245 case llvm::Triple::ppc:
3246 case llvm::Triple::ppc64:
3247 case llvm::Triple::ppc64le:
3248 AddPPCTargetArgs(Args, CmdArgs);
3249 break;
3250
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003251 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003252 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003253 AddSparcTargetArgs(Args, CmdArgs);
3254 break;
3255
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003256 case llvm::Triple::x86:
3257 case llvm::Triple::x86_64:
3258 AddX86TargetArgs(Args, CmdArgs);
3259 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003260
3261 case llvm::Triple::hexagon:
3262 AddHexagonTargetArgs(Args, CmdArgs);
3263 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003264 }
3265
Hans Wennborg75958c42013-08-08 00:17:41 +00003266 // Add clang-cl arguments.
3267 if (getToolChain().getDriver().IsCLMode())
3268 AddClangCLArgs(Args, CmdArgs);
3269
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003270 // Pass the linker version in use.
3271 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3272 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003273 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003274 }
3275
Eric Christopherb7d97e92013-04-03 01:58:53 +00003276 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003277 CmdArgs.push_back("-momit-leaf-frame-pointer");
3278
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003279 // Explicitly error on some things we know we don't support and can't just
3280 // ignore.
3281 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003282 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3283 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003284 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003285 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003286 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003287 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3288 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003289 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003290 << Unsupported->getOption().getName();
3291 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003292 }
3293
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003294 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003295 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003296 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003297 CmdArgs.push_back("-header-include-file");
3298 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3299 D.CCPrintHeadersFilename : "-");
3300 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003301 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003302 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003303
Chad Rosierbe10f982011-08-02 17:58:04 +00003304 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003305 CmdArgs.push_back("-diagnostic-log-file");
3306 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3307 D.CCLogDiagnosticsFilename : "-");
3308 }
3309
Manman Ren17bdb0f2013-11-20 20:22:14 +00003310 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3311 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003312 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003313 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003314 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3315 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003316 // FIXME: we should support specifying dwarf version with
3317 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003318 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003319 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003320 const llvm::Triple &Triple = getToolChain().getTriple();
3321 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003322 Triple.getOS() == llvm::Triple::FreeBSD ||
3323 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003324 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003325 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003326 CmdArgs.push_back("-gdwarf-2");
3327 else if (A->getOption().matches(options::OPT_gdwarf_3))
3328 CmdArgs.push_back("-gdwarf-3");
3329 else if (A->getOption().matches(options::OPT_gdwarf_4))
3330 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003331 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003332 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003333 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003334 const llvm::Triple &Triple = getToolChain().getTriple();
3335 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003336 Triple.getOS() == llvm::Triple::FreeBSD ||
3337 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003338 CmdArgs.push_back("-gdwarf-2");
3339 else
3340 CmdArgs.push_back("-g");
3341 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003342 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003343
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003344 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3345 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003346 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3347 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003348 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003349
Eric Christopher138c32b2013-09-13 22:37:55 +00003350 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003351 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3352 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003353 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003354 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003355 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003356 CmdArgs.push_back("-g");
3357 CmdArgs.push_back("-backend-option");
3358 CmdArgs.push_back("-split-dwarf=Enable");
3359 }
3360
Eric Christopher138c32b2013-09-13 22:37:55 +00003361 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3362 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3363 CmdArgs.push_back("-backend-option");
3364 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3365 }
Eric Christophereec89c22013-06-18 00:03:50 +00003366
Eric Christopher0d403d22014-02-14 01:27:03 +00003367 // -gdwarf-aranges turns on the emission of the aranges section in the
3368 // backend.
3369 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3370 CmdArgs.push_back("-backend-option");
3371 CmdArgs.push_back("-generate-arange-section");
3372 }
3373
David Blaikief36d9ba2014-01-27 18:52:43 +00003374 if (Args.hasFlag(options::OPT_fdebug_types_section,
3375 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003376 CmdArgs.push_back("-backend-option");
3377 CmdArgs.push_back("-generate-type-units");
3378 }
Eric Christophereec89c22013-06-18 00:03:50 +00003379
Ed Schouten6e576152015-03-26 17:50:28 +00003380 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3381 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3382
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003383 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003384 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003385 CmdArgs.push_back("-ffunction-sections");
3386 }
3387
3388 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003389 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003390 CmdArgs.push_back("-fdata-sections");
3391 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003392
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003393 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003394 options::OPT_fno_unique_section_names,
3395 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003396 CmdArgs.push_back("-fno-unique-section-names");
3397
Chris Lattner3c77a352010-06-22 00:03:40 +00003398 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3399
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003400 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3401 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3402 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3403 D.Diag(diag::err_drv_argument_not_allowed_with)
3404 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3405
3406 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3407
3408 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3409 A->render(Args, CmdArgs);
3410 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3411 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3412
Nick Lewycky207bce32011-04-21 23:44:07 +00003413 if (Args.hasArg(options::OPT_ftest_coverage) ||
3414 Args.hasArg(options::OPT_coverage))
3415 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003416 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3417 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003418 Args.hasArg(options::OPT_coverage))
3419 CmdArgs.push_back("-femit-coverage-data");
3420
Alex Lorenzee024992014-08-04 18:41:51 +00003421 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3422 !Args.hasArg(options::OPT_fprofile_instr_generate))
3423 D.Diag(diag::err_drv_argument_only_allowed_with)
3424 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3425
3426 if (Args.hasArg(options::OPT_fcoverage_mapping))
3427 CmdArgs.push_back("-fcoverage-mapping");
3428
Nick Lewycky480cb992011-05-04 20:46:58 +00003429 if (C.getArgs().hasArg(options::OPT_c) ||
3430 C.getArgs().hasArg(options::OPT_S)) {
3431 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003432 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003433 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003434 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003435 CoverageFilename = FinalOutput->getValue();
3436 } else {
3437 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3438 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003439 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003440 SmallString<128> Pwd;
3441 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003442 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003443 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003444 }
3445 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003446 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003447 }
3448 }
3449
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003450 // Pass options for controlling the default header search paths.
3451 if (Args.hasArg(options::OPT_nostdinc)) {
3452 CmdArgs.push_back("-nostdsysteminc");
3453 CmdArgs.push_back("-nobuiltininc");
3454 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003455 if (Args.hasArg(options::OPT_nostdlibinc))
3456 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003457 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3458 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3459 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003460
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003461 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003462 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003463 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003464
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003465 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3466
Ted Kremenekf7639e12012-03-06 20:06:33 +00003467 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003468 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003469 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003470 options::OPT_ccc_arcmt_modify,
3471 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003472 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003473 switch (A->getOption().getID()) {
3474 default:
3475 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003476 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003477 CmdArgs.push_back("-arcmt-check");
3478 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003479 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003480 CmdArgs.push_back("-arcmt-modify");
3481 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003482 case options::OPT_ccc_arcmt_migrate:
3483 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003484 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003485 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003486
3487 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3488 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003489 break;
John McCalld70fb982011-06-15 23:25:17 +00003490 }
3491 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003492 } else {
3493 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3494 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3495 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003496 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003497
Ted Kremenekf7639e12012-03-06 20:06:33 +00003498 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3499 if (ARCMTEnabled) {
3500 D.Diag(diag::err_drv_argument_not_allowed_with)
3501 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3502 }
3503 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003504 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003505
3506 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003507 options::OPT_objcmt_migrate_subscripting,
3508 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003509 // None specified, means enable them all.
3510 CmdArgs.push_back("-objcmt-migrate-literals");
3511 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003512 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003513 } else {
3514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003517 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003518 } else {
3519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3523 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3524 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3528 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3529 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003533 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003534 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003535 }
3536
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003537 // Add preprocessing options like -I, -D, etc. if we are using the
3538 // preprocessor.
3539 //
3540 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003541 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003542 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003543
Rafael Espindolaa7431922011-07-21 23:40:37 +00003544 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3545 // that "The compiler can only warn and ignore the option if not recognized".
3546 // When building with ccache, it will pass -D options to clang even on
3547 // preprocessed inputs and configure concludes that -fPIC is not supported.
3548 Args.ClaimAllArgs(options::OPT_D);
3549
Alp Toker7874bdc2013-11-15 20:40:58 +00003550 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003551 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3552 if (A->getOption().matches(options::OPT_O4)) {
3553 CmdArgs.push_back("-O3");
3554 D.Diag(diag::warn_O4_is_O3);
3555 } else {
3556 A->render(Args, CmdArgs);
3557 }
3558 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003559
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003560 // Warn about ignored options to clang.
3561 for (arg_iterator it = Args.filtered_begin(
3562 options::OPT_clang_ignored_gcc_optimization_f_Group),
3563 ie = Args.filtered_end(); it != ie; ++it) {
3564 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3565 }
3566
Rafael Espindola577637a2015-01-03 00:06:04 +00003567 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003568
Richard Smith3be1cb22014-08-07 00:24:21 +00003569 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003570 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003571 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3572 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003573 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003574 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003575
3576 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003577 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003578 //
3579 // If a std is supplied, only add -trigraphs if it follows the
3580 // option.
3581 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3582 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003583 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003584 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003585 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003586 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003587 else
3588 Std->render(Args, CmdArgs);
3589
Nico Weber00721502014-12-23 22:32:37 +00003590 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003591 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003592 options::OPT_ftrigraphs,
3593 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003594 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003595 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003596 } else {
3597 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003598 //
3599 // FIXME: Clang doesn't correctly handle -std= when the input language
3600 // doesn't match. For the time being just ignore this for C++ inputs;
3601 // eventually we want to do all the standard defaulting here instead of
3602 // splitting it between the driver and clang -cc1.
3603 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003604 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3605 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003606 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003607 CmdArgs.push_back("-std=c++11");
3608
Nico Weber00721502014-12-23 22:32:37 +00003609 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3610 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003611 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003612
Richard Smith282b4492013-09-04 22:50:31 +00003613 // GCC's behavior for -Wwrite-strings is a bit strange:
3614 // * In C, this "warning flag" changes the types of string literals from
3615 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3616 // for the discarded qualifier.
3617 // * In C++, this is just a normal warning flag.
3618 //
3619 // Implementing this warning correctly in C is hard, so we follow GCC's
3620 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3621 // a non-const char* in C, rather than using this crude hack.
3622 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003623 // FIXME: This should behave just like a warning flag, and thus should also
3624 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3625 Arg *WriteStrings =
3626 Args.getLastArg(options::OPT_Wwrite_strings,
3627 options::OPT_Wno_write_strings, options::OPT_w);
3628 if (WriteStrings &&
3629 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003630 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003631 }
3632
Chandler Carruth61fbf622011-04-23 09:27:53 +00003633 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003634 // during C++ compilation, which it is by default. GCC keeps this define even
3635 // in the presence of '-w', match this behavior bug-for-bug.
3636 if (types::isCXX(InputType) &&
3637 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3638 true)) {
3639 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003640 }
3641
Chandler Carruthe0391482010-05-22 02:21:53 +00003642 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3643 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3644 if (Asm->getOption().matches(options::OPT_fasm))
3645 CmdArgs.push_back("-fgnu-keywords");
3646 else
3647 CmdArgs.push_back("-fno-gnu-keywords");
3648 }
3649
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003650 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3651 CmdArgs.push_back("-fno-dwarf-directory-asm");
3652
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003653 if (ShouldDisableAutolink(Args, getToolChain()))
3654 CmdArgs.push_back("-fno-autolink");
3655
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003656 // Add in -fdebug-compilation-dir if necessary.
3657 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003658
Richard Smith9a568822011-11-21 19:36:32 +00003659 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3660 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003661 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003662 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003663 }
3664
Richard Smith79c927b2013-11-06 19:31:51 +00003665 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3666 CmdArgs.push_back("-foperator-arrow-depth");
3667 CmdArgs.push_back(A->getValue());
3668 }
3669
Richard Smith9a568822011-11-21 19:36:32 +00003670 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3671 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003672 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003673 }
3674
Richard Smitha3d3bd22013-05-08 02:12:03 +00003675 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3676 CmdArgs.push_back("-fconstexpr-steps");
3677 CmdArgs.push_back(A->getValue());
3678 }
3679
Richard Smithb3a14522013-02-22 01:59:51 +00003680 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3681 CmdArgs.push_back("-fbracket-depth");
3682 CmdArgs.push_back(A->getValue());
3683 }
3684
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003685 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3686 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003687 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003688 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003689 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3690 } else
3691 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003692 }
3693
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003694
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003695 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003696 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003697
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003698 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3699 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003700 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003701 }
David Chisnall5778fce2009-08-31 16:41:57 +00003702
Chris Lattnere23003d2010-01-09 21:54:33 +00003703 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3704 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003705 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003706 }
3707
Chris Lattnerb35583d2010-04-07 20:49:23 +00003708 CmdArgs.push_back("-ferror-limit");
3709 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003710 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003711 else
3712 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003713
Chandler Carrutha77a7272010-05-06 04:55:18 +00003714 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3715 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003716 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003717 }
3718
3719 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3720 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003721 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003722 }
3723
Richard Smithf6f003a2011-12-16 19:06:07 +00003724 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3725 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003726 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003727 }
3728
Nick Lewycky24653262014-12-16 21:39:02 +00003729 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3730 CmdArgs.push_back("-fspell-checking-limit");
3731 CmdArgs.push_back(A->getValue());
3732 }
3733
Daniel Dunbar2c978472009-11-04 06:24:47 +00003734 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003735 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003736 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003737 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003738 } else {
3739 // If -fmessage-length=N was not specified, determine whether this is a
3740 // terminal and, if so, implicitly define -fmessage-length appropriately.
3741 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003742 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003743 }
3744
John McCallb4a99d32013-02-19 01:57:35 +00003745 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3746 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3747 options::OPT_fvisibility_ms_compat)) {
3748 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3749 CmdArgs.push_back("-fvisibility");
3750 CmdArgs.push_back(A->getValue());
3751 } else {
3752 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3753 CmdArgs.push_back("-fvisibility");
3754 CmdArgs.push_back("hidden");
3755 CmdArgs.push_back("-ftype-visibility");
3756 CmdArgs.push_back("default");
3757 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003758 }
3759
Douglas Gregor08329632010-06-15 17:05:35 +00003760 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003761
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003762 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3763
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003764 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003765 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3766 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003767 CmdArgs.push_back("-ffreestanding");
3768
Daniel Dunbare357d562009-12-03 18:42:11 +00003769 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003770 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003771 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003772 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3773 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003774 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003775 // AltiVec language extensions aren't relevant for assembling.
3776 if (!isa<PreprocessJobAction>(JA) ||
3777 Output.getType() != types::TY_PP_Asm)
3778 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003779 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3780 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003781
Peter Collingbourne32701642013-11-01 18:16:25 +00003782 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3783 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003784
Eric Christopher459d2712013-02-19 06:16:53 +00003785 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003786 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003787 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003788 getToolChain().getArch() == llvm::Triple::ppc64 ||
3789 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003790 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003791 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003792
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003793 if (getToolChain().SupportsProfiling())
3794 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003795
3796 // -flax-vector-conversions is default.
3797 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3798 options::OPT_fno_lax_vector_conversions))
3799 CmdArgs.push_back("-fno-lax-vector-conversions");
3800
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003801 if (Args.getLastArg(options::OPT_fapple_kext))
3802 CmdArgs.push_back("-fapple-kext");
3803
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003804 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003805 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003806 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003807 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3808 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003809
3810 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3811 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003812 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003813 }
3814
Bob Wilson14adb362012-02-03 06:27:22 +00003815 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003816
Chandler Carruth6e501032011-03-27 00:04:55 +00003817 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3818 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3819 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3820 options::OPT_fno_wrapv)) {
3821 if (A->getOption().matches(options::OPT_fwrapv))
3822 CmdArgs.push_back("-fwrapv");
3823 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3824 options::OPT_fno_strict_overflow)) {
3825 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3826 CmdArgs.push_back("-fwrapv");
3827 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003828
3829 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3830 options::OPT_fno_reroll_loops))
3831 if (A->getOption().matches(options::OPT_freroll_loops))
3832 CmdArgs.push_back("-freroll-loops");
3833
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003834 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003835 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3836 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003837
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003838 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3839
Mahesha S6a682be42012-10-27 07:47:56 +00003840
Daniel Dunbar4930e332009-11-17 08:07:36 +00003841 // -stack-protector=0 is default.
3842 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003843 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3844 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003845 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003846 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003847 if (A->getOption().matches(options::OPT_fstack_protector)) {
3848 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3849 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3850 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003851 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003852 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003853 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003854 } else {
3855 StackProtectorLevel =
3856 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3857 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003858 if (StackProtectorLevel) {
3859 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003860 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003861 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003862
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003863 // --param ssp-buffer-size=
3864 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3865 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003866 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003867 if (Str.startswith("ssp-buffer-size=")) {
3868 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003869 CmdArgs.push_back("-stack-protector-buffer-size");
3870 // FIXME: Verify the argument is a valid integer.
3871 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003872 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003873 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003874 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003875 }
3876
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003877 // Translate -mstackrealign
3878 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3879 false)) {
3880 CmdArgs.push_back("-backend-option");
3881 CmdArgs.push_back("-force-align-stack");
3882 }
3883 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3884 false)) {
3885 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3886 }
3887
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003888 if (Args.hasArg(options::OPT_mstack_alignment)) {
3889 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3890 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003891 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003892
Hans Wennborg77dc2362015-01-20 19:45:50 +00003893 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3894 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3895
3896 if (!Size.empty())
3897 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3898 else
3899 CmdArgs.push_back("-mstack-probe-size=0");
3900 }
3901
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003902 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3903 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3904 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3905
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003906 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3907 options::OPT_mno_restrict_it)) {
3908 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3909 CmdArgs.push_back("-backend-option");
3910 CmdArgs.push_back("-arm-restrict-it");
3911 } else {
3912 CmdArgs.push_back("-backend-option");
3913 CmdArgs.push_back("-arm-no-restrict-it");
3914 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003915 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3916 TT.getArch() == llvm::Triple::thumb)) {
3917 // Windows on ARM expects restricted IT blocks
3918 CmdArgs.push_back("-backend-option");
3919 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003920 }
3921
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003922 if (TT.getArch() == llvm::Triple::arm ||
3923 TT.getArch() == llvm::Triple::thumb) {
3924 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3925 options::OPT_mno_long_calls)) {
3926 if (A->getOption().matches(options::OPT_mlong_calls)) {
3927 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003928 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003929 }
3930 }
3931 }
3932
Daniel Dunbard18049a2009-04-07 21:16:11 +00003933 // Forward -f options with positive and negative forms; we translate
3934 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003935 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3936 StringRef fname = A->getValue();
3937 if (!llvm::sys::fs::exists(fname))
3938 D.Diag(diag::err_drv_no_such_file) << fname;
3939 else
3940 A->render(Args, CmdArgs);
3941 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003942
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003943 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003944 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003945 CmdArgs.push_back("-fapple-kext");
3946 if (!Args.hasArg(options::OPT_fbuiltin))
3947 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003948 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003949 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003950 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003951 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003952 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003953
Nuno Lopes13c88c72009-12-16 16:59:22 +00003954 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3955 options::OPT_fno_assume_sane_operator_new))
3956 CmdArgs.push_back("-fno-assume-sane-operator-new");
3957
Daniel Dunbar4930e332009-11-17 08:07:36 +00003958 // -fblocks=0 is default.
3959 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003960 getToolChain().IsBlocksDefault()) ||
3961 (Args.hasArg(options::OPT_fgnu_runtime) &&
3962 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3963 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003964 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003965
3966 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3967 !getToolChain().hasBlocksRuntime())
3968 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003969 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003970
Richard Smithffb65082014-09-30 23:10:19 +00003971 // -fmodules enables modules (off by default).
3972 // Users can pass -fno-cxx-modules to turn off modules support for
3973 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003974 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003975 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3976 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3977 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003978 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003979 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003980 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003981 HaveModules = true;
3982 }
3983 }
3984
Daniel Jasper07e6c402013-08-05 20:26:17 +00003985 // -fmodule-maps enables module map processing (off by default) for header
3986 // checking. It is implied by -fmodules.
3987 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3988 false)) {
3989 CmdArgs.push_back("-fmodule-maps");
3990 }
3991
Daniel Jasperac42b752013-10-21 06:34:34 +00003992 // -fmodules-decluse checks that modules used are declared so (off by
3993 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003994 if (Args.hasFlag(options::OPT_fmodules_decluse,
3995 options::OPT_fno_modules_decluse,
3996 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003997 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003998 }
3999
Daniel Jasper962b38e2014-04-11 11:47:45 +00004000 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4001 // all #included headers are part of modules.
4002 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4003 options::OPT_fno_modules_strict_decluse,
4004 false)) {
4005 CmdArgs.push_back("-fmodules-strict-decluse");
4006 }
4007
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004008 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4009 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4010 options::OPT_fno_implicit_modules)) {
4011 CmdArgs.push_back("-fno-implicit-modules");
4012 }
4013
Daniel Jasperac42b752013-10-21 06:34:34 +00004014 // -fmodule-name specifies the module that is currently being built (or
4015 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004016 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004017
Richard Smith9887d792014-10-17 01:42:53 +00004018 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004019 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004020 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004021
Richard Smithe842a472014-10-22 02:05:46 +00004022 // -fmodule-file can be used to specify files containing precompiled modules.
4023 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4024
4025 // -fmodule-cache-path specifies where our implicitly-built module files
4026 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004027 SmallString<128> ModuleCachePath;
4028 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4029 ModuleCachePath = A->getValue();
4030 if (HaveModules) {
4031 if (C.isForDiagnostics()) {
4032 // When generating crash reports, we want to emit the modules along with
4033 // the reproduction sources, so we ignore any provided module path.
4034 ModuleCachePath = Output.getFilename();
4035 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4036 llvm::sys::path::append(ModuleCachePath, "modules");
4037 } else if (ModuleCachePath.empty()) {
4038 // No module path was provided: use the default.
4039 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4040 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004041 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4042 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004043 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4044 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004045 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004046 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4047 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4048 }
4049
4050 // When building modules and generating crashdumps, we need to dump a module
4051 // dependency VFS alongside the output.
4052 if (HaveModules && C.isForDiagnostics()) {
4053 SmallString<128> VFSDir(Output.getFilename());
4054 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004055 // Add the cache directory as a temp so the crash diagnostics pick it up.
4056 C.addTempFile(Args.MakeArgString(VFSDir));
4057
Justin Bognera88f0122014-06-20 22:59:50 +00004058 llvm::sys::path::append(VFSDir, "vfs");
4059 CmdArgs.push_back("-module-dependency-dir");
4060 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004061 }
4062
Richard Smith9887d792014-10-17 01:42:53 +00004063 if (HaveModules)
4064 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004065
Douglas Gregor35b04d62013-02-07 19:01:24 +00004066 // Pass through all -fmodules-ignore-macro arguments.
4067 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004068 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4069 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004070
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004071 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4072
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004073 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4074 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4075 D.Diag(diag::err_drv_argument_not_allowed_with)
4076 << A->getAsString(Args) << "-fbuild-session-timestamp";
4077
4078 llvm::sys::fs::file_status Status;
4079 if (llvm::sys::fs::status(A->getValue(), Status))
4080 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004081 CmdArgs.push_back(Args.MakeArgString(
4082 "-fbuild-session-timestamp=" +
4083 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004084 }
4085
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004086 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004087 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4088 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004089 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4090
4091 Args.AddLastArg(CmdArgs,
4092 options::OPT_fmodules_validate_once_per_build_session);
4093 }
4094
Ben Langmuirdcf73862014-03-12 00:06:17 +00004095 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4096
John McCalldfea9982010-04-09 19:12:06 +00004097 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004098 if (Args.hasFlag(options::OPT_fno_access_control,
4099 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004100 false))
John McCall3155f572010-04-09 19:03:51 +00004101 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004102
Anders Carlssond470fef2010-11-21 00:09:52 +00004103 // -felide-constructors is the default.
4104 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4105 options::OPT_felide_constructors,
4106 false))
4107 CmdArgs.push_back("-fno-elide-constructors");
4108
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004109 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004110
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004111 if (KernelOrKext || (types::isCXX(InputType) &&
4112 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4113 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004114 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004115
Tony Linthicum76329bf2011-12-12 21:14:55 +00004116 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004117 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004118 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004119 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004120 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004121 CmdArgs.push_back("-fshort-enums");
4122
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004123 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004124 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004125 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004126 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004127
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004128 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004129 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4130 options::OPT_fno_use_cxa_atexit,
4131 !IsWindowsCygnus && !IsWindowsGNU &&
4132 getToolChain().getArch() != llvm::Triple::hexagon &&
4133 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004134 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004135 CmdArgs.push_back("-fno-use-cxa-atexit");
4136
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004137 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004138 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004139 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004140 CmdArgs.push_back("-fms-extensions");
4141
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004142 // -fno-use-line-directives is default.
4143 if (Args.hasFlag(options::OPT_fuse_line_directives,
4144 options::OPT_fno_use_line_directives, false))
4145 CmdArgs.push_back("-fuse-line-directives");
4146
Francois Pichet1b4f1632011-09-17 04:32:15 +00004147 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004148 if (Args.hasFlag(options::OPT_fms_compatibility,
4149 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004150 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4151 options::OPT_fno_ms_extensions,
4152 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004153 CmdArgs.push_back("-fms-compatibility");
4154
David Majnemerc371ff02015-03-22 08:39:22 +00004155 // -fms-compatibility-version=18.00 is default.
4156 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004157 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004158 IsWindowsMSVC) ||
4159 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004160 Args.hasArg(options::OPT_fms_compatibility_version)) {
4161 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4162 const Arg *MSCompatibilityVersion =
4163 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004164
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004165 if (MSCVersion && MSCompatibilityVersion)
4166 D.Diag(diag::err_drv_argument_not_allowed_with)
4167 << MSCVersion->getAsString(Args)
4168 << MSCompatibilityVersion->getAsString(Args);
4169
David Majnemerc371ff02015-03-22 08:39:22 +00004170 if (MSCompatibilityVersion) {
4171 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4172 D.Diag(diag::err_drv_invalid_value)
4173 << MSCompatibilityVersion->getAsString(Args)
4174 << MSCompatibilityVersion->getValue();
4175 } else if (MSCVersion) {
4176 unsigned Version = 0;
4177 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4178 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4179 << MSCVersion->getValue();
4180 MSVT = getMSCompatibilityVersion(Version);
4181 } else {
4182 MSVT = VersionTuple(18);
4183 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004184
David Majnemerc371ff02015-03-22 08:39:22 +00004185 CmdArgs.push_back(
4186 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004187 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004188
Eric Christopher5ecce122013-02-18 00:38:31 +00004189 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004190 if (Args.hasFlag(options::OPT_fborland_extensions,
4191 options::OPT_fno_borland_extensions, false))
4192 CmdArgs.push_back("-fborland-extensions");
4193
David Majnemerc371ff02015-03-22 08:39:22 +00004194 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4195 // than 19.
4196 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4197 options::OPT_fno_threadsafe_statics,
4198 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4199 CmdArgs.push_back("-fno-threadsafe-statics");
4200
Francois Pichet02744872011-09-01 16:38:08 +00004201 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4202 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004203 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004204 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004205 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004206
Chandler Carruthe03aa552010-04-17 20:17:31 +00004207 // -fgnu-keywords default varies depending on language; only pass if
4208 // specified.
4209 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004210 options::OPT_fno_gnu_keywords))
4211 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004212
Rafael Espindola922a6242011-06-02 17:30:53 +00004213 if (Args.hasFlag(options::OPT_fgnu89_inline,
4214 options::OPT_fno_gnu89_inline,
4215 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004216 CmdArgs.push_back("-fgnu89-inline");
4217
Chad Rosier9c76d242012-03-15 22:31:42 +00004218 if (Args.hasArg(options::OPT_fno_inline))
4219 CmdArgs.push_back("-fno-inline");
4220
Chad Rosier64d6be92012-03-06 21:17:19 +00004221 if (Args.hasArg(options::OPT_fno_inline_functions))
4222 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004223
John McCall5fb5df92012-06-20 06:18:46 +00004224 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004225
John McCall5fb5df92012-06-20 06:18:46 +00004226 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004227 // legacy is the default. Except for deployment taget of 10.5,
4228 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4229 // gets ignored silently.
4230 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004231 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4232 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004233 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004234 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004235 if (getToolChain().UseObjCMixedDispatch())
4236 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4237 else
4238 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4239 }
4240 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004241
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004242 // When ObjectiveC legacy runtime is in effect on MacOSX,
4243 // turn on the option to do Array/Dictionary subscripting
4244 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004245 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4246 getToolChain().getTriple().isMacOSX() &&
4247 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4248 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004249 objcRuntime.isNeXTFamily())
4250 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4251
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004252 // -fencode-extended-block-signature=1 is default.
4253 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4254 CmdArgs.push_back("-fencode-extended-block-signature");
4255 }
4256
John McCall24fc0de2011-07-06 00:26:06 +00004257 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4258 // NOTE: This logic is duplicated in ToolChains.cpp.
4259 bool ARC = isObjCAutoRefCount(Args);
4260 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004261 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004262
John McCall24fc0de2011-07-06 00:26:06 +00004263 CmdArgs.push_back("-fobjc-arc");
4264
Chandler Carruth491db322011-11-04 07:34:47 +00004265 // FIXME: It seems like this entire block, and several around it should be
4266 // wrapped in isObjC, but for now we just use it here as this is where it
4267 // was being used previously.
4268 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4269 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4270 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4271 else
4272 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4273 }
4274
John McCall24fc0de2011-07-06 00:26:06 +00004275 // Allow the user to enable full exceptions code emission.
4276 // We define off for Objective-CC, on for Objective-C++.
4277 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4278 options::OPT_fno_objc_arc_exceptions,
4279 /*default*/ types::isCXX(InputType)))
4280 CmdArgs.push_back("-fobjc-arc-exceptions");
4281 }
4282
4283 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4284 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004285 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004286 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004287
John McCall24fc0de2011-07-06 00:26:06 +00004288 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4289 // takes precedence.
4290 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4291 if (!GCArg)
4292 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4293 if (GCArg) {
4294 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004295 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004296 << GCArg->getAsString(Args);
4297 } else if (getToolChain().SupportsObjCGC()) {
4298 GCArg->render(Args, CmdArgs);
4299 } else {
4300 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004301 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004302 << GCArg->getAsString(Args);
4303 }
4304 }
4305
Bob Wilsonb111ec92015-03-02 19:01:14 +00004306 if (Args.hasFlag(options::OPT_fapplication_extension,
4307 options::OPT_fno_application_extension, false))
4308 CmdArgs.push_back("-fapplication-extension");
4309
Reid Klecknerc542d372014-06-27 17:02:02 +00004310 // Handle GCC-style exception args.
4311 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004312 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004313 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004314
4315 if (getToolChain().UseSjLjExceptions())
4316 CmdArgs.push_back("-fsjlj-exceptions");
4317
4318 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004319 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4320 options::OPT_fno_assume_sane_operator_new))
4321 CmdArgs.push_back("-fno-assume-sane-operator-new");
4322
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004323 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4324 // most platforms.
4325 if (Args.hasFlag(options::OPT_fsized_deallocation,
4326 options::OPT_fno_sized_deallocation, false))
4327 CmdArgs.push_back("-fsized-deallocation");
4328
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004329 // -fconstant-cfstrings is default, and may be subject to argument translation
4330 // on Darwin.
4331 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4332 options::OPT_fno_constant_cfstrings) ||
4333 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4334 options::OPT_mno_constant_cfstrings))
4335 CmdArgs.push_back("-fno-constant-cfstrings");
4336
John Thompsoned4e2952009-11-05 20:14:16 +00004337 // -fshort-wchar default varies depending on platform; only
4338 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004339 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4340 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004341 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004342
Hans Wennborg28c96312013-07-31 23:39:13 +00004343 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004344 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004345 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004346 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004347 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004348
Daniel Dunbar096ed292011-10-05 21:04:55 +00004349 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4350 // -fno-pack-struct doesn't apply to -fpack-struct=.
4351 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004352 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004353 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004354 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004355 } else if (Args.hasFlag(options::OPT_fpack_struct,
4356 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004357 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004358 }
4359
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004360 // Handle -fmax-type-align=N and -fno-type-align
4361 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4362 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4363 if (!SkipMaxTypeAlign) {
4364 std::string MaxTypeAlignStr = "-fmax-type-align=";
4365 MaxTypeAlignStr += A->getValue();
4366 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4367 }
4368 } else if (getToolChain().getTriple().isOSDarwin()) {
4369 if (!SkipMaxTypeAlign) {
4370 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4371 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4372 }
4373 }
4374
Robert Lytton0e076492013-08-13 09:43:10 +00004375 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004376 if (!Args.hasArg(options::OPT_fcommon))
4377 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004378 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004379 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004380
Daniel Dunbard18049a2009-04-07 21:16:11 +00004381 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004382 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004383 CmdArgs.push_back("-fno-common");
4384
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004385 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004386 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004387 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004388 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004389 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004390 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4391
Daniel Dunbar6358d682010-10-15 22:30:42 +00004392 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4393 if (!Args.hasFlag(options::OPT_ffor_scope,
4394 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004395 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004396 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4397
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004398 // -finput_charset=UTF-8 is default. Reject others
4399 if (Arg *inputCharset = Args.getLastArg(
4400 options::OPT_finput_charset_EQ)) {
4401 StringRef value = inputCharset->getValue();
4402 if (value != "UTF-8")
4403 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4404 }
4405
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004406 // -fexec_charset=UTF-8 is default. Reject others
4407 if (Arg *execCharset = Args.getLastArg(
4408 options::OPT_fexec_charset_EQ)) {
4409 StringRef value = execCharset->getValue();
4410 if (value != "UTF-8")
4411 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4412 }
4413
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004414 // -fcaret-diagnostics is default.
4415 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4416 options::OPT_fno_caret_diagnostics, true))
4417 CmdArgs.push_back("-fno-caret-diagnostics");
4418
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004419 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004420 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004421 options::OPT_fno_diagnostics_fixit_info))
4422 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004423
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004424 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004425 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004426 options::OPT_fno_diagnostics_show_option))
4427 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004428
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004429 if (const Arg *A =
4430 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4431 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004432 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004433 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004434
Douglas Gregor643c9222011-05-21 17:07:29 +00004435 if (const Arg *A =
4436 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4437 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004438 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004439 }
4440
Chandler Carruthb6766f02011-03-27 01:50:55 +00004441 if (Arg *A = Args.getLastArg(
4442 options::OPT_fdiagnostics_show_note_include_stack,
4443 options::OPT_fno_diagnostics_show_note_include_stack)) {
4444 if (A->getOption().matches(
4445 options::OPT_fdiagnostics_show_note_include_stack))
4446 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4447 else
4448 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4449 }
4450
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004451 // Color diagnostics are the default, unless the terminal doesn't support
4452 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004453 // Support both clang's -f[no-]color-diagnostics and gcc's
4454 // -f[no-]diagnostics-colors[=never|always|auto].
4455 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004456 for (const auto &Arg : Args) {
4457 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004458 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4459 !O.matches(options::OPT_fdiagnostics_color) &&
4460 !O.matches(options::OPT_fno_color_diagnostics) &&
4461 !O.matches(options::OPT_fno_diagnostics_color) &&
4462 !O.matches(options::OPT_fdiagnostics_color_EQ))
4463 continue;
4464
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004465 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004466 if (O.matches(options::OPT_fcolor_diagnostics) ||
4467 O.matches(options::OPT_fdiagnostics_color)) {
4468 ShowColors = Colors_On;
4469 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4470 O.matches(options::OPT_fno_diagnostics_color)) {
4471 ShowColors = Colors_Off;
4472 } else {
4473 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004474 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004475 if (value == "always")
4476 ShowColors = Colors_On;
4477 else if (value == "never")
4478 ShowColors = Colors_Off;
4479 else if (value == "auto")
4480 ShowColors = Colors_Auto;
4481 else
4482 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4483 << ("-fdiagnostics-color=" + value).str();
4484 }
4485 }
4486 if (ShowColors == Colors_On ||
4487 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004488 CmdArgs.push_back("-fcolor-diagnostics");
4489
Nico Rieck7857d462013-09-11 00:38:02 +00004490 if (Args.hasArg(options::OPT_fansi_escape_codes))
4491 CmdArgs.push_back("-fansi-escape-codes");
4492
Daniel Dunbardb097022009-06-08 21:13:54 +00004493 if (!Args.hasFlag(options::OPT_fshow_source_location,
4494 options::OPT_fno_show_source_location))
4495 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004496
Douglas Gregor643c9222011-05-21 17:07:29 +00004497 if (!Args.hasFlag(options::OPT_fshow_column,
4498 options::OPT_fno_show_column,
4499 true))
4500 CmdArgs.push_back("-fno-show-column");
4501
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004502 if (!Args.hasFlag(options::OPT_fspell_checking,
4503 options::OPT_fno_spell_checking))
4504 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004505
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004506
Chad Rosierc8e56e82012-12-05 21:08:21 +00004507 // -fno-asm-blocks is default.
4508 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4509 false))
4510 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004511
Steven Wucb0d13f2015-01-16 23:05:28 +00004512 // -fgnu-inline-asm is default.
4513 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4514 options::OPT_fno_gnu_inline_asm, true))
4515 CmdArgs.push_back("-fno-gnu-inline-asm");
4516
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004517 // Enable vectorization per default according to the optimization level
4518 // selected. For optimization levels that want vectorization we use the alias
4519 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004520 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004521 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004522 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004523 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004524 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004525 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004526
Chad Rosier136d67d2014-04-28 19:30:57 +00004527 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004528 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4529 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004530 options::OPT_fslp_vectorize;
4531 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004532 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004533 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004534
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004535 // -fno-slp-vectorize-aggressive is default.
4536 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004537 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004538 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004539
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004540 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4541 A->render(Args, CmdArgs);
4542
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004543 // -fdollars-in-identifiers default varies depending on platform and
4544 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004545 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004546 options::OPT_fno_dollars_in_identifiers)) {
4547 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004548 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004549 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004550 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004551 }
4552
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004553 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4554 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004555 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004556 options::OPT_fno_unit_at_a_time)) {
4557 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004558 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004559 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004560
Eli Friedman055c9702011-11-02 01:53:16 +00004561 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4562 options::OPT_fno_apple_pragma_pack, false))
4563 CmdArgs.push_back("-fapple-pragma-pack");
4564
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004565 // le32-specific flags:
4566 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4567 // by default.
4568 if (getToolChain().getArch() == llvm::Triple::le32) {
4569 CmdArgs.push_back("-fno-math-builtin");
4570 }
4571
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004572 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004573 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004574 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004575#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004576 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004577 (getToolChain().getArch() == llvm::Triple::arm ||
4578 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004579 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4580 CmdArgs.push_back("-fno-builtin-strcat");
4581 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4582 CmdArgs.push_back("-fno-builtin-strcpy");
4583 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004584#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004585
Justin Bognera88f0122014-06-20 22:59:50 +00004586 // Enable rewrite includes if the user's asked for it or if we're generating
4587 // diagnostics.
4588 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4589 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004590 if (Args.hasFlag(options::OPT_frewrite_includes,
4591 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004592 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004593 CmdArgs.push_back("-frewrite-includes");
4594
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004595 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004596 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004597 options::OPT_traditional_cpp)) {
4598 if (isa<PreprocessJobAction>(JA))
4599 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004600 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004601 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004602 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004603
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004604 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004605 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004606
4607 // Handle serialized diagnostics.
4608 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4609 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004610 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004611 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004612
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004613 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4614 CmdArgs.push_back("-fretain-comments-from-system-headers");
4615
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004616 // Forward -fcomment-block-commands to -cc1.
4617 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004618 // Forward -fparse-all-comments to -cc1.
4619 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004620
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004621 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4622 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004623 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004624 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004625 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4626 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004627 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004628
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004629 // We translate this by hand to the -cc1 argument, since nightly test uses
4630 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004631 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004632 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004633 OptDisabled = true;
4634 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004635 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004636 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004637
Bob Wilson23a55f12014-12-21 07:00:00 +00004638 // With -save-temps, we want to save the unoptimized bitcode output from the
4639 // CompileJobAction, so disable optimizations if they are not already
4640 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004641 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004642 isa<CompileJobAction>(JA))
4643 CmdArgs.push_back("-disable-llvm-optzns");
4644
Daniel Dunbard67a3222009-03-30 06:36:42 +00004645 if (Output.getType() == types::TY_Dependencies) {
4646 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004647 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004648 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004649 CmdArgs.push_back(Output.getFilename());
4650 } else {
4651 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004652 }
4653
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004654 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004655 addDashXForInput(Args, II, CmdArgs);
4656
Daniel Dunbarb440f562010-08-02 02:38:21 +00004657 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004658 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004659 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004660 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004661 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004662
Chris Lattnere9d7d782009-11-03 19:50:27 +00004663 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4664
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004665 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004666
4667 // Optionally embed the -cc1 level arguments into the debug info, for build
4668 // analysis.
4669 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004670 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004671 for (const auto &Arg : Args)
4672 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004673
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004674 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004675 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004676 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004677 SmallString<128> EscapedArg;
4678 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004679 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004680 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004681 }
4682 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004683 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004684 }
4685
Eric Christopherd3804002013-02-22 20:12:52 +00004686 // Add the split debug info name to the command lines here so we
4687 // can propagate it to the backend.
4688 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004689 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004690 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4691 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004692 const char *SplitDwarfOut;
4693 if (SplitDwarf) {
4694 CmdArgs.push_back("-split-dwarf-file");
4695 SplitDwarfOut = SplitDebugName(Args, Inputs);
4696 CmdArgs.push_back(SplitDwarfOut);
4697 }
4698
4699 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004700 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004701 Output.getType() == types::TY_Object &&
4702 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004703 auto CLCommand =
4704 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4705 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4706 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004707 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004708 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004709 }
4710
Daniel Dunbar17731772009-03-23 19:03:36 +00004711
Eric Christopherf1545832013-02-22 23:50:16 +00004712 // Handle the debug info splitting at object creation time if we're
4713 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004714 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004715 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004716 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004717
Roman Divacky178e01602011-02-10 16:52:03 +00004718 if (Arg *A = Args.getLastArg(options::OPT_pg))
4719 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004720 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004721 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004722
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004723 // Claim some arguments which clang supports automatically.
4724
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004725 // -fpch-preprocess is used with gcc to add a special marker in the output to
4726 // include the PCH file. Clang's PTH solution is completely transparent, so we
4727 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004728 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004729
Daniel Dunbar17731772009-03-23 19:03:36 +00004730 // Claim some arguments which clang doesn't support, but we don't
4731 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004732 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4733 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004734
Rafael Espindolab0092d72013-09-04 19:37:35 +00004735 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004736 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004737}
4738
John McCall5fb5df92012-06-20 06:18:46 +00004739/// Add options related to the Objective-C runtime/ABI.
4740///
4741/// Returns true if the runtime is non-fragile.
4742ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4743 ArgStringList &cmdArgs,
4744 RewriteKind rewriteKind) const {
4745 // Look for the controlling runtime option.
4746 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4747 options::OPT_fgnu_runtime,
4748 options::OPT_fobjc_runtime_EQ);
4749
4750 // Just forward -fobjc-runtime= to the frontend. This supercedes
4751 // options about fragility.
4752 if (runtimeArg &&
4753 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4754 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004755 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004756 if (runtime.tryParse(value)) {
4757 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4758 << value;
4759 }
4760
4761 runtimeArg->render(args, cmdArgs);
4762 return runtime;
4763 }
4764
4765 // Otherwise, we'll need the ABI "version". Version numbers are
4766 // slightly confusing for historical reasons:
4767 // 1 - Traditional "fragile" ABI
4768 // 2 - Non-fragile ABI, version 1
4769 // 3 - Non-fragile ABI, version 2
4770 unsigned objcABIVersion = 1;
4771 // If -fobjc-abi-version= is present, use that to set the version.
4772 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004773 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004774 if (value == "1")
4775 objcABIVersion = 1;
4776 else if (value == "2")
4777 objcABIVersion = 2;
4778 else if (value == "3")
4779 objcABIVersion = 3;
4780 else
4781 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4782 << value;
4783 } else {
4784 // Otherwise, determine if we are using the non-fragile ABI.
4785 bool nonFragileABIIsDefault =
4786 (rewriteKind == RK_NonFragile ||
4787 (rewriteKind == RK_None &&
4788 getToolChain().IsObjCNonFragileABIDefault()));
4789 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4790 options::OPT_fno_objc_nonfragile_abi,
4791 nonFragileABIIsDefault)) {
4792 // Determine the non-fragile ABI version to use.
4793#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4794 unsigned nonFragileABIVersion = 1;
4795#else
4796 unsigned nonFragileABIVersion = 2;
4797#endif
4798
4799 if (Arg *abiArg = args.getLastArg(
4800 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004801 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004802 if (value == "1")
4803 nonFragileABIVersion = 1;
4804 else if (value == "2")
4805 nonFragileABIVersion = 2;
4806 else
4807 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4808 << value;
4809 }
4810
4811 objcABIVersion = 1 + nonFragileABIVersion;
4812 } else {
4813 objcABIVersion = 1;
4814 }
4815 }
4816
4817 // We don't actually care about the ABI version other than whether
4818 // it's non-fragile.
4819 bool isNonFragile = objcABIVersion != 1;
4820
4821 // If we have no runtime argument, ask the toolchain for its default runtime.
4822 // However, the rewriter only really supports the Mac runtime, so assume that.
4823 ObjCRuntime runtime;
4824 if (!runtimeArg) {
4825 switch (rewriteKind) {
4826 case RK_None:
4827 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4828 break;
4829 case RK_Fragile:
4830 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4831 break;
4832 case RK_NonFragile:
4833 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4834 break;
4835 }
4836
4837 // -fnext-runtime
4838 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4839 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004840 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004841 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4842
4843 // Otherwise, build for a generic macosx port.
4844 } else {
4845 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4846 }
4847
4848 // -fgnu-runtime
4849 } else {
4850 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004851 // Legacy behaviour is to target the gnustep runtime if we are i
4852 // non-fragile mode or the GCC runtime in fragile mode.
4853 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004854 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004855 else
4856 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004857 }
4858
4859 cmdArgs.push_back(args.MakeArgString(
4860 "-fobjc-runtime=" + runtime.getAsString()));
4861 return runtime;
4862}
4863
Reid Klecknerc542d372014-06-27 17:02:02 +00004864static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4865 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4866 I += HaveDash;
4867 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004868}
Reid Klecknerc542d372014-06-27 17:02:02 +00004869
4870struct EHFlags {
4871 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4872 bool Synch;
4873 bool Asynch;
4874 bool NoExceptC;
4875};
4876
4877/// /EH controls whether to run destructor cleanups when exceptions are
4878/// thrown. There are three modifiers:
4879/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4880/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4881/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4882/// - c: Assume that extern "C" functions are implicitly noexcept. This
4883/// modifier is an optimization, so we ignore it for now.
4884/// The default is /EHs-c-, meaning cleanups are disabled.
4885static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4886 EHFlags EH;
4887 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4888 for (auto EHVal : EHArgs) {
4889 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4890 switch (EHVal[I]) {
4891 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4892 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4893 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4894 default: break;
4895 }
4896 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4897 break;
4898 }
4899 }
4900 return EH;
4901}
4902
Hans Wennborg75958c42013-08-08 00:17:41 +00004903void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4904 unsigned RTOptionID = options::OPT__SLASH_MT;
4905
Hans Wennborgf1a74252013-09-10 20:18:04 +00004906 if (Args.hasArg(options::OPT__SLASH_LDd))
4907 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4908 // but defining _DEBUG is sticky.
4909 RTOptionID = options::OPT__SLASH_MTd;
4910
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004911 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004912 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004913
Hans Wennborg75958c42013-08-08 00:17:41 +00004914 switch(RTOptionID) {
4915 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004916 if (Args.hasArg(options::OPT__SLASH_LDd))
4917 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004918 CmdArgs.push_back("-D_MT");
4919 CmdArgs.push_back("-D_DLL");
4920 CmdArgs.push_back("--dependent-lib=msvcrt");
4921 break;
4922 case options::OPT__SLASH_MDd:
4923 CmdArgs.push_back("-D_DEBUG");
4924 CmdArgs.push_back("-D_MT");
4925 CmdArgs.push_back("-D_DLL");
4926 CmdArgs.push_back("--dependent-lib=msvcrtd");
4927 break;
4928 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004929 if (Args.hasArg(options::OPT__SLASH_LDd))
4930 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004931 CmdArgs.push_back("-D_MT");
4932 CmdArgs.push_back("--dependent-lib=libcmt");
4933 break;
4934 case options::OPT__SLASH_MTd:
4935 CmdArgs.push_back("-D_DEBUG");
4936 CmdArgs.push_back("-D_MT");
4937 CmdArgs.push_back("--dependent-lib=libcmtd");
4938 break;
4939 default:
4940 llvm_unreachable("Unexpected option ID.");
4941 }
4942
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004943 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4944 // users want. The /Za flag to cl.exe turns this off, but it's not
4945 // implemented in clang.
4946 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004947
Hans Wennborg8858a032014-07-21 23:42:07 +00004948 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4949 // would produce interleaved output, so ignore /showIncludes in such cases.
4950 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4951 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4952 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004953
David Majnemerf6072342014-07-01 22:24:56 +00004954 // This controls whether or not we emit RTTI data for polymorphic types.
4955 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4956 /*default=*/false))
4957 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004958
Reid Klecknerc542d372014-06-27 17:02:02 +00004959 const Driver &D = getToolChain().getDriver();
4960 EHFlags EH = parseClangCLEHFlags(D, Args);
4961 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004962 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004963 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004964 CmdArgs.push_back("-fexceptions");
4965 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004966
Hans Wennborge50cec32014-06-13 20:59:54 +00004967 // /EP should expand to -E -P.
4968 if (Args.hasArg(options::OPT__SLASH_EP)) {
4969 CmdArgs.push_back("-E");
4970 CmdArgs.push_back("-P");
4971 }
4972
David Majnemera5b195a2015-02-14 01:35:12 +00004973 unsigned VolatileOptionID;
4974 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4975 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4976 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4977 else
4978 VolatileOptionID = options::OPT__SLASH_volatile_iso;
4979
4980 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
4981 VolatileOptionID = A->getOption().getID();
4982
4983 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
4984 CmdArgs.push_back("-fms-volatile");
4985
David Majnemer86c318f2014-02-11 21:05:00 +00004986 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4987 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4988 if (MostGeneralArg && BestCaseArg)
4989 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4990 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4991
4992 if (MostGeneralArg) {
4993 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4994 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4995 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4996
4997 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4998 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4999 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5000 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5001 << FirstConflict->getAsString(Args)
5002 << SecondConflict->getAsString(Args);
5003
5004 if (SingleArg)
5005 CmdArgs.push_back("-fms-memptr-rep=single");
5006 else if (MultipleArg)
5007 CmdArgs.push_back("-fms-memptr-rep=multiple");
5008 else
5009 CmdArgs.push_back("-fms-memptr-rep=virtual");
5010 }
5011
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005012 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5013 A->render(Args, CmdArgs);
5014
Hans Wennborg81f74482013-09-10 01:07:07 +00005015 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5016 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005017 if (Args.hasArg(options::OPT__SLASH_fallback))
5018 CmdArgs.push_back("msvc-fallback");
5019 else
5020 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005021 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005022}
5023
Hans Wennborg1da044a2014-06-26 19:59:02 +00005024visualstudio::Compile *Clang::getCLFallback() const {
5025 if (!CLFallback)
5026 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5027 return CLFallback.get();
5028}
5029
Daniel Sanders7f933f42015-01-30 17:35:23 +00005030void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5031 ArgStringList &CmdArgs) const {
5032 StringRef CPUName;
5033 StringRef ABIName;
5034 const llvm::Triple &Triple = getToolChain().getTriple();
5035 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5036
5037 CmdArgs.push_back("-target-abi");
5038 CmdArgs.push_back(ABIName.data());
5039}
5040
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005041void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005042 const InputInfo &Output,
5043 const InputInfoList &Inputs,
5044 const ArgList &Args,
5045 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005046 ArgStringList CmdArgs;
5047
5048 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5049 const InputInfo &Input = Inputs[0];
5050
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005051 // Don't warn about "clang -w -c foo.s"
5052 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005053 // and "clang -emit-llvm -c foo.s"
5054 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005055
Rafael Espindola577637a2015-01-03 00:06:04 +00005056 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005057
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005058 // Invoke ourselves in -cc1as mode.
5059 //
5060 // FIXME: Implement custom jobs for internal actions.
5061 CmdArgs.push_back("-cc1as");
5062
5063 // Add the "effective" target triple.
5064 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005065 std::string TripleStr =
5066 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005067 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5068
5069 // Set the output mode, we currently only expect to be used as a real
5070 // assembler.
5071 CmdArgs.push_back("-filetype");
5072 CmdArgs.push_back("obj");
5073
Eric Christopher45f2e712012-12-18 00:31:10 +00005074 // Set the main file name, so that debug info works even with
5075 // -save-temps or preprocessed assembly.
5076 CmdArgs.push_back("-main-file-name");
5077 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
5078
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005079 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005080 const llvm::Triple &Triple = getToolChain().getTriple();
5081 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005082 if (!CPU.empty()) {
5083 CmdArgs.push_back("-target-cpu");
5084 CmdArgs.push_back(Args.MakeArgString(CPU));
5085 }
5086
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005087 // Add the target features
5088 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005089 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005090
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005091 // Ignore explicit -force_cpusubtype_ALL option.
5092 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005093
Eric Christopherfc3ee562012-01-10 00:38:01 +00005094 // Determine the original source input.
5095 const Action *SourceAction = &JA;
5096 while (SourceAction->getKind() != Action::InputClass) {
5097 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5098 SourceAction = SourceAction->getInputs()[0];
5099 }
5100
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005101 // Forward -g and handle debug info related flags, assuming we are dealing
5102 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005103 if (SourceAction->getType() == types::TY_Asm ||
5104 SourceAction->getType() == types::TY_PP_Asm) {
5105 Args.ClaimAllArgs(options::OPT_g_Group);
5106 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5107 if (!A->getOption().matches(options::OPT_g0))
5108 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005109
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005110 if (Args.hasArg(options::OPT_gdwarf_2))
5111 CmdArgs.push_back("-gdwarf-2");
5112 if (Args.hasArg(options::OPT_gdwarf_3))
5113 CmdArgs.push_back("-gdwarf-3");
5114 if (Args.hasArg(options::OPT_gdwarf_4))
5115 CmdArgs.push_back("-gdwarf-4");
5116
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005117 // Add the -fdebug-compilation-dir flag if needed.
5118 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005119
5120 // Set the AT_producer to the clang version when using the integrated
5121 // assembler on assembly source files.
5122 CmdArgs.push_back("-dwarf-debug-producer");
5123 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005124 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005125
5126 // Optionally embed the -cc1as level arguments into the debug info, for build
5127 // analysis.
5128 if (getToolChain().UseDwarfDebugFlags()) {
5129 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005130 for (const auto &Arg : Args)
5131 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005132
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005133 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005134 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5135 Flags += Exec;
5136 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005137 SmallString<128> EscapedArg;
5138 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005139 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005140 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005141 }
5142 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005143 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005144 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005145
5146 // FIXME: Add -static support, once we have it.
5147
Daniel Sanders7f933f42015-01-30 17:35:23 +00005148 // Add target specific flags.
5149 switch(getToolChain().getArch()) {
5150 default:
5151 break;
5152
5153 case llvm::Triple::mips:
5154 case llvm::Triple::mipsel:
5155 case llvm::Triple::mips64:
5156 case llvm::Triple::mips64el:
5157 AddMIPSTargetArgs(Args, CmdArgs);
5158 break;
5159 }
5160
David Blaikie372d9502014-01-17 03:17:40 +00005161 // Consume all the warning flags. Usually this would be handled more
5162 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5163 // doesn't handle that so rather than warning about unused flags that are
5164 // actually used, we'll lie by omission instead.
5165 // FIXME: Stop lying and consume only the appropriate driver flags
5166 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5167 ie = Args.filtered_end();
5168 it != ie; ++it)
5169 (*it)->claim();
5170
David Blaikie9260ed62013-07-25 21:19:01 +00005171 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5172 getToolChain().getDriver());
5173
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005174 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005175
5176 assert(Output.isFilename() && "Unexpected lipo output.");
5177 CmdArgs.push_back("-o");
5178 CmdArgs.push_back(Output.getFilename());
5179
Daniel Dunbarb440f562010-08-02 02:38:21 +00005180 assert(Input.isFilename() && "Invalid input.");
5181 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005182
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005183 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005184 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005185
5186 // Handle the debug info splitting at object creation time if we're
5187 // creating an object.
5188 // TODO: Currently only works on linux with newer objcopy.
5189 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005190 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005191 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5192 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005193}
5194
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005195void GnuTool::anchor() {}
5196
Daniel Dunbara3246a02009-03-18 08:07:30 +00005197void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005198 const InputInfo &Output,
5199 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005200 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005201 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005202 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005203 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005205 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005206 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005207 // Don't forward any -g arguments to assembly steps.
5208 if (isa<AssembleJobAction>(JA) &&
5209 A->getOption().matches(options::OPT_g_Group))
5210 continue;
5211
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005212 // Don't forward any -W arguments to assembly and link steps.
5213 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5214 A->getOption().matches(options::OPT_W_Group))
5215 continue;
5216
Daniel Dunbar2da02722009-03-19 07:55:12 +00005217 // It is unfortunate that we have to claim here, as this means
5218 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005219 // platforms using a generic gcc, even if we are just using gcc
5220 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005221 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005222 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005223 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005224 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005225
Daniel Dunbar4e295052010-01-25 22:35:08 +00005226 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005227
5228 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005229 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005230 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005231 CmdArgs.push_back(
5232 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005233 }
5234
Daniel Dunbar5716d872009-05-02 21:41:52 +00005235 // Try to force gcc to match the tool chain we want, if we recognize
5236 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005237 //
5238 // FIXME: The triple class should directly provide the information we want
5239 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005240 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005241 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005242 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005243 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5244 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005245 CmdArgs.push_back("-m64");
5246
Daniel Dunbarb440f562010-08-02 02:38:21 +00005247 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005248 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005249 CmdArgs.push_back(Output.getFilename());
5250 } else {
5251 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005252 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005253 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005254
Tony Linthicum76329bf2011-12-12 21:14:55 +00005255 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5256 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005257
5258 // Only pass -x if gcc will understand it; otherwise hope gcc
5259 // understands the suffix correctly. The main use case this would go
5260 // wrong in is for linker inputs if they happened to have an odd
5261 // suffix; really the only way to get this to happen is a command
5262 // like '-x foobar a.c' which will treat a.c like a linker input.
5263 //
5264 // FIXME: For the linker case specifically, can we safely convert
5265 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005266 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005267 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005268 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5269 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005270 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005271 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005272 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005273 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005274 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005275 else if (II.getType() == types::TY_ModuleFile)
5276 D.Diag(diag::err_drv_no_module_support)
5277 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005278
Daniel Dunbara3246a02009-03-18 08:07:30 +00005279 if (types::canTypeBeUserSpecified(II.getType())) {
5280 CmdArgs.push_back("-x");
5281 CmdArgs.push_back(types::getTypeName(II.getType()));
5282 }
5283
Daniel Dunbarb440f562010-08-02 02:38:21 +00005284 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005285 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005286 else {
5287 const Arg &A = II.getInputArg();
5288
5289 // Reverse translate some rewritten options.
5290 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5291 CmdArgs.push_back("-lstdc++");
5292 continue;
5293 }
5294
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005295 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005296 A.render(Args, CmdArgs);
5297 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005298 }
5299
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005300 const std::string customGCCName = D.getCCCGenericGCCName();
5301 const char *GCCName;
5302 if (!customGCCName.empty())
5303 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005304 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005305 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005306 } else
5307 GCCName = "gcc";
5308
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005309 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005310 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005311 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005312}
5313
Daniel Dunbar4e295052010-01-25 22:35:08 +00005314void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5315 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005316 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005317}
5318
Daniel Dunbar4e295052010-01-25 22:35:08 +00005319void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5320 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005321 const Driver &D = getToolChain().getDriver();
5322
Eric Christophercc7ff502015-01-29 00:56:17 +00005323 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005324 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005325 case types::TY_LLVM_IR:
5326 case types::TY_LTO_IR:
5327 case types::TY_LLVM_BC:
5328 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005329 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005330 break;
5331 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005332 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005333 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005334 case types::TY_Nothing:
5335 CmdArgs.push_back("-fsyntax-only");
5336 break;
5337 default:
5338 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005339 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005340}
5341
Daniel Dunbar4e295052010-01-25 22:35:08 +00005342void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5343 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005344 // The types are (hopefully) good enough.
5345}
5346
Tony Linthicum76329bf2011-12-12 21:14:55 +00005347// Hexagon tools start.
5348void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5349 ArgStringList &CmdArgs) const {
5350
5351}
5352void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5353 const InputInfo &Output,
5354 const InputInfoList &Inputs,
5355 const ArgList &Args,
5356 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005357 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005358
5359 const Driver &D = getToolChain().getDriver();
5360 ArgStringList CmdArgs;
5361
5362 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005363 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005364 CmdArgs.push_back(Args.MakeArgString(MarchString));
5365
5366 RenderExtraToolArgs(JA, CmdArgs);
5367
5368 if (Output.isFilename()) {
5369 CmdArgs.push_back("-o");
5370 CmdArgs.push_back(Output.getFilename());
5371 } else {
5372 assert(Output.isNothing() && "Unexpected output");
5373 CmdArgs.push_back("-fsyntax-only");
5374 }
5375
Matthew Curtise8f80a12012-12-06 17:49:03 +00005376 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5377 if (!SmallDataThreshold.empty())
5378 CmdArgs.push_back(
5379 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005380
Matthew Curtise5df3812012-12-07 17:23:04 +00005381 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5382 options::OPT_Xassembler);
5383
Tony Linthicum76329bf2011-12-12 21:14:55 +00005384 // Only pass -x if gcc will understand it; otherwise hope gcc
5385 // understands the suffix correctly. The main use case this would go
5386 // wrong in is for linker inputs if they happened to have an odd
5387 // suffix; really the only way to get this to happen is a command
5388 // like '-x foobar a.c' which will treat a.c like a linker input.
5389 //
5390 // FIXME: For the linker case specifically, can we safely convert
5391 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005392 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005393 // Don't try to pass LLVM or AST inputs to a generic gcc.
5394 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5395 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5396 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5397 << getToolChain().getTripleString();
5398 else if (II.getType() == types::TY_AST)
5399 D.Diag(clang::diag::err_drv_no_ast_support)
5400 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005401 else if (II.getType() == types::TY_ModuleFile)
5402 D.Diag(diag::err_drv_no_module_support)
5403 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005404
5405 if (II.isFilename())
5406 CmdArgs.push_back(II.getFilename());
5407 else
5408 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5409 II.getInputArg().render(Args, CmdArgs);
5410 }
5411
5412 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005413 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005414 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005415}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005416
Tony Linthicum76329bf2011-12-12 21:14:55 +00005417void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5418 ArgStringList &CmdArgs) const {
5419 // The types are (hopefully) good enough.
5420}
5421
5422void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5423 const InputInfo &Output,
5424 const InputInfoList &Inputs,
5425 const ArgList &Args,
5426 const char *LinkingOutput) const {
5427
Matthew Curtise689b052012-12-06 15:46:07 +00005428 const toolchains::Hexagon_TC& ToolChain =
5429 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5430 const Driver &D = ToolChain.getDriver();
5431
Tony Linthicum76329bf2011-12-12 21:14:55 +00005432 ArgStringList CmdArgs;
5433
Matthew Curtise689b052012-12-06 15:46:07 +00005434 //----------------------------------------------------------------------------
5435 //
5436 //----------------------------------------------------------------------------
5437 bool hasStaticArg = Args.hasArg(options::OPT_static);
5438 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005439 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005440 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5441 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5442 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5443 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005444
Matthew Curtise689b052012-12-06 15:46:07 +00005445 //----------------------------------------------------------------------------
5446 // Silence warnings for various options
5447 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005448
Matthew Curtise689b052012-12-06 15:46:07 +00005449 Args.ClaimAllArgs(options::OPT_g_Group);
5450 Args.ClaimAllArgs(options::OPT_emit_llvm);
5451 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5452 // handled somewhere else.
5453 Args.ClaimAllArgs(options::OPT_static_libgcc);
5454
5455 //----------------------------------------------------------------------------
5456 //
5457 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005458 for (const auto &Opt : ToolChain.ExtraOpts)
5459 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005460
Matthew Curtisf10a5952012-12-06 14:16:43 +00005461 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5462 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005463
Matthew Curtise689b052012-12-06 15:46:07 +00005464 if (buildingLib) {
5465 CmdArgs.push_back("-shared");
5466 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5467 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005468 }
5469
Matthew Curtise689b052012-12-06 15:46:07 +00005470 if (hasStaticArg)
5471 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005472
Matthew Curtise8f80a12012-12-06 17:49:03 +00005473 if (buildPIE && !buildingLib)
5474 CmdArgs.push_back("-pie");
5475
5476 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5477 if (!SmallDataThreshold.empty()) {
5478 CmdArgs.push_back(
5479 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5480 }
5481
Matthew Curtise689b052012-12-06 15:46:07 +00005482 //----------------------------------------------------------------------------
5483 //
5484 //----------------------------------------------------------------------------
5485 CmdArgs.push_back("-o");
5486 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005487
Matthew Curtise689b052012-12-06 15:46:07 +00005488 const std::string MarchSuffix = "/" + MarchString;
5489 const std::string G0Suffix = "/G0";
5490 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005491 const std::string RootDir =
5492 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005493 const std::string StartFilesDir = RootDir
5494 + "hexagon/lib"
5495 + (buildingLib
5496 ? MarchG0Suffix : MarchSuffix);
5497
5498 //----------------------------------------------------------------------------
5499 // moslib
5500 //----------------------------------------------------------------------------
5501 std::vector<std::string> oslibs;
5502 bool hasStandalone= false;
5503
5504 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5505 ie = Args.filtered_end(); it != ie; ++it) {
5506 (*it)->claim();
5507 oslibs.push_back((*it)->getValue());
5508 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005509 }
Matthew Curtise689b052012-12-06 15:46:07 +00005510 if (oslibs.empty()) {
5511 oslibs.push_back("standalone");
5512 hasStandalone = true;
5513 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005514
Matthew Curtise689b052012-12-06 15:46:07 +00005515 //----------------------------------------------------------------------------
5516 // Start Files
5517 //----------------------------------------------------------------------------
5518 if (incStdLib && incStartFiles) {
5519
5520 if (!buildingLib) {
5521 if (hasStandalone) {
5522 CmdArgs.push_back(
5523 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5524 }
5525 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5526 }
5527 std::string initObj = useShared ? "/initS.o" : "/init.o";
5528 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5529 }
5530
5531 //----------------------------------------------------------------------------
5532 // Library Search Paths
5533 //----------------------------------------------------------------------------
5534 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005535 for (const auto &LibPath : LibPaths)
5536 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005537
5538 //----------------------------------------------------------------------------
5539 //
5540 //----------------------------------------------------------------------------
5541 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5542 Args.AddAllArgs(CmdArgs, options::OPT_e);
5543 Args.AddAllArgs(CmdArgs, options::OPT_s);
5544 Args.AddAllArgs(CmdArgs, options::OPT_t);
5545 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5546
5547 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5548
5549 //----------------------------------------------------------------------------
5550 // Libraries
5551 //----------------------------------------------------------------------------
5552 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005553 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005554 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5555 CmdArgs.push_back("-lm");
5556 }
5557
5558 CmdArgs.push_back("--start-group");
5559
5560 if (!buildingLib) {
5561 for(std::vector<std::string>::iterator i = oslibs.begin(),
5562 e = oslibs.end(); i != e; ++i)
5563 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5564 CmdArgs.push_back("-lc");
5565 }
5566 CmdArgs.push_back("-lgcc");
5567
5568 CmdArgs.push_back("--end-group");
5569 }
5570
5571 //----------------------------------------------------------------------------
5572 // End files
5573 //----------------------------------------------------------------------------
5574 if (incStdLib && incStartFiles) {
5575 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5576 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5577 }
5578
5579 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005580 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5581 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005582}
5583// Hexagon tools end.
5584
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005585/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005586const char *arm::getARMCPUForMArch(const ArgList &Args,
5587 const llvm::Triple &Triple) {
5588 StringRef MArch;
5589 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5590 // Otherwise, if we have -march= choose the base CPU for that arch.
5591 MArch = A->getValue();
5592 } else {
5593 // Otherwise, use the Arch from the triple.
5594 MArch = Triple.getArchName();
5595 }
5596
5597 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005598 if (MArch == "native") {
5599 std::string CPU = llvm::sys::getHostCPUName();
5600 if (CPU != "generic") {
5601 // Translate the native cpu into the architecture. The switch below will
5602 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005603 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005604 }
5605 }
5606
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005607 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005608}
5609
5610/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005611StringRef arm::getARMTargetCPU(const ArgList &Args,
5612 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005613 // FIXME: Warn on inconsistent use of -mcpu and -march.
5614 // If we have -mcpu=, use that.
5615 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5616 StringRef MCPU = A->getValue();
5617 // Handle -mcpu=native.
5618 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005619 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005620 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005621 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005622 }
5623
5624 return getARMCPUForMArch(Args, Triple);
5625}
5626
5627/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5628/// CPU.
5629//
5630// FIXME: This is redundant with -mcpu, why does LLVM use this.
5631// FIXME: tblgen this, or kill it!
5632const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5633 return llvm::StringSwitch<const char *>(CPU)
5634 .Case("strongarm", "v4")
5635 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5636 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5637 .Cases("arm920", "arm920t", "arm922t", "v4t")
5638 .Cases("arm940t", "ep9312","v4t")
5639 .Cases("arm10tdmi", "arm1020t", "v5")
5640 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5641 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5642 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005643 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5644 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5645 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005646 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005647 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005648 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005649 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005650 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5651 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005652 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005653 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005654 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005655 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005656 .Default("");
5657}
5658
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005659void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5660 if (Args.hasArg(options::OPT_r))
5661 return;
5662
5663 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5664 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5665 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005666 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005667 .Default("--be8");
5668
5669 if (LinkFlag)
5670 CmdArgs.push_back(LinkFlag);
5671}
5672
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005673mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5674 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5675 .Case("mips1", NanLegacy)
5676 .Case("mips2", NanLegacy)
5677 .Case("mips3", NanLegacy)
5678 .Case("mips4", NanLegacy)
5679 .Case("mips5", NanLegacy)
5680 .Case("mips32", NanLegacy)
5681 .Case("mips32r2", NanLegacy)
5682 .Case("mips32r3", NanLegacy | Nan2008)
5683 .Case("mips32r5", NanLegacy | Nan2008)
5684 .Case("mips32r6", Nan2008)
5685 .Case("mips64", NanLegacy)
5686 .Case("mips64r2", NanLegacy)
5687 .Case("mips64r3", NanLegacy | Nan2008)
5688 .Case("mips64r5", NanLegacy | Nan2008)
5689 .Case("mips64r6", Nan2008)
5690 .Default(NanLegacy);
5691}
5692
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005693bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5694 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5695 return A && (A->getValue() == StringRef(Value));
5696}
5697
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005698bool mips::isUCLibc(const ArgList &Args) {
5699 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005700 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005701}
5702
Daniel Sanders2bf13662014-07-10 14:40:57 +00005703bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005704 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5705 return llvm::StringSwitch<bool>(NaNArg->getValue())
5706 .Case("2008", true)
5707 .Case("legacy", false)
5708 .Default(false);
5709
5710 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005711 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5712 .Cases("mips32r6", "mips64r6", true)
5713 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005714
5715 return false;
5716}
5717
Daniel Sanders379d44b2014-07-16 11:52:23 +00005718bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5719 StringRef ABIName) {
5720 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005721 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005722 return false;
5723
5724 if (ABIName != "32")
5725 return false;
5726
5727 return llvm::StringSwitch<bool>(CPUName)
5728 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005729 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5730 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005731 .Default(false);
5732}
5733
Tim Northover157d9112014-01-16 08:48:16 +00005734llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005735 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5736 // archs which Darwin doesn't use.
5737
5738 // The matching this routine does is fairly pointless, since it is neither the
5739 // complete architecture list, nor a reasonable subset. The problem is that
5740 // historically the driver driver accepts this and also ties its -march=
5741 // handling to the architecture name, so we need to be careful before removing
5742 // support for it.
5743
5744 // This code must be kept in sync with Clang's Darwin specific argument
5745 // translation.
5746
5747 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5748 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5749 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5750 .Case("ppc64", llvm::Triple::ppc64)
5751 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5752 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5753 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005754 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005755 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005756 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005757 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005758 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005759 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005760 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005761 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005762 .Case("nvptx", llvm::Triple::nvptx)
5763 .Case("nvptx64", llvm::Triple::nvptx64)
5764 .Case("amdil", llvm::Triple::amdil)
5765 .Case("spir", llvm::Triple::spir)
5766 .Default(llvm::Triple::UnknownArch);
5767}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005768
Tim Northover157d9112014-01-16 08:48:16 +00005769void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5770 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5771 T.setArch(Arch);
5772
5773 if (Str == "x86_64h")
5774 T.setArchName(Str);
5775 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5776 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005777 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005778 }
5779}
5780
Bob Wilsondecc03e2012-11-23 06:14:39 +00005781const char *Clang::getBaseInputName(const ArgList &Args,
5782 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005783 return Args.MakeArgString(
5784 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005785}
5786
Bob Wilsondecc03e2012-11-23 06:14:39 +00005787const char *Clang::getBaseInputStem(const ArgList &Args,
5788 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005789 const char *Str = getBaseInputName(Args, Inputs);
5790
Chris Lattner906bb902011-01-16 08:14:11 +00005791 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005792 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005793
5794 return Str;
5795}
5796
Bob Wilsondecc03e2012-11-23 06:14:39 +00005797const char *Clang::getDependencyFileName(const ArgList &Args,
5798 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005799 // FIXME: Think about this more.
5800 std::string Res;
5801
5802 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005803 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005804 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005805 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005806 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005807 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005808 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005809}
5810
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005811void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5812 const InputInfo &Output,
5813 const InputInfoList &Inputs,
5814 const ArgList &Args,
5815 const char *LinkingOutput) const {
5816 const ToolChain &ToolChain = getToolChain();
5817 const Driver &D = ToolChain.getDriver();
5818 ArgStringList CmdArgs;
5819
5820 // Silence warning for "clang -g foo.o -o foo"
5821 Args.ClaimAllArgs(options::OPT_g_Group);
5822 // and "clang -emit-llvm foo.o -o foo"
5823 Args.ClaimAllArgs(options::OPT_emit_llvm);
5824 // and for "clang -w foo.o -o foo". Other warning options are already
5825 // handled somewhere else.
5826 Args.ClaimAllArgs(options::OPT_w);
5827
5828 if (!D.SysRoot.empty())
5829 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5830
5831 // CloudABI only supports static linkage.
5832 CmdArgs.push_back("-Bstatic");
5833 CmdArgs.push_back("--eh-frame-hdr");
5834 CmdArgs.push_back("--gc-sections");
5835
5836 if (Output.isFilename()) {
5837 CmdArgs.push_back("-o");
5838 CmdArgs.push_back(Output.getFilename());
5839 } else {
5840 assert(Output.isNothing() && "Invalid output.");
5841 }
5842
5843 if (!Args.hasArg(options::OPT_nostdlib) &&
5844 !Args.hasArg(options::OPT_nostartfiles)) {
5845 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5846 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5847 }
5848
5849 Args.AddAllArgs(CmdArgs, options::OPT_L);
5850 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5851 for (const auto &Path : Paths)
5852 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5853 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5854 Args.AddAllArgs(CmdArgs, options::OPT_e);
5855 Args.AddAllArgs(CmdArgs, options::OPT_s);
5856 Args.AddAllArgs(CmdArgs, options::OPT_t);
5857 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5858 Args.AddAllArgs(CmdArgs, options::OPT_r);
5859
5860 if (D.IsUsingLTO(ToolChain, Args))
5861 AddGoldPlugin(ToolChain, Args, CmdArgs);
5862
5863 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5864
5865 if (!Args.hasArg(options::OPT_nostdlib) &&
5866 !Args.hasArg(options::OPT_nodefaultlibs)) {
5867 if (D.CCCIsCXX())
5868 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5869 CmdArgs.push_back("-lc");
5870 CmdArgs.push_back("-lcompiler_rt");
5871 }
5872
5873 if (!Args.hasArg(options::OPT_nostdlib) &&
5874 !Args.hasArg(options::OPT_nostartfiles))
5875 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5876
5877 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5879}
5880
Daniel Dunbarbe220842009-03-20 16:06:39 +00005881void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005882 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005883 const InputInfoList &Inputs,
5884 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005885 const char *LinkingOutput) const {
5886 ArgStringList CmdArgs;
5887
5888 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5889 const InputInfo &Input = Inputs[0];
5890
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005891 // Determine the original source input.
5892 const Action *SourceAction = &JA;
5893 while (SourceAction->getKind() != Action::InputClass) {
5894 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5895 SourceAction = SourceAction->getInputs()[0];
5896 }
5897
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005898 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005899 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005900 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5901 // FIXME: at run-time detect assembler capabilities or rely on version
5902 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005903 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005904 const llvm::Triple &T(getToolChain().getTriple());
5905 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005906 CmdArgs.push_back("-Q");
5907 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005908
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005909 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005910 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005911 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005912 if (Args.hasArg(options::OPT_gstabs))
5913 CmdArgs.push_back("--gstabs");
5914 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005915 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005916 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005917
Daniel Dunbarbe220842009-03-20 16:06:39 +00005918 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005919 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005920
Daniel Dunbar6d484762010-07-22 01:47:22 +00005921 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005922 if (getToolChain().getArch() == llvm::Triple::x86 ||
5923 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005924 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5925 CmdArgs.push_back("-force_cpusubtype_ALL");
5926
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005927 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005928 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005929 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005930 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005931 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005932 CmdArgs.push_back("-static");
5933
Daniel Dunbarbe220842009-03-20 16:06:39 +00005934 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5935 options::OPT_Xassembler);
5936
5937 assert(Output.isFilename() && "Unexpected lipo output.");
5938 CmdArgs.push_back("-o");
5939 CmdArgs.push_back(Output.getFilename());
5940
Daniel Dunbarb440f562010-08-02 02:38:21 +00005941 assert(Input.isFilename() && "Invalid input.");
5942 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005943
5944 // asm_final spec is empty.
5945
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005946 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005947 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005948 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005949}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005950
Tim Northover157d9112014-01-16 08:48:16 +00005951void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005952
Tim Northover157d9112014-01-16 08:48:16 +00005953void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5954 ArgStringList &CmdArgs) const {
5955 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005956
Daniel Dunbarc1964212009-03-26 16:23:12 +00005957 // Derived from darwin_arch spec.
5958 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005959 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005960
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005961 // FIXME: Is this needed anymore?
5962 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005963 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005964}
5965
Bill Wendling3b2000f2012-10-02 18:02:50 +00005966bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5967 // We only need to generate a temp path for LTO if we aren't compiling object
5968 // files. When compiling source files, we run 'dsymutil' after linking. We
5969 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005970 for (const auto &Input : Inputs)
5971 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005972 return true;
5973
5974 return false;
5975}
5976
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005977void darwin::Link::AddLinkArgs(Compilation &C,
5978 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005979 ArgStringList &CmdArgs,
5980 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005981 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005982 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005983
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005984 unsigned Version[3] = { 0, 0, 0 };
5985 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5986 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005987 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005988 Version[1], Version[2], HadExtra) ||
5989 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005990 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005991 << A->getAsString(Args);
5992 }
5993
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005994 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005995 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005996 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5997 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005998
Bob Wilson3d27dad2013-08-02 22:25:34 +00005999 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6000 CmdArgs.push_back("-export_dynamic");
6001
Bob Wilsonb111ec92015-03-02 19:01:14 +00006002 // If we are using App Extension restrictions, pass a flag to the linker
6003 // telling it that the compiled code has been audited.
6004 if (Args.hasFlag(options::OPT_fapplication_extension,
6005 options::OPT_fno_application_extension, false))
6006 CmdArgs.push_back("-application_extension");
6007
Bill Wendling313b6bf2012-11-16 23:03:00 +00006008 // If we are using LTO, then automatically create a temporary file path for
6009 // the linker to use, so that it's lifetime will extend past a possible
6010 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006011 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6012 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006013 const char *TmpPath = C.getArgs().MakeArgString(
6014 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6015 C.addTempFile(TmpPath);
6016 CmdArgs.push_back("-object_path_lto");
6017 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006018 }
6019
Daniel Dunbarc1964212009-03-26 16:23:12 +00006020 // Derived from the "link" spec.
6021 Args.AddAllArgs(CmdArgs, options::OPT_static);
6022 if (!Args.hasArg(options::OPT_static))
6023 CmdArgs.push_back("-dynamic");
6024 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6025 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6026 // here. How do we wish to handle such things?
6027 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006028
Daniel Dunbarc1964212009-03-26 16:23:12 +00006029 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006030 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006031 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006032 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006033
6034 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6035 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6036 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6037
6038 Arg *A;
6039 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6040 (A = Args.getLastArg(options::OPT_current__version)) ||
6041 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006042 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006043 << A->getAsString(Args) << "-dynamiclib";
6044
6045 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6046 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6047 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6048 } else {
6049 CmdArgs.push_back("-dylib");
6050
6051 Arg *A;
6052 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6053 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6054 (A = Args.getLastArg(options::OPT_client__name)) ||
6055 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6056 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6057 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006059 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006060
Daniel Dunbarc1964212009-03-26 16:23:12 +00006061 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6062 "-dylib_compatibility_version");
6063 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6064 "-dylib_current_version");
6065
Tim Northover157d9112014-01-16 08:48:16 +00006066 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006067
6068 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6069 "-dylib_install_name");
6070 }
6071
6072 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6073 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6074 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006075 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006076 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006077 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6078 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6079 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6080 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6081 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6082 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006083 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006084 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6085 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6086 Args.AddAllArgs(CmdArgs, options::OPT_init);
6087
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006088 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006089 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006090
Daniel Dunbarc1964212009-03-26 16:23:12 +00006091 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6092 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6093 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6094 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6095 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006096
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006097 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6098 options::OPT_fno_pie,
6099 options::OPT_fno_PIE)) {
6100 if (A->getOption().matches(options::OPT_fpie) ||
6101 A->getOption().matches(options::OPT_fPIE))
6102 CmdArgs.push_back("-pie");
6103 else
6104 CmdArgs.push_back("-no_pie");
6105 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006106
6107 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6108 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6109 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6110 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6111 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6112 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6113 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6114 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6115 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6116 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6117 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6118 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6119 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6120 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6121 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6122 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006123
Daniel Dunbar84384642011-05-02 21:03:47 +00006124 // Give --sysroot= preference, over the Apple specific behavior to also use
6125 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006126 StringRef sysroot = C.getSysRoot();
6127 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006128 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006129 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006130 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6131 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006132 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006133 }
6134
Daniel Dunbarc1964212009-03-26 16:23:12 +00006135 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6136 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6137 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6138 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6139 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006140 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006141 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6142 Args.AddAllArgs(CmdArgs, options::OPT_y);
6143 Args.AddLastArg(CmdArgs, options::OPT_w);
6144 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6145 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6146 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6147 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6148 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6149 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6150 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6151 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6152 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6153 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6154 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6155 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6156}
6157
Alexey Bataev186b28a2014-03-06 05:43:53 +00006158enum LibOpenMP {
6159 LibUnknown,
6160 LibGOMP,
6161 LibIOMP5
6162};
6163
Daniel Dunbarc1964212009-03-26 16:23:12 +00006164void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006165 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006166 const InputInfoList &Inputs,
6167 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006168 const char *LinkingOutput) const {
6169 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006170
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006171 // If the number of arguments surpasses the system limits, we will encode the
6172 // input files in a separate file, shortening the command line. To this end,
6173 // build a list of input file names that can be passed via a file with the
6174 // -filelist linker option.
6175 llvm::opt::ArgStringList InputFileList;
6176
Daniel Dunbarc1964212009-03-26 16:23:12 +00006177 // The logic here is derived from gcc's behavior; most of which
6178 // comes from specs (starting with link_command). Consult gcc for
6179 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006180 ArgStringList CmdArgs;
6181
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006182 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6183 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6184 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006185 for (const auto &Arg : Args)
6186 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006187 const char *Exec =
6188 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6189 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006190 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006191 return;
6192 }
6193
Daniel Dunbarc1964212009-03-26 16:23:12 +00006194 // I'm not sure why this particular decomposition exists in gcc, but
6195 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006196 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006197
Daniel Dunbarc1964212009-03-26 16:23:12 +00006198 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6199 Args.AddAllArgs(CmdArgs, options::OPT_s);
6200 Args.AddAllArgs(CmdArgs, options::OPT_t);
6201 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6202 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006203 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006204 Args.AddAllArgs(CmdArgs, options::OPT_r);
6205
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006206 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6207 // members of static archive libraries which implement Objective-C classes or
6208 // categories.
6209 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6210 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006211
Daniel Dunbarc1964212009-03-26 16:23:12 +00006212 CmdArgs.push_back("-o");
6213 CmdArgs.push_back(Output.getFilename());
6214
Chad Rosier06fd3c62012-05-16 23:45:12 +00006215 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006216 !Args.hasArg(options::OPT_nostartfiles))
6217 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006218
6219 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006220
Alexey Bataev186b28a2014-03-06 05:43:53 +00006221 LibOpenMP UsedOpenMPLib = LibUnknown;
6222 if (Args.hasArg(options::OPT_fopenmp)) {
6223 UsedOpenMPLib = LibGOMP;
6224 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6225 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6226 .Case("libgomp", LibGOMP)
6227 .Case("libiomp5", LibIOMP5)
6228 .Default(LibUnknown);
6229 if (UsedOpenMPLib == LibUnknown)
6230 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6231 << A->getOption().getName() << A->getValue();
6232 }
6233 switch (UsedOpenMPLib) {
6234 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006235 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006236 break;
6237 case LibIOMP5:
6238 CmdArgs.push_back("-liomp5");
6239 break;
6240 case LibUnknown:
6241 break;
6242 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006243
Douglas Gregor9295df02012-05-15 21:00:27 +00006244 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006245 // Build the input file for -filelist (list of linker input files) in case we
6246 // need it later
6247 for (const auto &II : Inputs) {
6248 if (!II.isFilename()) {
6249 // This is a linker input argument.
6250 // We cannot mix input arguments and file names in a -filelist input, thus
6251 // we prematurely stop our list (remaining files shall be passed as
6252 // arguments).
6253 if (InputFileList.size() > 0)
6254 break;
6255
6256 continue;
6257 }
6258
6259 InputFileList.push_back(II.getFilename());
6260 }
6261
Bob Wilson16d93952012-05-15 18:57:39 +00006262 if (isObjCRuntimeLinked(Args) &&
6263 !Args.hasArg(options::OPT_nostdlib) &&
6264 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006265 // We use arclite library for both ARC and subscripting support.
6266 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6267
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006268 CmdArgs.push_back("-framework");
6269 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006270 // Link libobj.
6271 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006272 }
John McCall31168b02011-06-15 23:02:42 +00006273
Daniel Dunbarc1964212009-03-26 16:23:12 +00006274 if (LinkingOutput) {
6275 CmdArgs.push_back("-arch_multiple");
6276 CmdArgs.push_back("-final_output");
6277 CmdArgs.push_back(LinkingOutput);
6278 }
6279
Daniel Dunbarc1964212009-03-26 16:23:12 +00006280 if (Args.hasArg(options::OPT_fnested_functions))
6281 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006282
Daniel Dunbarc1964212009-03-26 16:23:12 +00006283 if (!Args.hasArg(options::OPT_nostdlib) &&
6284 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006285 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006286 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006287
Daniel Dunbarc1964212009-03-26 16:23:12 +00006288 // link_ssp spec is empty.
6289
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006290 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006291 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006292 }
6293
Chad Rosier06fd3c62012-05-16 23:45:12 +00006294 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006295 !Args.hasArg(options::OPT_nostartfiles)) {
6296 // endfile_spec is empty.
6297 }
6298
6299 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6300 Args.AddAllArgs(CmdArgs, options::OPT_F);
6301
Steven Wu3ffb61b2015-02-06 18:08:29 +00006302 // -iframework should be forwarded as -F.
6303 for (auto it = Args.filtered_begin(options::OPT_iframework),
6304 ie = Args.filtered_end(); it != ie; ++it)
6305 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6306 (*it)->getValue()));
6307
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006308 if (!Args.hasArg(options::OPT_nostdlib) &&
6309 !Args.hasArg(options::OPT_nodefaultlibs)) {
6310 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6311 if (A->getValue() == StringRef("Accelerate")) {
6312 CmdArgs.push_back("-framework");
6313 CmdArgs.push_back("Accelerate");
6314 }
6315 }
6316 }
6317
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006318 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006319 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006320 std::unique_ptr<Command> Cmd =
6321 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6322 Cmd->setInputFileList(std::move(InputFileList));
6323 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006324}
6325
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006326void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006327 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006328 const InputInfoList &Inputs,
6329 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006330 const char *LinkingOutput) const {
6331 ArgStringList CmdArgs;
6332
6333 CmdArgs.push_back("-create");
6334 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006335
6336 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006337 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006338
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006339 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006340 assert(II.isFilename() && "Unexpected lipo input.");
6341 CmdArgs.push_back(II.getFilename());
6342 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006343
6344 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006345 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006346}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006347
Daniel Dunbar88299622010-06-04 18:28:36 +00006348void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006349 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006350 const InputInfoList &Inputs,
6351 const ArgList &Args,
6352 const char *LinkingOutput) const {
6353 ArgStringList CmdArgs;
6354
Daniel Dunbareb86b042011-05-09 17:23:16 +00006355 CmdArgs.push_back("-o");
6356 CmdArgs.push_back(Output.getFilename());
6357
Daniel Dunbar88299622010-06-04 18:28:36 +00006358 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6359 const InputInfo &Input = Inputs[0];
6360 assert(Input.isFilename() && "Unexpected dsymutil input.");
6361 CmdArgs.push_back(Input.getFilename());
6362
Daniel Dunbar88299622010-06-04 18:28:36 +00006363 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006364 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006365 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006366}
6367
Eric Christopher551ef452011-08-23 17:56:55 +00006368void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006369 const InputInfo &Output,
6370 const InputInfoList &Inputs,
6371 const ArgList &Args,
6372 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006373 ArgStringList CmdArgs;
6374 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006375 CmdArgs.push_back("--debug-info");
6376 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006377 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006378
6379 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6380 const InputInfo &Input = Inputs[0];
6381 assert(Input.isFilename() && "Unexpected verify input");
6382
6383 // Grabbing the output of the earlier dsymutil run.
6384 CmdArgs.push_back(Input.getFilename());
6385
6386 const char *Exec =
6387 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006388 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006389}
6390
David Chisnallf571cde2012-02-15 13:39:01 +00006391void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6392 const InputInfo &Output,
6393 const InputInfoList &Inputs,
6394 const ArgList &Args,
6395 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006396 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006397 ArgStringList CmdArgs;
6398
6399 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6400 options::OPT_Xassembler);
6401
6402 CmdArgs.push_back("-o");
6403 CmdArgs.push_back(Output.getFilename());
6404
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006405 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006406 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006407
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006408 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006409 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006410}
6411
David Chisnallf571cde2012-02-15 13:39:01 +00006412void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6413 const InputInfo &Output,
6414 const InputInfoList &Inputs,
6415 const ArgList &Args,
6416 const char *LinkingOutput) const {
6417 // FIXME: Find a real GCC, don't hard-code versions here
6418 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6419 const llvm::Triple &T = getToolChain().getTriple();
6420 std::string LibPath = "/usr/lib/";
6421 llvm::Triple::ArchType Arch = T.getArch();
6422 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006423 case llvm::Triple::x86:
6424 GCCLibPath +=
6425 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6426 break;
6427 case llvm::Triple::x86_64:
6428 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6429 GCCLibPath += "/4.5.2/amd64/";
6430 LibPath += "amd64/";
6431 break;
6432 default:
6433 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006434 }
6435
6436 ArgStringList CmdArgs;
6437
David Chisnall272a0712012-02-29 15:06:12 +00006438 // Demangle C++ names in errors
6439 CmdArgs.push_back("-C");
6440
David Chisnallf571cde2012-02-15 13:39:01 +00006441 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6442 (!Args.hasArg(options::OPT_shared))) {
6443 CmdArgs.push_back("-e");
6444 CmdArgs.push_back("_start");
6445 }
6446
6447 if (Args.hasArg(options::OPT_static)) {
6448 CmdArgs.push_back("-Bstatic");
6449 CmdArgs.push_back("-dn");
6450 } else {
6451 CmdArgs.push_back("-Bdynamic");
6452 if (Args.hasArg(options::OPT_shared)) {
6453 CmdArgs.push_back("-shared");
6454 } else {
6455 CmdArgs.push_back("--dynamic-linker");
6456 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6457 }
6458 }
6459
6460 if (Output.isFilename()) {
6461 CmdArgs.push_back("-o");
6462 CmdArgs.push_back(Output.getFilename());
6463 } else {
6464 assert(Output.isNothing() && "Invalid output.");
6465 }
6466
6467 if (!Args.hasArg(options::OPT_nostdlib) &&
6468 !Args.hasArg(options::OPT_nostartfiles)) {
6469 if (!Args.hasArg(options::OPT_shared)) {
6470 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6471 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006472 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006473 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6474 } else {
6475 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006476 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6477 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006478 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006479 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006480 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006481 }
6482
6483 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6484
6485 Args.AddAllArgs(CmdArgs, options::OPT_L);
6486 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6487 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006488 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006489
6490 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6491
6492 if (!Args.hasArg(options::OPT_nostdlib) &&
6493 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006494 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006495 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006496 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006497 if (!Args.hasArg(options::OPT_shared)) {
6498 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006499 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006500 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006501 }
David Chisnallf571cde2012-02-15 13:39:01 +00006502 }
6503
6504 if (!Args.hasArg(options::OPT_nostdlib) &&
6505 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006506 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006507 }
David Chisnall96de9932012-02-16 16:00:47 +00006508 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006509
Alexey Samsonov7811d192014-02-20 13:57:37 +00006510 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006511
6512 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006513 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006514 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006515}
6516
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006517void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006518 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006519 const InputInfoList &Inputs,
6520 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006521 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006522 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006523 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006524 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006525
Rafael Espindolacc126272014-02-28 01:55:21 +00006526 switch (getToolChain().getArch()) {
6527 case llvm::Triple::x86:
6528 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6529 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006530 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006531 break;
6532
6533 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006534 CmdArgs.push_back("-mppc");
6535 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006536 break;
6537
6538 case llvm::Triple::sparc:
6539 CmdArgs.push_back("-32");
6540 NeedsKPIC = true;
6541 break;
6542
6543 case llvm::Triple::sparcv9:
6544 CmdArgs.push_back("-64");
6545 CmdArgs.push_back("-Av9a");
6546 NeedsKPIC = true;
6547 break;
6548
6549 case llvm::Triple::mips64:
6550 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006551 StringRef CPUName;
6552 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006553 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006554
6555 CmdArgs.push_back("-mabi");
6556 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6557
6558 if (getToolChain().getArch() == llvm::Triple::mips64)
6559 CmdArgs.push_back("-EB");
6560 else
6561 CmdArgs.push_back("-EL");
6562
Rafael Espindolacc126272014-02-28 01:55:21 +00006563 NeedsKPIC = true;
6564 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006565 }
6566
Rafael Espindolacc126272014-02-28 01:55:21 +00006567 default:
6568 break;
6569 }
6570
6571 if (NeedsKPIC)
6572 addAssemblerKPIC(Args, CmdArgs);
6573
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006574 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6575 options::OPT_Xassembler);
6576
6577 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006578 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006579
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006580 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006581 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006582
6583 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006584 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006585 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006586}
6587
6588void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006589 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006590 const InputInfoList &Inputs,
6591 const ArgList &Args,
6592 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006593 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006594 ArgStringList CmdArgs;
6595
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006596 // Silence warning for "clang -g foo.o -o foo"
6597 Args.ClaimAllArgs(options::OPT_g_Group);
6598 // and "clang -emit-llvm foo.o -o foo"
6599 Args.ClaimAllArgs(options::OPT_emit_llvm);
6600 // and for "clang -w foo.o -o foo". Other warning options are already
6601 // handled somewhere else.
6602 Args.ClaimAllArgs(options::OPT_w);
6603
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006604 if (getToolChain().getArch() == llvm::Triple::mips64)
6605 CmdArgs.push_back("-EB");
6606 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6607 CmdArgs.push_back("-EL");
6608
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006609 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006610 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006611 CmdArgs.push_back("-e");
6612 CmdArgs.push_back("__start");
6613 }
6614
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006615 if (Args.hasArg(options::OPT_static)) {
6616 CmdArgs.push_back("-Bstatic");
6617 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006618 if (Args.hasArg(options::OPT_rdynamic))
6619 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006620 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006621 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006622 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006623 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006624 } else {
6625 CmdArgs.push_back("-dynamic-linker");
6626 CmdArgs.push_back("/usr/libexec/ld.so");
6627 }
6628 }
6629
Rafael Espindola044f7832013-06-05 04:28:55 +00006630 if (Args.hasArg(options::OPT_nopie))
6631 CmdArgs.push_back("-nopie");
6632
Daniel Dunbarb440f562010-08-02 02:38:21 +00006633 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006634 CmdArgs.push_back("-o");
6635 CmdArgs.push_back(Output.getFilename());
6636 } else {
6637 assert(Output.isNothing() && "Invalid output.");
6638 }
6639
6640 if (!Args.hasArg(options::OPT_nostdlib) &&
6641 !Args.hasArg(options::OPT_nostartfiles)) {
6642 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006643 if (Args.hasArg(options::OPT_pg))
6644 CmdArgs.push_back(Args.MakeArgString(
6645 getToolChain().GetFilePath("gcrt0.o")));
6646 else
6647 CmdArgs.push_back(Args.MakeArgString(
6648 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006649 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006650 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006651 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006652 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006653 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006654 }
6655 }
6656
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006657 std::string Triple = getToolChain().getTripleString();
6658 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006659 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006660 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006661 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006662
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006663 Args.AddAllArgs(CmdArgs, options::OPT_L);
6664 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6665 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006666 Args.AddAllArgs(CmdArgs, options::OPT_s);
6667 Args.AddAllArgs(CmdArgs, options::OPT_t);
6668 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6669 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006670
Daniel Dunbar54423b22010-09-17 00:24:54 +00006671 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006672
6673 if (!Args.hasArg(options::OPT_nostdlib) &&
6674 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006675 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006676 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006677 if (Args.hasArg(options::OPT_pg))
6678 CmdArgs.push_back("-lm_p");
6679 else
6680 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006681 }
6682
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006683 // FIXME: For some reason GCC passes -lgcc before adding
6684 // the default system libraries. Just mimic this for now.
6685 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006686
Eric Christopher17674ec2012-09-13 06:32:34 +00006687 if (Args.hasArg(options::OPT_pthread)) {
6688 if (!Args.hasArg(options::OPT_shared) &&
6689 Args.hasArg(options::OPT_pg))
6690 CmdArgs.push_back("-lpthread_p");
6691 else
6692 CmdArgs.push_back("-lpthread");
6693 }
6694
Chandler Carruth45661652011-12-17 22:32:42 +00006695 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006696 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006697 CmdArgs.push_back("-lc_p");
6698 else
6699 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006700 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006701
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006702 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006703 }
6704
6705 if (!Args.hasArg(options::OPT_nostdlib) &&
6706 !Args.hasArg(options::OPT_nostartfiles)) {
6707 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006708 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006709 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006710 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006711 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006712 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006713 }
6714
6715 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006716 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006717 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006718}
Ed Schoutene33194b2009-04-02 19:13:12 +00006719
Eli Friedman9fa28852012-08-08 23:57:20 +00006720void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6721 const InputInfo &Output,
6722 const InputInfoList &Inputs,
6723 const ArgList &Args,
6724 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006725 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006726 ArgStringList CmdArgs;
6727
6728 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6729 options::OPT_Xassembler);
6730
6731 CmdArgs.push_back("-o");
6732 CmdArgs.push_back(Output.getFilename());
6733
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006734 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006735 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006736
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006737 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006738 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006739}
6740
6741void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6742 const InputInfo &Output,
6743 const InputInfoList &Inputs,
6744 const ArgList &Args,
6745 const char *LinkingOutput) const {
6746 const Driver &D = getToolChain().getDriver();
6747 ArgStringList CmdArgs;
6748
6749 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6750 (!Args.hasArg(options::OPT_shared))) {
6751 CmdArgs.push_back("-e");
6752 CmdArgs.push_back("__start");
6753 }
6754
6755 if (Args.hasArg(options::OPT_static)) {
6756 CmdArgs.push_back("-Bstatic");
6757 } else {
6758 if (Args.hasArg(options::OPT_rdynamic))
6759 CmdArgs.push_back("-export-dynamic");
6760 CmdArgs.push_back("--eh-frame-hdr");
6761 CmdArgs.push_back("-Bdynamic");
6762 if (Args.hasArg(options::OPT_shared)) {
6763 CmdArgs.push_back("-shared");
6764 } else {
6765 CmdArgs.push_back("-dynamic-linker");
6766 CmdArgs.push_back("/usr/libexec/ld.so");
6767 }
6768 }
6769
6770 if (Output.isFilename()) {
6771 CmdArgs.push_back("-o");
6772 CmdArgs.push_back(Output.getFilename());
6773 } else {
6774 assert(Output.isNothing() && "Invalid output.");
6775 }
6776
6777 if (!Args.hasArg(options::OPT_nostdlib) &&
6778 !Args.hasArg(options::OPT_nostartfiles)) {
6779 if (!Args.hasArg(options::OPT_shared)) {
6780 if (Args.hasArg(options::OPT_pg))
6781 CmdArgs.push_back(Args.MakeArgString(
6782 getToolChain().GetFilePath("gcrt0.o")));
6783 else
6784 CmdArgs.push_back(Args.MakeArgString(
6785 getToolChain().GetFilePath("crt0.o")));
6786 CmdArgs.push_back(Args.MakeArgString(
6787 getToolChain().GetFilePath("crtbegin.o")));
6788 } else {
6789 CmdArgs.push_back(Args.MakeArgString(
6790 getToolChain().GetFilePath("crtbeginS.o")));
6791 }
6792 }
6793
6794 Args.AddAllArgs(CmdArgs, options::OPT_L);
6795 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6796 Args.AddAllArgs(CmdArgs, options::OPT_e);
6797
6798 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6799
6800 if (!Args.hasArg(options::OPT_nostdlib) &&
6801 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006802 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006803 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6804 if (Args.hasArg(options::OPT_pg))
6805 CmdArgs.push_back("-lm_p");
6806 else
6807 CmdArgs.push_back("-lm");
6808 }
6809
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006810 if (Args.hasArg(options::OPT_pthread)) {
6811 if (!Args.hasArg(options::OPT_shared) &&
6812 Args.hasArg(options::OPT_pg))
6813 CmdArgs.push_back("-lpthread_p");
6814 else
6815 CmdArgs.push_back("-lpthread");
6816 }
6817
Eli Friedman9fa28852012-08-08 23:57:20 +00006818 if (!Args.hasArg(options::OPT_shared)) {
6819 if (Args.hasArg(options::OPT_pg))
6820 CmdArgs.push_back("-lc_p");
6821 else
6822 CmdArgs.push_back("-lc");
6823 }
6824
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006825 StringRef MyArch;
6826 switch (getToolChain().getTriple().getArch()) {
6827 case llvm::Triple::arm:
6828 MyArch = "arm";
6829 break;
6830 case llvm::Triple::x86:
6831 MyArch = "i386";
6832 break;
6833 case llvm::Triple::x86_64:
6834 MyArch = "amd64";
6835 break;
6836 default:
6837 llvm_unreachable("Unsupported architecture");
6838 }
6839 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006840 }
6841
6842 if (!Args.hasArg(options::OPT_nostdlib) &&
6843 !Args.hasArg(options::OPT_nostartfiles)) {
6844 if (!Args.hasArg(options::OPT_shared))
6845 CmdArgs.push_back(Args.MakeArgString(
6846 getToolChain().GetFilePath("crtend.o")));
6847 else
6848 CmdArgs.push_back(Args.MakeArgString(
6849 getToolChain().GetFilePath("crtendS.o")));
6850 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006851
6852 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006853 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006855}
6856
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006857void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006858 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006859 const InputInfoList &Inputs,
6860 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006861 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006862 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006863 ArgStringList CmdArgs;
6864
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006865 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6866 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006867 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006868 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006869 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006870 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006871 else if (getToolChain().getArch() == llvm::Triple::mips ||
6872 getToolChain().getArch() == llvm::Triple::mipsel ||
6873 getToolChain().getArch() == llvm::Triple::mips64 ||
6874 getToolChain().getArch() == llvm::Triple::mips64el) {
6875 StringRef CPUName;
6876 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006877 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006878
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006879 CmdArgs.push_back("-march");
6880 CmdArgs.push_back(CPUName.data());
6881
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006882 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006883 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006884
6885 if (getToolChain().getArch() == llvm::Triple::mips ||
6886 getToolChain().getArch() == llvm::Triple::mips64)
6887 CmdArgs.push_back("-EB");
6888 else
6889 CmdArgs.push_back("-EL");
6890
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006891 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006892 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006893 getToolChain().getArch() == llvm::Triple::armeb ||
6894 getToolChain().getArch() == llvm::Triple::thumb ||
6895 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006896 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006897 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006898 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6899
6900 if (FloatABI == "hard") {
6901 CmdArgs.push_back("-mfpu=vfp");
6902 } else {
6903 CmdArgs.push_back("-mfpu=softvfp");
6904 }
6905
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006906 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006907 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006908 case llvm::Triple::GNUEABI:
6909 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006910 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006911 break;
6912
6913 default:
6914 CmdArgs.push_back("-matpcs");
6915 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006916 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006917 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006918 if (getToolChain().getArch() == llvm::Triple::sparc)
6919 CmdArgs.push_back("-Av8plusa");
6920 else
6921 CmdArgs.push_back("-Av9a");
6922
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006923 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006924 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006925
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006926 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6927 options::OPT_Xassembler);
6928
6929 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006930 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006931
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006932 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006933 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006934
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006935 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006936 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006937}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006938
6939void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006940 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006941 const InputInfoList &Inputs,
6942 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006943 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006944 const toolchains::FreeBSD& ToolChain =
6945 static_cast<const toolchains::FreeBSD&>(getToolChain());
6946 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006947 const bool IsPIE =
6948 !Args.hasArg(options::OPT_shared) &&
6949 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006950 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006951
6952 // Silence warning for "clang -g foo.o -o foo"
6953 Args.ClaimAllArgs(options::OPT_g_Group);
6954 // and "clang -emit-llvm foo.o -o foo"
6955 Args.ClaimAllArgs(options::OPT_emit_llvm);
6956 // and for "clang -w foo.o -o foo". Other warning options are already
6957 // handled somewhere else.
6958 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006959
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006960 if (!D.SysRoot.empty())
6961 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6962
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006963 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006964 CmdArgs.push_back("-pie");
6965
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006966 if (Args.hasArg(options::OPT_static)) {
6967 CmdArgs.push_back("-Bstatic");
6968 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006969 if (Args.hasArg(options::OPT_rdynamic))
6970 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006971 CmdArgs.push_back("--eh-frame-hdr");
6972 if (Args.hasArg(options::OPT_shared)) {
6973 CmdArgs.push_back("-Bshareable");
6974 } else {
6975 CmdArgs.push_back("-dynamic-linker");
6976 CmdArgs.push_back("/libexec/ld-elf.so.1");
6977 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006978 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6979 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006980 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6981 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6982 CmdArgs.push_back("--hash-style=both");
6983 }
6984 }
6985 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006986 }
6987
6988 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6989 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006990 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006991 CmdArgs.push_back("-m");
6992 CmdArgs.push_back("elf_i386_fbsd");
6993 }
6994
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006995 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006996 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006997 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006998 }
6999
Daniel Dunbarb440f562010-08-02 02:38:21 +00007000 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007001 CmdArgs.push_back("-o");
7002 CmdArgs.push_back(Output.getFilename());
7003 } else {
7004 assert(Output.isNothing() && "Invalid output.");
7005 }
7006
7007 if (!Args.hasArg(options::OPT_nostdlib) &&
7008 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007009 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007010 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007011 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007012 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007013 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007014 crt1 = "Scrt1.o";
7015 else
7016 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007017 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007018 if (crt1)
7019 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7020
7021 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7022
Craig Topper92fc2df2014-05-17 16:56:41 +00007023 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007024 if (Args.hasArg(options::OPT_static))
7025 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007026 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007027 crtbegin = "crtbeginS.o";
7028 else
7029 crtbegin = "crtbegin.o";
7030
7031 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007032 }
7033
7034 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007035 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007036 for (const auto &Path : Paths)
7037 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007038 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7039 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007040 Args.AddAllArgs(CmdArgs, options::OPT_s);
7041 Args.AddAllArgs(CmdArgs, options::OPT_t);
7042 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7043 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007044
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007045 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007046 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007047
Alexey Samsonov52550342014-09-15 19:58:40 +00007048 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007049 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007050
7051 if (!Args.hasArg(options::OPT_nostdlib) &&
7052 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007053 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007054 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007055 if (Args.hasArg(options::OPT_pg))
7056 CmdArgs.push_back("-lm_p");
7057 else
7058 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007059 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007060 if (NeedsSanitizerDeps)
7061 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007062 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7063 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007064 if (Args.hasArg(options::OPT_pg))
7065 CmdArgs.push_back("-lgcc_p");
7066 else
7067 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007068 if (Args.hasArg(options::OPT_static)) {
7069 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007070 } else if (Args.hasArg(options::OPT_pg)) {
7071 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007072 } else {
7073 CmdArgs.push_back("--as-needed");
7074 CmdArgs.push_back("-lgcc_s");
7075 CmdArgs.push_back("--no-as-needed");
7076 }
7077
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007078 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007079 if (Args.hasArg(options::OPT_pg))
7080 CmdArgs.push_back("-lpthread_p");
7081 else
7082 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007083 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007084
Roman Divacky66f22762011-02-10 16:59:40 +00007085 if (Args.hasArg(options::OPT_pg)) {
7086 if (Args.hasArg(options::OPT_shared))
7087 CmdArgs.push_back("-lc");
7088 else
7089 CmdArgs.push_back("-lc_p");
7090 CmdArgs.push_back("-lgcc_p");
7091 } else {
7092 CmdArgs.push_back("-lc");
7093 CmdArgs.push_back("-lgcc");
7094 }
7095
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007096 if (Args.hasArg(options::OPT_static)) {
7097 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007098 } else if (Args.hasArg(options::OPT_pg)) {
7099 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007100 } else {
7101 CmdArgs.push_back("--as-needed");
7102 CmdArgs.push_back("-lgcc_s");
7103 CmdArgs.push_back("--no-as-needed");
7104 }
7105 }
7106
7107 if (!Args.hasArg(options::OPT_nostdlib) &&
7108 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007109 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007110 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007111 else
7112 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007113 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007114 }
7115
Alexey Samsonov7811d192014-02-20 13:57:37 +00007116 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007117
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007118 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007119 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007120 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007121}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007122
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007123void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7124 const InputInfo &Output,
7125 const InputInfoList &Inputs,
7126 const ArgList &Args,
7127 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007128 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007129 ArgStringList CmdArgs;
7130
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007131 // GNU as needs different flags for creating the correct output format
7132 // on architectures with different ABIs or optional feature sets.
7133 switch (getToolChain().getArch()) {
7134 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007135 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007136 break;
7137 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007138 case llvm::Triple::armeb:
7139 case llvm::Triple::thumb:
7140 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007141 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007142 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007143 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007144 }
7145
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007146 case llvm::Triple::mips:
7147 case llvm::Triple::mipsel:
7148 case llvm::Triple::mips64:
7149 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007150 StringRef CPUName;
7151 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007152 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007153
7154 CmdArgs.push_back("-march");
7155 CmdArgs.push_back(CPUName.data());
7156
7157 CmdArgs.push_back("-mabi");
7158 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7159
7160 if (getToolChain().getArch() == llvm::Triple::mips ||
7161 getToolChain().getArch() == llvm::Triple::mips64)
7162 CmdArgs.push_back("-EB");
7163 else
7164 CmdArgs.push_back("-EL");
7165
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007166 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007167 break;
7168 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007169
7170 case llvm::Triple::sparc:
7171 CmdArgs.push_back("-32");
7172 addAssemblerKPIC(Args, CmdArgs);
7173 break;
7174
7175 case llvm::Triple::sparcv9:
7176 CmdArgs.push_back("-64");
7177 CmdArgs.push_back("-Av9");
7178 addAssemblerKPIC(Args, CmdArgs);
7179 break;
7180
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007181 default:
7182 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007183 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007184
7185 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7186 options::OPT_Xassembler);
7187
7188 CmdArgs.push_back("-o");
7189 CmdArgs.push_back(Output.getFilename());
7190
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007191 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007192 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007193
David Chisnallddbd68f2011-09-27 22:03:18 +00007194 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007195 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007196}
7197
7198void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7199 const InputInfo &Output,
7200 const InputInfoList &Inputs,
7201 const ArgList &Args,
7202 const char *LinkingOutput) const {
7203 const Driver &D = getToolChain().getDriver();
7204 ArgStringList CmdArgs;
7205
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007206 if (!D.SysRoot.empty())
7207 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7208
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007209 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007210 if (Args.hasArg(options::OPT_static)) {
7211 CmdArgs.push_back("-Bstatic");
7212 } else {
7213 if (Args.hasArg(options::OPT_rdynamic))
7214 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007215 if (Args.hasArg(options::OPT_shared)) {
7216 CmdArgs.push_back("-Bshareable");
7217 } else {
7218 CmdArgs.push_back("-dynamic-linker");
7219 CmdArgs.push_back("/libexec/ld.elf_so");
7220 }
7221 }
7222
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007223 // Many NetBSD architectures support more than one ABI.
7224 // Determine the correct emulation for ld.
7225 switch (getToolChain().getArch()) {
7226 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007227 CmdArgs.push_back("-m");
7228 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007229 break;
7230 case llvm::Triple::arm:
7231 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007232 CmdArgs.push_back("-m");
7233 switch (getToolChain().getTriple().getEnvironment()) {
7234 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007235 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007236 CmdArgs.push_back("armelf_nbsd_eabi");
7237 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007238 case llvm::Triple::EABIHF:
7239 case llvm::Triple::GNUEABIHF:
7240 CmdArgs.push_back("armelf_nbsd_eabihf");
7241 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007242 default:
7243 CmdArgs.push_back("armelf_nbsd");
7244 break;
7245 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007246 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007247 case llvm::Triple::armeb:
7248 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007249 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007250 CmdArgs.push_back("-m");
7251 switch (getToolChain().getTriple().getEnvironment()) {
7252 case llvm::Triple::EABI:
7253 case llvm::Triple::GNUEABI:
7254 CmdArgs.push_back("armelfb_nbsd_eabi");
7255 break;
7256 case llvm::Triple::EABIHF:
7257 case llvm::Triple::GNUEABIHF:
7258 CmdArgs.push_back("armelfb_nbsd_eabihf");
7259 break;
7260 default:
7261 CmdArgs.push_back("armelfb_nbsd");
7262 break;
7263 }
7264 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007265 case llvm::Triple::mips64:
7266 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007267 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007268 CmdArgs.push_back("-m");
7269 if (getToolChain().getArch() == llvm::Triple::mips64)
7270 CmdArgs.push_back("elf32btsmip");
7271 else
7272 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007273 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007274 CmdArgs.push_back("-m");
7275 if (getToolChain().getArch() == llvm::Triple::mips64)
7276 CmdArgs.push_back("elf64btsmip");
7277 else
7278 CmdArgs.push_back("elf64ltsmip");
7279 }
7280 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007281 case llvm::Triple::ppc:
7282 CmdArgs.push_back("-m");
7283 CmdArgs.push_back("elf32ppc_nbsd");
7284 break;
7285
7286 case llvm::Triple::ppc64:
7287 case llvm::Triple::ppc64le:
7288 CmdArgs.push_back("-m");
7289 CmdArgs.push_back("elf64ppc");
7290 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007291
7292 case llvm::Triple::sparc:
7293 CmdArgs.push_back("-m");
7294 CmdArgs.push_back("elf32_sparc");
7295 break;
7296
7297 case llvm::Triple::sparcv9:
7298 CmdArgs.push_back("-m");
7299 CmdArgs.push_back("elf64_sparc");
7300 break;
7301
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007302 default:
7303 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007304 }
7305
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007306 if (Output.isFilename()) {
7307 CmdArgs.push_back("-o");
7308 CmdArgs.push_back(Output.getFilename());
7309 } else {
7310 assert(Output.isNothing() && "Invalid output.");
7311 }
7312
7313 if (!Args.hasArg(options::OPT_nostdlib) &&
7314 !Args.hasArg(options::OPT_nostartfiles)) {
7315 if (!Args.hasArg(options::OPT_shared)) {
7316 CmdArgs.push_back(Args.MakeArgString(
7317 getToolChain().GetFilePath("crt0.o")));
7318 CmdArgs.push_back(Args.MakeArgString(
7319 getToolChain().GetFilePath("crti.o")));
7320 CmdArgs.push_back(Args.MakeArgString(
7321 getToolChain().GetFilePath("crtbegin.o")));
7322 } else {
7323 CmdArgs.push_back(Args.MakeArgString(
7324 getToolChain().GetFilePath("crti.o")));
7325 CmdArgs.push_back(Args.MakeArgString(
7326 getToolChain().GetFilePath("crtbeginS.o")));
7327 }
7328 }
7329
7330 Args.AddAllArgs(CmdArgs, options::OPT_L);
7331 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7332 Args.AddAllArgs(CmdArgs, options::OPT_e);
7333 Args.AddAllArgs(CmdArgs, options::OPT_s);
7334 Args.AddAllArgs(CmdArgs, options::OPT_t);
7335 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7336 Args.AddAllArgs(CmdArgs, options::OPT_r);
7337
7338 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7339
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007340 unsigned Major, Minor, Micro;
7341 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7342 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007343 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007344 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007345 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007346 case llvm::Triple::arm:
7347 case llvm::Triple::armeb:
7348 case llvm::Triple::thumb:
7349 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007350 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007351 case llvm::Triple::ppc64:
7352 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007353 case llvm::Triple::x86:
7354 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007355 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007356 break;
7357 default:
7358 break;
7359 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007360 }
7361
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007362 if (!Args.hasArg(options::OPT_nostdlib) &&
7363 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007364 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007365 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7366 CmdArgs.push_back("-lm");
7367 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007368 if (Args.hasArg(options::OPT_pthread))
7369 CmdArgs.push_back("-lpthread");
7370 CmdArgs.push_back("-lc");
7371
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007372 if (useLibgcc) {
7373 if (Args.hasArg(options::OPT_static)) {
7374 // libgcc_eh depends on libc, so resolve as much as possible,
7375 // pull in any new requirements from libc and then get the rest
7376 // of libgcc.
7377 CmdArgs.push_back("-lgcc_eh");
7378 CmdArgs.push_back("-lc");
7379 CmdArgs.push_back("-lgcc");
7380 } else {
7381 CmdArgs.push_back("-lgcc");
7382 CmdArgs.push_back("--as-needed");
7383 CmdArgs.push_back("-lgcc_s");
7384 CmdArgs.push_back("--no-as-needed");
7385 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007386 }
7387 }
7388
7389 if (!Args.hasArg(options::OPT_nostdlib) &&
7390 !Args.hasArg(options::OPT_nostartfiles)) {
7391 if (!Args.hasArg(options::OPT_shared))
7392 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7393 "crtend.o")));
7394 else
7395 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7396 "crtendS.o")));
7397 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7398 "crtn.o")));
7399 }
7400
Alexey Samsonov7811d192014-02-20 13:57:37 +00007401 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007402
Logan Chieneb9162f2014-06-26 14:23:45 +00007403 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007404 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007405}
7406
Thomas Schwinge4e555262013-03-28 19:04:25 +00007407void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7408 const InputInfo &Output,
7409 const InputInfoList &Inputs,
7410 const ArgList &Args,
7411 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007412 claimNoWarnArgs(Args);
7413
Rafael Espindola92b00932010-08-10 00:25:48 +00007414 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007415 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007416
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007417 switch (getToolChain().getArch()) {
7418 default:
7419 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007420 // Add --32/--64 to make sure we get the format we want.
7421 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007422 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007423 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007424 break;
7425 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007426 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7427 CmdArgs.push_back("--x32");
7428 else
7429 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007430 break;
7431 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007432 CmdArgs.push_back("-a32");
7433 CmdArgs.push_back("-mppc");
7434 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007435 break;
7436 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007437 CmdArgs.push_back("-a64");
7438 CmdArgs.push_back("-mppc64");
7439 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007440 break;
7441 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007442 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007443 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007444 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007445 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007446 break;
7447 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007448 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007449 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007450 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007451 break;
7452 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007453 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007454 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007455 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007456 break;
7457 case llvm::Triple::arm:
7458 case llvm::Triple::armeb:
7459 case llvm::Triple::thumb:
7460 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007461 const llvm::Triple &Triple = getToolChain().getTriple();
7462 switch (Triple.getSubArch()) {
7463 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007464 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007465 break;
7466 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007467 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007468 break;
7469 default:
7470 break;
7471 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007472
Tim Northover9c7e0352013-12-12 11:55:52 +00007473 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007474 getToolChain().getDriver(), Args,
7475 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007476 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007477
7478 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007479
7480 // FIXME: remove krait check when GNU tools support krait cpu
7481 // for now replace it with -march=armv7-a to avoid a lower
7482 // march from being picked in the absence of a cpu flag.
7483 Arg *A;
7484 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7485 StringRef(A->getValue()) == "krait")
7486 CmdArgs.push_back("-march=armv7-a");
7487 else
7488 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007489 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007490 break;
7491 }
7492 case llvm::Triple::mips:
7493 case llvm::Triple::mipsel:
7494 case llvm::Triple::mips64:
7495 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007496 StringRef CPUName;
7497 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007498 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007499 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007500
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007501 CmdArgs.push_back("-march");
7502 CmdArgs.push_back(CPUName.data());
7503
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007504 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007505 CmdArgs.push_back(ABIName.data());
7506
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007507 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7508 // or -mshared (not implemented) is in effect.
7509 bool IsPicOrPie = false;
7510 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7511 options::OPT_fpic, options::OPT_fno_pic,
7512 options::OPT_fPIE, options::OPT_fno_PIE,
7513 options::OPT_fpie, options::OPT_fno_pie)) {
7514 if (A->getOption().matches(options::OPT_fPIC) ||
7515 A->getOption().matches(options::OPT_fpic) ||
7516 A->getOption().matches(options::OPT_fPIE) ||
7517 A->getOption().matches(options::OPT_fpie))
7518 IsPicOrPie = true;
7519 }
7520 if (!IsPicOrPie)
7521 CmdArgs.push_back("-mno-shared");
7522
Daniel Sanders379d44b2014-07-16 11:52:23 +00007523 // LLVM doesn't support -mplt yet and acts as if it is always given.
7524 // However, -mplt has no effect with the N64 ABI.
7525 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007526
7527 if (getToolChain().getArch() == llvm::Triple::mips ||
7528 getToolChain().getArch() == llvm::Triple::mips64)
7529 CmdArgs.push_back("-EB");
7530 else
7531 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007532
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007533 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7534 if (StringRef(A->getValue()) == "2008")
7535 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7536 }
7537
Daniel Sanders379d44b2014-07-16 11:52:23 +00007538 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7539 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7540 options::OPT_mfp64)) {
7541 A->claim();
7542 A->render(Args, CmdArgs);
7543 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7544 ABIName))
7545 CmdArgs.push_back("-mfpxx");
7546
7547 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7548 // -mno-mips16 is actually -no-mips16.
7549 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7550 options::OPT_mno_mips16)) {
7551 if (A->getOption().matches(options::OPT_mips16)) {
7552 A->claim();
7553 A->render(Args, CmdArgs);
7554 } else {
7555 A->claim();
7556 CmdArgs.push_back("-no-mips16");
7557 }
7558 }
7559
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007560 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7561 options::OPT_mno_micromips);
7562 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7563 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7564
Simon Atanasyanbd986632013-11-26 11:58:04 +00007565 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7566 // Do not use AddLastArg because not all versions of MIPS assembler
7567 // support -mmsa / -mno-msa options.
7568 if (A->getOption().matches(options::OPT_mmsa))
7569 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7570 }
7571
Daniel Sanders379d44b2014-07-16 11:52:23 +00007572 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7573 options::OPT_msoft_float);
7574
7575 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7576 options::OPT_mno_odd_spreg);
7577
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007578 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007579 break;
7580 }
7581 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007582 // Always pass an -march option, since our default of z10 is later
7583 // than the GNU assembler's default.
7584 StringRef CPUName = getSystemZTargetCPU(Args);
7585 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007586 break;
7587 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007588 }
7589
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007590 if (NeedsKPIC)
7591 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007592
7593 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7594 options::OPT_Xassembler);
7595
7596 CmdArgs.push_back("-o");
7597 CmdArgs.push_back(Output.getFilename());
7598
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007599 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007600 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007601
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007602 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007603 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007604
7605 // Handle the debug info splitting at object creation time if we're
7606 // creating an object.
7607 // TODO: Currently only works on linux with newer objcopy.
7608 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007609 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007610 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7611 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007612}
7613
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007614static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007615 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007616 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007617 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7618 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007619 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007620 CmdArgs.push_back("-lgcc");
7621
Logan Chien3d3373c2012-11-19 12:04:11 +00007622 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007623 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007624 CmdArgs.push_back("-lgcc");
7625 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007626 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007627 CmdArgs.push_back("--as-needed");
7628 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007629 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007630 CmdArgs.push_back("--no-as-needed");
7631 }
7632
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007633 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007634 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007635 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007636 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007637
7638 // According to Android ABI, we have to link with libdl if we are
7639 // linking with non-static libgcc.
7640 //
7641 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7642 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7643 if (isAndroid && !StaticLibgcc)
7644 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007645}
7646
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007647static std::string getLinuxDynamicLinker(const ArgList &Args,
7648 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007649 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7650 if (ToolChain.getTriple().isArch64Bit())
7651 return "/system/bin/linker64";
7652 else
7653 return "/system/bin/linker";
7654 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7655 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007656 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007657 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007658 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007659 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007660 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007661 else if (ToolChain.getArch() == llvm::Triple::arm ||
7662 ToolChain.getArch() == llvm::Triple::thumb) {
7663 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7664 return "/lib/ld-linux-armhf.so.3";
7665 else
7666 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007667 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7668 ToolChain.getArch() == llvm::Triple::thumbeb) {
7669 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7670 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7671 else
7672 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007673 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007674 ToolChain.getArch() == llvm::Triple::mipsel ||
7675 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007676 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007677 StringRef CPUName;
7678 StringRef ABIName;
7679 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7680 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7681
7682 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7683 .Case("o32", "/lib")
7684 .Case("n32", "/lib32")
7685 .Case("n64", "/lib64")
7686 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007687 StringRef LibName;
7688 if (mips::isUCLibc(Args))
7689 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7690 else
7691 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007692
7693 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007694 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7695 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007696 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7697 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7698 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007699 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007700 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7701 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7702 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007703 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007704 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7705 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007706 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7707 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007708 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7709 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7710 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007711 else
7712 return "/lib64/ld-linux-x86-64.so.2";
7713}
7714
Renato Golinc4b49242014-02-13 10:01:16 +00007715static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007716 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007717 // Make use of compiler-rt if --rtlib option is used
7718 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7719
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007720 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007721 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007722 switch (TC.getTriple().getOS()) {
7723 default: llvm_unreachable("unsupported OS");
7724 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007725 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007726 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007727 break;
7728 }
Renato Golinc4b49242014-02-13 10:01:16 +00007729 break;
7730 case ToolChain::RLT_Libgcc:
7731 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7732 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007733 }
7734}
7735
Rafael Espindola1e085772014-08-15 17:14:35 +00007736static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7737 switch (T.getArch()) {
7738 case llvm::Triple::x86:
7739 return "elf_i386";
7740 case llvm::Triple::aarch64:
7741 return "aarch64linux";
7742 case llvm::Triple::aarch64_be:
7743 return "aarch64_be_linux";
7744 case llvm::Triple::arm:
7745 case llvm::Triple::thumb:
7746 return "armelf_linux_eabi";
7747 case llvm::Triple::armeb:
7748 case llvm::Triple::thumbeb:
7749 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7750 case llvm::Triple::ppc:
7751 return "elf32ppclinux";
7752 case llvm::Triple::ppc64:
7753 return "elf64ppc";
7754 case llvm::Triple::ppc64le:
7755 return "elf64lppc";
7756 case llvm::Triple::sparc:
7757 return "elf32_sparc";
7758 case llvm::Triple::sparcv9:
7759 return "elf64_sparc";
7760 case llvm::Triple::mips:
7761 return "elf32btsmip";
7762 case llvm::Triple::mipsel:
7763 return "elf32ltsmip";
7764 case llvm::Triple::mips64:
7765 if (mips::hasMipsAbiArg(Args, "n32"))
7766 return "elf32btsmipn32";
7767 return "elf64btsmip";
7768 case llvm::Triple::mips64el:
7769 if (mips::hasMipsAbiArg(Args, "n32"))
7770 return "elf32ltsmipn32";
7771 return "elf64ltsmip";
7772 case llvm::Triple::systemz:
7773 return "elf64_s390";
7774 case llvm::Triple::x86_64:
7775 if (T.getEnvironment() == llvm::Triple::GNUX32)
7776 return "elf32_x86_64";
7777 return "elf_x86_64";
7778 default:
7779 llvm_unreachable("Unexpected arch");
7780 }
7781}
7782
Thomas Schwinge4e555262013-03-28 19:04:25 +00007783void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7784 const InputInfo &Output,
7785 const InputInfoList &Inputs,
7786 const ArgList &Args,
7787 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007788 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007789 static_cast<const toolchains::Linux&>(getToolChain());
7790 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007791 const bool isAndroid =
7792 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007793 const bool IsPIE =
7794 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007795 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007796 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007797
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007798 ArgStringList CmdArgs;
7799
Rafael Espindolad1002f62010-11-15 18:28:16 +00007800 // Silence warning for "clang -g foo.o -o foo"
7801 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007802 // and "clang -emit-llvm foo.o -o foo"
7803 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007804 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007805 // handled somewhere else.
7806 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007807
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007808 if (!D.SysRoot.empty())
7809 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007810
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007811 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007812 CmdArgs.push_back("-pie");
7813
Rafael Espindola1c76c592010-11-07 22:57:16 +00007814 if (Args.hasArg(options::OPT_rdynamic))
7815 CmdArgs.push_back("-export-dynamic");
7816
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007817 if (Args.hasArg(options::OPT_s))
7818 CmdArgs.push_back("-s");
7819
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007820 if (ToolChain.getArch() == llvm::Triple::armeb ||
7821 ToolChain.getArch() == llvm::Triple::thumbeb)
7822 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7823
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007824 for (const auto &Opt : ToolChain.ExtraOpts)
7825 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007826
7827 if (!Args.hasArg(options::OPT_static)) {
7828 CmdArgs.push_back("--eh-frame-hdr");
7829 }
7830
7831 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007832 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007833
7834 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007835 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007836 ToolChain.getArch() == llvm::Triple::armeb ||
7837 ToolChain.getArch() == llvm::Triple::thumb ||
7838 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007839 CmdArgs.push_back("-Bstatic");
7840 else
7841 CmdArgs.push_back("-static");
7842 } else if (Args.hasArg(options::OPT_shared)) {
7843 CmdArgs.push_back("-shared");
7844 }
7845
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007846 if (ToolChain.getArch() == llvm::Triple::arm ||
7847 ToolChain.getArch() == llvm::Triple::armeb ||
7848 ToolChain.getArch() == llvm::Triple::thumb ||
7849 ToolChain.getArch() == llvm::Triple::thumbeb ||
7850 (!Args.hasArg(options::OPT_static) &&
7851 !Args.hasArg(options::OPT_shared))) {
7852 CmdArgs.push_back("-dynamic-linker");
7853 CmdArgs.push_back(Args.MakeArgString(
7854 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7855 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007856
7857 CmdArgs.push_back("-o");
7858 CmdArgs.push_back(Output.getFilename());
7859
Rafael Espindola81937ec2010-12-01 01:52:43 +00007860 if (!Args.hasArg(options::OPT_nostdlib) &&
7861 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007862 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007863 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007864 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007865 if (Args.hasArg(options::OPT_pg))
7866 crt1 = "gcrt1.o";
7867 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007868 crt1 = "Scrt1.o";
7869 else
7870 crt1 = "crt1.o";
7871 }
7872 if (crt1)
7873 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007874
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007875 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7876 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007877
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007878 const char *crtbegin;
7879 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007880 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007881 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007882 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007883 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007884 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007885 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007886 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007887 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007888
7889 // Add crtfastmath.o if available and fast math is enabled.
7890 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007891 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007892
7893 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007894 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007895
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007896 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007897
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007898 for (const auto &Path : Paths)
7899 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007900
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007901 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007902 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007903
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007904 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7905 CmdArgs.push_back("--no-demangle");
7906
Alexey Samsonov52550342014-09-15 19:58:40 +00007907 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007908 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007909 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007910 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007911
Hans Wennborg70850d82013-07-18 20:29:38 +00007912 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007913 !Args.hasArg(options::OPT_nostdlib) &&
7914 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007915 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7916 !Args.hasArg(options::OPT_static);
7917 if (OnlyLibstdcxxStatic)
7918 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007919 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007920 if (OnlyLibstdcxxStatic)
7921 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007922 CmdArgs.push_back("-lm");
7923 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007924 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7925 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007926
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007927 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007928 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7929 if (Args.hasArg(options::OPT_static))
7930 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007931
Alexey Samsonov52550342014-09-15 19:58:40 +00007932 if (NeedsSanitizerDeps)
7933 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7934
Alexey Bataev186b28a2014-03-06 05:43:53 +00007935 LibOpenMP UsedOpenMPLib = LibUnknown;
7936 if (Args.hasArg(options::OPT_fopenmp)) {
7937 UsedOpenMPLib = LibGOMP;
7938 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7939 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7940 .Case("libgomp", LibGOMP)
7941 .Case("libiomp5", LibIOMP5)
7942 .Default(LibUnknown);
7943 if (UsedOpenMPLib == LibUnknown)
7944 D.Diag(diag::err_drv_unsupported_option_argument)
7945 << A->getOption().getName() << A->getValue();
7946 }
7947 switch (UsedOpenMPLib) {
7948 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007949 CmdArgs.push_back("-lgomp");
7950
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007951 // FIXME: Exclude this for platforms with libgomp that don't require
7952 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007953 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007954 break;
7955 case LibIOMP5:
7956 CmdArgs.push_back("-liomp5");
7957 break;
7958 case LibUnknown:
7959 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007960 }
Renato Golinc4b49242014-02-13 10:01:16 +00007961 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007962
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007963 if ((Args.hasArg(options::OPT_pthread) ||
7964 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7965 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007966 CmdArgs.push_back("-lpthread");
7967
7968 CmdArgs.push_back("-lc");
7969
7970 if (Args.hasArg(options::OPT_static))
7971 CmdArgs.push_back("--end-group");
7972 else
Renato Golinc4b49242014-02-13 10:01:16 +00007973 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007974 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007975
Rafael Espindola81937ec2010-12-01 01:52:43 +00007976 if (!Args.hasArg(options::OPT_nostartfiles)) {
7977 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007978 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007979 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007980 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007981 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007982 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007983 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007984
Rafael Espindola81937ec2010-12-01 01:52:43 +00007985 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007986 if (!isAndroid)
7987 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007988 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007989 }
7990
David Blaikiec11bf802014-09-04 16:04:28 +00007991 C.addCommand(
7992 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007993}
7994
Derek Schuff6ab52fa2015-03-30 20:31:33 +00007995
7996// NaCl ARM assembly (inline or standalone) can be written with a set of macros
7997// for the various SFI requirements like register masking. The assembly tool
7998// inserts the file containing the macros as an input into all the assembly
7999// jobs.
8000void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8001 const InputInfo &Output,
8002 const InputInfoList &Inputs,
8003 const ArgList &Args,
8004 const char *LinkingOutput) const {
8005 const toolchains::NaCl_TC& ToolChain =
8006 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8007 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8008 "nacl-arm-macros.s");
8009 InputInfoList NewInputs;
8010 NewInputs.push_back(NaClMacros);
8011 NewInputs.append(Inputs.begin(), Inputs.end());
8012 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8013 LinkingOutput);
8014}
8015
8016
8017// This is quite similar to gnutools::link::ConstructJob with changes that
8018// we use static by default, do not yet support sanitizers or LTO, and a few
8019// others. Eventually we can support more of that and hopefully migrate back
8020// to gnutools::link.
8021void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8022 const InputInfo &Output,
8023 const InputInfoList &Inputs,
8024 const ArgList &Args,
8025 const char *LinkingOutput) const {
8026
8027 const toolchains::NaCl_TC& ToolChain =
8028 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8029 const Driver &D = ToolChain.getDriver();
8030 const bool IsStatic =
8031 !Args.hasArg(options::OPT_dynamic) &&
8032 !Args.hasArg(options::OPT_shared);
8033
8034 ArgStringList CmdArgs;
8035
8036 // Silence warning for "clang -g foo.o -o foo"
8037 Args.ClaimAllArgs(options::OPT_g_Group);
8038 // and "clang -emit-llvm foo.o -o foo"
8039 Args.ClaimAllArgs(options::OPT_emit_llvm);
8040 // and for "clang -w foo.o -o foo". Other warning options are already
8041 // handled somewhere else.
8042 Args.ClaimAllArgs(options::OPT_w);
8043
8044 if (!D.SysRoot.empty())
8045 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8046
8047 if (Args.hasArg(options::OPT_rdynamic))
8048 CmdArgs.push_back("-export-dynamic");
8049
8050 if (Args.hasArg(options::OPT_s))
8051 CmdArgs.push_back("-s");
8052
8053 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8054 // there is --build-id, which we do want.
8055 CmdArgs.push_back("--build-id");
8056
8057 if (!IsStatic)
8058 CmdArgs.push_back("--eh-frame-hdr");
8059
8060 CmdArgs.push_back("-m");
8061 if (ToolChain.getArch() == llvm::Triple::x86)
8062 CmdArgs.push_back("elf_i386_nacl");
8063 else if (ToolChain.getArch() == llvm::Triple::arm)
8064 CmdArgs.push_back("armelf_nacl");
8065 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8066 CmdArgs.push_back("elf_x86_64_nacl");
8067 else
8068 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8069 "Native Client";
8070
8071
8072 if (IsStatic)
8073 CmdArgs.push_back("-static");
8074 else if (Args.hasArg(options::OPT_shared))
8075 CmdArgs.push_back("-shared");
8076
8077 CmdArgs.push_back("-o");
8078 CmdArgs.push_back(Output.getFilename());
8079 if (!Args.hasArg(options::OPT_nostdlib) &&
8080 !Args.hasArg(options::OPT_nostartfiles)) {
8081 if (!Args.hasArg(options::OPT_shared))
8082 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8083 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8084
8085 const char *crtbegin;
8086 if (IsStatic)
8087 crtbegin = "crtbeginT.o";
8088 else if (Args.hasArg(options::OPT_shared))
8089 crtbegin = "crtbeginS.o";
8090 else
8091 crtbegin = "crtbegin.o";
8092 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8093 }
8094
8095 Args.AddAllArgs(CmdArgs, options::OPT_L);
8096 Args.AddAllArgs(CmdArgs, options::OPT_u);
8097
8098 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8099
8100 for (const auto &Path : Paths)
8101 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8102
8103 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8104 CmdArgs.push_back("--no-demangle");
8105
8106 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8107
8108 if (D.CCCIsCXX() &&
8109 !Args.hasArg(options::OPT_nostdlib) &&
8110 !Args.hasArg(options::OPT_nodefaultlibs)) {
8111 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8112 !IsStatic;
8113 if (OnlyLibstdcxxStatic)
8114 CmdArgs.push_back("-Bstatic");
8115 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8116 if (OnlyLibstdcxxStatic)
8117 CmdArgs.push_back("-Bdynamic");
8118 CmdArgs.push_back("-lm");
8119 }
8120
8121 if (!Args.hasArg(options::OPT_nostdlib)) {
8122 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8123 // Always use groups, since it has no effect on dynamic libraries.
8124 CmdArgs.push_back("--start-group");
8125 CmdArgs.push_back("-lc");
8126 // NaCl's libc++ currently requires libpthread, so just always include it
8127 // in the group for C++.
8128 if (Args.hasArg(options::OPT_pthread) ||
8129 Args.hasArg(options::OPT_pthreads) ||
8130 D.CCCIsCXX()) {
8131 CmdArgs.push_back("-lpthread");
8132 }
8133
8134 CmdArgs.push_back("-lgcc");
8135 CmdArgs.push_back("--as-needed");
8136 if (IsStatic)
8137 CmdArgs.push_back("-lgcc_eh");
8138 else
8139 CmdArgs.push_back("-lgcc_s");
8140 CmdArgs.push_back("--no-as-needed");
8141 CmdArgs.push_back("--end-group");
8142 }
8143
8144 if (!Args.hasArg(options::OPT_nostartfiles)) {
8145 const char *crtend;
8146 if (Args.hasArg(options::OPT_shared))
8147 crtend = "crtendS.o";
8148 else
8149 crtend = "crtend.o";
8150
8151 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8152 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8153 }
8154 }
8155
8156 C.addCommand(llvm::make_unique<Command>(JA, *this,
8157 ToolChain.Linker.c_str(), CmdArgs));
8158}
8159
8160
Chris Lattner3e2ee142010-07-07 16:01:42 +00008161void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008162 const InputInfo &Output,
8163 const InputInfoList &Inputs,
8164 const ArgList &Args,
8165 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008166 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008167 ArgStringList CmdArgs;
8168
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008169 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008170
8171 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008172 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008173
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008174 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008175 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008176
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008177 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008179}
8180
8181void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008182 const InputInfo &Output,
8183 const InputInfoList &Inputs,
8184 const ArgList &Args,
8185 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008186 const Driver &D = getToolChain().getDriver();
8187 ArgStringList CmdArgs;
8188
Daniel Dunbarb440f562010-08-02 02:38:21 +00008189 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008190 CmdArgs.push_back("-o");
8191 CmdArgs.push_back(Output.getFilename());
8192 } else {
8193 assert(Output.isNothing() && "Invalid output.");
8194 }
8195
8196 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008197 !Args.hasArg(options::OPT_nostartfiles)) {
8198 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8199 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8200 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8201 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8202 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008203
8204 Args.AddAllArgs(CmdArgs, options::OPT_L);
8205 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8206 Args.AddAllArgs(CmdArgs, options::OPT_e);
8207
Daniel Dunbar54423b22010-09-17 00:24:54 +00008208 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008209
Alexey Samsonov7811d192014-02-20 13:57:37 +00008210 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008211
Chris Lattner3e2ee142010-07-07 16:01:42 +00008212 if (!Args.hasArg(options::OPT_nostdlib) &&
8213 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008214 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008215 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008216 CmdArgs.push_back("-lm");
8217 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008218 }
8219
8220 if (!Args.hasArg(options::OPT_nostdlib) &&
8221 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008222 if (Args.hasArg(options::OPT_pthread))
8223 CmdArgs.push_back("-lpthread");
8224 CmdArgs.push_back("-lc");
8225 CmdArgs.push_back("-lCompilerRT-Generic");
8226 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8227 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008228 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008229 }
8230
Logan Chieneb9162f2014-06-26 14:23:45 +00008231 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008232 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008233}
8234
Daniel Dunbarcc912342009-05-02 18:28:39 +00008235/// DragonFly Tools
8236
8237// For now, DragonFly Assemble does just about the same as for
8238// FreeBSD, but this may change soon.
8239void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008240 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008241 const InputInfoList &Inputs,
8242 const ArgList &Args,
8243 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008244 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008245 ArgStringList CmdArgs;
8246
8247 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8248 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008249 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008250 CmdArgs.push_back("--32");
8251
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008252 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008253
8254 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008255 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008256
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008257 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008258 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008259
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008260 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008261 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008262}
8263
8264void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008265 const InputInfo &Output,
8266 const InputInfoList &Inputs,
8267 const ArgList &Args,
8268 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008269 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008270 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008271 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008272
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008273 if (!D.SysRoot.empty())
8274 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8275
John McCall65b8da02013-04-11 22:55:55 +00008276 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008277 if (Args.hasArg(options::OPT_static)) {
8278 CmdArgs.push_back("-Bstatic");
8279 } else {
John McCall65b8da02013-04-11 22:55:55 +00008280 if (Args.hasArg(options::OPT_rdynamic))
8281 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008282 if (Args.hasArg(options::OPT_shared))
8283 CmdArgs.push_back("-Bshareable");
8284 else {
8285 CmdArgs.push_back("-dynamic-linker");
8286 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8287 }
John McCall65b8da02013-04-11 22:55:55 +00008288 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008289 }
8290
8291 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8292 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008293 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008294 CmdArgs.push_back("-m");
8295 CmdArgs.push_back("elf_i386");
8296 }
8297
Daniel Dunbarb440f562010-08-02 02:38:21 +00008298 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008299 CmdArgs.push_back("-o");
8300 CmdArgs.push_back(Output.getFilename());
8301 } else {
8302 assert(Output.isNothing() && "Invalid output.");
8303 }
8304
8305 if (!Args.hasArg(options::OPT_nostdlib) &&
8306 !Args.hasArg(options::OPT_nostartfiles)) {
8307 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008308 if (Args.hasArg(options::OPT_pg))
8309 CmdArgs.push_back(Args.MakeArgString(
8310 getToolChain().GetFilePath("gcrt1.o")));
8311 else {
8312 if (Args.hasArg(options::OPT_pie))
8313 CmdArgs.push_back(Args.MakeArgString(
8314 getToolChain().GetFilePath("Scrt1.o")));
8315 else
8316 CmdArgs.push_back(Args.MakeArgString(
8317 getToolChain().GetFilePath("crt1.o")));
8318 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008319 }
John McCall65b8da02013-04-11 22:55:55 +00008320 CmdArgs.push_back(Args.MakeArgString(
8321 getToolChain().GetFilePath("crti.o")));
8322 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8323 CmdArgs.push_back(Args.MakeArgString(
8324 getToolChain().GetFilePath("crtbeginS.o")));
8325 else
8326 CmdArgs.push_back(Args.MakeArgString(
8327 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008328 }
8329
8330 Args.AddAllArgs(CmdArgs, options::OPT_L);
8331 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8332 Args.AddAllArgs(CmdArgs, options::OPT_e);
8333
Daniel Dunbar54423b22010-09-17 00:24:54 +00008334 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008335
8336 if (!Args.hasArg(options::OPT_nostdlib) &&
8337 !Args.hasArg(options::OPT_nodefaultlibs)) {
8338 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8339 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008340 if (UseGCC47)
8341 CmdArgs.push_back("-L/usr/lib/gcc47");
8342 else
8343 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008344
8345 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008346 if (UseGCC47) {
8347 CmdArgs.push_back("-rpath");
8348 CmdArgs.push_back("/usr/lib/gcc47");
8349 } else {
8350 CmdArgs.push_back("-rpath");
8351 CmdArgs.push_back("/usr/lib/gcc44");
8352 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008353 }
8354
Hans Wennborg70850d82013-07-18 20:29:38 +00008355 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008356 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008357 CmdArgs.push_back("-lm");
8358 }
8359
Daniel Dunbarcc912342009-05-02 18:28:39 +00008360 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008361 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008362
8363 if (!Args.hasArg(options::OPT_nolibc)) {
8364 CmdArgs.push_back("-lc");
8365 }
8366
John McCall65b8da02013-04-11 22:55:55 +00008367 if (UseGCC47) {
8368 if (Args.hasArg(options::OPT_static) ||
8369 Args.hasArg(options::OPT_static_libgcc)) {
8370 CmdArgs.push_back("-lgcc");
8371 CmdArgs.push_back("-lgcc_eh");
8372 } else {
8373 if (Args.hasArg(options::OPT_shared_libgcc)) {
8374 CmdArgs.push_back("-lgcc_pic");
8375 if (!Args.hasArg(options::OPT_shared))
8376 CmdArgs.push_back("-lgcc");
8377 } else {
8378 CmdArgs.push_back("-lgcc");
8379 CmdArgs.push_back("--as-needed");
8380 CmdArgs.push_back("-lgcc_pic");
8381 CmdArgs.push_back("--no-as-needed");
8382 }
8383 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008384 } else {
John McCall65b8da02013-04-11 22:55:55 +00008385 if (Args.hasArg(options::OPT_shared)) {
8386 CmdArgs.push_back("-lgcc_pic");
8387 } else {
8388 CmdArgs.push_back("-lgcc");
8389 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008390 }
8391 }
8392
8393 if (!Args.hasArg(options::OPT_nostdlib) &&
8394 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008395 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008396 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008397 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008398 else
8399 CmdArgs.push_back(Args.MakeArgString(
8400 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008401 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008402 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008403 }
8404
Alexey Samsonov7811d192014-02-20 13:57:37 +00008405 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008406
Logan Chieneb9162f2014-06-26 14:23:45 +00008407 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008408 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008409}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008410
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008411// Try to find Exe from a Visual Studio distribution. This first tries to find
8412// an installed copy of Visual Studio and, failing that, looks in the PATH,
8413// making sure that whatever executable that's found is not a same-named exe
8414// from clang itself to prevent clang from falling back to itself.
8415static std::string FindVisualStudioExecutable(const ToolChain &TC,
8416 const char *Exe,
8417 const char *ClangProgramPath) {
8418 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8419 std::string visualStudioBinDir;
8420 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8421 visualStudioBinDir)) {
8422 SmallString<128> FilePath(visualStudioBinDir);
8423 llvm::sys::path::append(FilePath, Exe);
8424 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8425 return FilePath.str();
8426 }
8427
8428 return Exe;
8429}
8430
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008431void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8432 const InputInfo &Output,
8433 const InputInfoList &Inputs,
8434 const ArgList &Args,
8435 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008436 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008437 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008438
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008439 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8440 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008441 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8442 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008443
8444 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008445 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008446 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008447
Zachary Turner10d75b22014-10-22 20:40:43 +00008448 if (!llvm::sys::Process::GetEnv("LIB")) {
8449 // If the VC environment hasn't been configured (perhaps because the user
8450 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008451 // the environment variable is set however, assume the user knows what
8452 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008453 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008454 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008455 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8456 SmallString<128> LibDir(VisualStudioDir);
8457 llvm::sys::path::append(LibDir, "VC", "lib");
8458 switch (MSVC.getArch()) {
8459 case llvm::Triple::x86:
8460 // x86 just puts the libraries directly in lib
8461 break;
8462 case llvm::Triple::x86_64:
8463 llvm::sys::path::append(LibDir, "amd64");
8464 break;
8465 case llvm::Triple::arm:
8466 llvm::sys::path::append(LibDir, "arm");
8467 break;
8468 default:
8469 break;
8470 }
8471 CmdArgs.push_back(
8472 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8473 }
8474
8475 std::string WindowsSdkLibPath;
8476 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8477 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8478 WindowsSdkLibPath.c_str()));
8479 }
8480
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008481 CmdArgs.push_back("-nologo");
8482
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008483 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008484 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008485
Hans Wennborge4c47f22015-03-04 23:16:21 +00008486 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8487 options::OPT__SLASH_LDd,
8488 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008489 if (DLL) {
8490 CmdArgs.push_back(Args.MakeArgString("-dll"));
8491
8492 SmallString<128> ImplibName(Output.getFilename());
8493 llvm::sys::path::replace_extension(ImplibName, "lib");
8494 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008495 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008496 }
8497
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008498 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008499 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008500 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008501 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008502 static const char *CompilerRTComponents[] = {
8503 "asan_dynamic",
8504 "asan_dynamic_runtime_thunk",
8505 };
8506 for (const auto &Component : CompilerRTComponents)
8507 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008508 // Make sure the dynamic runtime thunk is not optimized out at link time
8509 // to ensure proper SEH handling.
8510 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008511 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008512 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008513 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008514 static const char *CompilerRTComponents[] = {
8515 "asan",
8516 "asan_cxx",
8517 };
8518 for (const auto &Component : CompilerRTComponents)
8519 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008520 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008521 }
8522
Hans Wennborg2e274592013-08-13 23:38:57 +00008523 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008524
Reid Kleckner337188f2014-09-16 19:22:00 +00008525 // Add filenames, libraries, and other linker inputs.
8526 for (const auto &Input : Inputs) {
8527 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008528 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008529 continue;
8530 }
8531
8532 const Arg &A = Input.getInputArg();
8533
8534 // Render -l options differently for the MSVC linker.
8535 if (A.getOption().matches(options::OPT_l)) {
8536 StringRef Lib = A.getValue();
8537 const char *LinkLibArg;
8538 if (Lib.endswith(".lib"))
8539 LinkLibArg = Args.MakeArgString(Lib);
8540 else
8541 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8542 CmdArgs.push_back(LinkLibArg);
8543 continue;
8544 }
8545
8546 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8547 // or -L. Render it, even if MSVC doesn't understand it.
8548 A.renderAsInput(Args, CmdArgs);
8549 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008550
Zachary Turner719f58c2014-12-01 23:06:47 +00008551 // We need to special case some linker paths. In the case of lld, we need to
8552 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8553 // linker, we need to use a special search algorithm.
8554 llvm::SmallString<128> linkPath;
8555 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8556 if (Linker.equals_lower("lld"))
8557 Linker = "lld-link";
8558
8559 if (Linker.equals_lower("link")) {
8560 // If we're using the MSVC linker, it's not sufficient to just use link
8561 // from the program PATH, because other environments like GnuWin32 install
8562 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008563 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008564 C.getDriver().getClangProgramPath());
8565 } else {
8566 linkPath = Linker;
8567 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008568 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008569 }
8570
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008571 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008572 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008573}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008574
8575void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8576 const InputInfo &Output,
8577 const InputInfoList &Inputs,
8578 const ArgList &Args,
8579 const char *LinkingOutput) const {
8580 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8581}
8582
David Blaikiec11bf802014-09-04 16:04:28 +00008583std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8584 Compilation &C, const JobAction &JA, const InputInfo &Output,
8585 const InputInfoList &Inputs, const ArgList &Args,
8586 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008587 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008588 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008589 CmdArgs.push_back("/c"); // Compile only.
8590 CmdArgs.push_back("/W0"); // No warnings.
8591
8592 // The goal is to be able to invoke this tool correctly based on
8593 // any flag accepted by clang-cl.
8594
8595 // These are spelled the same way in clang and cl.exe,.
8596 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8597 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008598
8599 // Optimization level.
8600 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8601 if (A->getOption().getID() == options::OPT_O0) {
8602 CmdArgs.push_back("/Od");
8603 } else {
8604 StringRef OptLevel = A->getValue();
8605 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8606 A->render(Args, CmdArgs);
8607 else if (OptLevel == "3")
8608 CmdArgs.push_back("/Ox");
8609 }
8610 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008611
Nico Weber3f8dafb2015-03-12 19:37:10 +00008612 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008613 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8614
David Majnemerf6072342014-07-01 22:24:56 +00008615 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8616 /*default=*/false))
8617 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008618 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8619 options::OPT_fno_function_sections))
8620 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8621 ? "/Gy"
8622 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008623 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8624 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008625 CmdArgs.push_back(
8626 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008627 if (Args.hasArg(options::OPT_fsyntax_only))
8628 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008629 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8630 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008631
Nico Weber3f8dafb2015-03-12 19:37:10 +00008632 std::vector<std::string> Includes =
8633 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008634 for (const auto &Include : Includes)
8635 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008636
Hans Wennborg87cfa712013-09-19 20:32:16 +00008637 // Flags that can simply be passed through.
8638 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8639 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008640 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008641
8642 // The order of these flags is relevant, so pick the last one.
8643 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8644 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8645 A->render(Args, CmdArgs);
8646
8647
8648 // Input filename.
8649 assert(Inputs.size() == 1);
8650 const InputInfo &II = Inputs[0];
8651 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8652 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8653 if (II.isFilename())
8654 CmdArgs.push_back(II.getFilename());
8655 else
8656 II.getInputArg().renderAsInput(Args, CmdArgs);
8657
8658 // Output filename.
8659 assert(Output.getType() == types::TY_Object);
8660 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8661 Output.getFilename());
8662 CmdArgs.push_back(Fo);
8663
Hans Wennborg188382e2013-09-20 18:16:35 +00008664 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008665 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8666 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008667 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8668 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008669}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008670
8671
8672/// XCore Tools
8673// We pass assemble and link construction to the xcc tool.
8674
8675void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8676 const InputInfo &Output,
8677 const InputInfoList &Inputs,
8678 const ArgList &Args,
8679 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008680 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008681 ArgStringList CmdArgs;
8682
8683 CmdArgs.push_back("-o");
8684 CmdArgs.push_back(Output.getFilename());
8685
8686 CmdArgs.push_back("-c");
8687
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008688 if (Args.hasArg(options::OPT_v))
8689 CmdArgs.push_back("-v");
8690
Robert Lytton894d25c2014-05-02 09:33:25 +00008691 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8692 if (!A->getOption().matches(options::OPT_g0))
8693 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008694
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008695 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8696 false))
8697 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008698
8699 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8700 options::OPT_Xassembler);
8701
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008702 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008703 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008704
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008705 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008706 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008707}
8708
8709void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8710 const InputInfo &Output,
8711 const InputInfoList &Inputs,
8712 const ArgList &Args,
8713 const char *LinkingOutput) const {
8714 ArgStringList CmdArgs;
8715
8716 if (Output.isFilename()) {
8717 CmdArgs.push_back("-o");
8718 CmdArgs.push_back(Output.getFilename());
8719 } else {
8720 assert(Output.isNothing() && "Invalid output.");
8721 }
8722
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008723 if (Args.hasArg(options::OPT_v))
8724 CmdArgs.push_back("-v");
8725
David Majnemer8de68642014-12-05 08:11:58 +00008726 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008727 CmdArgs.push_back("-fexceptions");
8728
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008729 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8730
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008731 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008732 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008733}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008734
8735void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8736 const InputInfo &Output,
8737 const InputInfoList &Inputs,
8738 const ArgList &Args,
8739 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008740 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008741 const auto &TC =
8742 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8743 ArgStringList CmdArgs;
8744 const char *Exec;
8745
8746 switch (TC.getArch()) {
8747 default: llvm_unreachable("unsupported architecture");
8748 case llvm::Triple::arm:
8749 case llvm::Triple::thumb:
8750 break;
8751 case llvm::Triple::x86:
8752 CmdArgs.push_back("--32");
8753 break;
8754 case llvm::Triple::x86_64:
8755 CmdArgs.push_back("--64");
8756 break;
8757 }
8758
8759 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8760
8761 CmdArgs.push_back("-o");
8762 CmdArgs.push_back(Output.getFilename());
8763
8764 for (const auto &Input : Inputs)
8765 CmdArgs.push_back(Input.getFilename());
8766
8767 const std::string Assembler = TC.GetProgramPath("as");
8768 Exec = Args.MakeArgString(Assembler);
8769
8770 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8771}
8772
8773void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8774 const InputInfo &Output,
8775 const InputInfoList &Inputs,
8776 const ArgList &Args,
8777 const char *LinkingOutput) const {
8778 const auto &TC =
8779 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8780 const llvm::Triple &T = TC.getTriple();
8781 const Driver &D = TC.getDriver();
8782 SmallString<128> EntryPoint;
8783 ArgStringList CmdArgs;
8784 const char *Exec;
8785
8786 // Silence warning for "clang -g foo.o -o foo"
8787 Args.ClaimAllArgs(options::OPT_g_Group);
8788 // and "clang -emit-llvm foo.o -o foo"
8789 Args.ClaimAllArgs(options::OPT_emit_llvm);
8790 // and for "clang -w foo.o -o foo"
8791 Args.ClaimAllArgs(options::OPT_w);
8792 // Other warning options are already handled somewhere else.
8793
8794 if (!D.SysRoot.empty())
8795 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8796
8797 if (Args.hasArg(options::OPT_pie))
8798 CmdArgs.push_back("-pie");
8799 if (Args.hasArg(options::OPT_rdynamic))
8800 CmdArgs.push_back("-export-dynamic");
8801 if (Args.hasArg(options::OPT_s))
8802 CmdArgs.push_back("--strip-all");
8803
8804 CmdArgs.push_back("-m");
8805 switch (TC.getArch()) {
8806 default: llvm_unreachable("unsupported architecture");
8807 case llvm::Triple::arm:
8808 case llvm::Triple::thumb:
8809 // FIXME: this is incorrect for WinCE
8810 CmdArgs.push_back("thumb2pe");
8811 break;
8812 case llvm::Triple::x86:
8813 CmdArgs.push_back("i386pe");
8814 EntryPoint.append("_");
8815 break;
8816 case llvm::Triple::x86_64:
8817 CmdArgs.push_back("i386pep");
8818 break;
8819 }
8820
8821 if (Args.hasArg(options::OPT_shared)) {
8822 switch (T.getArch()) {
8823 default: llvm_unreachable("unsupported architecture");
8824 case llvm::Triple::arm:
8825 case llvm::Triple::thumb:
8826 case llvm::Triple::x86_64:
8827 EntryPoint.append("_DllMainCRTStartup");
8828 break;
8829 case llvm::Triple::x86:
8830 EntryPoint.append("_DllMainCRTStartup@12");
8831 break;
8832 }
8833
8834 CmdArgs.push_back("-shared");
8835 CmdArgs.push_back("-Bdynamic");
8836
8837 CmdArgs.push_back("--enable-auto-image-base");
8838
8839 CmdArgs.push_back("--entry");
8840 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8841 } else {
8842 EntryPoint.append("mainCRTStartup");
8843
8844 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8845 : "-Bdynamic");
8846
8847 if (!Args.hasArg(options::OPT_nostdlib) &&
8848 !Args.hasArg(options::OPT_nostartfiles)) {
8849 CmdArgs.push_back("--entry");
8850 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8851 }
8852
8853 // FIXME: handle subsystem
8854 }
8855
8856 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008857 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008858
8859 CmdArgs.push_back("-o");
8860 CmdArgs.push_back(Output.getFilename());
8861
8862 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8863 SmallString<261> ImpLib(Output.getFilename());
8864 llvm::sys::path::replace_extension(ImpLib, ".lib");
8865
8866 CmdArgs.push_back("--out-implib");
8867 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8868 }
8869
8870 if (!Args.hasArg(options::OPT_nostdlib) &&
8871 !Args.hasArg(options::OPT_nostartfiles)) {
8872 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8873 const char *CRTBegin;
8874
8875 CRTBegin =
8876 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8877 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8878 }
8879
8880 Args.AddAllArgs(CmdArgs, options::OPT_L);
8881
8882 const auto &Paths = TC.getFilePaths();
8883 for (const auto &Path : Paths)
8884 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8885
8886 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8887
8888 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8889 !Args.hasArg(options::OPT_nodefaultlibs)) {
8890 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8891 !Args.hasArg(options::OPT_static);
8892 if (StaticCXX)
8893 CmdArgs.push_back("-Bstatic");
8894 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8895 if (StaticCXX)
8896 CmdArgs.push_back("-Bdynamic");
8897 }
8898
8899 if (!Args.hasArg(options::OPT_nostdlib)) {
8900 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8901 // TODO handle /MT[d] /MD[d]
8902 CmdArgs.push_back("-lmsvcrt");
8903 AddRunTimeLibs(TC, D, CmdArgs, Args);
8904 }
8905 }
8906
8907 const std::string Linker = TC.GetProgramPath("ld");
8908 Exec = Args.MakeArgString(Linker);
8909
8910 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8911}