blob: 88e4221710216a38ff47940789e88c398e763e93 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000035#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000037#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000039#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000040#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000041#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000042#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000043
Ben Langmuir3b7b5402015-02-03 19:28:37 +000044#ifdef LLVM_ON_UNIX
45#include <unistd.h> // For getuid().
46#endif
47
Daniel Dunbar1a093d22009-03-18 06:00:36 +000048using namespace clang::driver;
49using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000050using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000051using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000052
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000053static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
54 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
55 options::OPT_fpic, options::OPT_fno_pic,
56 options::OPT_fPIE, options::OPT_fno_PIE,
57 options::OPT_fpie, options::OPT_fno_pie);
58 if (!LastPICArg)
59 return;
60 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
61 LastPICArg->getOption().matches(options::OPT_fpic) ||
62 LastPICArg->getOption().matches(options::OPT_fPIE) ||
63 LastPICArg->getOption().matches(options::OPT_fpie)) {
64 CmdArgs.push_back("-KPIC");
65 }
66}
67
Daniel Dunbar64198ef2009-09-10 01:21:05 +000068/// CheckPreprocessingOptions - Perform some validation of preprocessing
69/// arguments that is shared with gcc.
70static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000071 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
72 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
73 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000074 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000075 << A->getBaseArg().getAsString(Args)
76 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
77 }
78 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000079}
80
Daniel Dunbar4eadb602009-09-10 01:21:12 +000081/// CheckCodeGenerationOptions - Perform some validation of code generation
82/// arguments that is shared with gcc.
83static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
84 // In gcc, only ARM checks this, but it seems reasonable to check universally.
85 if (Args.hasArg(options::OPT_static))
86 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
87 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000088 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000089 << A->getAsString(Args) << "-static";
90}
91
Bob Wilsond5aad2a2014-11-04 22:28:48 +000092// Add backslashes to escape spaces and other backslashes.
93// This is used for the space-separated argument list specified with
94// the -dwarf-debug-flags option.
95static void EscapeSpacesAndBackslashes(const char *Arg,
96 SmallVectorImpl<char> &Res) {
97 for ( ; *Arg; ++Arg) {
98 switch (*Arg) {
99 default: break;
100 case ' ':
101 case '\\':
102 Res.push_back('\\');
103 break;
104 }
105 Res.push_back(*Arg);
106 }
107}
108
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000109// Quote target names for inclusion in GNU Make dependency files.
110// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111static void QuoteTarget(StringRef Target,
112 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000113 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
114 switch (Target[i]) {
115 case ' ':
116 case '\t':
117 // Escape the preceding backslashes
118 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
119 Res.push_back('\\');
120
121 // Escape the space/tab
122 Res.push_back('\\');
123 break;
124 case '$':
125 Res.push_back('$');
126 break;
127 case '#':
128 Res.push_back('\\');
129 break;
130 default:
131 break;
132 }
133
134 Res.push_back(Target[i]);
135 }
136}
137
Bill Wendlingc0938f32012-03-12 22:10:06 +0000138static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000139 ArgStringList &CmdArgs,
140 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *EnvVar) {
142 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 bool CombinedArg = false;
144
Bill Wendling281ca292012-03-12 21:22:35 +0000145 if (!DirList)
146 return; // Nothing to do.
147
Chad Rosier616e8a52012-10-30 21:42:09 +0000148 StringRef Name(ArgName);
149 if (Name.equals("-I") || Name.equals("-L"))
150 CombinedArg = true;
151
Bill Wendling281ca292012-03-12 21:22:35 +0000152 StringRef Dirs(DirList);
153 if (Dirs.empty()) // Empty string should not add '.'.
154 return;
155
156 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000157 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000158 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000159 if (CombinedArg) {
160 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
161 } else {
162 CmdArgs.push_back(ArgName);
163 CmdArgs.push_back(".");
164 }
Bill Wendling281ca292012-03-12 21:22:35 +0000165 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000166 if (CombinedArg) {
167 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193static void AddLinkerInputs(const ToolChain &TC,
194 const InputInfoList &Inputs, const ArgList &Args,
195 ArgStringList &CmdArgs) {
196 const Driver &D = TC.getDriver();
197
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000198 // Add extra linker input arguments which are not treated as inputs
199 // (constructed via -Xarch_).
200 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000202 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000203 if (!TC.HasNativeLLVMSupport()) {
204 // Don't try to pass LLVM inputs unless we have native support.
205 if (II.getType() == types::TY_LLVM_IR ||
206 II.getType() == types::TY_LTO_IR ||
207 II.getType() == types::TY_LLVM_BC ||
208 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000209 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000210 << TC.getTripleString();
211 }
212
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 // Add filenames immediately.
214 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000215 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000216 continue;
217 }
218
219 // Otherwise, this is a linker input argument.
220 const Arg &A = II.getInputArg();
221
222 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000223 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000224 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000225 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000226 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000227 else if (A.getOption().matches(options::OPT_z)) {
228 // Pass -z prefix for gcc linker compatibility.
229 A.claim();
230 A.render(Args, CmdArgs);
231 } else {
232 A.renderAsInput(Args, CmdArgs);
233 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000234 }
Bill Wendling281ca292012-03-12 21:22:35 +0000235
236 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000237 // and only supported on native toolchains.
238 if (!TC.isCrossCompiling())
239 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000240}
241
John McCall31168b02011-06-15 23:02:42 +0000242/// \brief Determine whether Objective-C automated reference counting is
243/// enabled.
244static bool isObjCAutoRefCount(const ArgList &Args) {
245 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
246}
247
Ted Kremeneke65b0862012-03-06 20:05:56 +0000248/// \brief Determine whether we are linking the ObjC runtime.
249static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 if (isObjCAutoRefCount(Args)) {
251 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000252 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000253 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000254 return Args.hasArg(options::OPT_fobjc_link_runtime);
255}
256
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000257static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000258 // Don't forward inputs from the original command line. They are added from
259 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000260 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000261 !O.hasFlag(options::DriverOption) &&
262 !O.hasFlag(options::LinkerInput);
263}
264
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000265void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000267 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000268 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 ArgStringList &CmdArgs,
270 const InputInfo &Output,
271 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000273
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000274 CheckPreprocessingOptions(D, Args);
275
276 Args.AddLastArg(CmdArgs, options::OPT_C);
277 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000278
279 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000280 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 (A = Args.getLastArg(options::OPT_MD)) ||
282 (A = Args.getLastArg(options::OPT_MMD))) {
283 // Determine the output location.
284 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000285 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000286 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000287 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000288 } else if (Output.getType() == types::TY_Dependencies) {
289 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000290 } else if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 DepFile = "-";
293 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000294 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000295 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297 CmdArgs.push_back("-dependency-file");
298 CmdArgs.push_back(DepFile);
299
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
302 const char *DepTarget;
303
304 // If user provided -o, that is the dependency target, except
305 // when we are only generating a dependency file.
306 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
307 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000308 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309 } else {
310 // Otherwise derive from the base input.
311 //
312 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000314 llvm::sys::path::replace_extension(P, "o");
315 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
318 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 QuoteTarget(DepTarget, Quoted);
321 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322 }
323
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000324 if (A->getOption().matches(options::OPT_M) ||
325 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000327 if ((isa<PrecompileJobAction>(JA) &&
328 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
329 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000330 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331 }
332
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000333 if (Args.hasArg(options::OPT_MG)) {
334 if (!A || A->getOption().matches(options::OPT_MD) ||
335 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000336 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000337 CmdArgs.push_back("-MG");
338 }
339
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000340 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342
343 // Convert all -MQ <target> args to -MT <quoted target>
344 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
345 options::OPT_MQ),
346 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000347 const Arg *A = *it;
348 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349
Daniel Dunbara442fd52010-06-11 22:00:13 +0000350 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000351 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000352 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000353 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000354 CmdArgs.push_back(Args.MakeArgString(Quoted));
355
356 // -MT flag - no change
357 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000358 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000359 }
360 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000361
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 // Add -i* options, and automatically translate to
363 // -include-pch/-include-pth for transparent PCH support. It's
364 // wonky, but we include looking for .gch so we can support seamless
365 // replacement into a build system already set up to be generating
366 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000367 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000368 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
369 ie = Args.filtered_end(); it != ie; ++it) {
370 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000371
372 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000373 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
374 RenderedImplicitInclude = true;
375
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000376 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000377 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000379 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000380 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000381 SmallString<128> P(A->getValue());
382 // We want the files to have a name like foo.h.pch. Add a dummy extension
383 // so that replace_extension does the right thing.
384 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000385 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000387 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000388 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000389 }
390
Douglas Gregor111af7d2009-04-18 00:34:01 +0000391 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000392 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000393 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000394 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000395 }
396
Douglas Gregor111af7d2009-04-18 00:34:01 +0000397 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000398 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000399 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000400 FoundPCH = UsePCH;
401 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000402 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
404
405 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000406 if (IsFirstImplicitInclude) {
407 A->claim();
408 if (UsePCH)
409 CmdArgs.push_back("-include-pch");
410 else
411 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000413 continue;
414 } else {
415 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000417 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000418 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000419 }
420 }
421
422 // Not translated, render as usual.
423 A->claim();
424 A->render(Args, CmdArgs);
425 }
426
427 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000428 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
429 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000430
431 // Add -Wp, and -Xassembler if using the preprocessor.
432
433 // FIXME: There is a very unfortunate problem here, some troubled
434 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
435 // really support that we would have to parse and then translate
436 // those options. :(
437 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
438 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000439
440 // -I- is a deprecated GCC feature, reject it.
441 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000442 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000443
444 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
445 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000446 StringRef sysroot = C.getSysRoot();
447 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000448 if (!Args.hasArg(options::OPT_isysroot)) {
449 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000450 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000451 }
452 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000453
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000455 // FIXME: We should probably sink the logic for handling these from the
456 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000457 // CPATH - included following the user specified includes (but prior to
458 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000459 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000460 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000461 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000463 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000464 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000465 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000466 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000467 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000468
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000470 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000471 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000472
473 // Add system include arguments.
474 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000475}
476
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000477// FIXME: Move to target hook.
478static bool isSignedCharDefault(const llvm::Triple &Triple) {
479 switch (Triple.getArch()) {
480 default:
481 return true;
482
Tim Northover9bb857a2013-01-31 12:13:10 +0000483 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000484 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000485 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000486 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000487 case llvm::Triple::thumb:
488 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000489 if (Triple.isOSDarwin() || Triple.isOSWindows())
490 return true;
491 return false;
492
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000493 case llvm::Triple::ppc:
494 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000495 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000496 return true;
497 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000498
Bill Schmidt778d3872013-07-26 01:36:11 +0000499 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000500 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000501 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000502 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000503 }
504}
505
Robert Lytton0e076492013-08-13 09:43:10 +0000506static bool isNoCommonDefault(const llvm::Triple &Triple) {
507 switch (Triple.getArch()) {
508 default:
509 return false;
510
511 case llvm::Triple::xcore:
512 return true;
513 }
514}
515
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000516// Handle -mhwdiv=.
517static void getARMHWDivFeatures(const Driver &D, const Arg *A,
518 const ArgList &Args,
519 std::vector<const char *> &Features) {
520 StringRef HWDiv = A->getValue();
521 if (HWDiv == "arm") {
522 Features.push_back("+hwdiv-arm");
523 Features.push_back("-hwdiv");
524 } else if (HWDiv == "thumb") {
525 Features.push_back("-hwdiv-arm");
526 Features.push_back("+hwdiv");
527 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
528 Features.push_back("+hwdiv-arm");
529 Features.push_back("+hwdiv");
530 } else if (HWDiv == "none") {
531 Features.push_back("-hwdiv-arm");
532 Features.push_back("-hwdiv");
533 } else
534 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
535}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000536
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000537// Handle -mfpu=.
538//
539// FIXME: Centralize feature selection, defaulting shouldn't be also in the
540// frontend target.
541static void getARMFPUFeatures(const Driver &D, const Arg *A,
542 const ArgList &Args,
543 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000544 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000545
546 // Set the target features based on the FPU.
547 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
548 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000549 Features.push_back("-vfp2");
550 Features.push_back("-vfp3");
551 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000552 } else if (FPU == "vfp") {
553 Features.push_back("+vfp2");
554 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000555 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000556 Features.push_back("+vfp3");
557 Features.push_back("+d16");
558 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000559 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000560 Features.push_back("+vfp3");
561 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000562 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
563 Features.push_back("+vfp4");
564 Features.push_back("+d16");
565 Features.push_back("-neon");
566 } else if (FPU == "vfp4" || FPU == "vfpv4") {
567 Features.push_back("+vfp4");
568 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000569 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
570 Features.push_back("+vfp4");
571 Features.push_back("+d16");
572 Features.push_back("+fp-only-sp");
573 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000574 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
575 Features.push_back("+fp-armv8");
576 Features.push_back("+fp-only-sp");
577 Features.push_back("+d16");
578 Features.push_back("-neon");
579 Features.push_back("-crypto");
580 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
581 FPU == "fp5-d16" || FPU == "fpv5-d16") {
582 Features.push_back("+fp-armv8");
583 Features.push_back("+d16");
584 Features.push_back("-neon");
585 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000586 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("-neon");
589 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000590 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000591 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000593 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000594 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000595 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000596 Features.push_back("+neon");
597 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000598 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000599 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000600 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000601 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000602 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000603 } else if (FPU == "neon-vfpv4") {
604 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000605 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000606 } else if (FPU == "none") {
607 Features.push_back("-vfp2");
608 Features.push_back("-vfp3");
609 Features.push_back("-vfp4");
610 Features.push_back("-fp-armv8");
611 Features.push_back("-crypto");
612 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000613 } else
614 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
615}
616
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000617// Select the float ABI as determined by -msoft-float, -mhard-float, and
618// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000619StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000621 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000622 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
623 options::OPT_mhard_float,
624 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000625 if (A->getOption().matches(options::OPT_msoft_float))
626 FloatABI = "soft";
627 else if (A->getOption().matches(options::OPT_mhard_float))
628 FloatABI = "hard";
629 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000630 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000632 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 << A->getAsString(Args);
634 FloatABI = "soft";
635 }
636 }
637 }
638
639 // If unspecified, choose the default based on the platform.
640 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000641 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000642 case llvm::Triple::Darwin:
643 case llvm::Triple::MacOSX:
644 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 // Darwin defaults to "softfp" for v6 and v7.
646 //
647 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000649 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v6") ||
651 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000652 FloatABI = "softfp";
653 else
654 FloatABI = "soft";
655 break;
656 }
657
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000658 // FIXME: this is invalid for WindowsCE
659 case llvm::Triple::Win32:
660 FloatABI = "hard";
661 break;
662
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000663 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000664 switch(Triple.getEnvironment()) {
665 case llvm::Triple::GNUEABIHF:
666 FloatABI = "hard";
667 break;
668 default:
669 // FreeBSD defaults to soft float
670 FloatABI = "soft";
671 break;
672 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000673 break;
674
Daniel Dunbar78485922009-09-10 23:00:09 +0000675 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000676 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000677 case llvm::Triple::GNUEABIHF:
678 FloatABI = "hard";
679 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000680 case llvm::Triple::GNUEABI:
681 FloatABI = "softfp";
682 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000683 case llvm::Triple::EABIHF:
684 FloatABI = "hard";
685 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000686 case llvm::Triple::EABI:
687 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
688 FloatABI = "softfp";
689 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000690 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000691 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000692 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000693 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000694 FloatABI = "softfp";
695 else
696 FloatABI = "soft";
697 break;
698 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000699 default:
700 // Assume "soft", but warn the user we are guessing.
701 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000702 if (Triple.getOS() != llvm::Triple::UnknownOS ||
703 !Triple.isOSBinFormatMachO())
704 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000705 break;
706 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000707 }
708 }
709
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000710 return FloatABI;
711}
712
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000713static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
714 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000715 std::vector<const char *> &Features,
716 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000717 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
718 if (!ForAS) {
719 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
720 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
721 // stripped out by the ARM target. We should probably pass this a new
722 // -target-option, which is handled by the -cc1/-cc1as invocation.
723 //
724 // FIXME2: For consistency, it would be ideal if we set up the target
725 // machine state the same when using the frontend or the assembler. We don't
726 // currently do that for the assembler, we pass the options directly to the
727 // backend and never even instantiate the frontend TargetInfo. If we did,
728 // and used its handleTargetFeatures hook, then we could ensure the
729 // assembler and the frontend behave the same.
730
731 // Use software floating point operations?
732 if (FloatABI == "soft")
733 Features.push_back("+soft-float");
734
735 // Use software floating point argument passing?
736 if (FloatABI != "hard")
737 Features.push_back("+soft-float-abi");
738 }
739
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000740 // Honor -mfpu=.
741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000742 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000743 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
744 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000745
John Brawna95c1a82015-05-08 12:52:18 +0000746 // -march is handled in getARMCPUForMarch by translating it into a CPU name,
747 // but it needs to return an empty string on invalid arguments. We therefore
748 // check and give an error here if the -march is invalid.
749 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
750 if (!Triple.getARMCPUForArch(A->getValue()))
751 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
752
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000753 // Setting -msoft-float effectively disables NEON because of the GCC
754 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000755 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000757 // Also need to explicitly disable features which imply NEON.
758 Features.push_back("-crypto");
759 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000760
Eric Christopher269c2a22015-04-04 03:34:43 +0000761 // En/disable crc code generation.
762 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000763 if (A->getOption().matches(options::OPT_mcrc))
764 Features.push_back("+crc");
765 else
766 Features.push_back("-crc");
767 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000768}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769
770void Clang::AddARMTargetArgs(const ArgList &Args,
771 ArgStringList &CmdArgs,
772 bool KernelOrKext) const {
773 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000774 // Get the effective triple, which takes into account the deployment target.
775 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
776 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000777 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000778
779 // Select the ABI to use.
780 //
781 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000782 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000783 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000784 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000785 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000786 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000787 // The backend is hardwired to assume AAPCS for M-class processors, ensure
788 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000789 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000790 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000791 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000792 ABIName = "aapcs";
793 } else {
794 ABIName = "apcs-gnu";
795 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000796 } else if (Triple.isOSWindows()) {
797 // FIXME: this is invalid for WindowsCE
798 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000799 } else {
800 // Select the default based on the platform.
801 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000802 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000803 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000804 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000805 ABIName = "aapcs-linux";
806 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000807 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 case llvm::Triple::EABI:
809 ABIName = "aapcs";
810 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000811 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000812 if (Triple.getOS() == llvm::Triple::NetBSD)
813 ABIName = "apcs-gnu";
814 else
815 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000816 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817 }
818 }
819 CmdArgs.push_back("-target-abi");
820 CmdArgs.push_back(ABIName);
821
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000823 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000824 if (FloatABI == "soft") {
825 // Floating point operations and argument passing are soft.
826 //
827 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000828 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000829 CmdArgs.push_back("-mfloat-abi");
830 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000831 } else if (FloatABI == "softfp") {
832 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000833 CmdArgs.push_back("-mfloat-abi");
834 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000835 } else {
836 // Floating point operations and argument passing are hard.
837 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000838 CmdArgs.push_back("-mfloat-abi");
839 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000840 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000841
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000842 // Kernel code has more strict alignment requirements.
843 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000844 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000845 CmdArgs.push_back("-backend-option");
846 CmdArgs.push_back("-arm-long-calls");
847 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000848
Daniel Dunbar12100e22011-03-22 16:48:17 +0000849 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000850 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000851
852 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000853 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000854 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000855 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000856
Bob Wilson0874e532014-07-29 00:23:18 +0000857 // -mkernel implies -mstrict-align; don't add the redundant option.
858 if (!KernelOrKext) {
859 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
860 options::OPT_munaligned_access)) {
861 CmdArgs.push_back("-backend-option");
862 if (A->getOption().matches(options::OPT_mno_unaligned_access))
863 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000864 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000865 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000866 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000867 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000868 }
Bob Wilson0874e532014-07-29 00:23:18 +0000869 }
870 }
871
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000872 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000873 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
874 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000875 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000876 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000877 CmdArgs.push_back("-arm-global-merge=false");
878 else
879 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000880 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000881
Bob Wilson9c8af452013-04-11 18:53:25 +0000882 if (!Args.hasFlag(options::OPT_mimplicit_float,
883 options::OPT_mno_implicit_float,
884 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000885 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000886
Logan Chien749763e2014-04-03 13:12:44 +0000887 // llvm does not support reserving registers in general. There is support
888 // for reserving r9 on ARM though (defined as a platform-specific register
889 // in ARM EABI).
890 if (Args.hasArg(options::OPT_ffixed_r9)) {
891 CmdArgs.push_back("-backend-option");
892 CmdArgs.push_back("-arm-reserve-r9");
893 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000894}
895
Tim Northover573cbee2014-05-24 12:52:07 +0000896/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
897/// targeting.
898static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000899 Arg *A;
900 std::string CPU;
901 // If we have -mtune or -mcpu, use that.
902 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
903 CPU = A->getValue();
904 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000905 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000906 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000907 }
908
Kevin Qin110db6f2014-07-18 07:03:22 +0000909 // Handle CPU name is 'native'.
910 if (CPU == "native")
911 return llvm::sys::getHostCPUName();
912 else if (CPU.size())
913 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000914
James Molloy9b1586b2014-04-17 12:51:17 +0000915 // Make sure we pick "cyclone" if -arch is used.
916 // FIXME: Should this be picked by checking the target triple instead?
917 if (Args.getLastArg(options::OPT_arch))
918 return "cyclone";
919
920 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000921}
922
Tim Northover573cbee2014-05-24 12:52:07 +0000923void Clang::AddAArch64TargetArgs(const ArgList &Args,
924 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000925 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
926 llvm::Triple Triple(TripleStr);
927
928 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
929 Args.hasArg(options::OPT_mkernel) ||
930 Args.hasArg(options::OPT_fapple_kext))
931 CmdArgs.push_back("-disable-red-zone");
932
933 if (!Args.hasFlag(options::OPT_mimplicit_float,
934 options::OPT_mno_implicit_float, true))
935 CmdArgs.push_back("-no-implicit-float");
936
Craig Topper92fc2df2014-05-17 16:56:41 +0000937 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000938 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
939 ABIName = A->getValue();
940 else if (Triple.isOSDarwin())
941 ABIName = "darwinpcs";
942 else
943 ABIName = "aapcs";
944
945 CmdArgs.push_back("-target-abi");
946 CmdArgs.push_back(ABIName);
947
Bob Wilson0874e532014-07-29 00:23:18 +0000948 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
949 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000950 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000951 if (A->getOption().matches(options::OPT_mno_unaligned_access))
952 CmdArgs.push_back("-aarch64-strict-align");
953 else
954 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000955 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000956
Bradley Smith9ff64332014-10-13 10:16:06 +0000957 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
958 options::OPT_mno_fix_cortex_a53_835769)) {
959 CmdArgs.push_back("-backend-option");
960 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
961 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
962 else
963 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000964 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
965 // Enabled A53 errata (835769) workaround by default on android
966 CmdArgs.push_back("-backend-option");
967 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000968 }
969
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000970 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000971 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
972 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000973 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000974 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000975 CmdArgs.push_back("-aarch64-global-merge=false");
976 else
977 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000978 }
Renato Golinb625f482015-01-25 23:17:48 +0000979
980 if (Args.hasArg(options::OPT_ffixed_x18)) {
981 CmdArgs.push_back("-backend-option");
982 CmdArgs.push_back("-aarch64-reserve-x18");
983 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000984}
985
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000986// Get CPU and ABI names. They are not independent
987// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000988void mips::getMipsCPUAndABI(const ArgList &Args,
989 const llvm::Triple &Triple,
990 StringRef &CPUName,
991 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000992 const char *DefMips32CPU = "mips32r2";
993 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000994
Daniel Sanders2bf13662014-07-10 14:40:57 +0000995 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
996 // default for mips64(el)?-img-linux-gnu.
997 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
998 Triple.getEnvironment() == llvm::Triple::GNU) {
999 DefMips32CPU = "mips32r6";
1000 DefMips64CPU = "mips64r6";
1001 }
1002
Brad Smithba26f582015-01-06 02:53:17 +00001003 // MIPS3 is the default for mips64*-unknown-openbsd.
1004 if (Triple.getOS() == llvm::Triple::OpenBSD)
1005 DefMips64CPU = "mips3";
1006
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001007 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001008 options::OPT_mcpu_EQ))
1009 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001010
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001012 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001013 // Convert a GNU style Mips ABI name to the name
1014 // accepted by LLVM Mips backend.
1015 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1016 .Case("32", "o32")
1017 .Case("64", "n64")
1018 .Default(ABIName);
1019 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001020
1021 // Setup default CPU and ABI names.
1022 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001023 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001024 default:
1025 llvm_unreachable("Unexpected triple arch name");
1026 case llvm::Triple::mips:
1027 case llvm::Triple::mipsel:
1028 CPUName = DefMips32CPU;
1029 break;
1030 case llvm::Triple::mips64:
1031 case llvm::Triple::mips64el:
1032 CPUName = DefMips64CPU;
1033 break;
1034 }
1035 }
1036
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001037 if (ABIName.empty()) {
1038 // Deduce ABI name from the target triple.
1039 if (Triple.getArch() == llvm::Triple::mips ||
1040 Triple.getArch() == llvm::Triple::mipsel)
1041 ABIName = "o32";
1042 else
1043 ABIName = "n64";
1044 }
1045
1046 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001047 // Deduce CPU name from ABI name.
1048 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001049 .Cases("o32", "eabi", DefMips32CPU)
1050 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001051 .Default("");
1052 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001053
1054 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001055}
1056
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001057// Convert ABI name to the GNU tools acceptable variant.
1058static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1059 return llvm::StringSwitch<llvm::StringRef>(ABI)
1060 .Case("o32", "32")
1061 .Case("n64", "64")
1062 .Default(ABI);
1063}
1064
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001065// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1066// and -mfloat-abi=.
1067static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001068 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001069 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001070 options::OPT_mhard_float,
1071 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001072 if (A->getOption().matches(options::OPT_msoft_float))
1073 FloatABI = "soft";
1074 else if (A->getOption().matches(options::OPT_mhard_float))
1075 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001076 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001077 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001078 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001079 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001080 FloatABI = "hard";
1081 }
1082 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001083 }
1084
1085 // If unspecified, choose the default based on the platform.
1086 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001087 // Assume "hard", because it's a default value used by gcc.
1088 // When we start to recognize specific target MIPS processors,
1089 // we will be able to select the default more correctly.
1090 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001091 }
1092
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001093 return FloatABI;
1094}
1095
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001096static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001097 std::vector<const char *> &Features,
1098 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001099 StringRef FeatureName) {
1100 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001101 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001102 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001103 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001104 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001105 }
1106}
1107
Daniel Sanders379d44b2014-07-16 11:52:23 +00001108static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1109 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001110 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001111 StringRef CPUName;
1112 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001113 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001114 ABIName = getGnuCompatibleMipsABIName(ABIName);
1115
Daniel Sandersfeb61302014-08-08 15:47:17 +00001116 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1117 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001118
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001119 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001120 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001121 // FIXME: Note, this is a hack. We need to pass the selected float
1122 // mode to the MipsTargetInfoBase to define appropriate macros there.
1123 // Now it is the only method.
1124 Features.push_back("+soft-float");
1125 }
1126
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001127 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001128 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001129 if (Val == "2008") {
1130 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1131 Features.push_back("+nan2008");
1132 else {
1133 Features.push_back("-nan2008");
1134 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1135 }
1136 } else if (Val == "legacy") {
1137 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1138 Features.push_back("-nan2008");
1139 else {
1140 Features.push_back("+nan2008");
1141 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1142 }
1143 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001144 D.Diag(diag::err_drv_unsupported_option_argument)
1145 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001146 }
1147
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001148 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1149 options::OPT_mdouble_float, "single-float");
1150 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1151 "mips16");
1152 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1153 options::OPT_mno_micromips, "micromips");
1154 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1155 "dsp");
1156 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1157 "dspr2");
1158 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1159 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001160
1161 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1162 // pass -mfpxx
1163 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1164 options::OPT_mfp64)) {
1165 if (A->getOption().matches(options::OPT_mfp32))
1166 Features.push_back(Args.MakeArgString("-fp64"));
1167 else if (A->getOption().matches(options::OPT_mfpxx)) {
1168 Features.push_back(Args.MakeArgString("+fpxx"));
1169 Features.push_back(Args.MakeArgString("+nooddspreg"));
1170 } else
1171 Features.push_back(Args.MakeArgString("+fp64"));
1172 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001173 Features.push_back(Args.MakeArgString("+fpxx"));
1174 Features.push_back(Args.MakeArgString("+nooddspreg"));
1175 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001176
Daniel Sanders28e5d392014-07-10 10:39:51 +00001177 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1178 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001179}
1180
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001181void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001182 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001183 const Driver &D = getToolChain().getDriver();
1184 StringRef CPUName;
1185 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001186 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001187 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001188
1189 CmdArgs.push_back("-target-abi");
1190 CmdArgs.push_back(ABIName.data());
1191
1192 StringRef FloatABI = getMipsFloatABI(D, Args);
1193
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001194 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001195 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001197 CmdArgs.push_back("-mfloat-abi");
1198 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001199 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
1201 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001202 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001203 CmdArgs.push_back("-mfloat-abi");
1204 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001205 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001206
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001207 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1208 if (A->getOption().matches(options::OPT_mxgot)) {
1209 CmdArgs.push_back("-mllvm");
1210 CmdArgs.push_back("-mxgot");
1211 }
1212 }
1213
Simon Atanasyanc580b322013-05-11 06:33:44 +00001214 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1215 options::OPT_mno_ldc1_sdc1)) {
1216 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1217 CmdArgs.push_back("-mllvm");
1218 CmdArgs.push_back("-mno-ldc1-sdc1");
1219 }
1220 }
1221
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001222 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1223 options::OPT_mno_check_zero_division)) {
1224 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1225 CmdArgs.push_back("-mllvm");
1226 CmdArgs.push_back("-mno-check-zero-division");
1227 }
1228 }
1229
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001230 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001231 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001232 CmdArgs.push_back("-mllvm");
1233 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1234 A->claim();
1235 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001236}
1237
Hal Finkel8eb59282012-06-11 22:35:19 +00001238/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1239static std::string getPPCTargetCPU(const ArgList &Args) {
1240 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001241 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001242
1243 if (CPUName == "native") {
1244 std::string CPU = llvm::sys::getHostCPUName();
1245 if (!CPU.empty() && CPU != "generic")
1246 return CPU;
1247 else
1248 return "";
1249 }
1250
1251 return llvm::StringSwitch<const char *>(CPUName)
1252 .Case("common", "generic")
1253 .Case("440", "440")
1254 .Case("440fp", "440")
1255 .Case("450", "450")
1256 .Case("601", "601")
1257 .Case("602", "602")
1258 .Case("603", "603")
1259 .Case("603e", "603e")
1260 .Case("603ev", "603ev")
1261 .Case("604", "604")
1262 .Case("604e", "604e")
1263 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001264 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 .Case("G3", "g3")
1266 .Case("7400", "7400")
1267 .Case("G4", "g4")
1268 .Case("7450", "7450")
1269 .Case("G4+", "g4+")
1270 .Case("750", "750")
1271 .Case("970", "970")
1272 .Case("G5", "g5")
1273 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001274 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001275 .Case("e500mc", "e500mc")
1276 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001277 .Case("power3", "pwr3")
1278 .Case("power4", "pwr4")
1279 .Case("power5", "pwr5")
1280 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001281 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001282 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001283 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001284 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001285 .Case("pwr3", "pwr3")
1286 .Case("pwr4", "pwr4")
1287 .Case("pwr5", "pwr5")
1288 .Case("pwr5x", "pwr5x")
1289 .Case("pwr6", "pwr6")
1290 .Case("pwr6x", "pwr6x")
1291 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001292 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001293 .Case("powerpc", "ppc")
1294 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001295 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 .Default("");
1297 }
1298
1299 return "";
1300}
1301
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001302static void getPPCTargetFeatures(const ArgList &Args,
1303 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001304 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1305 ie = Args.filtered_end();
1306 it != ie; ++it) {
1307 StringRef Name = (*it)->getOption().getName();
1308 (*it)->claim();
1309
1310 // Skip over "-m".
1311 assert(Name.startswith("m") && "Invalid feature name.");
1312 Name = Name.substr(1);
1313
1314 bool IsNegative = Name.startswith("no-");
1315 if (IsNegative)
1316 Name = Name.substr(3);
1317
1318 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1319 // pass the correct option to the backend while calling the frontend
1320 // option the same.
1321 // TODO: Change the LLVM backend option maybe?
1322 if (Name == "mfcrf")
1323 Name = "mfocrf";
1324
1325 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1326 }
1327
1328 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001329 AddTargetFeature(Args, Features, options::OPT_faltivec,
1330 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001331}
1332
Ulrich Weigand8afad612014-07-28 13:17:52 +00001333void Clang::AddPPCTargetArgs(const ArgList &Args,
1334 ArgStringList &CmdArgs) const {
1335 // Select the ABI to use.
1336 const char *ABIName = nullptr;
1337 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1338 ABIName = A->getValue();
1339 } else if (getToolChain().getTriple().isOSLinux())
1340 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001341 case llvm::Triple::ppc64: {
1342 // When targeting a processor that supports QPX, or if QPX is
1343 // specifically enabled, default to using the ABI that supports QPX (so
1344 // long as it is not specifically disabled).
1345 bool HasQPX = false;
1346 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1347 HasQPX = A->getValue() == StringRef("a2q");
1348 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1349 if (HasQPX) {
1350 ABIName = "elfv1-qpx";
1351 break;
1352 }
1353
Ulrich Weigand8afad612014-07-28 13:17:52 +00001354 ABIName = "elfv1";
1355 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001356 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357 case llvm::Triple::ppc64le:
1358 ABIName = "elfv2";
1359 break;
1360 default:
1361 break;
1362 }
1363
1364 if (ABIName) {
1365 CmdArgs.push_back("-target-abi");
1366 CmdArgs.push_back(ABIName);
1367 }
1368}
1369
1370bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1371 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1372 return A && (A->getValue() == StringRef(Value));
1373}
1374
Tom Stellard6674c702013-04-01 20:56:53 +00001375/// Get the (LLVM) name of the R600 gpu we are targeting.
1376static std::string getR600TargetGPU(const ArgList &Args) {
1377 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001378 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001379 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001380 .Cases("rv630", "rv635", "r600")
1381 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001382 .Case("rv740", "rv770")
1383 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001384 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001385 .Case("hemlock", "cypress")
1386 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001387 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001388 }
1389 return "";
1390}
1391
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001392static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001393 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001394 bool SoftFloatABI = true;
1395 if (Arg *A =
1396 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1397 if (A->getOption().matches(options::OPT_mhard_float))
1398 SoftFloatABI = false;
1399 }
1400 if (SoftFloatABI)
1401 Features.push_back("+soft-float");
1402}
1403
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001404void Clang::AddSparcTargetArgs(const ArgList &Args,
1405 ArgStringList &CmdArgs) const {
1406 const Driver &D = getToolChain().getDriver();
1407
Brad Smith10cd0f42014-07-11 20:12:08 +00001408 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001409 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001410 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1411 options::OPT_mhard_float)) {
1412 if (A->getOption().matches(options::OPT_msoft_float))
1413 FloatABI = "soft";
1414 else if (A->getOption().matches(options::OPT_mhard_float))
1415 FloatABI = "hard";
1416 }
1417
1418 // If unspecified, choose the default based on the platform.
1419 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001420 // Assume "soft", but warn the user we are guessing.
1421 FloatABI = "soft";
1422 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423 }
1424
1425 if (FloatABI == "soft") {
1426 // Floating point operations and argument passing are soft.
1427 //
1428 // FIXME: This changes CPP defines, we need -target-soft-float.
1429 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430 } else {
1431 assert(FloatABI == "hard" && "Invalid float abi!");
1432 CmdArgs.push_back("-mhard-float");
1433 }
1434}
1435
Richard Sandiford4652d892013-07-19 16:51:51 +00001436static const char *getSystemZTargetCPU(const ArgList &Args) {
1437 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1438 return A->getValue();
1439 return "z10";
1440}
1441
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001442static void getSystemZTargetFeatures(const ArgList &Args,
1443 std::vector<const char *> &Features) {
1444 // -m(no-)htm overrides use of the transactional-execution facility.
1445 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1446 options::OPT_mno_htm)) {
1447 if (A->getOption().matches(options::OPT_mhtm))
1448 Features.push_back("+transactional-execution");
1449 else
1450 Features.push_back("-transactional-execution");
1451 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001452 // -m(no-)vx overrides use of the vector facility.
1453 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1454 options::OPT_mno_vx)) {
1455 if (A->getOption().matches(options::OPT_mvx))
1456 Features.push_back("+vector");
1457 else
1458 Features.push_back("-vector");
1459 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001460}
1461
Chandler Carruth953fb082013-01-13 11:46:33 +00001462static const char *getX86TargetCPU(const ArgList &Args,
1463 const llvm::Triple &Triple) {
1464 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001465 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001466 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001467 return "core-avx2";
1468
Chandler Carruth953fb082013-01-13 11:46:33 +00001469 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001470 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001471
1472 // FIXME: Reject attempts to use -march=native unless the target matches
1473 // the host.
1474 //
1475 // FIXME: We should also incorporate the detected target features for use
1476 // with -native.
1477 std::string CPU = llvm::sys::getHostCPUName();
1478 if (!CPU.empty() && CPU != "generic")
1479 return Args.MakeArgString(CPU);
1480 }
1481
1482 // Select the default CPU if none was given (or detection failed).
1483
1484 if (Triple.getArch() != llvm::Triple::x86_64 &&
1485 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001486 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001487
1488 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1489
1490 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001491 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001492 if (Triple.getArchName() == "x86_64h")
1493 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001494 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001495 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001496
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001497 // Set up default CPU name for PS4 compilers.
1498 if (Triple.isPS4CPU())
1499 return "btver2";
1500
Alexey Bataev286d1b92014-01-31 04:07:13 +00001501 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001502 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001503 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001504
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001505 // Everything else goes to x86-64 in 64-bit mode.
1506 if (Is64Bit)
1507 return "x86-64";
1508
1509 switch (Triple.getOS()) {
1510 case llvm::Triple::FreeBSD:
1511 case llvm::Triple::NetBSD:
1512 case llvm::Triple::OpenBSD:
1513 return "i486";
1514 case llvm::Triple::Haiku:
1515 return "i586";
1516 case llvm::Triple::Bitrig:
1517 return "i686";
1518 default:
1519 // Fallback to p4.
1520 return "pentium4";
1521 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001522}
1523
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001524static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1525 switch(T.getArch()) {
1526 default:
1527 return "";
1528
Amara Emerson703da2e2013-10-31 09:32:33 +00001529 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001530 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001531 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001532
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001533 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001534 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001535 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001536 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001537 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001538
1539 case llvm::Triple::mips:
1540 case llvm::Triple::mipsel:
1541 case llvm::Triple::mips64:
1542 case llvm::Triple::mips64el: {
1543 StringRef CPUName;
1544 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001545 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001546 return CPUName;
1547 }
1548
1549 case llvm::Triple::ppc:
1550 case llvm::Triple::ppc64:
1551 case llvm::Triple::ppc64le: {
1552 std::string TargetCPUName = getPPCTargetCPU(Args);
1553 // LLVM may default to generating code for the native CPU,
1554 // but, like gcc, we default to a more generic option for
1555 // each architecture. (except on Darwin)
1556 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1557 if (T.getArch() == llvm::Triple::ppc64)
1558 TargetCPUName = "ppc64";
1559 else if (T.getArch() == llvm::Triple::ppc64le)
1560 TargetCPUName = "ppc64le";
1561 else
1562 TargetCPUName = "ppc";
1563 }
1564 return TargetCPUName;
1565 }
1566
1567 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001568 case llvm::Triple::sparcv9:
1569 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001570 return A->getValue();
1571 return "";
1572
1573 case llvm::Triple::x86:
1574 case llvm::Triple::x86_64:
1575 return getX86TargetCPU(Args, T);
1576
1577 case llvm::Triple::hexagon:
1578 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1579
1580 case llvm::Triple::systemz:
1581 return getSystemZTargetCPU(Args);
1582
1583 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001584 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001585 return getR600TargetGPU(Args);
1586 }
1587}
1588
Alp Tokerce365ca2013-12-02 12:43:03 +00001589static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1590 ArgStringList &CmdArgs) {
1591 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1592 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1593 // forward.
1594 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001595 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001596 CmdArgs.push_back(Args.MakeArgString(Plugin));
1597
1598 // Try to pass driver level flags relevant to LTO code generation down to
1599 // the plugin.
1600
1601 // Handle flags for selecting CPU variants.
1602 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1603 if (!CPU.empty())
1604 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1605}
1606
Eric Christopherc54920a2015-03-23 19:26:05 +00001607static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001608 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001609 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001610 // If -march=native, autodetect the feature list.
1611 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1612 if (StringRef(A->getValue()) == "native") {
1613 llvm::StringMap<bool> HostFeatures;
1614 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1615 for (auto &F : HostFeatures)
1616 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1617 F.first()));
1618 }
1619 }
1620
Jim Grosbach82eee262013-11-16 00:53:35 +00001621 if (Triple.getArchName() == "x86_64h") {
1622 // x86_64h implies quite a few of the more modern subtarget features
1623 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1624 Features.push_back("-rdrnd");
1625 Features.push_back("-aes");
1626 Features.push_back("-pclmul");
1627 Features.push_back("-rtm");
1628 Features.push_back("-hle");
1629 Features.push_back("-fsgsbase");
1630 }
1631
Eric Christopherc54920a2015-03-23 19:26:05 +00001632 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001633 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001634 if (Triple.getArch() == llvm::Triple::x86_64) {
1635 Features.push_back("+sse4.2");
1636 Features.push_back("+popcnt");
1637 } else
1638 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001639 }
1640
Eric Christopherc54920a2015-03-23 19:26:05 +00001641 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001642 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1643 StringRef Arch = A->getValue();
1644 bool ArchUsed = false;
1645 // First, look for flags that are shared in x86 and x86-64.
1646 if (Triple.getArch() == llvm::Triple::x86_64 ||
1647 Triple.getArch() == llvm::Triple::x86) {
1648 if (Arch == "AVX" || Arch == "AVX2") {
1649 ArchUsed = true;
1650 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1651 }
1652 }
1653 // Then, look for x86-specific flags.
1654 if (Triple.getArch() == llvm::Triple::x86) {
1655 if (Arch == "IA32") {
1656 ArchUsed = true;
1657 } else if (Arch == "SSE" || Arch == "SSE2") {
1658 ArchUsed = true;
1659 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1660 }
1661 }
1662 if (!ArchUsed)
1663 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1664 }
1665
Jim Grosbach82eee262013-11-16 00:53:35 +00001666 // Now add any that the user explicitly requested on the command line,
1667 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001668 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1669 ie = Args.filtered_end();
1670 it != ie; ++it) {
1671 StringRef Name = (*it)->getOption().getName();
1672 (*it)->claim();
1673
1674 // Skip over "-m".
1675 assert(Name.startswith("m") && "Invalid feature name.");
1676 Name = Name.substr(1);
1677
1678 bool IsNegative = Name.startswith("no-");
1679 if (IsNegative)
1680 Name = Name.substr(3);
1681
1682 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1683 }
1684}
1685
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001686void Clang::AddX86TargetArgs(const ArgList &Args,
1687 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001688 if (!Args.hasFlag(options::OPT_mred_zone,
1689 options::OPT_mno_red_zone,
1690 true) ||
1691 Args.hasArg(options::OPT_mkernel) ||
1692 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001693 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001694
Bob Wilson2616e2e2013-02-10 16:01:41 +00001695 // Default to avoid implicit floating-point for kernel/kext code, but allow
1696 // that to be overridden with -mno-soft-float.
1697 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1698 Args.hasArg(options::OPT_fapple_kext));
1699 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1700 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001701 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001702 options::OPT_mno_implicit_float)) {
1703 const Option &O = A->getOption();
1704 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1705 O.matches(options::OPT_msoft_float));
1706 }
1707 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001708 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001709
1710 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1711 StringRef Value = A->getValue();
1712 if (Value == "intel" || Value == "att") {
1713 CmdArgs.push_back("-mllvm");
1714 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1715 } else {
1716 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1717 << A->getOption().getName() << Value;
1718 }
1719 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001720}
1721
Matthew Curtise8f80a12012-12-06 17:49:03 +00001722static inline bool HasPICArg(const ArgList &Args) {
1723 return Args.hasArg(options::OPT_fPIC)
1724 || Args.hasArg(options::OPT_fpic);
1725}
1726
1727static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1728 return Args.getLastArg(options::OPT_G,
1729 options::OPT_G_EQ,
1730 options::OPT_msmall_data_threshold_EQ);
1731}
1732
1733static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1734 std::string value;
1735 if (HasPICArg(Args))
1736 value = "0";
1737 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1738 value = A->getValue();
1739 A->claim();
1740 }
1741 return value;
1742}
1743
Tony Linthicum76329bf2011-12-12 21:14:55 +00001744void Clang::AddHexagonTargetArgs(const ArgList &Args,
1745 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001746 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001747 CmdArgs.push_back("-mqdsp6-compat");
1748 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001749
Matthew Curtise8f80a12012-12-06 17:49:03 +00001750 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1751 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001752 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001753 CmdArgs.push_back(Args.MakeArgString(
1754 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001755 }
1756
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001757 if (!Args.hasArg(options::OPT_fno_short_enums))
1758 CmdArgs.push_back("-fshort-enums");
1759 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1760 CmdArgs.push_back ("-mllvm");
1761 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1762 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001763 CmdArgs.push_back ("-mllvm");
1764 CmdArgs.push_back ("-machine-sink-split=0");
1765}
1766
Kevin Qin110db6f2014-07-18 07:03:22 +00001767// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001768static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001769 std::vector<const char *> &Features) {
1770 SmallVector<StringRef, 8> Split;
1771 text.split(Split, StringRef("+"), -1, false);
1772
1773 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1774 const char *result = llvm::StringSwitch<const char *>(Split[I])
1775 .Case("fp", "+fp-armv8")
1776 .Case("simd", "+neon")
1777 .Case("crc", "+crc")
1778 .Case("crypto", "+crypto")
1779 .Case("nofp", "-fp-armv8")
1780 .Case("nosimd", "-neon")
1781 .Case("nocrc", "-crc")
1782 .Case("nocrypto", "-crypto")
1783 .Default(nullptr);
1784 if (result)
1785 Features.push_back(result);
1786 else if (Split[I] == "neon" || Split[I] == "noneon")
1787 D.Diag(diag::err_drv_no_neon_modifier);
1788 else
1789 return false;
1790 }
1791 return true;
1792}
1793
1794// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1795// decode CPU and feature.
1796static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1797 std::vector<const char *> &Features) {
1798 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1799 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001800 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001801 Features.push_back("+neon");
1802 Features.push_back("+crc");
1803 Features.push_back("+crypto");
1804 } else if (CPU == "generic") {
1805 Features.push_back("+neon");
1806 } else {
1807 return false;
1808 }
1809
1810 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1811 return false;
1812
1813 return true;
1814}
1815
1816static bool
1817getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1818 const ArgList &Args,
1819 std::vector<const char *> &Features) {
1820 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001821
1822 if (Split.first == "armv8-a" ||
1823 Split.first == "armv8a") {
1824 // ok, no additional features.
1825 } else if (
1826 Split.first == "armv8.1-a" ||
1827 Split.first == "armv8.1a" ) {
1828 Features.push_back("+v8.1a");
1829 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001830 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001831 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001832
1833 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1834 return false;
1835
1836 return true;
1837}
1838
1839static bool
1840getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1841 const ArgList &Args,
1842 std::vector<const char *> &Features) {
1843 StringRef CPU;
1844 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1845 return false;
1846
1847 return true;
1848}
1849
1850static bool
1851getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1852 const ArgList &Args,
1853 std::vector<const char *> &Features) {
1854 // Handle CPU name is 'native'.
1855 if (Mtune == "native")
1856 Mtune = llvm::sys::getHostCPUName();
1857 if (Mtune == "cyclone") {
1858 Features.push_back("+zcm");
1859 Features.push_back("+zcz");
1860 }
1861 return true;
1862}
1863
1864static bool
1865getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1866 const ArgList &Args,
1867 std::vector<const char *> &Features) {
1868 StringRef CPU;
1869 std::vector<const char *> DecodedFeature;
1870 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1871 return false;
1872
1873 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1874}
1875
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001876static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1877 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001878 Arg *A;
1879 bool success = true;
1880 // Enable NEON by default.
1881 Features.push_back("+neon");
1882 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1883 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1884 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1885 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001886 else if (Args.hasArg(options::OPT_arch))
1887 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1888 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001889
1890 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1891 success =
1892 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1893 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1894 success =
1895 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001896 else if (Args.hasArg(options::OPT_arch))
1897 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1898 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001899
1900 if (!success)
1901 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001902
1903 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1904 Features.push_back("-fp-armv8");
1905 Features.push_back("-crypto");
1906 Features.push_back("-neon");
1907 }
Bradley Smith418c5932014-05-02 15:17:51 +00001908
1909 // En/disable crc
1910 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1911 options::OPT_mnocrc)) {
1912 if (A->getOption().matches(options::OPT_mcrc))
1913 Features.push_back("+crc");
1914 else
1915 Features.push_back("-crc");
1916 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001917}
1918
1919static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001920 const ArgList &Args, ArgStringList &CmdArgs,
1921 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001922 std::vector<const char *> Features;
1923 switch (Triple.getArch()) {
1924 default:
1925 break;
1926 case llvm::Triple::mips:
1927 case llvm::Triple::mipsel:
1928 case llvm::Triple::mips64:
1929 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001930 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001931 break;
1932
1933 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001934 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001935 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001936 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001937 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001938 break;
1939
1940 case llvm::Triple::ppc:
1941 case llvm::Triple::ppc64:
1942 case llvm::Triple::ppc64le:
1943 getPPCTargetFeatures(Args, Features);
1944 break;
1945 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001946 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001947 getSparcTargetFeatures(Args, Features);
1948 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001949 case llvm::Triple::systemz:
1950 getSystemZTargetFeatures(Args, Features);
1951 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001952 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001953 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001954 getAArch64TargetFeatures(D, Args, Features);
1955 break;
1956 case llvm::Triple::x86:
1957 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001958 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001959 break;
1960 }
Rafael Espindola43964802013-08-21 17:34:32 +00001961
1962 // Find the last of each feature.
1963 llvm::StringMap<unsigned> LastOpt;
1964 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1965 const char *Name = Features[I];
1966 assert(Name[0] == '-' || Name[0] == '+');
1967 LastOpt[Name + 1] = I;
1968 }
1969
1970 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1971 // If this feature was overridden, ignore it.
1972 const char *Name = Features[I];
1973 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1974 assert(LastI != LastOpt.end());
1975 unsigned Last = LastI->second;
1976 if (Last != I)
1977 continue;
1978
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001979 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001980 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001981 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001982}
1983
David Majnemerae394812014-12-09 00:12:30 +00001984static bool
1985shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1986 const llvm::Triple &Triple) {
1987 // We use the zero-cost exception tables for Objective-C if the non-fragile
1988 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1989 // later.
1990 if (runtime.isNonFragile())
1991 return true;
1992
1993 if (!Triple.isMacOSX())
1994 return false;
1995
1996 return (!Triple.isMacOSXVersionLT(10,5) &&
1997 (Triple.getArch() == llvm::Triple::x86_64 ||
1998 Triple.getArch() == llvm::Triple::arm));
1999}
2000
Nico Webere8e53112014-05-11 01:04:02 +00002001// exceptionSettings() exists to share the logic between -cc1 and linker
2002// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002003static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002004 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002005 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002006 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002007 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002008
David Majnemer8de68642014-12-05 08:11:58 +00002009 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002010}
2011
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002012/// Adds exception related arguments to the driver command arguments. There's a
2013/// master flag, -fexceptions and also language specific flags to enable/disable
2014/// C++ and Objective-C exceptions. This makes it possible to for example
2015/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002016static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002017 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002018 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002019 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002020 const Driver &D = TC.getDriver();
2021 const llvm::Triple &Triple = TC.getTriple();
2022
Chad Rosier4fab82c2012-03-26 22:04:46 +00002023 if (KernelOrKext) {
2024 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2025 // arguments now to avoid warnings about unused arguments.
2026 Args.ClaimAllArgs(options::OPT_fexceptions);
2027 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2028 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2029 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2030 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2031 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002032 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002033 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002034
David Majnemer8de68642014-12-05 08:11:58 +00002035 // Gather the exception settings from the command line arguments.
2036 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002037
David Majnemerae394812014-12-09 00:12:30 +00002038 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2039 // is not necessarily sensible, but follows GCC.
2040 if (types::isObjC(InputType) &&
2041 Args.hasFlag(options::OPT_fobjc_exceptions,
2042 options::OPT_fno_objc_exceptions,
2043 true)) {
2044 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002045
David Majnemerae394812014-12-09 00:12:30 +00002046 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002047 }
2048
2049 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002050 bool CXXExceptionsEnabled =
2051 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002052 Arg *ExceptionArg = Args.getLastArg(
2053 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2054 options::OPT_fexceptions, options::OPT_fno_exceptions);
2055 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002056 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002057 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2058 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002059
2060 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002061 if (Triple.isPS4CPU()) {
2062 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2063 assert(ExceptionArg &&
2064 "On the PS4 exceptions should only be enabled if passing "
2065 "an argument");
2066 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2067 const Arg *RTTIArg = TC.getRTTIArg();
2068 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2069 D.Diag(diag::err_drv_argument_not_allowed_with)
2070 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2071 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2072 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2073 } else
2074 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2075
Anders Carlssone96ab552011-02-28 02:27:16 +00002076 CmdArgs.push_back("-fcxx-exceptions");
2077
David Majnemer8de68642014-12-05 08:11:58 +00002078 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002079 }
2080 }
2081
David Majnemer8de68642014-12-05 08:11:58 +00002082 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002083 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002084}
2085
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002086static bool ShouldDisableAutolink(const ArgList &Args,
2087 const ToolChain &TC) {
2088 bool Default = true;
2089 if (TC.getTriple().isOSDarwin()) {
2090 // The native darwin assembler doesn't support the linker_option directives,
2091 // so we disable them if we think the .s file will be passed to it.
2092 Default = TC.useIntegratedAs();
2093 }
2094 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2095 Default);
2096}
2097
Ted Kremenek62093662013-03-12 17:02:12 +00002098static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2099 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002100 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2101 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002102 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002103 return !UseDwarfDirectory;
2104}
2105
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002106/// \brief Check whether the given input tree contains any compilation actions.
2107static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002108 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002109 return true;
2110
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002111 for (const auto &Act : *A)
2112 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002113 return true;
2114
2115 return false;
2116}
2117
2118/// \brief Check if -relax-all should be passed to the internal assembler.
2119/// This is done by default when compiling non-assembler source with -O0.
2120static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2121 bool RelaxDefault = true;
2122
2123 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2124 RelaxDefault = A->getOption().matches(options::OPT_O0);
2125
2126 if (RelaxDefault) {
2127 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002128 for (const auto &Act : C.getActions()) {
2129 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002130 RelaxDefault = true;
2131 break;
2132 }
2133 }
2134 }
2135
2136 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2137 RelaxDefault);
2138}
2139
David Blaikie9260ed62013-07-25 21:19:01 +00002140static void CollectArgsForIntegratedAssembler(Compilation &C,
2141 const ArgList &Args,
2142 ArgStringList &CmdArgs,
2143 const Driver &D) {
2144 if (UseRelaxAll(C, Args))
2145 CmdArgs.push_back("-mrelax-all");
2146
David Peixottodfb66142013-11-14 22:52:58 +00002147 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002148 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002149 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2150 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2151 // arg after parsing the '-I' arg.
2152 bool TakeNextArg = false;
2153
David Blaikie9260ed62013-07-25 21:19:01 +00002154 // When using an integrated assembler, translate -Wa, and -Xassembler
2155 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002156 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002157 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2158 options::OPT_Xassembler),
2159 ie = Args.filtered_end(); it != ie; ++it) {
2160 const Arg *A = *it;
2161 A->claim();
2162
2163 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2164 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002165 if (TakeNextArg) {
2166 CmdArgs.push_back(Value.data());
2167 TakeNextArg = false;
2168 continue;
2169 }
David Blaikie9260ed62013-07-25 21:19:01 +00002170
2171 if (Value == "-force_cpusubtype_ALL") {
2172 // Do nothing, this is the default and we don't support anything else.
2173 } else if (Value == "-L") {
2174 CmdArgs.push_back("-msave-temp-labels");
2175 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002176 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002177 } else if (Value == "--noexecstack") {
2178 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002179 } else if (Value == "-compress-debug-sections" ||
2180 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002181 CompressDebugSections = true;
2182 } else if (Value == "-nocompress-debug-sections" ||
2183 Value == "--nocompress-debug-sections") {
2184 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002185 } else if (Value.startswith("-I")) {
2186 CmdArgs.push_back(Value.data());
2187 // We need to consume the next argument if the current arg is a plain
2188 // -I. The next arg will be the include directory.
2189 if (Value == "-I")
2190 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002191 } else if (Value.startswith("-gdwarf-")) {
2192 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002193 } else {
2194 D.Diag(diag::err_drv_unsupported_option_argument)
2195 << A->getOption().getName() << Value;
2196 }
2197 }
2198 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002199 if (CompressDebugSections) {
2200 if (llvm::zlib::isAvailable())
2201 CmdArgs.push_back("-compress-debug-sections");
2202 else
2203 D.Diag(diag::warn_debug_compression_unavailable);
2204 }
David Blaikie9260ed62013-07-25 21:19:01 +00002205}
2206
Renato Goline807c122014-01-31 11:47:28 +00002207// Until ARM libraries are build separately, we have them all in one library
2208static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002209 // FIXME: handle 64-bit
2210 if (TC.getTriple().isOSWindows() &&
2211 !TC.getTriple().isWindowsItaniumEnvironment())
2212 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002213 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002214 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002215 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002216}
2217
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002218static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2219 // The runtimes are located in the OS-specific resource directory.
2220 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002221 const llvm::Triple &Triple = TC.getTriple();
2222 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002223 StringRef OSLibName =
2224 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002225 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002226 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002227}
2228
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002229static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002230 bool Shared = false) {
2231 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2232 ? "-android"
2233 : "";
2234
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002235 bool IsOSWindows = TC.getTriple().isOSWindows();
2236 StringRef Arch = getArchNameForCompilerRTLib(TC);
2237 const char *Prefix = IsOSWindows ? "" : "lib";
2238 const char *Suffix =
2239 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2240
2241 SmallString<128> Path = getCompilerRTLibDir(TC);
2242 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2243 Arch + Env + Suffix);
2244
2245 return Path;
2246}
2247
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002248// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002249// FIXME: Make sure we can also emit shared objects if they're requested
2250// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002251static void addClangRT(const ToolChain &TC, const ArgList &Args,
2252 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002253 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002254
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002255 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002256 // FIXME: why do we link against gcc when we are using compiler-rt?
2257 CmdArgs.push_back("-lgcc_s");
2258 if (TC.getDriver().CCCIsCXX())
2259 CmdArgs.push_back("-lgcc_eh");
2260 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002261}
2262
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002263static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2264 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002265 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2266 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002267 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002268 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002269 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002270 Args.hasArg(options::OPT_fcreate_profile) ||
2271 Args.hasArg(options::OPT_coverage)))
2272 return;
2273
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002274 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002275}
2276
Alexey Samsonov52550342014-09-15 19:58:40 +00002277static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2278 ArgStringList &CmdArgs, StringRef Sanitizer,
2279 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002280 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002281 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002282 if (!IsShared)
2283 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002284 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002285 if (!IsShared)
2286 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002287}
2288
Alexey Samsonov52550342014-09-15 19:58:40 +00002289// Tries to use a file with the list of dynamic symbols that need to be exported
2290// from the runtime library. Returns true if the file was found.
2291static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2292 ArgStringList &CmdArgs,
2293 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002294 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2295 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2296 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002297 return true;
2298 }
2299 return false;
2300}
2301
2302static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2303 ArgStringList &CmdArgs) {
2304 // Force linking against the system libraries sanitizers depends on
2305 // (see PR15823 why this is necessary).
2306 CmdArgs.push_back("--no-as-needed");
2307 CmdArgs.push_back("-lpthread");
2308 CmdArgs.push_back("-lrt");
2309 CmdArgs.push_back("-lm");
2310 // There's no libdl on FreeBSD.
2311 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2312 CmdArgs.push_back("-ldl");
2313}
2314
2315static void
2316collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2317 SmallVectorImpl<StringRef> &SharedRuntimes,
2318 SmallVectorImpl<StringRef> &StaticRuntimes,
2319 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2320 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2321 // Collect shared runtimes.
2322 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2323 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002324 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002325
Alexey Samsonov52550342014-09-15 19:58:40 +00002326 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002327 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002328 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2329 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002330 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002331 }
2332 if (SanArgs.needsAsanRt()) {
2333 if (SanArgs.needsSharedAsanRt()) {
2334 HelperStaticRuntimes.push_back("asan-preinit");
2335 } else {
2336 StaticRuntimes.push_back("asan");
2337 if (SanArgs.linkCXXRuntimes())
2338 StaticRuntimes.push_back("asan_cxx");
2339 }
2340 }
2341 if (SanArgs.needsDfsanRt())
2342 StaticRuntimes.push_back("dfsan");
2343 if (SanArgs.needsLsanRt())
2344 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002345 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002346 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002347 if (SanArgs.linkCXXRuntimes())
2348 StaticRuntimes.push_back("msan_cxx");
2349 }
2350 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002351 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002352 if (SanArgs.linkCXXRuntimes())
2353 StaticRuntimes.push_back("tsan_cxx");
2354 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002355 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002356 StaticRuntimes.push_back("ubsan_standalone");
2357 if (SanArgs.linkCXXRuntimes())
2358 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002359 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002360}
2361
Alexey Samsonov52550342014-09-15 19:58:40 +00002362// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2363// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2364static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002365 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002366 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2367 HelperStaticRuntimes;
2368 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2369 HelperStaticRuntimes);
2370 for (auto RT : SharedRuntimes)
2371 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2372 for (auto RT : HelperStaticRuntimes)
2373 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2374 bool AddExportDynamic = false;
2375 for (auto RT : StaticRuntimes) {
2376 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2377 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2378 }
2379 // If there is a static runtime with no dynamic list, force all the symbols
2380 // to be dynamic to be sure we export sanitizer interface functions.
2381 if (AddExportDynamic)
2382 CmdArgs.push_back("-export-dynamic");
2383 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002384}
2385
Reid Kleckner86ea7702015-02-04 23:45:07 +00002386static bool areOptimizationsEnabled(const ArgList &Args) {
2387 // Find the last -O arg and see if it is non-zero.
2388 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2389 return !A->getOption().matches(options::OPT_O0);
2390 // Defaults to -O0.
2391 return false;
2392}
2393
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002394static bool shouldUseFramePointerForTarget(const ArgList &Args,
2395 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002396 // XCore never wants frame pointers, regardless of OS.
2397 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002398 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002399 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002400
2401 if (Triple.isOSLinux()) {
2402 switch (Triple.getArch()) {
2403 // Don't use a frame pointer on linux if optimizing for certain targets.
2404 case llvm::Triple::mips64:
2405 case llvm::Triple::mips64el:
2406 case llvm::Triple::mips:
2407 case llvm::Triple::mipsel:
2408 case llvm::Triple::systemz:
2409 case llvm::Triple::x86:
2410 case llvm::Triple::x86_64:
2411 return !areOptimizationsEnabled(Args);
2412 default:
2413 return true;
2414 }
2415 }
2416
2417 if (Triple.isOSWindows()) {
2418 switch (Triple.getArch()) {
2419 case llvm::Triple::x86:
2420 return !areOptimizationsEnabled(Args);
2421 default:
2422 // All other supported Windows ISAs use xdata unwind information, so frame
2423 // pointers are not generally useful.
2424 return false;
2425 }
2426 }
2427
2428 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002429}
2430
Rafael Espindola224dd632011-12-14 21:02:23 +00002431static bool shouldUseFramePointer(const ArgList &Args,
2432 const llvm::Triple &Triple) {
2433 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2434 options::OPT_fomit_frame_pointer))
2435 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2436
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002437 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002438}
2439
Eric Christopherb7d97e92013-04-03 01:58:53 +00002440static bool shouldUseLeafFramePointer(const ArgList &Args,
2441 const llvm::Triple &Triple) {
2442 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2443 options::OPT_momit_leaf_frame_pointer))
2444 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2445
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002446 if (Triple.isPS4CPU())
2447 return false;
2448
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002449 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002450}
2451
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002452/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002453static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002454 SmallString<128> cwd;
2455 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002456 CmdArgs.push_back("-fdebug-compilation-dir");
2457 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002458 }
2459}
2460
Eric Christopherd3804002013-02-22 20:12:52 +00002461static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002462 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002463 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2464 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2465 SmallString<128> T(FinalOutput->getValue());
2466 llvm::sys::path::replace_extension(T, "dwo");
2467 return Args.MakeArgString(T);
2468 } else {
2469 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002470 SmallString<128> T(
2471 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002472 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002473 llvm::sys::path::replace_extension(F, "dwo");
2474 T += F;
2475 return Args.MakeArgString(F);
2476 }
2477}
2478
2479static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2480 const Tool &T, const JobAction &JA,
2481 const ArgList &Args, const InputInfo &Output,
2482 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002483 ArgStringList ExtractArgs;
2484 ExtractArgs.push_back("--extract-dwo");
2485
2486 ArgStringList StripArgs;
2487 StripArgs.push_back("--strip-dwo");
2488
2489 // Grabbing the output of the earlier compile step.
2490 StripArgs.push_back(Output.getFilename());
2491 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002492 ExtractArgs.push_back(OutFile);
2493
2494 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002495 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002496
2497 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002498 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002499
2500 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002501 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002502}
2503
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002504/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002505/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2506static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002507 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002508 if (A->getOption().matches(options::OPT_O4) ||
2509 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002510 return true;
2511
2512 if (A->getOption().matches(options::OPT_O0))
2513 return false;
2514
2515 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2516
Rafael Espindola91780de2013-08-26 14:05:41 +00002517 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002518 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002519 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002520 return true;
2521
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002522 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002523 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002524 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002525
2526 unsigned OptLevel = 0;
2527 if (S.getAsInteger(10, OptLevel))
2528 return false;
2529
2530 return OptLevel > 1;
2531 }
2532
2533 return false;
2534}
2535
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002536/// Add -x lang to \p CmdArgs for \p Input.
2537static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2538 ArgStringList &CmdArgs) {
2539 // When using -verify-pch, we don't want to provide the type
2540 // 'precompiled-header' if it was inferred from the file extension
2541 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2542 return;
2543
2544 CmdArgs.push_back("-x");
2545 if (Args.hasArg(options::OPT_rewrite_objc))
2546 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2547 else
2548 CmdArgs.push_back(types::getTypeName(Input.getType()));
2549}
2550
David Majnemerc371ff02015-03-22 08:39:22 +00002551static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002552 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002553 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002554
2555 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002556 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002557
2558 unsigned Build = 0, Factor = 1;
2559 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2560 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002561 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002562}
2563
Rafael Espindola577637a2015-01-03 00:06:04 +00002564// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002565// options that build systems might add but are unused when assembling or only
2566// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002567static void claimNoWarnArgs(const ArgList &Args) {
2568 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002569 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002570 Args.ClaimAllArgs(options::OPT_flto);
2571 Args.ClaimAllArgs(options::OPT_fno_lto);
2572}
2573
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002574static void appendUserToPath(SmallVectorImpl<char> &Result) {
2575#ifdef LLVM_ON_UNIX
2576 const char *Username = getenv("LOGNAME");
2577#else
2578 const char *Username = getenv("USERNAME");
2579#endif
2580 if (Username) {
2581 // Validate that LoginName can be used in a path, and get its length.
2582 size_t Len = 0;
2583 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002584 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002585 Username = nullptr;
2586 break;
2587 }
2588 }
2589
2590 if (Username && Len > 0) {
2591 Result.append(Username, Username + Len);
2592 return;
2593 }
2594 }
2595
2596 // Fallback to user id.
2597#ifdef LLVM_ON_UNIX
2598 std::string UID = llvm::utostr(getuid());
2599#else
2600 // FIXME: Windows seems to have an 'SID' that might work.
2601 std::string UID = "9999";
2602#endif
2603 Result.append(UID.begin(), UID.end());
2604}
2605
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002606void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002607 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002608 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002609 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002610 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002611 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2612 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002613 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002614 ArgStringList CmdArgs;
2615
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002616 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002617 bool IsWindowsCygnus =
2618 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002619 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2620
Daniel Dunbare521a892009-03-31 20:53:55 +00002621 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002622 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002623
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002624 // Invoke ourselves in -cc1 mode.
2625 //
2626 // FIXME: Implement custom jobs for internal actions.
2627 CmdArgs.push_back("-cc1");
2628
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002629 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002630 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002631 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002632 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002633
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002634 const llvm::Triple TT(TripleStr);
2635 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2636 TT.getArch() == llvm::Triple::thumb)) {
2637 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2638 unsigned Version;
2639 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2640 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002641 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2642 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002643 }
2644
Tim Northover336f1892014-03-29 13:16:12 +00002645 // Push all default warning arguments that are specific to
2646 // the given target. These come before user provided warning options
2647 // are provided.
2648 getToolChain().addClangWarningOptions(CmdArgs);
2649
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002650 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002651 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002652
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002653 if (isa<AnalyzeJobAction>(JA)) {
2654 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2655 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002656 } else if (isa<MigrateJobAction>(JA)) {
2657 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002658 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002659 if (Output.getType() == types::TY_Dependencies)
2660 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002661 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002662 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002663 if (Args.hasArg(options::OPT_rewrite_objc) &&
2664 !Args.hasArg(options::OPT_g_Group))
2665 CmdArgs.push_back("-P");
2666 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002667 } else if (isa<AssembleJobAction>(JA)) {
2668 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002669
David Blaikie9260ed62013-07-25 21:19:01 +00002670 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002671
2672 // Also ignore explicit -force_cpusubtype_ALL option.
2673 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002674 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002675 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002676 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002677
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002678 if (JA.getType() == types::TY_Nothing)
2679 CmdArgs.push_back("-fsyntax-only");
2680 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002681 CmdArgs.push_back("-emit-pch");
2682 else
2683 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002684 } else if (isa<VerifyPCHJobAction>(JA)) {
2685 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002686 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002687 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2688 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002689
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002690 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002691 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002692 } else if (JA.getType() == types::TY_LLVM_IR ||
2693 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002694 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002695 } else if (JA.getType() == types::TY_LLVM_BC ||
2696 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002697 CmdArgs.push_back("-emit-llvm-bc");
2698 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002699 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002700 } else if (JA.getType() == types::TY_AST) {
2701 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002702 } else if (JA.getType() == types::TY_ModuleFile) {
2703 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002704 } else if (JA.getType() == types::TY_RewrittenObjC) {
2705 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002706 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002707 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2708 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002709 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002710 } else {
2711 assert(JA.getType() == types::TY_PP_Asm &&
2712 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002713 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002714
2715 // Preserve use-list order by default when emitting bitcode, so that
2716 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2717 // same result as running passes here. For LTO, we don't need to preserve
2718 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002719 if (JA.getType() == types::TY_LLVM_BC)
2720 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002721 }
2722
Justin Bognera88f0122014-06-20 22:59:50 +00002723 // We normally speed up the clang process a bit by skipping destructors at
2724 // exit, but when we're generating diagnostics we can rely on some of the
2725 // cleanup.
2726 if (!C.isForDiagnostics())
2727 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002728
John McCallbb79b5f2010-02-13 03:50:24 +00002729 // Disable the verification pass in -asserts builds.
2730#ifdef NDEBUG
2731 CmdArgs.push_back("-disable-llvm-verifier");
2732#endif
2733
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002734 // Set the main file name, so that debug info works even with
2735 // -save-temps.
2736 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002737 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002738
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002739 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002740 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002741 if (Args.hasArg(options::OPT_static))
2742 CmdArgs.push_back("-static-define");
2743
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002744 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002745 // Enable region store model by default.
2746 CmdArgs.push_back("-analyzer-store=region");
2747
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002748 // Treat blocks as analysis entry points.
2749 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2750
Ted Kremenek49c79792011-03-24 00:28:47 +00002751 CmdArgs.push_back("-analyzer-eagerly-assume");
2752
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002753 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002754 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002755 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002756
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002757 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002758 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002759
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002760 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002761 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002762
2763 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002764
Artem Belevichba558952015-05-06 18:20:23 +00002765 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002766 CmdArgs.push_back("-analyzer-checker=cplusplus");
2767
Nico Webere8e53112014-05-11 01:04:02 +00002768 // Enable the following experimental checkers for testing.
2769 CmdArgs.push_back(
2770 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002771 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2772 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2773 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2774 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002776 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002777
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002778 // Set the output format. The default is plist, for (lame) historical
2779 // reasons.
2780 CmdArgs.push_back("-analyzer-output");
2781 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002782 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002783 else
2784 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002785
Ted Kremenekfe449a22010-03-22 22:32:05 +00002786 // Disable the presentation of standard compiler warnings when
2787 // using --analyze. We only want to show static analyzer diagnostics
2788 // or frontend errors.
2789 CmdArgs.push_back("-w");
2790
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002791 // Add -Xanalyzer arguments when running as analyzer.
2792 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002793 }
2794
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002795 CheckCodeGenerationOptions(D, Args);
2796
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002797 bool PIE = getToolChain().isPIEDefault();
2798 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002799 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002800
Alexey Bataev40e75222014-01-28 06:30:35 +00002801 // Android-specific defaults for PIC/PIE
2802 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2803 switch (getToolChain().getTriple().getArch()) {
2804 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002805 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002806 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002807 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002808 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002809 case llvm::Triple::mips:
2810 case llvm::Triple::mipsel:
2811 case llvm::Triple::mips64:
2812 case llvm::Triple::mips64el:
2813 PIC = true; // "-fpic"
2814 break;
2815
2816 case llvm::Triple::x86:
2817 case llvm::Triple::x86_64:
2818 PIC = true; // "-fPIC"
2819 IsPICLevelTwo = true;
2820 break;
2821
2822 default:
2823 break;
2824 }
2825 }
2826
Brad Smith5b05db82014-06-24 19:51:29 +00002827 // OpenBSD-specific defaults for PIE
2828 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2829 switch (getToolChain().getTriple().getArch()) {
2830 case llvm::Triple::mips64:
2831 case llvm::Triple::mips64el:
2832 case llvm::Triple::sparc:
2833 case llvm::Triple::x86:
2834 case llvm::Triple::x86_64:
2835 IsPICLevelTwo = false; // "-fpie"
2836 break;
2837
2838 case llvm::Triple::ppc:
2839 case llvm::Triple::sparcv9:
2840 IsPICLevelTwo = true; // "-fPIE"
2841 break;
2842
2843 default:
2844 break;
2845 }
2846 }
2847
Alexey Samsonov090301e2013-04-09 12:28:19 +00002848 // For the PIC and PIE flag options, this logic is different from the
2849 // legacy logic in very old versions of GCC, as that logic was just
2850 // a bug no one had ever fixed. This logic is both more rational and
2851 // consistent with GCC's new logic now that the bugs are fixed. The last
2852 // argument relating to either PIC or PIE wins, and no other argument is
2853 // used. If the last argument is any flavor of the '-fno-...' arguments,
2854 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2855 // at the same level.
2856 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2857 options::OPT_fpic, options::OPT_fno_pic,
2858 options::OPT_fPIE, options::OPT_fno_PIE,
2859 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002860 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2861 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002862 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002863 if (LastPICArg) {
2864 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002865 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2866 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2867 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2868 PIC = PIE || O.matches(options::OPT_fPIC) ||
2869 O.matches(options::OPT_fpic);
2870 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2871 O.matches(options::OPT_fPIC);
2872 } else {
2873 PIE = PIC = false;
2874 }
2875 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002876 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002877
Nick Lewycky609dd662013-10-11 03:33:53 +00002878 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002879 // specified while enabling PIC enabled level 1 PIC, just force it back to
2880 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2881 // informal testing).
2882 if (PIC && getToolChain().getTriple().isOSDarwin())
2883 IsPICLevelTwo |= getToolChain().isPICDefault();
2884
Chandler Carruthc0c04552012-04-08 16:40:35 +00002885 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2886 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002887 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002888 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002889 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002890 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002891 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002892
Chandler Carruth76a943b2012-11-19 03:52:03 +00002893 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2894 // This is a very special mode. It trumps the other modes, almost no one
2895 // uses it, and it isn't even valid on any OS but Darwin.
2896 if (!getToolChain().getTriple().isOSDarwin())
2897 D.Diag(diag::err_drv_unsupported_opt_for_target)
2898 << A->getSpelling() << getToolChain().getTriple().str();
2899
2900 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2901
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002902 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002903 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002904
Chandler Carruth76a943b2012-11-19 03:52:03 +00002905 // Only a forced PIC mode can cause the actual compile to have PIC defines
2906 // etc., no flags are sufficient. This behavior was selected to closely
2907 // match that of llvm-gcc and Apple GCC before that.
2908 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2909 CmdArgs.push_back("-pic-level");
2910 CmdArgs.push_back("2");
2911 }
2912 } else {
2913 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2914 // handled in Clang's IRGen by the -pie-level flag.
2915 CmdArgs.push_back("-mrelocation-model");
2916 CmdArgs.push_back(PIC ? "pic" : "static");
2917
2918 if (PIC) {
2919 CmdArgs.push_back("-pic-level");
2920 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2921 if (PIE) {
2922 CmdArgs.push_back("-pie-level");
2923 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2924 }
2925 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002926 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002927
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002928 CmdArgs.push_back("-mthread-model");
2929 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2930 CmdArgs.push_back(A->getValue());
2931 else
2932 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2933
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002934 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2935
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002936 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2937 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002938 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002939
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002940 // LLVM Code Generator Options.
2941
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002942 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2943 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2944 for (arg_iterator
2945 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2946 options::OPT_frewrite_map_file_EQ),
2947 MFE = Args.filtered_end();
2948 MFI != MFE; ++MFI) {
2949 CmdArgs.push_back("-frewrite-map-file");
2950 CmdArgs.push_back((*MFI)->getValue());
2951 (*MFI)->claim();
2952 }
2953 }
2954
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002955 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2956 StringRef v = A->getValue();
2957 CmdArgs.push_back("-mllvm");
2958 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2959 A->claim();
2960 }
2961
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002962 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2963 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002964 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002965 }
2966
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002967 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2968 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002969 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002970 D.Diag(diag::err_drv_unsupported_opt_for_target)
2971 << A->getSpelling() << getToolChain().getTriple().str();
2972 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2973 CmdArgs.push_back("-fpcc-struct-return");
2974 } else {
2975 assert(A->getOption().matches(options::OPT_freg_struct_return));
2976 CmdArgs.push_back("-freg-struct-return");
2977 }
2978 }
2979
Roman Divacky65b88cd2011-03-01 17:40:53 +00002980 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2981 CmdArgs.push_back("-mrtd");
2982
Rafael Espindola224dd632011-12-14 21:02:23 +00002983 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002984 CmdArgs.push_back("-mdisable-fp-elim");
2985 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2986 options::OPT_fno_zero_initialized_in_bss))
2987 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002988
2989 bool OFastEnabled = isOptimizationLevelFast(Args);
2990 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2991 // enabled. This alias option is being used to simplify the hasFlag logic.
2992 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2993 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002994 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2995 // doesn't do any TBAA.
2996 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002997 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002998 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002999 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003000 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3001 options::OPT_fno_struct_path_tbaa))
3002 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003003 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3004 false))
3005 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003006 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3007 options::OPT_fno_optimize_sibling_calls))
3008 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003009
Eric Christopher006208c2013-04-04 06:29:47 +00003010 // Handle segmented stacks.
3011 if (Args.hasArg(options::OPT_fsplit_stack))
3012 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003013
3014 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3015 // This alias option is being used to simplify the getLastArg logic.
3016 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3017 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003018
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003019 // Handle various floating point optimization flags, mapping them to the
3020 // appropriate LLVM code generation flags. The pattern for all of these is to
3021 // default off the codegen optimizations, and if any flag enables them and no
3022 // flag disables them after the flag enabling them, enable the codegen
3023 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003024 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003025 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003026 options::OPT_ffinite_math_only,
3027 options::OPT_fno_finite_math_only,
3028 options::OPT_fhonor_infinities,
3029 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003030 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3031 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003032 A->getOption().getID() != options::OPT_fhonor_infinities)
3033 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003034 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003035 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003036 options::OPT_ffinite_math_only,
3037 options::OPT_fno_finite_math_only,
3038 options::OPT_fhonor_nans,
3039 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003040 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3041 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003042 A->getOption().getID() != options::OPT_fhonor_nans)
3043 CmdArgs.push_back("-menable-no-nans");
3044
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003045 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3046 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003047 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003048 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003049 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003050 options::OPT_fno_math_errno)) {
3051 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3052 // However, turning *off* -ffast_math merely restores the toolchain default
3053 // (which may be false).
3054 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3055 A->getOption().getID() == options::OPT_ffast_math ||
3056 A->getOption().getID() == options::OPT_Ofast)
3057 MathErrno = false;
3058 else if (A->getOption().getID() == options::OPT_fmath_errno)
3059 MathErrno = true;
3060 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003061 if (MathErrno)
3062 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003063
3064 // There are several flags which require disabling very specific
3065 // optimizations. Any of these being disabled forces us to turn off the
3066 // entire set of LLVM optimizations, so collect them through all the flag
3067 // madness.
3068 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003069 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003070 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003071 options::OPT_funsafe_math_optimizations,
3072 options::OPT_fno_unsafe_math_optimizations,
3073 options::OPT_fassociative_math,
3074 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003075 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3076 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003077 A->getOption().getID() != options::OPT_fno_associative_math)
3078 AssociativeMath = true;
3079 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003080 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003081 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003082 options::OPT_funsafe_math_optimizations,
3083 options::OPT_fno_unsafe_math_optimizations,
3084 options::OPT_freciprocal_math,
3085 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003086 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3087 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003088 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3089 ReciprocalMath = true;
3090 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003091 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003092 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003093 options::OPT_funsafe_math_optimizations,
3094 options::OPT_fno_unsafe_math_optimizations,
3095 options::OPT_fsigned_zeros,
3096 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003097 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3098 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003099 A->getOption().getID() != options::OPT_fsigned_zeros)
3100 SignedZeros = false;
3101 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003102 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003103 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003104 options::OPT_funsafe_math_optimizations,
3105 options::OPT_fno_unsafe_math_optimizations,
3106 options::OPT_ftrapping_math,
3107 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003108 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3109 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003110 A->getOption().getID() != options::OPT_ftrapping_math)
3111 TrappingMath = false;
3112 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3113 !TrappingMath)
3114 CmdArgs.push_back("-menable-unsafe-fp-math");
3115
Sanjay Patel76c9e092015-01-23 16:40:50 +00003116 if (!SignedZeros)
3117 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003118
Sanjay Patel359b1052015-04-09 15:03:23 +00003119 if (ReciprocalMath)
3120 CmdArgs.push_back("-freciprocal-math");
3121
Lang Hamesaa53b932012-07-06 00:59:19 +00003122 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003123 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003124 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003125 options::OPT_ffp_contract)) {
3126 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003127 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003128 if (Val == "fast" || Val == "on" || Val == "off") {
3129 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3130 } else {
3131 D.Diag(diag::err_drv_unsupported_option_argument)
3132 << A->getOption().getName() << Val;
3133 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003134 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3135 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003136 // If fast-math is set then set the fp-contract mode to fast.
3137 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3138 }
3139 }
3140
Bob Wilson6a039162012-07-19 03:52:53 +00003141 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3142 // and if we find them, tell the frontend to provide the appropriate
3143 // preprocessor macros. This is distinct from enabling any optimizations as
3144 // these options induce language changes which must survive serialization
3145 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003146 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3147 options::OPT_fno_fast_math))
3148 if (!A->getOption().matches(options::OPT_fno_fast_math))
3149 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003150 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3151 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003152 if (A->getOption().matches(options::OPT_ffinite_math_only))
3153 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003154
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003155 // Decide whether to use verbose asm. Verbose assembly is the default on
3156 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003157 bool IsIntegratedAssemblerDefault =
3158 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003159 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003160 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003161 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003162 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003163
Rafael Espindola298059a2015-04-06 04:36:45 +00003164 bool UsingIntegratedAssembler =
3165 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3166 IsIntegratedAssemblerDefault);
3167 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003168 CmdArgs.push_back("-no-integrated-as");
3169
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003170 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3171 CmdArgs.push_back("-mdebug-pass");
3172 CmdArgs.push_back("Structure");
3173 }
3174 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3175 CmdArgs.push_back("-mdebug-pass");
3176 CmdArgs.push_back("Arguments");
3177 }
3178
John McCall8517abc2010-02-19 02:45:38 +00003179 // Enable -mconstructor-aliases except on darwin, where we have to
3180 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003181 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003182 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003183
John McCall7ef5cb32011-03-18 02:56:14 +00003184 // Darwin's kernel doesn't support guard variables; just die if we
3185 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003186 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003187 CmdArgs.push_back("-fforbid-guard-variables");
3188
Douglas Gregordbe39272011-02-01 15:15:22 +00003189 if (Args.hasArg(options::OPT_mms_bitfields)) {
3190 CmdArgs.push_back("-mms-bitfields");
3191 }
John McCall8517abc2010-02-19 02:45:38 +00003192
Daniel Dunbar306945d2009-09-16 06:17:29 +00003193 // This is a coarse approximation of what llvm-gcc actually does, both
3194 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3195 // complicated ways.
3196 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003197 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3198 options::OPT_fno_asynchronous_unwind_tables,
3199 (getToolChain().IsUnwindTablesDefault() ||
3200 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3201 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003202 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3203 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003204 CmdArgs.push_back("-munwind-tables");
3205
Chandler Carruth05fb5852012-11-21 23:40:23 +00003206 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003207
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003208 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3209 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003210 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003211 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003212
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003213 // FIXME: Handle -mtune=.
3214 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003215
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003216 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003217 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003218 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003219 }
3220
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003221 // Add the target cpu
3222 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3223 llvm::Triple ETriple(ETripleStr);
3224 std::string CPU = getCPUName(Args, ETriple);
3225 if (!CPU.empty()) {
3226 CmdArgs.push_back("-target-cpu");
3227 CmdArgs.push_back(Args.MakeArgString(CPU));
3228 }
3229
Rafael Espindolaeb265472013-08-21 21:59:03 +00003230 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3231 CmdArgs.push_back("-mfpmath");
3232 CmdArgs.push_back(A->getValue());
3233 }
3234
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003235 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003236 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003237
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003238 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003239 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003240 default:
3241 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003242
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003243 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003244 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003245 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003246 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003247 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003248 break;
3249
Tim Northover573cbee2014-05-24 12:52:07 +00003250 case llvm::Triple::aarch64:
3251 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003252 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003253 break;
3254
Eric Christopher0b26a612010-03-02 02:41:08 +00003255 case llvm::Triple::mips:
3256 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003257 case llvm::Triple::mips64:
3258 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003259 AddMIPSTargetArgs(Args, CmdArgs);
3260 break;
3261
Ulrich Weigand8afad612014-07-28 13:17:52 +00003262 case llvm::Triple::ppc:
3263 case llvm::Triple::ppc64:
3264 case llvm::Triple::ppc64le:
3265 AddPPCTargetArgs(Args, CmdArgs);
3266 break;
3267
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003268 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003269 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003270 AddSparcTargetArgs(Args, CmdArgs);
3271 break;
3272
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003273 case llvm::Triple::x86:
3274 case llvm::Triple::x86_64:
3275 AddX86TargetArgs(Args, CmdArgs);
3276 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003277
3278 case llvm::Triple::hexagon:
3279 AddHexagonTargetArgs(Args, CmdArgs);
3280 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003281 }
3282
Hans Wennborg75958c42013-08-08 00:17:41 +00003283 // Add clang-cl arguments.
3284 if (getToolChain().getDriver().IsCLMode())
3285 AddClangCLArgs(Args, CmdArgs);
3286
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003287 // Pass the linker version in use.
3288 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3289 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003290 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003291 }
3292
Eric Christopherb7d97e92013-04-03 01:58:53 +00003293 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003294 CmdArgs.push_back("-momit-leaf-frame-pointer");
3295
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003296 // Explicitly error on some things we know we don't support and can't just
3297 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003298 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003299 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3300 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003301 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003302 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003303 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003304 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3305 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003306 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003307 << Unsupported->getOption().getName();
3308 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003309 }
3310
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003311 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003312 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003313 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003314 CmdArgs.push_back("-header-include-file");
3315 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3316 D.CCPrintHeadersFilename : "-");
3317 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003318 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003319 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003320
Chad Rosierbe10f982011-08-02 17:58:04 +00003321 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003322 CmdArgs.push_back("-diagnostic-log-file");
3323 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3324 D.CCLogDiagnosticsFilename : "-");
3325 }
3326
Manman Ren17bdb0f2013-11-20 20:22:14 +00003327 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3328 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003329 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003330 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003331 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3332 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003333 // FIXME: we should support specifying dwarf version with
3334 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003335 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003336 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003337 const llvm::Triple &Triple = getToolChain().getTriple();
3338 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003339 Triple.getOS() == llvm::Triple::FreeBSD ||
3340 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003341 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003342 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003343 CmdArgs.push_back("-gdwarf-2");
3344 else if (A->getOption().matches(options::OPT_gdwarf_3))
3345 CmdArgs.push_back("-gdwarf-3");
3346 else if (A->getOption().matches(options::OPT_gdwarf_4))
3347 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003348 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003349 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003350 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003351 const llvm::Triple &Triple = getToolChain().getTriple();
3352 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003353 Triple.getOS() == llvm::Triple::FreeBSD ||
3354 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003355 CmdArgs.push_back("-gdwarf-2");
3356 else
3357 CmdArgs.push_back("-g");
3358 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003359 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003360
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003361 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3362 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003363 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3364 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003365 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003366
Eric Christopher138c32b2013-09-13 22:37:55 +00003367 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003368 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3369 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003370 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003371 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003372 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003373 CmdArgs.push_back("-g");
3374 CmdArgs.push_back("-backend-option");
3375 CmdArgs.push_back("-split-dwarf=Enable");
3376 }
3377
Eric Christopher138c32b2013-09-13 22:37:55 +00003378 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3379 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3380 CmdArgs.push_back("-backend-option");
3381 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3382 }
Eric Christophereec89c22013-06-18 00:03:50 +00003383
Eric Christopher0d403d22014-02-14 01:27:03 +00003384 // -gdwarf-aranges turns on the emission of the aranges section in the
3385 // backend.
3386 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3387 CmdArgs.push_back("-backend-option");
3388 CmdArgs.push_back("-generate-arange-section");
3389 }
3390
David Blaikief36d9ba2014-01-27 18:52:43 +00003391 if (Args.hasFlag(options::OPT_fdebug_types_section,
3392 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003393 CmdArgs.push_back("-backend-option");
3394 CmdArgs.push_back("-generate-type-units");
3395 }
Eric Christophereec89c22013-06-18 00:03:50 +00003396
Ed Schouten6e576152015-03-26 17:50:28 +00003397 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3398 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3399
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003400 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003401 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003402 CmdArgs.push_back("-ffunction-sections");
3403 }
3404
3405 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003406 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003407 CmdArgs.push_back("-fdata-sections");
3408 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003409
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003410 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003411 options::OPT_fno_unique_section_names,
3412 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003413 CmdArgs.push_back("-fno-unique-section-names");
3414
Chris Lattner3c77a352010-06-22 00:03:40 +00003415 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3416
Justin Bognera71e6812015-04-30 23:49:42 +00003417 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3418 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003419 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3420 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3421 D.Diag(diag::err_drv_argument_not_allowed_with)
3422 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3423
Justin Bognera71e6812015-04-30 23:49:42 +00003424 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3425 A->render(Args, CmdArgs);
3426 else
3427 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003428
3429 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3430 A->render(Args, CmdArgs);
3431 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3432 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3433
Nick Lewycky207bce32011-04-21 23:44:07 +00003434 if (Args.hasArg(options::OPT_ftest_coverage) ||
3435 Args.hasArg(options::OPT_coverage))
3436 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003437 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3438 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003439 Args.hasArg(options::OPT_coverage))
3440 CmdArgs.push_back("-femit-coverage-data");
3441
Alex Lorenzee024992014-08-04 18:41:51 +00003442 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003443 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3444 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003445 D.Diag(diag::err_drv_argument_only_allowed_with)
3446 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3447
3448 if (Args.hasArg(options::OPT_fcoverage_mapping))
3449 CmdArgs.push_back("-fcoverage-mapping");
3450
Nick Lewycky480cb992011-05-04 20:46:58 +00003451 if (C.getArgs().hasArg(options::OPT_c) ||
3452 C.getArgs().hasArg(options::OPT_S)) {
3453 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003454 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003455 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003456 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003457 CoverageFilename = FinalOutput->getValue();
3458 } else {
3459 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3460 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003461 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003462 SmallString<128> Pwd;
3463 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003464 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003465 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003466 }
3467 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003468 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003469 }
3470 }
3471
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003472 // Pass options for controlling the default header search paths.
3473 if (Args.hasArg(options::OPT_nostdinc)) {
3474 CmdArgs.push_back("-nostdsysteminc");
3475 CmdArgs.push_back("-nobuiltininc");
3476 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003477 if (Args.hasArg(options::OPT_nostdlibinc))
3478 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003479 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3480 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3481 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003482
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003483 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003484 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003485 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003486
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003487 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3488
Ted Kremenekf7639e12012-03-06 20:06:33 +00003489 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003490 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003491 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003492 options::OPT_ccc_arcmt_modify,
3493 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003494 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003495 switch (A->getOption().getID()) {
3496 default:
3497 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003498 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003499 CmdArgs.push_back("-arcmt-check");
3500 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003501 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003502 CmdArgs.push_back("-arcmt-modify");
3503 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003504 case options::OPT_ccc_arcmt_migrate:
3505 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003506 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003507 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003508
3509 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3510 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003511 break;
John McCalld70fb982011-06-15 23:25:17 +00003512 }
3513 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003514 } else {
3515 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3516 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3517 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003518 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003519
Ted Kremenekf7639e12012-03-06 20:06:33 +00003520 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3521 if (ARCMTEnabled) {
3522 D.Diag(diag::err_drv_argument_not_allowed_with)
3523 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3524 }
3525 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003526 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003527
3528 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003529 options::OPT_objcmt_migrate_subscripting,
3530 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003531 // None specified, means enable them all.
3532 CmdArgs.push_back("-objcmt-migrate-literals");
3533 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003534 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003535 } else {
3536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003539 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003540 } else {
3541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3551 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3552 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3553 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3554 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003555 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003556 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003557 }
3558
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003559 // Add preprocessing options like -I, -D, etc. if we are using the
3560 // preprocessor.
3561 //
3562 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003563 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003564 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003565
Rafael Espindolaa7431922011-07-21 23:40:37 +00003566 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3567 // that "The compiler can only warn and ignore the option if not recognized".
3568 // When building with ccache, it will pass -D options to clang even on
3569 // preprocessed inputs and configure concludes that -fPIC is not supported.
3570 Args.ClaimAllArgs(options::OPT_D);
3571
Alp Toker7874bdc2013-11-15 20:40:58 +00003572 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003573 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3574 if (A->getOption().matches(options::OPT_O4)) {
3575 CmdArgs.push_back("-O3");
3576 D.Diag(diag::warn_O4_is_O3);
3577 } else {
3578 A->render(Args, CmdArgs);
3579 }
3580 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003581
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003582 // Warn about ignored options to clang.
3583 for (arg_iterator it = Args.filtered_begin(
3584 options::OPT_clang_ignored_gcc_optimization_f_Group),
3585 ie = Args.filtered_end(); it != ie; ++it) {
3586 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3587 }
3588
Rafael Espindola577637a2015-01-03 00:06:04 +00003589 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003590
Richard Smith3be1cb22014-08-07 00:24:21 +00003591 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003592 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003593 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3594 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003595 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003596 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003597
3598 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003599 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003600 //
3601 // If a std is supplied, only add -trigraphs if it follows the
3602 // option.
3603 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3604 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003605 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003606 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003607 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003608 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003609 else
3610 Std->render(Args, CmdArgs);
3611
Nico Weber00721502014-12-23 22:32:37 +00003612 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003613 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003614 options::OPT_ftrigraphs,
3615 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003616 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003617 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003618 } else {
3619 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003620 //
3621 // FIXME: Clang doesn't correctly handle -std= when the input language
3622 // doesn't match. For the time being just ignore this for C++ inputs;
3623 // eventually we want to do all the standard defaulting here instead of
3624 // splitting it between the driver and clang -cc1.
3625 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003626 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3627 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003628 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003629 CmdArgs.push_back("-std=c++11");
3630
Nico Weber00721502014-12-23 22:32:37 +00003631 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3632 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003633 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003634
Richard Smith282b4492013-09-04 22:50:31 +00003635 // GCC's behavior for -Wwrite-strings is a bit strange:
3636 // * In C, this "warning flag" changes the types of string literals from
3637 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3638 // for the discarded qualifier.
3639 // * In C++, this is just a normal warning flag.
3640 //
3641 // Implementing this warning correctly in C is hard, so we follow GCC's
3642 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3643 // a non-const char* in C, rather than using this crude hack.
3644 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003645 // FIXME: This should behave just like a warning flag, and thus should also
3646 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3647 Arg *WriteStrings =
3648 Args.getLastArg(options::OPT_Wwrite_strings,
3649 options::OPT_Wno_write_strings, options::OPT_w);
3650 if (WriteStrings &&
3651 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003652 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003653 }
3654
Chandler Carruth61fbf622011-04-23 09:27:53 +00003655 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003656 // during C++ compilation, which it is by default. GCC keeps this define even
3657 // in the presence of '-w', match this behavior bug-for-bug.
3658 if (types::isCXX(InputType) &&
3659 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3660 true)) {
3661 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003662 }
3663
Chandler Carruthe0391482010-05-22 02:21:53 +00003664 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3665 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3666 if (Asm->getOption().matches(options::OPT_fasm))
3667 CmdArgs.push_back("-fgnu-keywords");
3668 else
3669 CmdArgs.push_back("-fno-gnu-keywords");
3670 }
3671
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003672 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3673 CmdArgs.push_back("-fno-dwarf-directory-asm");
3674
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003675 if (ShouldDisableAutolink(Args, getToolChain()))
3676 CmdArgs.push_back("-fno-autolink");
3677
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003678 // Add in -fdebug-compilation-dir if necessary.
3679 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003680
Richard Smith9a568822011-11-21 19:36:32 +00003681 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3682 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003683 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003684 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003685 }
3686
Richard Smith79c927b2013-11-06 19:31:51 +00003687 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3688 CmdArgs.push_back("-foperator-arrow-depth");
3689 CmdArgs.push_back(A->getValue());
3690 }
3691
Richard Smith9a568822011-11-21 19:36:32 +00003692 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3693 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003694 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003695 }
3696
Richard Smitha3d3bd22013-05-08 02:12:03 +00003697 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3698 CmdArgs.push_back("-fconstexpr-steps");
3699 CmdArgs.push_back(A->getValue());
3700 }
3701
Richard Smithb3a14522013-02-22 01:59:51 +00003702 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3703 CmdArgs.push_back("-fbracket-depth");
3704 CmdArgs.push_back(A->getValue());
3705 }
3706
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003707 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3708 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003709 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003710 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003711 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3712 } else
3713 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003714 }
3715
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003716
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003717 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003718 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003719
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003720 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3721 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003722 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003723 }
David Chisnall5778fce2009-08-31 16:41:57 +00003724
Chris Lattnere23003d2010-01-09 21:54:33 +00003725 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3726 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003728 }
3729
Chris Lattnerb35583d2010-04-07 20:49:23 +00003730 CmdArgs.push_back("-ferror-limit");
3731 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003732 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003733 else
3734 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003735
Chandler Carrutha77a7272010-05-06 04:55:18 +00003736 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3737 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003738 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003739 }
3740
3741 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3742 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003743 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003744 }
3745
Richard Smithf6f003a2011-12-16 19:06:07 +00003746 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3747 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003748 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003749 }
3750
Nick Lewycky24653262014-12-16 21:39:02 +00003751 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3752 CmdArgs.push_back("-fspell-checking-limit");
3753 CmdArgs.push_back(A->getValue());
3754 }
3755
Daniel Dunbar2c978472009-11-04 06:24:47 +00003756 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003757 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003758 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003759 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003760 } else {
3761 // If -fmessage-length=N was not specified, determine whether this is a
3762 // terminal and, if so, implicitly define -fmessage-length appropriately.
3763 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003764 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003765 }
3766
John McCallb4a99d32013-02-19 01:57:35 +00003767 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3768 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3769 options::OPT_fvisibility_ms_compat)) {
3770 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3771 CmdArgs.push_back("-fvisibility");
3772 CmdArgs.push_back(A->getValue());
3773 } else {
3774 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3775 CmdArgs.push_back("-fvisibility");
3776 CmdArgs.push_back("hidden");
3777 CmdArgs.push_back("-ftype-visibility");
3778 CmdArgs.push_back("default");
3779 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003780 }
3781
Douglas Gregor08329632010-06-15 17:05:35 +00003782 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003783
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003784 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3785
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003786 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003787 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3788 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003789 CmdArgs.push_back("-ffreestanding");
3790
Daniel Dunbare357d562009-12-03 18:42:11 +00003791 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003792 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003793 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003794 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3795 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003796 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003797 // AltiVec language extensions aren't relevant for assembling.
3798 if (!isa<PreprocessJobAction>(JA) ||
3799 Output.getType() != types::TY_PP_Asm)
3800 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003801 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3802 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003803
Peter Collingbourne32701642013-11-01 18:16:25 +00003804 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3805 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003806
Eric Christopher459d2712013-02-19 06:16:53 +00003807 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003808 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003809 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003810 getToolChain().getArch() == llvm::Triple::ppc64 ||
3811 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003812 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003813 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003814
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003815 if (getToolChain().SupportsProfiling())
3816 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003817
3818 // -flax-vector-conversions is default.
3819 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3820 options::OPT_fno_lax_vector_conversions))
3821 CmdArgs.push_back("-fno-lax-vector-conversions");
3822
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003823 if (Args.getLastArg(options::OPT_fapple_kext))
3824 CmdArgs.push_back("-fapple-kext");
3825
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003826 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003827 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003828 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003829 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3830 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003831
3832 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3833 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003834 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003835 }
3836
Bob Wilson14adb362012-02-03 06:27:22 +00003837 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003838
Chandler Carruth6e501032011-03-27 00:04:55 +00003839 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3840 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3841 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3842 options::OPT_fno_wrapv)) {
3843 if (A->getOption().matches(options::OPT_fwrapv))
3844 CmdArgs.push_back("-fwrapv");
3845 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3846 options::OPT_fno_strict_overflow)) {
3847 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3848 CmdArgs.push_back("-fwrapv");
3849 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003850
3851 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3852 options::OPT_fno_reroll_loops))
3853 if (A->getOption().matches(options::OPT_freroll_loops))
3854 CmdArgs.push_back("-freroll-loops");
3855
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003856 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003857 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3858 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003859
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003860 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3861
Mahesha S6a682be42012-10-27 07:47:56 +00003862
Daniel Dunbar4930e332009-11-17 08:07:36 +00003863 // -stack-protector=0 is default.
3864 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003865 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3866 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003867 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003868 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003869 if (A->getOption().matches(options::OPT_fstack_protector)) {
3870 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3871 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3872 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003873 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003874 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003875 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003876 } else {
3877 StackProtectorLevel =
3878 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3879 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003880 if (StackProtectorLevel) {
3881 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003882 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003883 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003884
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003885 // --param ssp-buffer-size=
3886 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3887 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003888 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003889 if (Str.startswith("ssp-buffer-size=")) {
3890 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003891 CmdArgs.push_back("-stack-protector-buffer-size");
3892 // FIXME: Verify the argument is a valid integer.
3893 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003894 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003895 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003896 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003897 }
3898
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003899 // Translate -mstackrealign
3900 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3901 false)) {
3902 CmdArgs.push_back("-backend-option");
3903 CmdArgs.push_back("-force-align-stack");
3904 }
3905 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3906 false)) {
3907 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3908 }
3909
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003910 if (Args.hasArg(options::OPT_mstack_alignment)) {
3911 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3912 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003913 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003914
Hans Wennborg77dc2362015-01-20 19:45:50 +00003915 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3916 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3917
3918 if (!Size.empty())
3919 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3920 else
3921 CmdArgs.push_back("-mstack-probe-size=0");
3922 }
3923
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003924 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3925 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3926 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3927
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003928 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3929 options::OPT_mno_restrict_it)) {
3930 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3931 CmdArgs.push_back("-backend-option");
3932 CmdArgs.push_back("-arm-restrict-it");
3933 } else {
3934 CmdArgs.push_back("-backend-option");
3935 CmdArgs.push_back("-arm-no-restrict-it");
3936 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003937 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3938 TT.getArch() == llvm::Triple::thumb)) {
3939 // Windows on ARM expects restricted IT blocks
3940 CmdArgs.push_back("-backend-option");
3941 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003942 }
3943
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003944 if (TT.getArch() == llvm::Triple::arm ||
3945 TT.getArch() == llvm::Triple::thumb) {
3946 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3947 options::OPT_mno_long_calls)) {
3948 if (A->getOption().matches(options::OPT_mlong_calls)) {
3949 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003950 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003951 }
3952 }
3953 }
3954
Daniel Dunbard18049a2009-04-07 21:16:11 +00003955 // Forward -f options with positive and negative forms; we translate
3956 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003957 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3958 StringRef fname = A->getValue();
3959 if (!llvm::sys::fs::exists(fname))
3960 D.Diag(diag::err_drv_no_such_file) << fname;
3961 else
3962 A->render(Args, CmdArgs);
3963 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003964
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003965 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003966 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003967 CmdArgs.push_back("-fapple-kext");
3968 if (!Args.hasArg(options::OPT_fbuiltin))
3969 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003970 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003971 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003972 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003973 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003974 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003975
Nuno Lopes13c88c72009-12-16 16:59:22 +00003976 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3977 options::OPT_fno_assume_sane_operator_new))
3978 CmdArgs.push_back("-fno-assume-sane-operator-new");
3979
Daniel Dunbar4930e332009-11-17 08:07:36 +00003980 // -fblocks=0 is default.
3981 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003982 getToolChain().IsBlocksDefault()) ||
3983 (Args.hasArg(options::OPT_fgnu_runtime) &&
3984 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3985 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003986 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003987
3988 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3989 !getToolChain().hasBlocksRuntime())
3990 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003991 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003992
Richard Smithffb65082014-09-30 23:10:19 +00003993 // -fmodules enables modules (off by default).
3994 // Users can pass -fno-cxx-modules to turn off modules support for
3995 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003996 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003997 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3998 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3999 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004000 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004001 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004002 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004003 HaveModules = true;
4004 }
4005 }
4006
Daniel Jasper07e6c402013-08-05 20:26:17 +00004007 // -fmodule-maps enables module map processing (off by default) for header
4008 // checking. It is implied by -fmodules.
4009 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4010 false)) {
4011 CmdArgs.push_back("-fmodule-maps");
4012 }
4013
Daniel Jasperac42b752013-10-21 06:34:34 +00004014 // -fmodules-decluse checks that modules used are declared so (off by
4015 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004016 if (Args.hasFlag(options::OPT_fmodules_decluse,
4017 options::OPT_fno_modules_decluse,
4018 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004019 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004020 }
4021
Daniel Jasper962b38e2014-04-11 11:47:45 +00004022 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4023 // all #included headers are part of modules.
4024 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4025 options::OPT_fno_modules_strict_decluse,
4026 false)) {
4027 CmdArgs.push_back("-fmodules-strict-decluse");
4028 }
4029
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004030 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4031 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4032 options::OPT_fno_implicit_modules)) {
4033 CmdArgs.push_back("-fno-implicit-modules");
4034 }
4035
Daniel Jasperac42b752013-10-21 06:34:34 +00004036 // -fmodule-name specifies the module that is currently being built (or
4037 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004038 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004039
Richard Smith9887d792014-10-17 01:42:53 +00004040 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004041 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004042 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004043
Richard Smithe842a472014-10-22 02:05:46 +00004044 // -fmodule-file can be used to specify files containing precompiled modules.
4045 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4046
4047 // -fmodule-cache-path specifies where our implicitly-built module files
4048 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004049 SmallString<128> ModuleCachePath;
4050 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4051 ModuleCachePath = A->getValue();
4052 if (HaveModules) {
4053 if (C.isForDiagnostics()) {
4054 // When generating crash reports, we want to emit the modules along with
4055 // the reproduction sources, so we ignore any provided module path.
4056 ModuleCachePath = Output.getFilename();
4057 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4058 llvm::sys::path::append(ModuleCachePath, "modules");
4059 } else if (ModuleCachePath.empty()) {
4060 // No module path was provided: use the default.
4061 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4062 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004063 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4064 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004065 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4066 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004067 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004068 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4069 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4070 }
4071
4072 // When building modules and generating crashdumps, we need to dump a module
4073 // dependency VFS alongside the output.
4074 if (HaveModules && C.isForDiagnostics()) {
4075 SmallString<128> VFSDir(Output.getFilename());
4076 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004077 // Add the cache directory as a temp so the crash diagnostics pick it up.
4078 C.addTempFile(Args.MakeArgString(VFSDir));
4079
Justin Bognera88f0122014-06-20 22:59:50 +00004080 llvm::sys::path::append(VFSDir, "vfs");
4081 CmdArgs.push_back("-module-dependency-dir");
4082 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004083 }
4084
Richard Smith9887d792014-10-17 01:42:53 +00004085 if (HaveModules)
4086 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004087
Douglas Gregor35b04d62013-02-07 19:01:24 +00004088 // Pass through all -fmodules-ignore-macro arguments.
4089 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004090 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4091 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004092
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004093 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4094
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004095 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4096 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4097 D.Diag(diag::err_drv_argument_not_allowed_with)
4098 << A->getAsString(Args) << "-fbuild-session-timestamp";
4099
4100 llvm::sys::fs::file_status Status;
4101 if (llvm::sys::fs::status(A->getValue(), Status))
4102 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004103 CmdArgs.push_back(Args.MakeArgString(
4104 "-fbuild-session-timestamp=" +
4105 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004106 }
4107
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004108 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004109 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4110 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004111 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4112
4113 Args.AddLastArg(CmdArgs,
4114 options::OPT_fmodules_validate_once_per_build_session);
4115 }
4116
Ben Langmuirdcf73862014-03-12 00:06:17 +00004117 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4118
John McCalldfea9982010-04-09 19:12:06 +00004119 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004120 if (Args.hasFlag(options::OPT_fno_access_control,
4121 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004122 false))
John McCall3155f572010-04-09 19:03:51 +00004123 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004124
Anders Carlssond470fef2010-11-21 00:09:52 +00004125 // -felide-constructors is the default.
4126 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4127 options::OPT_felide_constructors,
4128 false))
4129 CmdArgs.push_back("-fno-elide-constructors");
4130
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004131 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004132
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004133 if (KernelOrKext || (types::isCXX(InputType) &&
4134 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4135 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004136 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004137
Tony Linthicum76329bf2011-12-12 21:14:55 +00004138 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004139 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004140 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004141 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004142 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004143 CmdArgs.push_back("-fshort-enums");
4144
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004145 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004146 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004147 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004148 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004149
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004150 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004151 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4152 options::OPT_fno_use_cxa_atexit,
4153 !IsWindowsCygnus && !IsWindowsGNU &&
4154 getToolChain().getArch() != llvm::Triple::hexagon &&
4155 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004156 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004157 CmdArgs.push_back("-fno-use-cxa-atexit");
4158
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004159 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004160 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004161 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004162 CmdArgs.push_back("-fms-extensions");
4163
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004164 // -fno-use-line-directives is default.
4165 if (Args.hasFlag(options::OPT_fuse_line_directives,
4166 options::OPT_fno_use_line_directives, false))
4167 CmdArgs.push_back("-fuse-line-directives");
4168
Francois Pichet1b4f1632011-09-17 04:32:15 +00004169 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004170 if (Args.hasFlag(options::OPT_fms_compatibility,
4171 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004172 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4173 options::OPT_fno_ms_extensions,
4174 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004175 CmdArgs.push_back("-fms-compatibility");
4176
David Majnemerc371ff02015-03-22 08:39:22 +00004177 // -fms-compatibility-version=18.00 is default.
4178 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004179 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004180 IsWindowsMSVC) ||
4181 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004182 Args.hasArg(options::OPT_fms_compatibility_version)) {
4183 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4184 const Arg *MSCompatibilityVersion =
4185 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004186
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004187 if (MSCVersion && MSCompatibilityVersion)
4188 D.Diag(diag::err_drv_argument_not_allowed_with)
4189 << MSCVersion->getAsString(Args)
4190 << MSCompatibilityVersion->getAsString(Args);
4191
David Majnemerc371ff02015-03-22 08:39:22 +00004192 if (MSCompatibilityVersion) {
4193 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4194 D.Diag(diag::err_drv_invalid_value)
4195 << MSCompatibilityVersion->getAsString(Args)
4196 << MSCompatibilityVersion->getValue();
4197 } else if (MSCVersion) {
4198 unsigned Version = 0;
4199 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4200 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4201 << MSCVersion->getValue();
4202 MSVT = getMSCompatibilityVersion(Version);
4203 } else {
4204 MSVT = VersionTuple(18);
4205 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004206
David Majnemerc371ff02015-03-22 08:39:22 +00004207 CmdArgs.push_back(
4208 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004209 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004210
Eric Christopher5ecce122013-02-18 00:38:31 +00004211 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004212 if (Args.hasFlag(options::OPT_fborland_extensions,
4213 options::OPT_fno_borland_extensions, false))
4214 CmdArgs.push_back("-fborland-extensions");
4215
David Majnemerc371ff02015-03-22 08:39:22 +00004216 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4217 // than 19.
4218 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4219 options::OPT_fno_threadsafe_statics,
4220 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4221 CmdArgs.push_back("-fno-threadsafe-statics");
4222
Francois Pichet02744872011-09-01 16:38:08 +00004223 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4224 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004225 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004226 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004227 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004228
Chandler Carruthe03aa552010-04-17 20:17:31 +00004229 // -fgnu-keywords default varies depending on language; only pass if
4230 // specified.
4231 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004232 options::OPT_fno_gnu_keywords))
4233 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004234
Rafael Espindola922a6242011-06-02 17:30:53 +00004235 if (Args.hasFlag(options::OPT_fgnu89_inline,
4236 options::OPT_fno_gnu89_inline,
4237 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004238 CmdArgs.push_back("-fgnu89-inline");
4239
Chad Rosier9c76d242012-03-15 22:31:42 +00004240 if (Args.hasArg(options::OPT_fno_inline))
4241 CmdArgs.push_back("-fno-inline");
4242
Chad Rosier64d6be92012-03-06 21:17:19 +00004243 if (Args.hasArg(options::OPT_fno_inline_functions))
4244 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004245
John McCall5fb5df92012-06-20 06:18:46 +00004246 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004247
John McCall5fb5df92012-06-20 06:18:46 +00004248 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004249 // legacy is the default. Except for deployment taget of 10.5,
4250 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4251 // gets ignored silently.
4252 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004253 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4254 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004255 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004256 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004257 if (getToolChain().UseObjCMixedDispatch())
4258 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4259 else
4260 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4261 }
4262 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004263
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004264 // When ObjectiveC legacy runtime is in effect on MacOSX,
4265 // turn on the option to do Array/Dictionary subscripting
4266 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004267 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4268 getToolChain().getTriple().isMacOSX() &&
4269 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4270 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004271 objcRuntime.isNeXTFamily())
4272 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4273
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004274 // -fencode-extended-block-signature=1 is default.
4275 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4276 CmdArgs.push_back("-fencode-extended-block-signature");
4277 }
4278
John McCall24fc0de2011-07-06 00:26:06 +00004279 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4280 // NOTE: This logic is duplicated in ToolChains.cpp.
4281 bool ARC = isObjCAutoRefCount(Args);
4282 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004283 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004284
John McCall24fc0de2011-07-06 00:26:06 +00004285 CmdArgs.push_back("-fobjc-arc");
4286
Chandler Carruth491db322011-11-04 07:34:47 +00004287 // FIXME: It seems like this entire block, and several around it should be
4288 // wrapped in isObjC, but for now we just use it here as this is where it
4289 // was being used previously.
4290 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4291 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4292 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4293 else
4294 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4295 }
4296
John McCall24fc0de2011-07-06 00:26:06 +00004297 // Allow the user to enable full exceptions code emission.
4298 // We define off for Objective-CC, on for Objective-C++.
4299 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4300 options::OPT_fno_objc_arc_exceptions,
4301 /*default*/ types::isCXX(InputType)))
4302 CmdArgs.push_back("-fobjc-arc-exceptions");
4303 }
4304
4305 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4306 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004307 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004308 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004309
John McCall24fc0de2011-07-06 00:26:06 +00004310 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4311 // takes precedence.
4312 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4313 if (!GCArg)
4314 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4315 if (GCArg) {
4316 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004317 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004318 << GCArg->getAsString(Args);
4319 } else if (getToolChain().SupportsObjCGC()) {
4320 GCArg->render(Args, CmdArgs);
4321 } else {
4322 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004323 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004324 << GCArg->getAsString(Args);
4325 }
4326 }
4327
Bob Wilsonb111ec92015-03-02 19:01:14 +00004328 if (Args.hasFlag(options::OPT_fapplication_extension,
4329 options::OPT_fno_application_extension, false))
4330 CmdArgs.push_back("-fapplication-extension");
4331
Reid Klecknerc542d372014-06-27 17:02:02 +00004332 // Handle GCC-style exception args.
4333 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004334 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004335 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004336
4337 if (getToolChain().UseSjLjExceptions())
4338 CmdArgs.push_back("-fsjlj-exceptions");
4339
4340 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004341 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4342 options::OPT_fno_assume_sane_operator_new))
4343 CmdArgs.push_back("-fno-assume-sane-operator-new");
4344
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004345 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4346 // most platforms.
4347 if (Args.hasFlag(options::OPT_fsized_deallocation,
4348 options::OPT_fno_sized_deallocation, false))
4349 CmdArgs.push_back("-fsized-deallocation");
4350
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004351 // -fconstant-cfstrings is default, and may be subject to argument translation
4352 // on Darwin.
4353 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4354 options::OPT_fno_constant_cfstrings) ||
4355 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4356 options::OPT_mno_constant_cfstrings))
4357 CmdArgs.push_back("-fno-constant-cfstrings");
4358
John Thompsoned4e2952009-11-05 20:14:16 +00004359 // -fshort-wchar default varies depending on platform; only
4360 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004361 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4362 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004363 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004364
Hans Wennborg28c96312013-07-31 23:39:13 +00004365 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004366 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004367 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004368 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004369 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004370
Daniel Dunbar096ed292011-10-05 21:04:55 +00004371 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4372 // -fno-pack-struct doesn't apply to -fpack-struct=.
4373 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004374 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004375 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004376 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004377 } else if (Args.hasFlag(options::OPT_fpack_struct,
4378 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004379 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004380 }
4381
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004382 // Handle -fmax-type-align=N and -fno-type-align
4383 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4384 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4385 if (!SkipMaxTypeAlign) {
4386 std::string MaxTypeAlignStr = "-fmax-type-align=";
4387 MaxTypeAlignStr += A->getValue();
4388 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4389 }
4390 } else if (getToolChain().getTriple().isOSDarwin()) {
4391 if (!SkipMaxTypeAlign) {
4392 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4393 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4394 }
4395 }
4396
Robert Lytton0e076492013-08-13 09:43:10 +00004397 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004398 if (!Args.hasArg(options::OPT_fcommon))
4399 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004400 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004401 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004402
Daniel Dunbard18049a2009-04-07 21:16:11 +00004403 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004404 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004405 CmdArgs.push_back("-fno-common");
4406
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004407 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004408 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004409 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004410 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004411 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004412 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4413
Daniel Dunbar6358d682010-10-15 22:30:42 +00004414 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4415 if (!Args.hasFlag(options::OPT_ffor_scope,
4416 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004417 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004418 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4419
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004420 // -finput_charset=UTF-8 is default. Reject others
4421 if (Arg *inputCharset = Args.getLastArg(
4422 options::OPT_finput_charset_EQ)) {
4423 StringRef value = inputCharset->getValue();
4424 if (value != "UTF-8")
4425 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4426 }
4427
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004428 // -fexec_charset=UTF-8 is default. Reject others
4429 if (Arg *execCharset = Args.getLastArg(
4430 options::OPT_fexec_charset_EQ)) {
4431 StringRef value = execCharset->getValue();
4432 if (value != "UTF-8")
4433 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4434 }
4435
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004436 // -fcaret-diagnostics is default.
4437 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4438 options::OPT_fno_caret_diagnostics, true))
4439 CmdArgs.push_back("-fno-caret-diagnostics");
4440
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004441 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004442 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004443 options::OPT_fno_diagnostics_fixit_info))
4444 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004445
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004446 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004447 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004448 options::OPT_fno_diagnostics_show_option))
4449 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004450
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004451 if (const Arg *A =
4452 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4453 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004454 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004455 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004456
Douglas Gregor643c9222011-05-21 17:07:29 +00004457 if (const Arg *A =
4458 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4459 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004460 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004461 }
4462
Chandler Carruthb6766f02011-03-27 01:50:55 +00004463 if (Arg *A = Args.getLastArg(
4464 options::OPT_fdiagnostics_show_note_include_stack,
4465 options::OPT_fno_diagnostics_show_note_include_stack)) {
4466 if (A->getOption().matches(
4467 options::OPT_fdiagnostics_show_note_include_stack))
4468 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4469 else
4470 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4471 }
4472
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004473 // Color diagnostics are the default, unless the terminal doesn't support
4474 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004475 // Support both clang's -f[no-]color-diagnostics and gcc's
4476 // -f[no-]diagnostics-colors[=never|always|auto].
4477 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004478 for (const auto &Arg : Args) {
4479 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004480 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4481 !O.matches(options::OPT_fdiagnostics_color) &&
4482 !O.matches(options::OPT_fno_color_diagnostics) &&
4483 !O.matches(options::OPT_fno_diagnostics_color) &&
4484 !O.matches(options::OPT_fdiagnostics_color_EQ))
4485 continue;
4486
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004487 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004488 if (O.matches(options::OPT_fcolor_diagnostics) ||
4489 O.matches(options::OPT_fdiagnostics_color)) {
4490 ShowColors = Colors_On;
4491 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4492 O.matches(options::OPT_fno_diagnostics_color)) {
4493 ShowColors = Colors_Off;
4494 } else {
4495 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004496 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004497 if (value == "always")
4498 ShowColors = Colors_On;
4499 else if (value == "never")
4500 ShowColors = Colors_Off;
4501 else if (value == "auto")
4502 ShowColors = Colors_Auto;
4503 else
4504 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4505 << ("-fdiagnostics-color=" + value).str();
4506 }
4507 }
4508 if (ShowColors == Colors_On ||
4509 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004510 CmdArgs.push_back("-fcolor-diagnostics");
4511
Nico Rieck7857d462013-09-11 00:38:02 +00004512 if (Args.hasArg(options::OPT_fansi_escape_codes))
4513 CmdArgs.push_back("-fansi-escape-codes");
4514
Daniel Dunbardb097022009-06-08 21:13:54 +00004515 if (!Args.hasFlag(options::OPT_fshow_source_location,
4516 options::OPT_fno_show_source_location))
4517 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004518
Douglas Gregor643c9222011-05-21 17:07:29 +00004519 if (!Args.hasFlag(options::OPT_fshow_column,
4520 options::OPT_fno_show_column,
4521 true))
4522 CmdArgs.push_back("-fno-show-column");
4523
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004524 if (!Args.hasFlag(options::OPT_fspell_checking,
4525 options::OPT_fno_spell_checking))
4526 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004527
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004528
Chad Rosierc8e56e82012-12-05 21:08:21 +00004529 // -fno-asm-blocks is default.
4530 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4531 false))
4532 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004533
Steven Wucb0d13f2015-01-16 23:05:28 +00004534 // -fgnu-inline-asm is default.
4535 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4536 options::OPT_fno_gnu_inline_asm, true))
4537 CmdArgs.push_back("-fno-gnu-inline-asm");
4538
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004539 // Enable vectorization per default according to the optimization level
4540 // selected. For optimization levels that want vectorization we use the alias
4541 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004542 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004543 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004544 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004545 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004546 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004547 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004548
Chad Rosier136d67d2014-04-28 19:30:57 +00004549 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004550 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4551 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004552 options::OPT_fslp_vectorize;
4553 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004554 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004555 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004556
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004557 // -fno-slp-vectorize-aggressive is default.
4558 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004559 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004560 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004561
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004562 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4563 A->render(Args, CmdArgs);
4564
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004565 // -fdollars-in-identifiers default varies depending on platform and
4566 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004567 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004568 options::OPT_fno_dollars_in_identifiers)) {
4569 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004570 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004571 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004572 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004573 }
4574
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004575 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4576 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004577 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004578 options::OPT_fno_unit_at_a_time)) {
4579 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004580 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004581 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004582
Eli Friedman055c9702011-11-02 01:53:16 +00004583 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4584 options::OPT_fno_apple_pragma_pack, false))
4585 CmdArgs.push_back("-fapple-pragma-pack");
4586
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004587 // le32-specific flags:
4588 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4589 // by default.
4590 if (getToolChain().getArch() == llvm::Triple::le32) {
4591 CmdArgs.push_back("-fno-math-builtin");
4592 }
4593
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004594 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004595 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004596 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004597#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004598 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004599 (getToolChain().getArch() == llvm::Triple::arm ||
4600 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004601 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4602 CmdArgs.push_back("-fno-builtin-strcat");
4603 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4604 CmdArgs.push_back("-fno-builtin-strcpy");
4605 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004606#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004607
Justin Bognera88f0122014-06-20 22:59:50 +00004608 // Enable rewrite includes if the user's asked for it or if we're generating
4609 // diagnostics.
4610 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4611 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004612 if (Args.hasFlag(options::OPT_frewrite_includes,
4613 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004614 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004615 CmdArgs.push_back("-frewrite-includes");
4616
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004617 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004618 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004619 options::OPT_traditional_cpp)) {
4620 if (isa<PreprocessJobAction>(JA))
4621 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004622 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004623 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004624 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004625
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004626 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004627 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004628
4629 // Handle serialized diagnostics.
4630 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4631 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004632 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004633 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004634
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004635 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4636 CmdArgs.push_back("-fretain-comments-from-system-headers");
4637
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004638 // Forward -fcomment-block-commands to -cc1.
4639 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004640 // Forward -fparse-all-comments to -cc1.
4641 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004642
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004643 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4644 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004645 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004646 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004647 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4648 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004649 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004650
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004651 // We translate this by hand to the -cc1 argument, since nightly test uses
4652 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004653 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004654 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004655 OptDisabled = true;
4656 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004657 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004658 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004659
Bob Wilson23a55f12014-12-21 07:00:00 +00004660 // With -save-temps, we want to save the unoptimized bitcode output from the
4661 // CompileJobAction, so disable optimizations if they are not already
4662 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004663 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004664 isa<CompileJobAction>(JA))
4665 CmdArgs.push_back("-disable-llvm-optzns");
4666
Daniel Dunbard67a3222009-03-30 06:36:42 +00004667 if (Output.getType() == types::TY_Dependencies) {
4668 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004669 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004670 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004671 CmdArgs.push_back(Output.getFilename());
4672 } else {
4673 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004674 }
4675
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004676 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004677 addDashXForInput(Args, II, CmdArgs);
4678
Daniel Dunbarb440f562010-08-02 02:38:21 +00004679 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004680 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004681 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004682 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004683 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004684
Chris Lattnere9d7d782009-11-03 19:50:27 +00004685 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4686
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004687 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004688
4689 // Optionally embed the -cc1 level arguments into the debug info, for build
4690 // analysis.
4691 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004692 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004693 for (const auto &Arg : Args)
4694 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004695
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004696 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004697 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004698 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004699 SmallString<128> EscapedArg;
4700 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004701 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004702 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004703 }
4704 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004705 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004706 }
4707
Eric Christopherd3804002013-02-22 20:12:52 +00004708 // Add the split debug info name to the command lines here so we
4709 // can propagate it to the backend.
4710 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004711 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004712 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4713 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004714 const char *SplitDwarfOut;
4715 if (SplitDwarf) {
4716 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004717 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004718 CmdArgs.push_back(SplitDwarfOut);
4719 }
4720
4721 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004722 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004723 Output.getType() == types::TY_Object &&
4724 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004725 auto CLCommand =
4726 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4727 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4728 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004729 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004730 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004731 }
4732
Daniel Dunbar17731772009-03-23 19:03:36 +00004733
Eric Christopherf1545832013-02-22 23:50:16 +00004734 // Handle the debug info splitting at object creation time if we're
4735 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004736 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004737 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004738 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004739
Roman Divacky178e01602011-02-10 16:52:03 +00004740 if (Arg *A = Args.getLastArg(options::OPT_pg))
4741 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004742 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004743 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004744
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004745 // Claim some arguments which clang supports automatically.
4746
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004747 // -fpch-preprocess is used with gcc to add a special marker in the output to
4748 // include the PCH file. Clang's PTH solution is completely transparent, so we
4749 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004750 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004751
Daniel Dunbar17731772009-03-23 19:03:36 +00004752 // Claim some arguments which clang doesn't support, but we don't
4753 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004754 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4755 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004756
Rafael Espindolab0092d72013-09-04 19:37:35 +00004757 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004758 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004759}
4760
John McCall5fb5df92012-06-20 06:18:46 +00004761/// Add options related to the Objective-C runtime/ABI.
4762///
4763/// Returns true if the runtime is non-fragile.
4764ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4765 ArgStringList &cmdArgs,
4766 RewriteKind rewriteKind) const {
4767 // Look for the controlling runtime option.
4768 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4769 options::OPT_fgnu_runtime,
4770 options::OPT_fobjc_runtime_EQ);
4771
4772 // Just forward -fobjc-runtime= to the frontend. This supercedes
4773 // options about fragility.
4774 if (runtimeArg &&
4775 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4776 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004777 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004778 if (runtime.tryParse(value)) {
4779 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4780 << value;
4781 }
4782
4783 runtimeArg->render(args, cmdArgs);
4784 return runtime;
4785 }
4786
4787 // Otherwise, we'll need the ABI "version". Version numbers are
4788 // slightly confusing for historical reasons:
4789 // 1 - Traditional "fragile" ABI
4790 // 2 - Non-fragile ABI, version 1
4791 // 3 - Non-fragile ABI, version 2
4792 unsigned objcABIVersion = 1;
4793 // If -fobjc-abi-version= is present, use that to set the version.
4794 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004795 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004796 if (value == "1")
4797 objcABIVersion = 1;
4798 else if (value == "2")
4799 objcABIVersion = 2;
4800 else if (value == "3")
4801 objcABIVersion = 3;
4802 else
4803 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4804 << value;
4805 } else {
4806 // Otherwise, determine if we are using the non-fragile ABI.
4807 bool nonFragileABIIsDefault =
4808 (rewriteKind == RK_NonFragile ||
4809 (rewriteKind == RK_None &&
4810 getToolChain().IsObjCNonFragileABIDefault()));
4811 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4812 options::OPT_fno_objc_nonfragile_abi,
4813 nonFragileABIIsDefault)) {
4814 // Determine the non-fragile ABI version to use.
4815#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4816 unsigned nonFragileABIVersion = 1;
4817#else
4818 unsigned nonFragileABIVersion = 2;
4819#endif
4820
4821 if (Arg *abiArg = args.getLastArg(
4822 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004823 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004824 if (value == "1")
4825 nonFragileABIVersion = 1;
4826 else if (value == "2")
4827 nonFragileABIVersion = 2;
4828 else
4829 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4830 << value;
4831 }
4832
4833 objcABIVersion = 1 + nonFragileABIVersion;
4834 } else {
4835 objcABIVersion = 1;
4836 }
4837 }
4838
4839 // We don't actually care about the ABI version other than whether
4840 // it's non-fragile.
4841 bool isNonFragile = objcABIVersion != 1;
4842
4843 // If we have no runtime argument, ask the toolchain for its default runtime.
4844 // However, the rewriter only really supports the Mac runtime, so assume that.
4845 ObjCRuntime runtime;
4846 if (!runtimeArg) {
4847 switch (rewriteKind) {
4848 case RK_None:
4849 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4850 break;
4851 case RK_Fragile:
4852 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4853 break;
4854 case RK_NonFragile:
4855 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4856 break;
4857 }
4858
4859 // -fnext-runtime
4860 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4861 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004862 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004863 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4864
4865 // Otherwise, build for a generic macosx port.
4866 } else {
4867 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4868 }
4869
4870 // -fgnu-runtime
4871 } else {
4872 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004873 // Legacy behaviour is to target the gnustep runtime if we are i
4874 // non-fragile mode or the GCC runtime in fragile mode.
4875 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004876 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004877 else
4878 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004879 }
4880
4881 cmdArgs.push_back(args.MakeArgString(
4882 "-fobjc-runtime=" + runtime.getAsString()));
4883 return runtime;
4884}
4885
Reid Klecknerc542d372014-06-27 17:02:02 +00004886static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4887 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4888 I += HaveDash;
4889 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004890}
Reid Klecknerc542d372014-06-27 17:02:02 +00004891
4892struct EHFlags {
4893 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4894 bool Synch;
4895 bool Asynch;
4896 bool NoExceptC;
4897};
4898
4899/// /EH controls whether to run destructor cleanups when exceptions are
4900/// thrown. There are three modifiers:
4901/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4902/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4903/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4904/// - c: Assume that extern "C" functions are implicitly noexcept. This
4905/// modifier is an optimization, so we ignore it for now.
4906/// The default is /EHs-c-, meaning cleanups are disabled.
4907static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4908 EHFlags EH;
4909 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4910 for (auto EHVal : EHArgs) {
4911 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4912 switch (EHVal[I]) {
4913 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4914 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4915 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4916 default: break;
4917 }
4918 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4919 break;
4920 }
4921 }
4922 return EH;
4923}
4924
Hans Wennborg75958c42013-08-08 00:17:41 +00004925void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4926 unsigned RTOptionID = options::OPT__SLASH_MT;
4927
Hans Wennborgf1a74252013-09-10 20:18:04 +00004928 if (Args.hasArg(options::OPT__SLASH_LDd))
4929 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4930 // but defining _DEBUG is sticky.
4931 RTOptionID = options::OPT__SLASH_MTd;
4932
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004933 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004934 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004935
Hans Wennborg75958c42013-08-08 00:17:41 +00004936 switch(RTOptionID) {
4937 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004938 if (Args.hasArg(options::OPT__SLASH_LDd))
4939 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004940 CmdArgs.push_back("-D_MT");
4941 CmdArgs.push_back("-D_DLL");
4942 CmdArgs.push_back("--dependent-lib=msvcrt");
4943 break;
4944 case options::OPT__SLASH_MDd:
4945 CmdArgs.push_back("-D_DEBUG");
4946 CmdArgs.push_back("-D_MT");
4947 CmdArgs.push_back("-D_DLL");
4948 CmdArgs.push_back("--dependent-lib=msvcrtd");
4949 break;
4950 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004951 if (Args.hasArg(options::OPT__SLASH_LDd))
4952 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004953 CmdArgs.push_back("-D_MT");
4954 CmdArgs.push_back("--dependent-lib=libcmt");
4955 break;
4956 case options::OPT__SLASH_MTd:
4957 CmdArgs.push_back("-D_DEBUG");
4958 CmdArgs.push_back("-D_MT");
4959 CmdArgs.push_back("--dependent-lib=libcmtd");
4960 break;
4961 default:
4962 llvm_unreachable("Unexpected option ID.");
4963 }
4964
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004965 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4966 // users want. The /Za flag to cl.exe turns this off, but it's not
4967 // implemented in clang.
4968 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004969
Hans Wennborg8858a032014-07-21 23:42:07 +00004970 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4971 // would produce interleaved output, so ignore /showIncludes in such cases.
4972 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4973 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4974 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004975
David Majnemerf6072342014-07-01 22:24:56 +00004976 // This controls whether or not we emit RTTI data for polymorphic types.
4977 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4978 /*default=*/false))
4979 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004980
Reid Klecknerc542d372014-06-27 17:02:02 +00004981 const Driver &D = getToolChain().getDriver();
4982 EHFlags EH = parseClangCLEHFlags(D, Args);
4983 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004984 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004985 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004986 CmdArgs.push_back("-fexceptions");
4987 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004988
Hans Wennborge50cec32014-06-13 20:59:54 +00004989 // /EP should expand to -E -P.
4990 if (Args.hasArg(options::OPT__SLASH_EP)) {
4991 CmdArgs.push_back("-E");
4992 CmdArgs.push_back("-P");
4993 }
4994
David Majnemera5b195a2015-02-14 01:35:12 +00004995 unsigned VolatileOptionID;
4996 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4997 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4998 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4999 else
5000 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5001
5002 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5003 VolatileOptionID = A->getOption().getID();
5004
5005 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5006 CmdArgs.push_back("-fms-volatile");
5007
David Majnemer86c318f2014-02-11 21:05:00 +00005008 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5009 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5010 if (MostGeneralArg && BestCaseArg)
5011 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5012 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5013
5014 if (MostGeneralArg) {
5015 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5016 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5017 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5018
5019 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5020 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5021 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5022 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5023 << FirstConflict->getAsString(Args)
5024 << SecondConflict->getAsString(Args);
5025
5026 if (SingleArg)
5027 CmdArgs.push_back("-fms-memptr-rep=single");
5028 else if (MultipleArg)
5029 CmdArgs.push_back("-fms-memptr-rep=multiple");
5030 else
5031 CmdArgs.push_back("-fms-memptr-rep=virtual");
5032 }
5033
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005034 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5035 A->render(Args, CmdArgs);
5036
Hans Wennborg81f74482013-09-10 01:07:07 +00005037 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5038 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005039 if (Args.hasArg(options::OPT__SLASH_fallback))
5040 CmdArgs.push_back("msvc-fallback");
5041 else
5042 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005043 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005044}
5045
Hans Wennborg1da044a2014-06-26 19:59:02 +00005046visualstudio::Compile *Clang::getCLFallback() const {
5047 if (!CLFallback)
5048 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5049 return CLFallback.get();
5050}
5051
Daniel Sanders7f933f42015-01-30 17:35:23 +00005052void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5053 ArgStringList &CmdArgs) const {
5054 StringRef CPUName;
5055 StringRef ABIName;
5056 const llvm::Triple &Triple = getToolChain().getTriple();
5057 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5058
5059 CmdArgs.push_back("-target-abi");
5060 CmdArgs.push_back(ABIName.data());
5061}
5062
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005063void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005064 const InputInfo &Output,
5065 const InputInfoList &Inputs,
5066 const ArgList &Args,
5067 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005068 ArgStringList CmdArgs;
5069
5070 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5071 const InputInfo &Input = Inputs[0];
5072
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005073 // Don't warn about "clang -w -c foo.s"
5074 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005075 // and "clang -emit-llvm -c foo.s"
5076 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005077
Rafael Espindola577637a2015-01-03 00:06:04 +00005078 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005079
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005080 // Invoke ourselves in -cc1as mode.
5081 //
5082 // FIXME: Implement custom jobs for internal actions.
5083 CmdArgs.push_back("-cc1as");
5084
5085 // Add the "effective" target triple.
5086 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005087 std::string TripleStr =
5088 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005089 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5090
5091 // Set the output mode, we currently only expect to be used as a real
5092 // assembler.
5093 CmdArgs.push_back("-filetype");
5094 CmdArgs.push_back("obj");
5095
Eric Christopher45f2e712012-12-18 00:31:10 +00005096 // Set the main file name, so that debug info works even with
5097 // -save-temps or preprocessed assembly.
5098 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005099 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005100
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005101 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005102 const llvm::Triple &Triple = getToolChain().getTriple();
5103 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005104 if (!CPU.empty()) {
5105 CmdArgs.push_back("-target-cpu");
5106 CmdArgs.push_back(Args.MakeArgString(CPU));
5107 }
5108
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005109 // Add the target features
5110 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005111 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005112
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005113 // Ignore explicit -force_cpusubtype_ALL option.
5114 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005115
Eric Christopherfc3ee562012-01-10 00:38:01 +00005116 // Determine the original source input.
5117 const Action *SourceAction = &JA;
5118 while (SourceAction->getKind() != Action::InputClass) {
5119 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5120 SourceAction = SourceAction->getInputs()[0];
5121 }
5122
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005123 // Forward -g and handle debug info related flags, assuming we are dealing
5124 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005125 if (SourceAction->getType() == types::TY_Asm ||
5126 SourceAction->getType() == types::TY_PP_Asm) {
5127 Args.ClaimAllArgs(options::OPT_g_Group);
5128 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5129 if (!A->getOption().matches(options::OPT_g0))
5130 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005131
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005132 if (Args.hasArg(options::OPT_gdwarf_2))
5133 CmdArgs.push_back("-gdwarf-2");
5134 if (Args.hasArg(options::OPT_gdwarf_3))
5135 CmdArgs.push_back("-gdwarf-3");
5136 if (Args.hasArg(options::OPT_gdwarf_4))
5137 CmdArgs.push_back("-gdwarf-4");
5138
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005139 // Add the -fdebug-compilation-dir flag if needed.
5140 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005141
5142 // Set the AT_producer to the clang version when using the integrated
5143 // assembler on assembly source files.
5144 CmdArgs.push_back("-dwarf-debug-producer");
5145 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005146 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005147
5148 // Optionally embed the -cc1as level arguments into the debug info, for build
5149 // analysis.
5150 if (getToolChain().UseDwarfDebugFlags()) {
5151 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005152 for (const auto &Arg : Args)
5153 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005154
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005155 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005156 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5157 Flags += Exec;
5158 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005159 SmallString<128> EscapedArg;
5160 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005161 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005162 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005163 }
5164 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005165 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005166 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005167
5168 // FIXME: Add -static support, once we have it.
5169
Daniel Sanders7f933f42015-01-30 17:35:23 +00005170 // Add target specific flags.
5171 switch(getToolChain().getArch()) {
5172 default:
5173 break;
5174
5175 case llvm::Triple::mips:
5176 case llvm::Triple::mipsel:
5177 case llvm::Triple::mips64:
5178 case llvm::Triple::mips64el:
5179 AddMIPSTargetArgs(Args, CmdArgs);
5180 break;
5181 }
5182
David Blaikie372d9502014-01-17 03:17:40 +00005183 // Consume all the warning flags. Usually this would be handled more
5184 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5185 // doesn't handle that so rather than warning about unused flags that are
5186 // actually used, we'll lie by omission instead.
5187 // FIXME: Stop lying and consume only the appropriate driver flags
5188 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5189 ie = Args.filtered_end();
5190 it != ie; ++it)
5191 (*it)->claim();
5192
David Blaikie9260ed62013-07-25 21:19:01 +00005193 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5194 getToolChain().getDriver());
5195
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005196 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005197
5198 assert(Output.isFilename() && "Unexpected lipo output.");
5199 CmdArgs.push_back("-o");
5200 CmdArgs.push_back(Output.getFilename());
5201
Daniel Dunbarb440f562010-08-02 02:38:21 +00005202 assert(Input.isFilename() && "Invalid input.");
5203 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005204
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005205 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005206 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005207
5208 // Handle the debug info splitting at object creation time if we're
5209 // creating an object.
5210 // TODO: Currently only works on linux with newer objcopy.
5211 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005212 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005213 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005214 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005215}
5216
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005217void GnuTool::anchor() {}
5218
Daniel Dunbara3246a02009-03-18 08:07:30 +00005219void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005220 const InputInfo &Output,
5221 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005222 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005223 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005224 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005225 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005226
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005227 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005228 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005229 // Don't forward any -g arguments to assembly steps.
5230 if (isa<AssembleJobAction>(JA) &&
5231 A->getOption().matches(options::OPT_g_Group))
5232 continue;
5233
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005234 // Don't forward any -W arguments to assembly and link steps.
5235 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5236 A->getOption().matches(options::OPT_W_Group))
5237 continue;
5238
Daniel Dunbar2da02722009-03-19 07:55:12 +00005239 // It is unfortunate that we have to claim here, as this means
5240 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005241 // platforms using a generic gcc, even if we are just using gcc
5242 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005243 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005244 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005245 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005246 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005247
Daniel Dunbar4e295052010-01-25 22:35:08 +00005248 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005249
5250 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005251 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005252 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005253 CmdArgs.push_back(
5254 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005255 }
5256
Daniel Dunbar5716d872009-05-02 21:41:52 +00005257 // Try to force gcc to match the tool chain we want, if we recognize
5258 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005259 //
5260 // FIXME: The triple class should directly provide the information we want
5261 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005262 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005263 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005264 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005265 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5266 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005267 CmdArgs.push_back("-m64");
5268
Daniel Dunbarb440f562010-08-02 02:38:21 +00005269 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005270 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005271 CmdArgs.push_back(Output.getFilename());
5272 } else {
5273 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005274 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005275 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005276
Tony Linthicum76329bf2011-12-12 21:14:55 +00005277 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5278 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005279
5280 // Only pass -x if gcc will understand it; otherwise hope gcc
5281 // understands the suffix correctly. The main use case this would go
5282 // wrong in is for linker inputs if they happened to have an odd
5283 // suffix; really the only way to get this to happen is a command
5284 // like '-x foobar a.c' which will treat a.c like a linker input.
5285 //
5286 // FIXME: For the linker case specifically, can we safely convert
5287 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005288 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005289 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005290 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5291 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005292 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005293 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005294 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005295 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005296 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005297 else if (II.getType() == types::TY_ModuleFile)
5298 D.Diag(diag::err_drv_no_module_support)
5299 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005300
Daniel Dunbara3246a02009-03-18 08:07:30 +00005301 if (types::canTypeBeUserSpecified(II.getType())) {
5302 CmdArgs.push_back("-x");
5303 CmdArgs.push_back(types::getTypeName(II.getType()));
5304 }
5305
Daniel Dunbarb440f562010-08-02 02:38:21 +00005306 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005307 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005308 else {
5309 const Arg &A = II.getInputArg();
5310
5311 // Reverse translate some rewritten options.
5312 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5313 CmdArgs.push_back("-lstdc++");
5314 continue;
5315 }
5316
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005317 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005318 A.render(Args, CmdArgs);
5319 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005320 }
5321
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005322 const std::string customGCCName = D.getCCCGenericGCCName();
5323 const char *GCCName;
5324 if (!customGCCName.empty())
5325 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005326 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005327 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005328 } else
5329 GCCName = "gcc";
5330
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005331 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005332 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005333 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005334}
5335
Daniel Dunbar4e295052010-01-25 22:35:08 +00005336void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5337 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005338 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005339}
5340
Daniel Dunbar4e295052010-01-25 22:35:08 +00005341void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5342 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005343 const Driver &D = getToolChain().getDriver();
5344
Eric Christophercc7ff502015-01-29 00:56:17 +00005345 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005346 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005347 case types::TY_LLVM_IR:
5348 case types::TY_LTO_IR:
5349 case types::TY_LLVM_BC:
5350 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005351 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005352 break;
5353 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005354 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005355 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005356 case types::TY_Nothing:
5357 CmdArgs.push_back("-fsyntax-only");
5358 break;
5359 default:
5360 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005361 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005362}
5363
Daniel Dunbar4e295052010-01-25 22:35:08 +00005364void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5365 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005366 // The types are (hopefully) good enough.
5367}
5368
Tony Linthicum76329bf2011-12-12 21:14:55 +00005369// Hexagon tools start.
5370void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5371 ArgStringList &CmdArgs) const {
5372
5373}
5374void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5375 const InputInfo &Output,
5376 const InputInfoList &Inputs,
5377 const ArgList &Args,
5378 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005379 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005380
5381 const Driver &D = getToolChain().getDriver();
5382 ArgStringList CmdArgs;
5383
5384 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005385 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005386 CmdArgs.push_back(Args.MakeArgString(MarchString));
5387
5388 RenderExtraToolArgs(JA, CmdArgs);
5389
5390 if (Output.isFilename()) {
5391 CmdArgs.push_back("-o");
5392 CmdArgs.push_back(Output.getFilename());
5393 } else {
5394 assert(Output.isNothing() && "Unexpected output");
5395 CmdArgs.push_back("-fsyntax-only");
5396 }
5397
Matthew Curtise8f80a12012-12-06 17:49:03 +00005398 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5399 if (!SmallDataThreshold.empty())
5400 CmdArgs.push_back(
5401 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005402
Matthew Curtise5df3812012-12-07 17:23:04 +00005403 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5404 options::OPT_Xassembler);
5405
Tony Linthicum76329bf2011-12-12 21:14:55 +00005406 // Only pass -x if gcc will understand it; otherwise hope gcc
5407 // understands the suffix correctly. The main use case this would go
5408 // wrong in is for linker inputs if they happened to have an odd
5409 // suffix; really the only way to get this to happen is a command
5410 // like '-x foobar a.c' which will treat a.c like a linker input.
5411 //
5412 // FIXME: For the linker case specifically, can we safely convert
5413 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005414 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005415 // Don't try to pass LLVM or AST inputs to a generic gcc.
5416 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5417 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5418 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5419 << getToolChain().getTripleString();
5420 else if (II.getType() == types::TY_AST)
5421 D.Diag(clang::diag::err_drv_no_ast_support)
5422 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005423 else if (II.getType() == types::TY_ModuleFile)
5424 D.Diag(diag::err_drv_no_module_support)
5425 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005426
5427 if (II.isFilename())
5428 CmdArgs.push_back(II.getFilename());
5429 else
5430 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5431 II.getInputArg().render(Args, CmdArgs);
5432 }
5433
5434 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005435 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005437}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005438
Tony Linthicum76329bf2011-12-12 21:14:55 +00005439void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5440 ArgStringList &CmdArgs) const {
5441 // The types are (hopefully) good enough.
5442}
5443
5444void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5445 const InputInfo &Output,
5446 const InputInfoList &Inputs,
5447 const ArgList &Args,
5448 const char *LinkingOutput) const {
5449
Matthew Curtise689b052012-12-06 15:46:07 +00005450 const toolchains::Hexagon_TC& ToolChain =
5451 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5452 const Driver &D = ToolChain.getDriver();
5453
Tony Linthicum76329bf2011-12-12 21:14:55 +00005454 ArgStringList CmdArgs;
5455
Matthew Curtise689b052012-12-06 15:46:07 +00005456 //----------------------------------------------------------------------------
5457 //
5458 //----------------------------------------------------------------------------
5459 bool hasStaticArg = Args.hasArg(options::OPT_static);
5460 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005461 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005462 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5463 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5464 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5465 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005466
Matthew Curtise689b052012-12-06 15:46:07 +00005467 //----------------------------------------------------------------------------
5468 // Silence warnings for various options
5469 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005470
Matthew Curtise689b052012-12-06 15:46:07 +00005471 Args.ClaimAllArgs(options::OPT_g_Group);
5472 Args.ClaimAllArgs(options::OPT_emit_llvm);
5473 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5474 // handled somewhere else.
5475 Args.ClaimAllArgs(options::OPT_static_libgcc);
5476
5477 //----------------------------------------------------------------------------
5478 //
5479 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005480 for (const auto &Opt : ToolChain.ExtraOpts)
5481 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005482
Matthew Curtisf10a5952012-12-06 14:16:43 +00005483 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5484 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005485
Matthew Curtise689b052012-12-06 15:46:07 +00005486 if (buildingLib) {
5487 CmdArgs.push_back("-shared");
5488 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5489 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005490 }
5491
Matthew Curtise689b052012-12-06 15:46:07 +00005492 if (hasStaticArg)
5493 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005494
Matthew Curtise8f80a12012-12-06 17:49:03 +00005495 if (buildPIE && !buildingLib)
5496 CmdArgs.push_back("-pie");
5497
5498 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5499 if (!SmallDataThreshold.empty()) {
5500 CmdArgs.push_back(
5501 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5502 }
5503
Matthew Curtise689b052012-12-06 15:46:07 +00005504 //----------------------------------------------------------------------------
5505 //
5506 //----------------------------------------------------------------------------
5507 CmdArgs.push_back("-o");
5508 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005509
Matthew Curtise689b052012-12-06 15:46:07 +00005510 const std::string MarchSuffix = "/" + MarchString;
5511 const std::string G0Suffix = "/G0";
5512 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005513 const std::string RootDir =
5514 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005515 const std::string StartFilesDir = RootDir
5516 + "hexagon/lib"
5517 + (buildingLib
5518 ? MarchG0Suffix : MarchSuffix);
5519
5520 //----------------------------------------------------------------------------
5521 // moslib
5522 //----------------------------------------------------------------------------
5523 std::vector<std::string> oslibs;
5524 bool hasStandalone= false;
5525
5526 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5527 ie = Args.filtered_end(); it != ie; ++it) {
5528 (*it)->claim();
5529 oslibs.push_back((*it)->getValue());
5530 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005531 }
Matthew Curtise689b052012-12-06 15:46:07 +00005532 if (oslibs.empty()) {
5533 oslibs.push_back("standalone");
5534 hasStandalone = true;
5535 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005536
Matthew Curtise689b052012-12-06 15:46:07 +00005537 //----------------------------------------------------------------------------
5538 // Start Files
5539 //----------------------------------------------------------------------------
5540 if (incStdLib && incStartFiles) {
5541
5542 if (!buildingLib) {
5543 if (hasStandalone) {
5544 CmdArgs.push_back(
5545 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5546 }
5547 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5548 }
5549 std::string initObj = useShared ? "/initS.o" : "/init.o";
5550 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5551 }
5552
5553 //----------------------------------------------------------------------------
5554 // Library Search Paths
5555 //----------------------------------------------------------------------------
5556 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005557 for (const auto &LibPath : LibPaths)
5558 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005559
5560 //----------------------------------------------------------------------------
5561 //
5562 //----------------------------------------------------------------------------
5563 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5564 Args.AddAllArgs(CmdArgs, options::OPT_e);
5565 Args.AddAllArgs(CmdArgs, options::OPT_s);
5566 Args.AddAllArgs(CmdArgs, options::OPT_t);
5567 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5568
5569 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5570
5571 //----------------------------------------------------------------------------
5572 // Libraries
5573 //----------------------------------------------------------------------------
5574 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005575 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005576 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5577 CmdArgs.push_back("-lm");
5578 }
5579
5580 CmdArgs.push_back("--start-group");
5581
5582 if (!buildingLib) {
5583 for(std::vector<std::string>::iterator i = oslibs.begin(),
5584 e = oslibs.end(); i != e; ++i)
5585 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5586 CmdArgs.push_back("-lc");
5587 }
5588 CmdArgs.push_back("-lgcc");
5589
5590 CmdArgs.push_back("--end-group");
5591 }
5592
5593 //----------------------------------------------------------------------------
5594 // End files
5595 //----------------------------------------------------------------------------
5596 if (incStdLib && incStartFiles) {
5597 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5598 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5599 }
5600
5601 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005602 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5603 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005604}
5605// Hexagon tools end.
5606
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005607/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005608const char *arm::getARMCPUForMArch(const ArgList &Args,
5609 const llvm::Triple &Triple) {
5610 StringRef MArch;
5611 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5612 // Otherwise, if we have -march= choose the base CPU for that arch.
5613 MArch = A->getValue();
5614 } else {
5615 // Otherwise, use the Arch from the triple.
5616 MArch = Triple.getArchName();
5617 }
5618
5619 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005620 if (MArch == "native") {
5621 std::string CPU = llvm::sys::getHostCPUName();
5622 if (CPU != "generic") {
5623 // Translate the native cpu into the architecture. The switch below will
5624 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005625 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005626 }
5627 }
5628
John Brawna95c1a82015-05-08 12:52:18 +00005629 // We need to return an empty string here on invalid MArch values as the
5630 // various places that call this function can't cope with a null result.
5631 const char *result = Triple.getARMCPUForArch(MArch);
5632 if (result)
5633 return result;
5634 else
5635 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005636}
5637
5638/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005639StringRef arm::getARMTargetCPU(const ArgList &Args,
5640 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005641 // FIXME: Warn on inconsistent use of -mcpu and -march.
5642 // If we have -mcpu=, use that.
5643 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin4045f662015-05-08 15:44:36 +00005644 StringRef MCPU = A->getValue();
Bernard Ogden31561762013-12-12 13:27:11 +00005645 // Handle -mcpu=native.
5646 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005647 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005648 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005649 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005650 }
5651
5652 return getARMCPUForMArch(Args, Triple);
5653}
5654
5655/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5656/// CPU.
5657//
5658// FIXME: This is redundant with -mcpu, why does LLVM use this.
5659// FIXME: tblgen this, or kill it!
5660const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5661 return llvm::StringSwitch<const char *>(CPU)
5662 .Case("strongarm", "v4")
5663 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5664 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5665 .Cases("arm920", "arm920t", "arm922t", "v4t")
5666 .Cases("arm940t", "ep9312","v4t")
5667 .Cases("arm10tdmi", "arm1020t", "v5")
5668 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5669 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5670 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005671 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5672 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5673 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005674 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005675 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005676 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005677 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005678 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5679 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005680 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005681 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005682 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005683 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005684 .Default("");
5685}
5686
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005687void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5688 if (Args.hasArg(options::OPT_r))
5689 return;
5690
5691 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5692 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5693 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005694 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005695 .Default("--be8");
5696
5697 if (LinkFlag)
5698 CmdArgs.push_back(LinkFlag);
5699}
5700
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005701mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5702 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5703 .Case("mips1", NanLegacy)
5704 .Case("mips2", NanLegacy)
5705 .Case("mips3", NanLegacy)
5706 .Case("mips4", NanLegacy)
5707 .Case("mips5", NanLegacy)
5708 .Case("mips32", NanLegacy)
5709 .Case("mips32r2", NanLegacy)
5710 .Case("mips32r3", NanLegacy | Nan2008)
5711 .Case("mips32r5", NanLegacy | Nan2008)
5712 .Case("mips32r6", Nan2008)
5713 .Case("mips64", NanLegacy)
5714 .Case("mips64r2", NanLegacy)
5715 .Case("mips64r3", NanLegacy | Nan2008)
5716 .Case("mips64r5", NanLegacy | Nan2008)
5717 .Case("mips64r6", Nan2008)
5718 .Default(NanLegacy);
5719}
5720
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005721bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5722 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5723 return A && (A->getValue() == StringRef(Value));
5724}
5725
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005726bool mips::isUCLibc(const ArgList &Args) {
5727 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005728 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005729}
5730
Daniel Sanders2bf13662014-07-10 14:40:57 +00005731bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005732 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5733 return llvm::StringSwitch<bool>(NaNArg->getValue())
5734 .Case("2008", true)
5735 .Case("legacy", false)
5736 .Default(false);
5737
5738 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005739 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5740 .Cases("mips32r6", "mips64r6", true)
5741 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005742
5743 return false;
5744}
5745
Daniel Sanders379d44b2014-07-16 11:52:23 +00005746bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5747 StringRef ABIName) {
5748 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005749 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005750 return false;
5751
5752 if (ABIName != "32")
5753 return false;
5754
5755 return llvm::StringSwitch<bool>(CPUName)
5756 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005757 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5758 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005759 .Default(false);
5760}
5761
Tim Northover157d9112014-01-16 08:48:16 +00005762llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005763 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5764 // archs which Darwin doesn't use.
5765
5766 // The matching this routine does is fairly pointless, since it is neither the
5767 // complete architecture list, nor a reasonable subset. The problem is that
5768 // historically the driver driver accepts this and also ties its -march=
5769 // handling to the architecture name, so we need to be careful before removing
5770 // support for it.
5771
5772 // This code must be kept in sync with Clang's Darwin specific argument
5773 // translation.
5774
5775 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5776 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5777 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5778 .Case("ppc64", llvm::Triple::ppc64)
5779 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5780 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5781 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005782 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005783 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005784 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005785 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005786 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005787 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005788 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005789 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005790 .Case("nvptx", llvm::Triple::nvptx)
5791 .Case("nvptx64", llvm::Triple::nvptx64)
5792 .Case("amdil", llvm::Triple::amdil)
5793 .Case("spir", llvm::Triple::spir)
5794 .Default(llvm::Triple::UnknownArch);
5795}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005796
Tim Northover157d9112014-01-16 08:48:16 +00005797void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5798 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5799 T.setArch(Arch);
5800
5801 if (Str == "x86_64h")
5802 T.setArchName(Str);
5803 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5804 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005805 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005806 }
5807}
5808
Bob Wilsondecc03e2012-11-23 06:14:39 +00005809const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005810 const InputInfo &Input) {
5811 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005812}
5813
Bob Wilsondecc03e2012-11-23 06:14:39 +00005814const char *Clang::getBaseInputStem(const ArgList &Args,
5815 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005816 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005817
Chris Lattner906bb902011-01-16 08:14:11 +00005818 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005819 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005820
5821 return Str;
5822}
5823
Bob Wilsondecc03e2012-11-23 06:14:39 +00005824const char *Clang::getDependencyFileName(const ArgList &Args,
5825 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005826 // FIXME: Think about this more.
5827 std::string Res;
5828
5829 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005830 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005831 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005832 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005833 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005834 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005835 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005836}
5837
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005838void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5839 const InputInfo &Output,
5840 const InputInfoList &Inputs,
5841 const ArgList &Args,
5842 const char *LinkingOutput) const {
5843 const ToolChain &ToolChain = getToolChain();
5844 const Driver &D = ToolChain.getDriver();
5845 ArgStringList CmdArgs;
5846
5847 // Silence warning for "clang -g foo.o -o foo"
5848 Args.ClaimAllArgs(options::OPT_g_Group);
5849 // and "clang -emit-llvm foo.o -o foo"
5850 Args.ClaimAllArgs(options::OPT_emit_llvm);
5851 // and for "clang -w foo.o -o foo". Other warning options are already
5852 // handled somewhere else.
5853 Args.ClaimAllArgs(options::OPT_w);
5854
5855 if (!D.SysRoot.empty())
5856 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5857
5858 // CloudABI only supports static linkage.
5859 CmdArgs.push_back("-Bstatic");
5860 CmdArgs.push_back("--eh-frame-hdr");
5861 CmdArgs.push_back("--gc-sections");
5862
5863 if (Output.isFilename()) {
5864 CmdArgs.push_back("-o");
5865 CmdArgs.push_back(Output.getFilename());
5866 } else {
5867 assert(Output.isNothing() && "Invalid output.");
5868 }
5869
5870 if (!Args.hasArg(options::OPT_nostdlib) &&
5871 !Args.hasArg(options::OPT_nostartfiles)) {
5872 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5873 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5874 }
5875
5876 Args.AddAllArgs(CmdArgs, options::OPT_L);
5877 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5878 for (const auto &Path : Paths)
5879 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5880 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5881 Args.AddAllArgs(CmdArgs, options::OPT_e);
5882 Args.AddAllArgs(CmdArgs, options::OPT_s);
5883 Args.AddAllArgs(CmdArgs, options::OPT_t);
5884 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5885 Args.AddAllArgs(CmdArgs, options::OPT_r);
5886
5887 if (D.IsUsingLTO(ToolChain, Args))
5888 AddGoldPlugin(ToolChain, Args, CmdArgs);
5889
5890 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5891
5892 if (!Args.hasArg(options::OPT_nostdlib) &&
5893 !Args.hasArg(options::OPT_nodefaultlibs)) {
5894 if (D.CCCIsCXX())
5895 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5896 CmdArgs.push_back("-lc");
5897 CmdArgs.push_back("-lcompiler_rt");
5898 }
5899
5900 if (!Args.hasArg(options::OPT_nostdlib) &&
5901 !Args.hasArg(options::OPT_nostartfiles))
5902 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5903
5904 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5905 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5906}
5907
Daniel Dunbarbe220842009-03-20 16:06:39 +00005908void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005909 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005910 const InputInfoList &Inputs,
5911 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005912 const char *LinkingOutput) const {
5913 ArgStringList CmdArgs;
5914
5915 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5916 const InputInfo &Input = Inputs[0];
5917
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005918 // Determine the original source input.
5919 const Action *SourceAction = &JA;
5920 while (SourceAction->getKind() != Action::InputClass) {
5921 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5922 SourceAction = SourceAction->getInputs()[0];
5923 }
5924
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005925 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005926 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005927 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5928 // FIXME: at run-time detect assembler capabilities or rely on version
5929 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005930 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005931 const llvm::Triple &T(getToolChain().getTriple());
5932 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005933 CmdArgs.push_back("-Q");
5934 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005935
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005936 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005937 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005938 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005939 if (Args.hasArg(options::OPT_gstabs))
5940 CmdArgs.push_back("--gstabs");
5941 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005942 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005943 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005944
Daniel Dunbarbe220842009-03-20 16:06:39 +00005945 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005946 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005947
Daniel Dunbar6d484762010-07-22 01:47:22 +00005948 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005949 if (getToolChain().getArch() == llvm::Triple::x86 ||
5950 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005951 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5952 CmdArgs.push_back("-force_cpusubtype_ALL");
5953
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005954 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005955 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005956 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005957 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005958 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005959 CmdArgs.push_back("-static");
5960
Daniel Dunbarbe220842009-03-20 16:06:39 +00005961 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5962 options::OPT_Xassembler);
5963
5964 assert(Output.isFilename() && "Unexpected lipo output.");
5965 CmdArgs.push_back("-o");
5966 CmdArgs.push_back(Output.getFilename());
5967
Daniel Dunbarb440f562010-08-02 02:38:21 +00005968 assert(Input.isFilename() && "Invalid input.");
5969 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005970
5971 // asm_final spec is empty.
5972
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005973 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005974 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005975 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005976}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005977
Tim Northover157d9112014-01-16 08:48:16 +00005978void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005979
Tim Northover157d9112014-01-16 08:48:16 +00005980void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5981 ArgStringList &CmdArgs) const {
5982 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005983
Daniel Dunbarc1964212009-03-26 16:23:12 +00005984 // Derived from darwin_arch spec.
5985 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005986 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005987
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005988 // FIXME: Is this needed anymore?
5989 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005990 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005991}
5992
Bill Wendling3b2000f2012-10-02 18:02:50 +00005993bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5994 // We only need to generate a temp path for LTO if we aren't compiling object
5995 // files. When compiling source files, we run 'dsymutil' after linking. We
5996 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005997 for (const auto &Input : Inputs)
5998 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005999 return true;
6000
6001 return false;
6002}
6003
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006004void darwin::Link::AddLinkArgs(Compilation &C,
6005 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006006 ArgStringList &CmdArgs,
6007 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006008 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006009 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006010
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006011 unsigned Version[3] = { 0, 0, 0 };
6012 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6013 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006014 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006015 Version[1], Version[2], HadExtra) ||
6016 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006017 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006018 << A->getAsString(Args);
6019 }
6020
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006021 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006022 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006023 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6024 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006025
Bob Wilson3d27dad2013-08-02 22:25:34 +00006026 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6027 CmdArgs.push_back("-export_dynamic");
6028
Bob Wilsonb111ec92015-03-02 19:01:14 +00006029 // If we are using App Extension restrictions, pass a flag to the linker
6030 // telling it that the compiled code has been audited.
6031 if (Args.hasFlag(options::OPT_fapplication_extension,
6032 options::OPT_fno_application_extension, false))
6033 CmdArgs.push_back("-application_extension");
6034
Bill Wendling313b6bf2012-11-16 23:03:00 +00006035 // If we are using LTO, then automatically create a temporary file path for
6036 // the linker to use, so that it's lifetime will extend past a possible
6037 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006038 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6039 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006040 const char *TmpPath = C.getArgs().MakeArgString(
6041 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6042 C.addTempFile(TmpPath);
6043 CmdArgs.push_back("-object_path_lto");
6044 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006045 }
6046
Daniel Dunbarc1964212009-03-26 16:23:12 +00006047 // Derived from the "link" spec.
6048 Args.AddAllArgs(CmdArgs, options::OPT_static);
6049 if (!Args.hasArg(options::OPT_static))
6050 CmdArgs.push_back("-dynamic");
6051 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6052 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6053 // here. How do we wish to handle such things?
6054 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006055
Daniel Dunbarc1964212009-03-26 16:23:12 +00006056 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006057 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006058 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006059 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006060
6061 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6062 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6063 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6064
6065 Arg *A;
6066 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6067 (A = Args.getLastArg(options::OPT_current__version)) ||
6068 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006069 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006070 << A->getAsString(Args) << "-dynamiclib";
6071
6072 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6073 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6074 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6075 } else {
6076 CmdArgs.push_back("-dylib");
6077
6078 Arg *A;
6079 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6080 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6081 (A = Args.getLastArg(options::OPT_client__name)) ||
6082 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6083 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6084 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006085 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006086 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006087
Daniel Dunbarc1964212009-03-26 16:23:12 +00006088 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6089 "-dylib_compatibility_version");
6090 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6091 "-dylib_current_version");
6092
Tim Northover157d9112014-01-16 08:48:16 +00006093 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006094
6095 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6096 "-dylib_install_name");
6097 }
6098
6099 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6100 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6101 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006102 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006103 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006104 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6105 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6106 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6107 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6108 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6109 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006110 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006111 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6112 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6113 Args.AddAllArgs(CmdArgs, options::OPT_init);
6114
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006115 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006116 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006117
Daniel Dunbarc1964212009-03-26 16:23:12 +00006118 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6119 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6120 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6121 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6122 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006123
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006124 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6125 options::OPT_fno_pie,
6126 options::OPT_fno_PIE)) {
6127 if (A->getOption().matches(options::OPT_fpie) ||
6128 A->getOption().matches(options::OPT_fPIE))
6129 CmdArgs.push_back("-pie");
6130 else
6131 CmdArgs.push_back("-no_pie");
6132 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006133
6134 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6135 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6136 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6137 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6138 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6139 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6140 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6141 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6142 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6143 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6144 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6145 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6146 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6147 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6148 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6149 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006150
Daniel Dunbar84384642011-05-02 21:03:47 +00006151 // Give --sysroot= preference, over the Apple specific behavior to also use
6152 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006153 StringRef sysroot = C.getSysRoot();
6154 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006155 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006156 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006157 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6158 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006159 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006160 }
6161
Daniel Dunbarc1964212009-03-26 16:23:12 +00006162 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6163 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6164 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6165 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6166 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006167 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006168 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6169 Args.AddAllArgs(CmdArgs, options::OPT_y);
6170 Args.AddLastArg(CmdArgs, options::OPT_w);
6171 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6172 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6173 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6174 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6175 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6176 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6177 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6178 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6179 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6180 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6181 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6182 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6183}
6184
Alexey Bataev186b28a2014-03-06 05:43:53 +00006185enum LibOpenMP {
6186 LibUnknown,
6187 LibGOMP,
6188 LibIOMP5
6189};
6190
Daniel Dunbarc1964212009-03-26 16:23:12 +00006191void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006192 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006193 const InputInfoList &Inputs,
6194 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006195 const char *LinkingOutput) const {
6196 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006197
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006198 // If the number of arguments surpasses the system limits, we will encode the
6199 // input files in a separate file, shortening the command line. To this end,
6200 // build a list of input file names that can be passed via a file with the
6201 // -filelist linker option.
6202 llvm::opt::ArgStringList InputFileList;
6203
Daniel Dunbarc1964212009-03-26 16:23:12 +00006204 // The logic here is derived from gcc's behavior; most of which
6205 // comes from specs (starting with link_command). Consult gcc for
6206 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006207 ArgStringList CmdArgs;
6208
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006209 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6210 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6211 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006212 for (const auto &Arg : Args)
6213 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006214 const char *Exec =
6215 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6216 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006217 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006218 return;
6219 }
6220
Daniel Dunbarc1964212009-03-26 16:23:12 +00006221 // I'm not sure why this particular decomposition exists in gcc, but
6222 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006223 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006224
Daniel Dunbarc1964212009-03-26 16:23:12 +00006225 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6226 Args.AddAllArgs(CmdArgs, options::OPT_s);
6227 Args.AddAllArgs(CmdArgs, options::OPT_t);
6228 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6229 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006230 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006231 Args.AddAllArgs(CmdArgs, options::OPT_r);
6232
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006233 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6234 // members of static archive libraries which implement Objective-C classes or
6235 // categories.
6236 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6237 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006238
Daniel Dunbarc1964212009-03-26 16:23:12 +00006239 CmdArgs.push_back("-o");
6240 CmdArgs.push_back(Output.getFilename());
6241
Chad Rosier06fd3c62012-05-16 23:45:12 +00006242 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006243 !Args.hasArg(options::OPT_nostartfiles))
6244 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006245
6246 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006247
Alexey Bataev186b28a2014-03-06 05:43:53 +00006248 LibOpenMP UsedOpenMPLib = LibUnknown;
6249 if (Args.hasArg(options::OPT_fopenmp)) {
6250 UsedOpenMPLib = LibGOMP;
6251 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6252 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6253 .Case("libgomp", LibGOMP)
6254 .Case("libiomp5", LibIOMP5)
6255 .Default(LibUnknown);
6256 if (UsedOpenMPLib == LibUnknown)
6257 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6258 << A->getOption().getName() << A->getValue();
6259 }
6260 switch (UsedOpenMPLib) {
6261 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006262 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006263 break;
6264 case LibIOMP5:
6265 CmdArgs.push_back("-liomp5");
6266 break;
6267 case LibUnknown:
6268 break;
6269 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006270
Douglas Gregor9295df02012-05-15 21:00:27 +00006271 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006272 // Build the input file for -filelist (list of linker input files) in case we
6273 // need it later
6274 for (const auto &II : Inputs) {
6275 if (!II.isFilename()) {
6276 // This is a linker input argument.
6277 // We cannot mix input arguments and file names in a -filelist input, thus
6278 // we prematurely stop our list (remaining files shall be passed as
6279 // arguments).
6280 if (InputFileList.size() > 0)
6281 break;
6282
6283 continue;
6284 }
6285
6286 InputFileList.push_back(II.getFilename());
6287 }
6288
Bob Wilson16d93952012-05-15 18:57:39 +00006289 if (isObjCRuntimeLinked(Args) &&
6290 !Args.hasArg(options::OPT_nostdlib) &&
6291 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006292 // We use arclite library for both ARC and subscripting support.
6293 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6294
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006295 CmdArgs.push_back("-framework");
6296 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006297 // Link libobj.
6298 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006299 }
John McCall31168b02011-06-15 23:02:42 +00006300
Daniel Dunbarc1964212009-03-26 16:23:12 +00006301 if (LinkingOutput) {
6302 CmdArgs.push_back("-arch_multiple");
6303 CmdArgs.push_back("-final_output");
6304 CmdArgs.push_back(LinkingOutput);
6305 }
6306
Daniel Dunbarc1964212009-03-26 16:23:12 +00006307 if (Args.hasArg(options::OPT_fnested_functions))
6308 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006309
Daniel Dunbarc1964212009-03-26 16:23:12 +00006310 if (!Args.hasArg(options::OPT_nostdlib) &&
6311 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006312 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006313 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006314
Daniel Dunbarc1964212009-03-26 16:23:12 +00006315 // link_ssp spec is empty.
6316
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006317 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006318 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006319 }
6320
Chad Rosier06fd3c62012-05-16 23:45:12 +00006321 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006322 !Args.hasArg(options::OPT_nostartfiles)) {
6323 // endfile_spec is empty.
6324 }
6325
6326 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6327 Args.AddAllArgs(CmdArgs, options::OPT_F);
6328
Steven Wu3ffb61b2015-02-06 18:08:29 +00006329 // -iframework should be forwarded as -F.
6330 for (auto it = Args.filtered_begin(options::OPT_iframework),
6331 ie = Args.filtered_end(); it != ie; ++it)
6332 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6333 (*it)->getValue()));
6334
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006335 if (!Args.hasArg(options::OPT_nostdlib) &&
6336 !Args.hasArg(options::OPT_nodefaultlibs)) {
6337 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6338 if (A->getValue() == StringRef("Accelerate")) {
6339 CmdArgs.push_back("-framework");
6340 CmdArgs.push_back("Accelerate");
6341 }
6342 }
6343 }
6344
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006345 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006346 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006347 std::unique_ptr<Command> Cmd =
6348 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6349 Cmd->setInputFileList(std::move(InputFileList));
6350 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006351}
6352
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006353void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006354 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006355 const InputInfoList &Inputs,
6356 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006357 const char *LinkingOutput) const {
6358 ArgStringList CmdArgs;
6359
6360 CmdArgs.push_back("-create");
6361 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006362
6363 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006364 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006365
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006366 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006367 assert(II.isFilename() && "Unexpected lipo input.");
6368 CmdArgs.push_back(II.getFilename());
6369 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006370
6371 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006372 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006373}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006374
Daniel Dunbar88299622010-06-04 18:28:36 +00006375void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006376 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006377 const InputInfoList &Inputs,
6378 const ArgList &Args,
6379 const char *LinkingOutput) const {
6380 ArgStringList CmdArgs;
6381
Daniel Dunbareb86b042011-05-09 17:23:16 +00006382 CmdArgs.push_back("-o");
6383 CmdArgs.push_back(Output.getFilename());
6384
Daniel Dunbar88299622010-06-04 18:28:36 +00006385 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6386 const InputInfo &Input = Inputs[0];
6387 assert(Input.isFilename() && "Unexpected dsymutil input.");
6388 CmdArgs.push_back(Input.getFilename());
6389
Daniel Dunbar88299622010-06-04 18:28:36 +00006390 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006391 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006392 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006393}
6394
Eric Christopher551ef452011-08-23 17:56:55 +00006395void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006396 const InputInfo &Output,
6397 const InputInfoList &Inputs,
6398 const ArgList &Args,
6399 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006400 ArgStringList CmdArgs;
6401 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006402 CmdArgs.push_back("--debug-info");
6403 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006404 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006405
6406 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6407 const InputInfo &Input = Inputs[0];
6408 assert(Input.isFilename() && "Unexpected verify input");
6409
6410 // Grabbing the output of the earlier dsymutil run.
6411 CmdArgs.push_back(Input.getFilename());
6412
6413 const char *Exec =
6414 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006415 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006416}
6417
David Chisnallf571cde2012-02-15 13:39:01 +00006418void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6419 const InputInfo &Output,
6420 const InputInfoList &Inputs,
6421 const ArgList &Args,
6422 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006423 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006424 ArgStringList CmdArgs;
6425
6426 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6427 options::OPT_Xassembler);
6428
6429 CmdArgs.push_back("-o");
6430 CmdArgs.push_back(Output.getFilename());
6431
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006432 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006433 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006434
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006435 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006437}
6438
David Chisnallf571cde2012-02-15 13:39:01 +00006439void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6440 const InputInfo &Output,
6441 const InputInfoList &Inputs,
6442 const ArgList &Args,
6443 const char *LinkingOutput) const {
6444 // FIXME: Find a real GCC, don't hard-code versions here
6445 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6446 const llvm::Triple &T = getToolChain().getTriple();
6447 std::string LibPath = "/usr/lib/";
6448 llvm::Triple::ArchType Arch = T.getArch();
6449 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006450 case llvm::Triple::x86:
6451 GCCLibPath +=
6452 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6453 break;
6454 case llvm::Triple::x86_64:
6455 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6456 GCCLibPath += "/4.5.2/amd64/";
6457 LibPath += "amd64/";
6458 break;
6459 default:
6460 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006461 }
6462
6463 ArgStringList CmdArgs;
6464
David Chisnall272a0712012-02-29 15:06:12 +00006465 // Demangle C++ names in errors
6466 CmdArgs.push_back("-C");
6467
David Chisnallf571cde2012-02-15 13:39:01 +00006468 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6469 (!Args.hasArg(options::OPT_shared))) {
6470 CmdArgs.push_back("-e");
6471 CmdArgs.push_back("_start");
6472 }
6473
6474 if (Args.hasArg(options::OPT_static)) {
6475 CmdArgs.push_back("-Bstatic");
6476 CmdArgs.push_back("-dn");
6477 } else {
6478 CmdArgs.push_back("-Bdynamic");
6479 if (Args.hasArg(options::OPT_shared)) {
6480 CmdArgs.push_back("-shared");
6481 } else {
6482 CmdArgs.push_back("--dynamic-linker");
6483 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6484 }
6485 }
6486
6487 if (Output.isFilename()) {
6488 CmdArgs.push_back("-o");
6489 CmdArgs.push_back(Output.getFilename());
6490 } else {
6491 assert(Output.isNothing() && "Invalid output.");
6492 }
6493
6494 if (!Args.hasArg(options::OPT_nostdlib) &&
6495 !Args.hasArg(options::OPT_nostartfiles)) {
6496 if (!Args.hasArg(options::OPT_shared)) {
6497 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6498 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006499 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006500 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6501 } else {
6502 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006503 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6504 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006505 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006506 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006507 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006508 }
6509
6510 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6511
6512 Args.AddAllArgs(CmdArgs, options::OPT_L);
6513 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6514 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006515 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006516
6517 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6518
6519 if (!Args.hasArg(options::OPT_nostdlib) &&
6520 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006521 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006522 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006523 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006524 if (!Args.hasArg(options::OPT_shared)) {
6525 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006526 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006527 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006528 }
David Chisnallf571cde2012-02-15 13:39:01 +00006529 }
6530
6531 if (!Args.hasArg(options::OPT_nostdlib) &&
6532 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006533 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006534 }
David Chisnall96de9932012-02-16 16:00:47 +00006535 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006536
Alexey Samsonov7811d192014-02-20 13:57:37 +00006537 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006538
6539 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006540 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006541 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006542}
6543
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006544void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006545 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006546 const InputInfoList &Inputs,
6547 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006548 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006549 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006550 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006551 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006552
Rafael Espindolacc126272014-02-28 01:55:21 +00006553 switch (getToolChain().getArch()) {
6554 case llvm::Triple::x86:
6555 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6556 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006557 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006558 break;
6559
6560 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006561 CmdArgs.push_back("-mppc");
6562 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006563 break;
6564
6565 case llvm::Triple::sparc:
6566 CmdArgs.push_back("-32");
6567 NeedsKPIC = true;
6568 break;
6569
6570 case llvm::Triple::sparcv9:
6571 CmdArgs.push_back("-64");
6572 CmdArgs.push_back("-Av9a");
6573 NeedsKPIC = true;
6574 break;
6575
6576 case llvm::Triple::mips64:
6577 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006578 StringRef CPUName;
6579 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006580 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006581
6582 CmdArgs.push_back("-mabi");
6583 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6584
6585 if (getToolChain().getArch() == llvm::Triple::mips64)
6586 CmdArgs.push_back("-EB");
6587 else
6588 CmdArgs.push_back("-EL");
6589
Rafael Espindolacc126272014-02-28 01:55:21 +00006590 NeedsKPIC = true;
6591 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006592 }
6593
Rafael Espindolacc126272014-02-28 01:55:21 +00006594 default:
6595 break;
6596 }
6597
6598 if (NeedsKPIC)
6599 addAssemblerKPIC(Args, CmdArgs);
6600
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006601 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6602 options::OPT_Xassembler);
6603
6604 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006605 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006606
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006607 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006608 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006609
6610 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006611 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006612 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006613}
6614
6615void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006616 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006617 const InputInfoList &Inputs,
6618 const ArgList &Args,
6619 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006620 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006621 ArgStringList CmdArgs;
6622
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006623 // Silence warning for "clang -g foo.o -o foo"
6624 Args.ClaimAllArgs(options::OPT_g_Group);
6625 // and "clang -emit-llvm foo.o -o foo"
6626 Args.ClaimAllArgs(options::OPT_emit_llvm);
6627 // and for "clang -w foo.o -o foo". Other warning options are already
6628 // handled somewhere else.
6629 Args.ClaimAllArgs(options::OPT_w);
6630
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006631 if (getToolChain().getArch() == llvm::Triple::mips64)
6632 CmdArgs.push_back("-EB");
6633 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6634 CmdArgs.push_back("-EL");
6635
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006636 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006637 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006638 CmdArgs.push_back("-e");
6639 CmdArgs.push_back("__start");
6640 }
6641
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006642 if (Args.hasArg(options::OPT_static)) {
6643 CmdArgs.push_back("-Bstatic");
6644 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006645 if (Args.hasArg(options::OPT_rdynamic))
6646 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006647 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006648 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006649 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006650 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006651 } else {
6652 CmdArgs.push_back("-dynamic-linker");
6653 CmdArgs.push_back("/usr/libexec/ld.so");
6654 }
6655 }
6656
Rafael Espindola044f7832013-06-05 04:28:55 +00006657 if (Args.hasArg(options::OPT_nopie))
6658 CmdArgs.push_back("-nopie");
6659
Daniel Dunbarb440f562010-08-02 02:38:21 +00006660 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006661 CmdArgs.push_back("-o");
6662 CmdArgs.push_back(Output.getFilename());
6663 } else {
6664 assert(Output.isNothing() && "Invalid output.");
6665 }
6666
6667 if (!Args.hasArg(options::OPT_nostdlib) &&
6668 !Args.hasArg(options::OPT_nostartfiles)) {
6669 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006670 if (Args.hasArg(options::OPT_pg))
6671 CmdArgs.push_back(Args.MakeArgString(
6672 getToolChain().GetFilePath("gcrt0.o")));
6673 else
6674 CmdArgs.push_back(Args.MakeArgString(
6675 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006676 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006677 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006678 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006679 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006680 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006681 }
6682 }
6683
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006684 std::string Triple = getToolChain().getTripleString();
6685 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006686 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006687 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006688 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006689
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006690 Args.AddAllArgs(CmdArgs, options::OPT_L);
6691 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6692 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006693 Args.AddAllArgs(CmdArgs, options::OPT_s);
6694 Args.AddAllArgs(CmdArgs, options::OPT_t);
6695 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6696 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006697
Daniel Dunbar54423b22010-09-17 00:24:54 +00006698 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006699
6700 if (!Args.hasArg(options::OPT_nostdlib) &&
6701 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006702 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006703 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006704 if (Args.hasArg(options::OPT_pg))
6705 CmdArgs.push_back("-lm_p");
6706 else
6707 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006708 }
6709
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006710 // FIXME: For some reason GCC passes -lgcc before adding
6711 // the default system libraries. Just mimic this for now.
6712 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006713
Eric Christopher17674ec2012-09-13 06:32:34 +00006714 if (Args.hasArg(options::OPT_pthread)) {
6715 if (!Args.hasArg(options::OPT_shared) &&
6716 Args.hasArg(options::OPT_pg))
6717 CmdArgs.push_back("-lpthread_p");
6718 else
6719 CmdArgs.push_back("-lpthread");
6720 }
6721
Chandler Carruth45661652011-12-17 22:32:42 +00006722 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006723 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006724 CmdArgs.push_back("-lc_p");
6725 else
6726 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006727 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006728
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006729 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006730 }
6731
6732 if (!Args.hasArg(options::OPT_nostdlib) &&
6733 !Args.hasArg(options::OPT_nostartfiles)) {
6734 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006735 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006736 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006737 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006738 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006739 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006740 }
6741
6742 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006743 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006744 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006745}
Ed Schoutene33194b2009-04-02 19:13:12 +00006746
Eli Friedman9fa28852012-08-08 23:57:20 +00006747void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6748 const InputInfo &Output,
6749 const InputInfoList &Inputs,
6750 const ArgList &Args,
6751 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006752 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006753 ArgStringList CmdArgs;
6754
6755 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6756 options::OPT_Xassembler);
6757
6758 CmdArgs.push_back("-o");
6759 CmdArgs.push_back(Output.getFilename());
6760
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006761 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006762 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006763
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006764 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006765 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006766}
6767
6768void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6769 const InputInfo &Output,
6770 const InputInfoList &Inputs,
6771 const ArgList &Args,
6772 const char *LinkingOutput) const {
6773 const Driver &D = getToolChain().getDriver();
6774 ArgStringList CmdArgs;
6775
6776 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6777 (!Args.hasArg(options::OPT_shared))) {
6778 CmdArgs.push_back("-e");
6779 CmdArgs.push_back("__start");
6780 }
6781
6782 if (Args.hasArg(options::OPT_static)) {
6783 CmdArgs.push_back("-Bstatic");
6784 } else {
6785 if (Args.hasArg(options::OPT_rdynamic))
6786 CmdArgs.push_back("-export-dynamic");
6787 CmdArgs.push_back("--eh-frame-hdr");
6788 CmdArgs.push_back("-Bdynamic");
6789 if (Args.hasArg(options::OPT_shared)) {
6790 CmdArgs.push_back("-shared");
6791 } else {
6792 CmdArgs.push_back("-dynamic-linker");
6793 CmdArgs.push_back("/usr/libexec/ld.so");
6794 }
6795 }
6796
6797 if (Output.isFilename()) {
6798 CmdArgs.push_back("-o");
6799 CmdArgs.push_back(Output.getFilename());
6800 } else {
6801 assert(Output.isNothing() && "Invalid output.");
6802 }
6803
6804 if (!Args.hasArg(options::OPT_nostdlib) &&
6805 !Args.hasArg(options::OPT_nostartfiles)) {
6806 if (!Args.hasArg(options::OPT_shared)) {
6807 if (Args.hasArg(options::OPT_pg))
6808 CmdArgs.push_back(Args.MakeArgString(
6809 getToolChain().GetFilePath("gcrt0.o")));
6810 else
6811 CmdArgs.push_back(Args.MakeArgString(
6812 getToolChain().GetFilePath("crt0.o")));
6813 CmdArgs.push_back(Args.MakeArgString(
6814 getToolChain().GetFilePath("crtbegin.o")));
6815 } else {
6816 CmdArgs.push_back(Args.MakeArgString(
6817 getToolChain().GetFilePath("crtbeginS.o")));
6818 }
6819 }
6820
6821 Args.AddAllArgs(CmdArgs, options::OPT_L);
6822 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6823 Args.AddAllArgs(CmdArgs, options::OPT_e);
6824
6825 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6826
6827 if (!Args.hasArg(options::OPT_nostdlib) &&
6828 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006829 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006830 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6831 if (Args.hasArg(options::OPT_pg))
6832 CmdArgs.push_back("-lm_p");
6833 else
6834 CmdArgs.push_back("-lm");
6835 }
6836
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006837 if (Args.hasArg(options::OPT_pthread)) {
6838 if (!Args.hasArg(options::OPT_shared) &&
6839 Args.hasArg(options::OPT_pg))
6840 CmdArgs.push_back("-lpthread_p");
6841 else
6842 CmdArgs.push_back("-lpthread");
6843 }
6844
Eli Friedman9fa28852012-08-08 23:57:20 +00006845 if (!Args.hasArg(options::OPT_shared)) {
6846 if (Args.hasArg(options::OPT_pg))
6847 CmdArgs.push_back("-lc_p");
6848 else
6849 CmdArgs.push_back("-lc");
6850 }
6851
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006852 StringRef MyArch;
6853 switch (getToolChain().getTriple().getArch()) {
6854 case llvm::Triple::arm:
6855 MyArch = "arm";
6856 break;
6857 case llvm::Triple::x86:
6858 MyArch = "i386";
6859 break;
6860 case llvm::Triple::x86_64:
6861 MyArch = "amd64";
6862 break;
6863 default:
6864 llvm_unreachable("Unsupported architecture");
6865 }
6866 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006867 }
6868
6869 if (!Args.hasArg(options::OPT_nostdlib) &&
6870 !Args.hasArg(options::OPT_nostartfiles)) {
6871 if (!Args.hasArg(options::OPT_shared))
6872 CmdArgs.push_back(Args.MakeArgString(
6873 getToolChain().GetFilePath("crtend.o")));
6874 else
6875 CmdArgs.push_back(Args.MakeArgString(
6876 getToolChain().GetFilePath("crtendS.o")));
6877 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006878
6879 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006880 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006881 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006882}
6883
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006884void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006885 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006886 const InputInfoList &Inputs,
6887 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006888 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006889 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006890 ArgStringList CmdArgs;
6891
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006892 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6893 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006894 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006895 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006896 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006897 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006898 else if (getToolChain().getArch() == llvm::Triple::mips ||
6899 getToolChain().getArch() == llvm::Triple::mipsel ||
6900 getToolChain().getArch() == llvm::Triple::mips64 ||
6901 getToolChain().getArch() == llvm::Triple::mips64el) {
6902 StringRef CPUName;
6903 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006904 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006905
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006906 CmdArgs.push_back("-march");
6907 CmdArgs.push_back(CPUName.data());
6908
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006909 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006910 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006911
6912 if (getToolChain().getArch() == llvm::Triple::mips ||
6913 getToolChain().getArch() == llvm::Triple::mips64)
6914 CmdArgs.push_back("-EB");
6915 else
6916 CmdArgs.push_back("-EL");
6917
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006918 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006919 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006920 getToolChain().getArch() == llvm::Triple::armeb ||
6921 getToolChain().getArch() == llvm::Triple::thumb ||
6922 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006923 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006924 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006925 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6926
6927 if (FloatABI == "hard") {
6928 CmdArgs.push_back("-mfpu=vfp");
6929 } else {
6930 CmdArgs.push_back("-mfpu=softvfp");
6931 }
6932
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006933 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006934 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006935 case llvm::Triple::GNUEABI:
6936 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006937 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006938 break;
6939
6940 default:
6941 CmdArgs.push_back("-matpcs");
6942 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006943 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006944 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006945 if (getToolChain().getArch() == llvm::Triple::sparc)
6946 CmdArgs.push_back("-Av8plusa");
6947 else
6948 CmdArgs.push_back("-Av9a");
6949
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006950 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006951 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006952
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006953 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6954 options::OPT_Xassembler);
6955
6956 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006957 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006958
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006959 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006960 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006961
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006962 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006963 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006964}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006965
6966void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006967 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006968 const InputInfoList &Inputs,
6969 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006970 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006971 const toolchains::FreeBSD& ToolChain =
6972 static_cast<const toolchains::FreeBSD&>(getToolChain());
6973 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006974 const bool IsPIE =
6975 !Args.hasArg(options::OPT_shared) &&
6976 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006977 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006978
6979 // Silence warning for "clang -g foo.o -o foo"
6980 Args.ClaimAllArgs(options::OPT_g_Group);
6981 // and "clang -emit-llvm foo.o -o foo"
6982 Args.ClaimAllArgs(options::OPT_emit_llvm);
6983 // and for "clang -w foo.o -o foo". Other warning options are already
6984 // handled somewhere else.
6985 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006986
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006987 if (!D.SysRoot.empty())
6988 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6989
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006990 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006991 CmdArgs.push_back("-pie");
6992
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006993 if (Args.hasArg(options::OPT_static)) {
6994 CmdArgs.push_back("-Bstatic");
6995 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006996 if (Args.hasArg(options::OPT_rdynamic))
6997 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006998 CmdArgs.push_back("--eh-frame-hdr");
6999 if (Args.hasArg(options::OPT_shared)) {
7000 CmdArgs.push_back("-Bshareable");
7001 } else {
7002 CmdArgs.push_back("-dynamic-linker");
7003 CmdArgs.push_back("/libexec/ld-elf.so.1");
7004 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007005 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
7006 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00007007 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7008 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7009 CmdArgs.push_back("--hash-style=both");
7010 }
7011 }
7012 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007013 }
7014
7015 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7016 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007017 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007018 CmdArgs.push_back("-m");
7019 CmdArgs.push_back("elf_i386_fbsd");
7020 }
7021
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007022 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007023 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007024 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007025 }
7026
Daniel Dunbarb440f562010-08-02 02:38:21 +00007027 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007028 CmdArgs.push_back("-o");
7029 CmdArgs.push_back(Output.getFilename());
7030 } else {
7031 assert(Output.isNothing() && "Invalid output.");
7032 }
7033
7034 if (!Args.hasArg(options::OPT_nostdlib) &&
7035 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007036 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007037 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007038 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007039 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007040 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007041 crt1 = "Scrt1.o";
7042 else
7043 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007044 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007045 if (crt1)
7046 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7047
7048 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7049
Craig Topper92fc2df2014-05-17 16:56:41 +00007050 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007051 if (Args.hasArg(options::OPT_static))
7052 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007053 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007054 crtbegin = "crtbeginS.o";
7055 else
7056 crtbegin = "crtbegin.o";
7057
7058 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007059 }
7060
7061 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007062 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007063 for (const auto &Path : Paths)
7064 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007065 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7066 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007067 Args.AddAllArgs(CmdArgs, options::OPT_s);
7068 Args.AddAllArgs(CmdArgs, options::OPT_t);
7069 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7070 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007071
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007072 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007073 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007074
Alexey Samsonov52550342014-09-15 19:58:40 +00007075 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007076 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007077
7078 if (!Args.hasArg(options::OPT_nostdlib) &&
7079 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007080 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007081 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007082 if (Args.hasArg(options::OPT_pg))
7083 CmdArgs.push_back("-lm_p");
7084 else
7085 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007086 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007087 if (NeedsSanitizerDeps)
7088 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007089 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7090 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007091 if (Args.hasArg(options::OPT_pg))
7092 CmdArgs.push_back("-lgcc_p");
7093 else
7094 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007095 if (Args.hasArg(options::OPT_static)) {
7096 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007097 } else if (Args.hasArg(options::OPT_pg)) {
7098 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007099 } else {
7100 CmdArgs.push_back("--as-needed");
7101 CmdArgs.push_back("-lgcc_s");
7102 CmdArgs.push_back("--no-as-needed");
7103 }
7104
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007105 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007106 if (Args.hasArg(options::OPT_pg))
7107 CmdArgs.push_back("-lpthread_p");
7108 else
7109 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007110 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007111
Roman Divacky66f22762011-02-10 16:59:40 +00007112 if (Args.hasArg(options::OPT_pg)) {
7113 if (Args.hasArg(options::OPT_shared))
7114 CmdArgs.push_back("-lc");
7115 else
7116 CmdArgs.push_back("-lc_p");
7117 CmdArgs.push_back("-lgcc_p");
7118 } else {
7119 CmdArgs.push_back("-lc");
7120 CmdArgs.push_back("-lgcc");
7121 }
7122
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007123 if (Args.hasArg(options::OPT_static)) {
7124 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007125 } else if (Args.hasArg(options::OPT_pg)) {
7126 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007127 } else {
7128 CmdArgs.push_back("--as-needed");
7129 CmdArgs.push_back("-lgcc_s");
7130 CmdArgs.push_back("--no-as-needed");
7131 }
7132 }
7133
7134 if (!Args.hasArg(options::OPT_nostdlib) &&
7135 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007136 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007137 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007138 else
7139 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007141 }
7142
Alexey Samsonov7811d192014-02-20 13:57:37 +00007143 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007144
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007145 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007146 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007147 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007148}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007149
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007150void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7151 const InputInfo &Output,
7152 const InputInfoList &Inputs,
7153 const ArgList &Args,
7154 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007155 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007156 ArgStringList CmdArgs;
7157
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007158 // GNU as needs different flags for creating the correct output format
7159 // on architectures with different ABIs or optional feature sets.
7160 switch (getToolChain().getArch()) {
7161 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007162 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007163 break;
7164 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007165 case llvm::Triple::armeb:
7166 case llvm::Triple::thumb:
7167 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007168 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007169 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007170 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007171 }
7172
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007173 case llvm::Triple::mips:
7174 case llvm::Triple::mipsel:
7175 case llvm::Triple::mips64:
7176 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007177 StringRef CPUName;
7178 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007179 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007180
7181 CmdArgs.push_back("-march");
7182 CmdArgs.push_back(CPUName.data());
7183
7184 CmdArgs.push_back("-mabi");
7185 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7186
7187 if (getToolChain().getArch() == llvm::Triple::mips ||
7188 getToolChain().getArch() == llvm::Triple::mips64)
7189 CmdArgs.push_back("-EB");
7190 else
7191 CmdArgs.push_back("-EL");
7192
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007193 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007194 break;
7195 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007196
7197 case llvm::Triple::sparc:
7198 CmdArgs.push_back("-32");
7199 addAssemblerKPIC(Args, CmdArgs);
7200 break;
7201
7202 case llvm::Triple::sparcv9:
7203 CmdArgs.push_back("-64");
7204 CmdArgs.push_back("-Av9");
7205 addAssemblerKPIC(Args, CmdArgs);
7206 break;
7207
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007208 default:
7209 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007210 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007211
7212 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7213 options::OPT_Xassembler);
7214
7215 CmdArgs.push_back("-o");
7216 CmdArgs.push_back(Output.getFilename());
7217
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007218 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007219 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007220
David Chisnallddbd68f2011-09-27 22:03:18 +00007221 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007222 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007223}
7224
7225void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7226 const InputInfo &Output,
7227 const InputInfoList &Inputs,
7228 const ArgList &Args,
7229 const char *LinkingOutput) const {
7230 const Driver &D = getToolChain().getDriver();
7231 ArgStringList CmdArgs;
7232
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007233 if (!D.SysRoot.empty())
7234 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7235
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007236 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007237 if (Args.hasArg(options::OPT_static)) {
7238 CmdArgs.push_back("-Bstatic");
7239 } else {
7240 if (Args.hasArg(options::OPT_rdynamic))
7241 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007242 if (Args.hasArg(options::OPT_shared)) {
7243 CmdArgs.push_back("-Bshareable");
7244 } else {
7245 CmdArgs.push_back("-dynamic-linker");
7246 CmdArgs.push_back("/libexec/ld.elf_so");
7247 }
7248 }
7249
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007250 // Many NetBSD architectures support more than one ABI.
7251 // Determine the correct emulation for ld.
7252 switch (getToolChain().getArch()) {
7253 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007254 CmdArgs.push_back("-m");
7255 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007256 break;
7257 case llvm::Triple::arm:
7258 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007259 CmdArgs.push_back("-m");
7260 switch (getToolChain().getTriple().getEnvironment()) {
7261 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007262 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007263 CmdArgs.push_back("armelf_nbsd_eabi");
7264 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007265 case llvm::Triple::EABIHF:
7266 case llvm::Triple::GNUEABIHF:
7267 CmdArgs.push_back("armelf_nbsd_eabihf");
7268 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007269 default:
7270 CmdArgs.push_back("armelf_nbsd");
7271 break;
7272 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007273 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007274 case llvm::Triple::armeb:
7275 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007276 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007277 CmdArgs.push_back("-m");
7278 switch (getToolChain().getTriple().getEnvironment()) {
7279 case llvm::Triple::EABI:
7280 case llvm::Triple::GNUEABI:
7281 CmdArgs.push_back("armelfb_nbsd_eabi");
7282 break;
7283 case llvm::Triple::EABIHF:
7284 case llvm::Triple::GNUEABIHF:
7285 CmdArgs.push_back("armelfb_nbsd_eabihf");
7286 break;
7287 default:
7288 CmdArgs.push_back("armelfb_nbsd");
7289 break;
7290 }
7291 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007292 case llvm::Triple::mips64:
7293 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007294 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007295 CmdArgs.push_back("-m");
7296 if (getToolChain().getArch() == llvm::Triple::mips64)
7297 CmdArgs.push_back("elf32btsmip");
7298 else
7299 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007300 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007301 CmdArgs.push_back("-m");
7302 if (getToolChain().getArch() == llvm::Triple::mips64)
7303 CmdArgs.push_back("elf64btsmip");
7304 else
7305 CmdArgs.push_back("elf64ltsmip");
7306 }
7307 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007308 case llvm::Triple::ppc:
7309 CmdArgs.push_back("-m");
7310 CmdArgs.push_back("elf32ppc_nbsd");
7311 break;
7312
7313 case llvm::Triple::ppc64:
7314 case llvm::Triple::ppc64le:
7315 CmdArgs.push_back("-m");
7316 CmdArgs.push_back("elf64ppc");
7317 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007318
7319 case llvm::Triple::sparc:
7320 CmdArgs.push_back("-m");
7321 CmdArgs.push_back("elf32_sparc");
7322 break;
7323
7324 case llvm::Triple::sparcv9:
7325 CmdArgs.push_back("-m");
7326 CmdArgs.push_back("elf64_sparc");
7327 break;
7328
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007329 default:
7330 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007331 }
7332
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007333 if (Output.isFilename()) {
7334 CmdArgs.push_back("-o");
7335 CmdArgs.push_back(Output.getFilename());
7336 } else {
7337 assert(Output.isNothing() && "Invalid output.");
7338 }
7339
7340 if (!Args.hasArg(options::OPT_nostdlib) &&
7341 !Args.hasArg(options::OPT_nostartfiles)) {
7342 if (!Args.hasArg(options::OPT_shared)) {
7343 CmdArgs.push_back(Args.MakeArgString(
7344 getToolChain().GetFilePath("crt0.o")));
7345 CmdArgs.push_back(Args.MakeArgString(
7346 getToolChain().GetFilePath("crti.o")));
7347 CmdArgs.push_back(Args.MakeArgString(
7348 getToolChain().GetFilePath("crtbegin.o")));
7349 } else {
7350 CmdArgs.push_back(Args.MakeArgString(
7351 getToolChain().GetFilePath("crti.o")));
7352 CmdArgs.push_back(Args.MakeArgString(
7353 getToolChain().GetFilePath("crtbeginS.o")));
7354 }
7355 }
7356
7357 Args.AddAllArgs(CmdArgs, options::OPT_L);
7358 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7359 Args.AddAllArgs(CmdArgs, options::OPT_e);
7360 Args.AddAllArgs(CmdArgs, options::OPT_s);
7361 Args.AddAllArgs(CmdArgs, options::OPT_t);
7362 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7363 Args.AddAllArgs(CmdArgs, options::OPT_r);
7364
7365 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7366
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007367 unsigned Major, Minor, Micro;
7368 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7369 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007370 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007371 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007372 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007373 case llvm::Triple::arm:
7374 case llvm::Triple::armeb:
7375 case llvm::Triple::thumb:
7376 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007377 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007378 case llvm::Triple::ppc64:
7379 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007380 case llvm::Triple::x86:
7381 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007382 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007383 break;
7384 default:
7385 break;
7386 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007387 }
7388
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007389 if (!Args.hasArg(options::OPT_nostdlib) &&
7390 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007391 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007392 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7393 CmdArgs.push_back("-lm");
7394 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007395 if (Args.hasArg(options::OPT_pthread))
7396 CmdArgs.push_back("-lpthread");
7397 CmdArgs.push_back("-lc");
7398
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007399 if (useLibgcc) {
7400 if (Args.hasArg(options::OPT_static)) {
7401 // libgcc_eh depends on libc, so resolve as much as possible,
7402 // pull in any new requirements from libc and then get the rest
7403 // of libgcc.
7404 CmdArgs.push_back("-lgcc_eh");
7405 CmdArgs.push_back("-lc");
7406 CmdArgs.push_back("-lgcc");
7407 } else {
7408 CmdArgs.push_back("-lgcc");
7409 CmdArgs.push_back("--as-needed");
7410 CmdArgs.push_back("-lgcc_s");
7411 CmdArgs.push_back("--no-as-needed");
7412 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007413 }
7414 }
7415
7416 if (!Args.hasArg(options::OPT_nostdlib) &&
7417 !Args.hasArg(options::OPT_nostartfiles)) {
7418 if (!Args.hasArg(options::OPT_shared))
7419 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7420 "crtend.o")));
7421 else
7422 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7423 "crtendS.o")));
7424 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7425 "crtn.o")));
7426 }
7427
Alexey Samsonov7811d192014-02-20 13:57:37 +00007428 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007429
Logan Chieneb9162f2014-06-26 14:23:45 +00007430 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007431 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007432}
7433
Thomas Schwinge4e555262013-03-28 19:04:25 +00007434void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7435 const InputInfo &Output,
7436 const InputInfoList &Inputs,
7437 const ArgList &Args,
7438 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007439 claimNoWarnArgs(Args);
7440
Rafael Espindola92b00932010-08-10 00:25:48 +00007441 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007442 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007443
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007444 switch (getToolChain().getArch()) {
7445 default:
7446 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007447 // Add --32/--64 to make sure we get the format we want.
7448 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007449 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007450 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007451 break;
7452 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007453 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7454 CmdArgs.push_back("--x32");
7455 else
7456 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007457 break;
7458 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007459 CmdArgs.push_back("-a32");
7460 CmdArgs.push_back("-mppc");
7461 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007462 break;
7463 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007464 CmdArgs.push_back("-a64");
7465 CmdArgs.push_back("-mppc64");
7466 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007467 break;
7468 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007469 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007470 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007471 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007472 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007473 break;
7474 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007475 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007476 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007477 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007478 break;
7479 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007480 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007481 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007482 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007483 break;
7484 case llvm::Triple::arm:
7485 case llvm::Triple::armeb:
7486 case llvm::Triple::thumb:
7487 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007488 const llvm::Triple &Triple = getToolChain().getTriple();
7489 switch (Triple.getSubArch()) {
7490 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007491 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007492 break;
7493 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007494 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007495 break;
7496 default:
7497 break;
7498 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007499
Tim Northover9c7e0352013-12-12 11:55:52 +00007500 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007501 getToolChain().getDriver(), Args,
7502 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007503 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007504
7505 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007506
7507 // FIXME: remove krait check when GNU tools support krait cpu
7508 // for now replace it with -march=armv7-a to avoid a lower
7509 // march from being picked in the absence of a cpu flag.
7510 Arg *A;
7511 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin4045f662015-05-08 15:44:36 +00007512 StringRef(A->getValue()) == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007513 CmdArgs.push_back("-march=armv7-a");
7514 else
7515 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007516 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007517 break;
7518 }
7519 case llvm::Triple::mips:
7520 case llvm::Triple::mipsel:
7521 case llvm::Triple::mips64:
7522 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007523 StringRef CPUName;
7524 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007525 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007526 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007527
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007528 CmdArgs.push_back("-march");
7529 CmdArgs.push_back(CPUName.data());
7530
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007531 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007532 CmdArgs.push_back(ABIName.data());
7533
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007534 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7535 // or -mshared (not implemented) is in effect.
7536 bool IsPicOrPie = false;
7537 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7538 options::OPT_fpic, options::OPT_fno_pic,
7539 options::OPT_fPIE, options::OPT_fno_PIE,
7540 options::OPT_fpie, options::OPT_fno_pie)) {
7541 if (A->getOption().matches(options::OPT_fPIC) ||
7542 A->getOption().matches(options::OPT_fpic) ||
7543 A->getOption().matches(options::OPT_fPIE) ||
7544 A->getOption().matches(options::OPT_fpie))
7545 IsPicOrPie = true;
7546 }
7547 if (!IsPicOrPie)
7548 CmdArgs.push_back("-mno-shared");
7549
Daniel Sanders379d44b2014-07-16 11:52:23 +00007550 // LLVM doesn't support -mplt yet and acts as if it is always given.
7551 // However, -mplt has no effect with the N64 ABI.
7552 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007553
7554 if (getToolChain().getArch() == llvm::Triple::mips ||
7555 getToolChain().getArch() == llvm::Triple::mips64)
7556 CmdArgs.push_back("-EB");
7557 else
7558 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007559
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007560 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7561 if (StringRef(A->getValue()) == "2008")
7562 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7563 }
7564
Daniel Sanders379d44b2014-07-16 11:52:23 +00007565 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7566 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7567 options::OPT_mfp64)) {
7568 A->claim();
7569 A->render(Args, CmdArgs);
7570 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7571 ABIName))
7572 CmdArgs.push_back("-mfpxx");
7573
7574 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7575 // -mno-mips16 is actually -no-mips16.
7576 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7577 options::OPT_mno_mips16)) {
7578 if (A->getOption().matches(options::OPT_mips16)) {
7579 A->claim();
7580 A->render(Args, CmdArgs);
7581 } else {
7582 A->claim();
7583 CmdArgs.push_back("-no-mips16");
7584 }
7585 }
7586
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007587 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7588 options::OPT_mno_micromips);
7589 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7590 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7591
Simon Atanasyanbd986632013-11-26 11:58:04 +00007592 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7593 // Do not use AddLastArg because not all versions of MIPS assembler
7594 // support -mmsa / -mno-msa options.
7595 if (A->getOption().matches(options::OPT_mmsa))
7596 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7597 }
7598
Daniel Sanders379d44b2014-07-16 11:52:23 +00007599 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7600 options::OPT_msoft_float);
7601
7602 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7603 options::OPT_mno_odd_spreg);
7604
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007605 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007606 break;
7607 }
7608 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007609 // Always pass an -march option, since our default of z10 is later
7610 // than the GNU assembler's default.
7611 StringRef CPUName = getSystemZTargetCPU(Args);
7612 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007613 break;
7614 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007615 }
7616
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007617 if (NeedsKPIC)
7618 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007619
7620 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7621 options::OPT_Xassembler);
7622
7623 CmdArgs.push_back("-o");
7624 CmdArgs.push_back(Output.getFilename());
7625
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007626 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007627 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007628
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007629 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007630 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007631
7632 // Handle the debug info splitting at object creation time if we're
7633 // creating an object.
7634 // TODO: Currently only works on linux with newer objcopy.
7635 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007636 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007637 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007638 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007639}
7640
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007641static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007642 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007643 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007644 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7645 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007646 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007647 CmdArgs.push_back("-lgcc");
7648
Logan Chien3d3373c2012-11-19 12:04:11 +00007649 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007650 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007651 CmdArgs.push_back("-lgcc");
7652 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007653 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007654 CmdArgs.push_back("--as-needed");
7655 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007656 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007657 CmdArgs.push_back("--no-as-needed");
7658 }
7659
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007660 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007661 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007662 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007663 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007664
7665 // According to Android ABI, we have to link with libdl if we are
7666 // linking with non-static libgcc.
7667 //
7668 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7669 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7670 if (isAndroid && !StaticLibgcc)
7671 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007672}
7673
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007674static std::string getLinuxDynamicLinker(const ArgList &Args,
7675 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007676 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7677 if (ToolChain.getTriple().isArch64Bit())
7678 return "/system/bin/linker64";
7679 else
7680 return "/system/bin/linker";
7681 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7682 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007683 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007684 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007685 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007686 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007687 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007688 else if (ToolChain.getArch() == llvm::Triple::arm ||
7689 ToolChain.getArch() == llvm::Triple::thumb) {
7690 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7691 return "/lib/ld-linux-armhf.so.3";
7692 else
7693 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007694 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7695 ToolChain.getArch() == llvm::Triple::thumbeb) {
7696 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7697 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7698 else
7699 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007700 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007701 ToolChain.getArch() == llvm::Triple::mipsel ||
7702 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007703 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007704 StringRef CPUName;
7705 StringRef ABIName;
7706 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7707 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7708
7709 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7710 .Case("o32", "/lib")
7711 .Case("n32", "/lib32")
7712 .Case("n64", "/lib64")
7713 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007714 StringRef LibName;
7715 if (mips::isUCLibc(Args))
7716 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7717 else
7718 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007719
7720 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007721 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7722 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007723 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7724 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7725 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007726 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007727 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7728 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7729 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007730 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007731 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7732 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007733 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7734 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007735 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7736 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7737 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007738 else
7739 return "/lib64/ld-linux-x86-64.so.2";
7740}
7741
Renato Golinc4b49242014-02-13 10:01:16 +00007742static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007743 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007744 // Make use of compiler-rt if --rtlib option is used
7745 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7746
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007747 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007748 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007749 switch (TC.getTriple().getOS()) {
7750 default: llvm_unreachable("unsupported OS");
7751 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007752 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007753 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007754 break;
7755 }
Renato Golinc4b49242014-02-13 10:01:16 +00007756 break;
7757 case ToolChain::RLT_Libgcc:
7758 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7759 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007760 }
7761}
7762
Rafael Espindola1e085772014-08-15 17:14:35 +00007763static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7764 switch (T.getArch()) {
7765 case llvm::Triple::x86:
7766 return "elf_i386";
7767 case llvm::Triple::aarch64:
7768 return "aarch64linux";
7769 case llvm::Triple::aarch64_be:
7770 return "aarch64_be_linux";
7771 case llvm::Triple::arm:
7772 case llvm::Triple::thumb:
7773 return "armelf_linux_eabi";
7774 case llvm::Triple::armeb:
7775 case llvm::Triple::thumbeb:
7776 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7777 case llvm::Triple::ppc:
7778 return "elf32ppclinux";
7779 case llvm::Triple::ppc64:
7780 return "elf64ppc";
7781 case llvm::Triple::ppc64le:
7782 return "elf64lppc";
7783 case llvm::Triple::sparc:
7784 return "elf32_sparc";
7785 case llvm::Triple::sparcv9:
7786 return "elf64_sparc";
7787 case llvm::Triple::mips:
7788 return "elf32btsmip";
7789 case llvm::Triple::mipsel:
7790 return "elf32ltsmip";
7791 case llvm::Triple::mips64:
7792 if (mips::hasMipsAbiArg(Args, "n32"))
7793 return "elf32btsmipn32";
7794 return "elf64btsmip";
7795 case llvm::Triple::mips64el:
7796 if (mips::hasMipsAbiArg(Args, "n32"))
7797 return "elf32ltsmipn32";
7798 return "elf64ltsmip";
7799 case llvm::Triple::systemz:
7800 return "elf64_s390";
7801 case llvm::Triple::x86_64:
7802 if (T.getEnvironment() == llvm::Triple::GNUX32)
7803 return "elf32_x86_64";
7804 return "elf_x86_64";
7805 default:
7806 llvm_unreachable("Unexpected arch");
7807 }
7808}
7809
Thomas Schwinge4e555262013-03-28 19:04:25 +00007810void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7811 const InputInfo &Output,
7812 const InputInfoList &Inputs,
7813 const ArgList &Args,
7814 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007815 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007816 static_cast<const toolchains::Linux&>(getToolChain());
7817 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007818 const bool isAndroid =
7819 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007820 const bool IsPIE =
7821 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007822 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007823 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007824
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007825 ArgStringList CmdArgs;
7826
Rafael Espindolad1002f62010-11-15 18:28:16 +00007827 // Silence warning for "clang -g foo.o -o foo"
7828 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007829 // and "clang -emit-llvm foo.o -o foo"
7830 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007831 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007832 // handled somewhere else.
7833 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007834
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007835 if (!D.SysRoot.empty())
7836 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007837
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007838 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007839 CmdArgs.push_back("-pie");
7840
Rafael Espindola1c76c592010-11-07 22:57:16 +00007841 if (Args.hasArg(options::OPT_rdynamic))
7842 CmdArgs.push_back("-export-dynamic");
7843
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007844 if (Args.hasArg(options::OPT_s))
7845 CmdArgs.push_back("-s");
7846
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007847 if (ToolChain.getArch() == llvm::Triple::armeb ||
7848 ToolChain.getArch() == llvm::Triple::thumbeb)
7849 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7850
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007851 for (const auto &Opt : ToolChain.ExtraOpts)
7852 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007853
7854 if (!Args.hasArg(options::OPT_static)) {
7855 CmdArgs.push_back("--eh-frame-hdr");
7856 }
7857
7858 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007859 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007860
7861 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007862 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007863 ToolChain.getArch() == llvm::Triple::armeb ||
7864 ToolChain.getArch() == llvm::Triple::thumb ||
7865 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007866 CmdArgs.push_back("-Bstatic");
7867 else
7868 CmdArgs.push_back("-static");
7869 } else if (Args.hasArg(options::OPT_shared)) {
7870 CmdArgs.push_back("-shared");
7871 }
7872
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007873 if (ToolChain.getArch() == llvm::Triple::arm ||
7874 ToolChain.getArch() == llvm::Triple::armeb ||
7875 ToolChain.getArch() == llvm::Triple::thumb ||
7876 ToolChain.getArch() == llvm::Triple::thumbeb ||
7877 (!Args.hasArg(options::OPT_static) &&
7878 !Args.hasArg(options::OPT_shared))) {
7879 CmdArgs.push_back("-dynamic-linker");
7880 CmdArgs.push_back(Args.MakeArgString(
7881 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7882 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007883
7884 CmdArgs.push_back("-o");
7885 CmdArgs.push_back(Output.getFilename());
7886
Rafael Espindola81937ec2010-12-01 01:52:43 +00007887 if (!Args.hasArg(options::OPT_nostdlib) &&
7888 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007889 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007890 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007891 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007892 if (Args.hasArg(options::OPT_pg))
7893 crt1 = "gcrt1.o";
7894 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007895 crt1 = "Scrt1.o";
7896 else
7897 crt1 = "crt1.o";
7898 }
7899 if (crt1)
7900 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007901
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007902 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7903 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007904
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007905 const char *crtbegin;
7906 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007907 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007908 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007909 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007910 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007911 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007912 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007913 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007915
7916 // Add crtfastmath.o if available and fast math is enabled.
7917 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007918 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007919
7920 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007921 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007922
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007923 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007924
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007925 for (const auto &Path : Paths)
7926 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007927
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007928 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007929 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007930
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007931 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7932 CmdArgs.push_back("--no-demangle");
7933
Alexey Samsonov52550342014-09-15 19:58:40 +00007934 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007935 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007936 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007937 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007938
Hans Wennborg70850d82013-07-18 20:29:38 +00007939 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007940 !Args.hasArg(options::OPT_nostdlib) &&
7941 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007942 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7943 !Args.hasArg(options::OPT_static);
7944 if (OnlyLibstdcxxStatic)
7945 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007946 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007947 if (OnlyLibstdcxxStatic)
7948 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007949 CmdArgs.push_back("-lm");
7950 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007951 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7952 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007953
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007954 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007955 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7956 if (Args.hasArg(options::OPT_static))
7957 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007958
Alexey Samsonov52550342014-09-15 19:58:40 +00007959 if (NeedsSanitizerDeps)
7960 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7961
Alexey Bataev186b28a2014-03-06 05:43:53 +00007962 LibOpenMP UsedOpenMPLib = LibUnknown;
7963 if (Args.hasArg(options::OPT_fopenmp)) {
7964 UsedOpenMPLib = LibGOMP;
7965 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7966 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7967 .Case("libgomp", LibGOMP)
7968 .Case("libiomp5", LibIOMP5)
7969 .Default(LibUnknown);
7970 if (UsedOpenMPLib == LibUnknown)
7971 D.Diag(diag::err_drv_unsupported_option_argument)
7972 << A->getOption().getName() << A->getValue();
7973 }
7974 switch (UsedOpenMPLib) {
7975 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007976 CmdArgs.push_back("-lgomp");
7977
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007978 // FIXME: Exclude this for platforms with libgomp that don't require
7979 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007980 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007981 break;
7982 case LibIOMP5:
7983 CmdArgs.push_back("-liomp5");
7984 break;
7985 case LibUnknown:
7986 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007987 }
Renato Golinc4b49242014-02-13 10:01:16 +00007988 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007989
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007990 if ((Args.hasArg(options::OPT_pthread) ||
7991 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7992 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007993 CmdArgs.push_back("-lpthread");
7994
7995 CmdArgs.push_back("-lc");
7996
7997 if (Args.hasArg(options::OPT_static))
7998 CmdArgs.push_back("--end-group");
7999 else
Renato Golinc4b49242014-02-13 10:01:16 +00008000 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008001 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008002
Rafael Espindola81937ec2010-12-01 01:52:43 +00008003 if (!Args.hasArg(options::OPT_nostartfiles)) {
8004 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008005 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008006 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008007 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008008 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008009 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008010 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008011
Rafael Espindola81937ec2010-12-01 01:52:43 +00008012 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008013 if (!isAndroid)
8014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008015 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008016 }
8017
David Blaikiec11bf802014-09-04 16:04:28 +00008018 C.addCommand(
8019 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008020}
8021
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008022
8023// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8024// for the various SFI requirements like register masking. The assembly tool
8025// inserts the file containing the macros as an input into all the assembly
8026// jobs.
8027void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8028 const InputInfo &Output,
8029 const InputInfoList &Inputs,
8030 const ArgList &Args,
8031 const char *LinkingOutput) const {
8032 const toolchains::NaCl_TC& ToolChain =
8033 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8034 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8035 "nacl-arm-macros.s");
8036 InputInfoList NewInputs;
8037 NewInputs.push_back(NaClMacros);
8038 NewInputs.append(Inputs.begin(), Inputs.end());
8039 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8040 LinkingOutput);
8041}
8042
8043
8044// This is quite similar to gnutools::link::ConstructJob with changes that
8045// we use static by default, do not yet support sanitizers or LTO, and a few
8046// others. Eventually we can support more of that and hopefully migrate back
8047// to gnutools::link.
8048void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8049 const InputInfo &Output,
8050 const InputInfoList &Inputs,
8051 const ArgList &Args,
8052 const char *LinkingOutput) const {
8053
8054 const toolchains::NaCl_TC& ToolChain =
8055 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8056 const Driver &D = ToolChain.getDriver();
8057 const bool IsStatic =
8058 !Args.hasArg(options::OPT_dynamic) &&
8059 !Args.hasArg(options::OPT_shared);
8060
8061 ArgStringList CmdArgs;
8062
8063 // Silence warning for "clang -g foo.o -o foo"
8064 Args.ClaimAllArgs(options::OPT_g_Group);
8065 // and "clang -emit-llvm foo.o -o foo"
8066 Args.ClaimAllArgs(options::OPT_emit_llvm);
8067 // and for "clang -w foo.o -o foo". Other warning options are already
8068 // handled somewhere else.
8069 Args.ClaimAllArgs(options::OPT_w);
8070
8071 if (!D.SysRoot.empty())
8072 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8073
8074 if (Args.hasArg(options::OPT_rdynamic))
8075 CmdArgs.push_back("-export-dynamic");
8076
8077 if (Args.hasArg(options::OPT_s))
8078 CmdArgs.push_back("-s");
8079
8080 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8081 // there is --build-id, which we do want.
8082 CmdArgs.push_back("--build-id");
8083
8084 if (!IsStatic)
8085 CmdArgs.push_back("--eh-frame-hdr");
8086
8087 CmdArgs.push_back("-m");
8088 if (ToolChain.getArch() == llvm::Triple::x86)
8089 CmdArgs.push_back("elf_i386_nacl");
8090 else if (ToolChain.getArch() == llvm::Triple::arm)
8091 CmdArgs.push_back("armelf_nacl");
8092 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8093 CmdArgs.push_back("elf_x86_64_nacl");
8094 else
8095 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8096 "Native Client";
8097
8098
8099 if (IsStatic)
8100 CmdArgs.push_back("-static");
8101 else if (Args.hasArg(options::OPT_shared))
8102 CmdArgs.push_back("-shared");
8103
8104 CmdArgs.push_back("-o");
8105 CmdArgs.push_back(Output.getFilename());
8106 if (!Args.hasArg(options::OPT_nostdlib) &&
8107 !Args.hasArg(options::OPT_nostartfiles)) {
8108 if (!Args.hasArg(options::OPT_shared))
8109 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8110 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8111
8112 const char *crtbegin;
8113 if (IsStatic)
8114 crtbegin = "crtbeginT.o";
8115 else if (Args.hasArg(options::OPT_shared))
8116 crtbegin = "crtbeginS.o";
8117 else
8118 crtbegin = "crtbegin.o";
8119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8120 }
8121
8122 Args.AddAllArgs(CmdArgs, options::OPT_L);
8123 Args.AddAllArgs(CmdArgs, options::OPT_u);
8124
8125 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8126
8127 for (const auto &Path : Paths)
8128 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8129
8130 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8131 CmdArgs.push_back("--no-demangle");
8132
8133 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8134
8135 if (D.CCCIsCXX() &&
8136 !Args.hasArg(options::OPT_nostdlib) &&
8137 !Args.hasArg(options::OPT_nodefaultlibs)) {
8138 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8139 !IsStatic;
8140 if (OnlyLibstdcxxStatic)
8141 CmdArgs.push_back("-Bstatic");
8142 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8143 if (OnlyLibstdcxxStatic)
8144 CmdArgs.push_back("-Bdynamic");
8145 CmdArgs.push_back("-lm");
8146 }
8147
8148 if (!Args.hasArg(options::OPT_nostdlib)) {
8149 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8150 // Always use groups, since it has no effect on dynamic libraries.
8151 CmdArgs.push_back("--start-group");
8152 CmdArgs.push_back("-lc");
8153 // NaCl's libc++ currently requires libpthread, so just always include it
8154 // in the group for C++.
8155 if (Args.hasArg(options::OPT_pthread) ||
8156 Args.hasArg(options::OPT_pthreads) ||
8157 D.CCCIsCXX()) {
8158 CmdArgs.push_back("-lpthread");
8159 }
8160
8161 CmdArgs.push_back("-lgcc");
8162 CmdArgs.push_back("--as-needed");
8163 if (IsStatic)
8164 CmdArgs.push_back("-lgcc_eh");
8165 else
8166 CmdArgs.push_back("-lgcc_s");
8167 CmdArgs.push_back("--no-as-needed");
8168 CmdArgs.push_back("--end-group");
8169 }
8170
8171 if (!Args.hasArg(options::OPT_nostartfiles)) {
8172 const char *crtend;
8173 if (Args.hasArg(options::OPT_shared))
8174 crtend = "crtendS.o";
8175 else
8176 crtend = "crtend.o";
8177
8178 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8179 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8180 }
8181 }
8182
8183 C.addCommand(llvm::make_unique<Command>(JA, *this,
8184 ToolChain.Linker.c_str(), CmdArgs));
8185}
8186
8187
Chris Lattner3e2ee142010-07-07 16:01:42 +00008188void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008189 const InputInfo &Output,
8190 const InputInfoList &Inputs,
8191 const ArgList &Args,
8192 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008193 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008194 ArgStringList CmdArgs;
8195
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008196 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008197
8198 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008199 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008200
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008201 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008202 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008203
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008204 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008205 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008206}
8207
8208void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008209 const InputInfo &Output,
8210 const InputInfoList &Inputs,
8211 const ArgList &Args,
8212 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008213 const Driver &D = getToolChain().getDriver();
8214 ArgStringList CmdArgs;
8215
Daniel Dunbarb440f562010-08-02 02:38:21 +00008216 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008217 CmdArgs.push_back("-o");
8218 CmdArgs.push_back(Output.getFilename());
8219 } else {
8220 assert(Output.isNothing() && "Invalid output.");
8221 }
8222
8223 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008224 !Args.hasArg(options::OPT_nostartfiles)) {
8225 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8226 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8227 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8228 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8229 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008230
8231 Args.AddAllArgs(CmdArgs, options::OPT_L);
8232 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8233 Args.AddAllArgs(CmdArgs, options::OPT_e);
8234
Daniel Dunbar54423b22010-09-17 00:24:54 +00008235 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008236
Alexey Samsonov7811d192014-02-20 13:57:37 +00008237 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008238
Chris Lattner3e2ee142010-07-07 16:01:42 +00008239 if (!Args.hasArg(options::OPT_nostdlib) &&
8240 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008241 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008242 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008243 CmdArgs.push_back("-lm");
8244 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008245 }
8246
8247 if (!Args.hasArg(options::OPT_nostdlib) &&
8248 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008249 if (Args.hasArg(options::OPT_pthread))
8250 CmdArgs.push_back("-lpthread");
8251 CmdArgs.push_back("-lc");
8252 CmdArgs.push_back("-lCompilerRT-Generic");
8253 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8254 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008255 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008256 }
8257
Logan Chieneb9162f2014-06-26 14:23:45 +00008258 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008260}
8261
Daniel Dunbarcc912342009-05-02 18:28:39 +00008262/// DragonFly Tools
8263
8264// For now, DragonFly Assemble does just about the same as for
8265// FreeBSD, but this may change soon.
8266void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008267 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008268 const InputInfoList &Inputs,
8269 const ArgList &Args,
8270 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008271 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008272 ArgStringList CmdArgs;
8273
8274 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8275 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008276 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008277 CmdArgs.push_back("--32");
8278
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008279 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008280
8281 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008282 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008283
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008284 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008285 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008286
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008287 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008288 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008289}
8290
8291void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008292 const InputInfo &Output,
8293 const InputInfoList &Inputs,
8294 const ArgList &Args,
8295 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008296 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008297 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008298 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008299
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008300 if (!D.SysRoot.empty())
8301 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8302
John McCall65b8da02013-04-11 22:55:55 +00008303 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008304 if (Args.hasArg(options::OPT_static)) {
8305 CmdArgs.push_back("-Bstatic");
8306 } else {
John McCall65b8da02013-04-11 22:55:55 +00008307 if (Args.hasArg(options::OPT_rdynamic))
8308 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008309 if (Args.hasArg(options::OPT_shared))
8310 CmdArgs.push_back("-Bshareable");
8311 else {
8312 CmdArgs.push_back("-dynamic-linker");
8313 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8314 }
John McCall65b8da02013-04-11 22:55:55 +00008315 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008316 }
8317
8318 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8319 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008320 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008321 CmdArgs.push_back("-m");
8322 CmdArgs.push_back("elf_i386");
8323 }
8324
Daniel Dunbarb440f562010-08-02 02:38:21 +00008325 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008326 CmdArgs.push_back("-o");
8327 CmdArgs.push_back(Output.getFilename());
8328 } else {
8329 assert(Output.isNothing() && "Invalid output.");
8330 }
8331
8332 if (!Args.hasArg(options::OPT_nostdlib) &&
8333 !Args.hasArg(options::OPT_nostartfiles)) {
8334 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008335 if (Args.hasArg(options::OPT_pg))
8336 CmdArgs.push_back(Args.MakeArgString(
8337 getToolChain().GetFilePath("gcrt1.o")));
8338 else {
8339 if (Args.hasArg(options::OPT_pie))
8340 CmdArgs.push_back(Args.MakeArgString(
8341 getToolChain().GetFilePath("Scrt1.o")));
8342 else
8343 CmdArgs.push_back(Args.MakeArgString(
8344 getToolChain().GetFilePath("crt1.o")));
8345 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008346 }
John McCall65b8da02013-04-11 22:55:55 +00008347 CmdArgs.push_back(Args.MakeArgString(
8348 getToolChain().GetFilePath("crti.o")));
8349 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8350 CmdArgs.push_back(Args.MakeArgString(
8351 getToolChain().GetFilePath("crtbeginS.o")));
8352 else
8353 CmdArgs.push_back(Args.MakeArgString(
8354 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008355 }
8356
8357 Args.AddAllArgs(CmdArgs, options::OPT_L);
8358 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8359 Args.AddAllArgs(CmdArgs, options::OPT_e);
8360
Daniel Dunbar54423b22010-09-17 00:24:54 +00008361 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008362
8363 if (!Args.hasArg(options::OPT_nostdlib) &&
8364 !Args.hasArg(options::OPT_nodefaultlibs)) {
8365 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8366 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008367 if (UseGCC47)
8368 CmdArgs.push_back("-L/usr/lib/gcc47");
8369 else
8370 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008371
8372 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008373 if (UseGCC47) {
8374 CmdArgs.push_back("-rpath");
8375 CmdArgs.push_back("/usr/lib/gcc47");
8376 } else {
8377 CmdArgs.push_back("-rpath");
8378 CmdArgs.push_back("/usr/lib/gcc44");
8379 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008380 }
8381
Hans Wennborg70850d82013-07-18 20:29:38 +00008382 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008383 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008384 CmdArgs.push_back("-lm");
8385 }
8386
Daniel Dunbarcc912342009-05-02 18:28:39 +00008387 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008388 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008389
8390 if (!Args.hasArg(options::OPT_nolibc)) {
8391 CmdArgs.push_back("-lc");
8392 }
8393
John McCall65b8da02013-04-11 22:55:55 +00008394 if (UseGCC47) {
8395 if (Args.hasArg(options::OPT_static) ||
8396 Args.hasArg(options::OPT_static_libgcc)) {
8397 CmdArgs.push_back("-lgcc");
8398 CmdArgs.push_back("-lgcc_eh");
8399 } else {
8400 if (Args.hasArg(options::OPT_shared_libgcc)) {
8401 CmdArgs.push_back("-lgcc_pic");
8402 if (!Args.hasArg(options::OPT_shared))
8403 CmdArgs.push_back("-lgcc");
8404 } else {
8405 CmdArgs.push_back("-lgcc");
8406 CmdArgs.push_back("--as-needed");
8407 CmdArgs.push_back("-lgcc_pic");
8408 CmdArgs.push_back("--no-as-needed");
8409 }
8410 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008411 } else {
John McCall65b8da02013-04-11 22:55:55 +00008412 if (Args.hasArg(options::OPT_shared)) {
8413 CmdArgs.push_back("-lgcc_pic");
8414 } else {
8415 CmdArgs.push_back("-lgcc");
8416 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008417 }
8418 }
8419
8420 if (!Args.hasArg(options::OPT_nostdlib) &&
8421 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008422 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008423 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008424 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008425 else
8426 CmdArgs.push_back(Args.MakeArgString(
8427 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008428 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008429 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008430 }
8431
Alexey Samsonov7811d192014-02-20 13:57:37 +00008432 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008433
Logan Chieneb9162f2014-06-26 14:23:45 +00008434 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008435 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008436}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008437
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008438// Try to find Exe from a Visual Studio distribution. This first tries to find
8439// an installed copy of Visual Studio and, failing that, looks in the PATH,
8440// making sure that whatever executable that's found is not a same-named exe
8441// from clang itself to prevent clang from falling back to itself.
8442static std::string FindVisualStudioExecutable(const ToolChain &TC,
8443 const char *Exe,
8444 const char *ClangProgramPath) {
8445 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8446 std::string visualStudioBinDir;
8447 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8448 visualStudioBinDir)) {
8449 SmallString<128> FilePath(visualStudioBinDir);
8450 llvm::sys::path::append(FilePath, Exe);
8451 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8452 return FilePath.str();
8453 }
8454
8455 return Exe;
8456}
8457
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008458void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8459 const InputInfo &Output,
8460 const InputInfoList &Inputs,
8461 const ArgList &Args,
8462 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008463 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008464 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008465
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008466 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8467 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008468 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8469 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008470
8471 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008472 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008473 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008474
Zachary Turner10d75b22014-10-22 20:40:43 +00008475 if (!llvm::sys::Process::GetEnv("LIB")) {
8476 // If the VC environment hasn't been configured (perhaps because the user
8477 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008478 // the environment variable is set however, assume the user knows what
8479 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008480 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008481 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008482 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8483 SmallString<128> LibDir(VisualStudioDir);
8484 llvm::sys::path::append(LibDir, "VC", "lib");
8485 switch (MSVC.getArch()) {
8486 case llvm::Triple::x86:
8487 // x86 just puts the libraries directly in lib
8488 break;
8489 case llvm::Triple::x86_64:
8490 llvm::sys::path::append(LibDir, "amd64");
8491 break;
8492 case llvm::Triple::arm:
8493 llvm::sys::path::append(LibDir, "arm");
8494 break;
8495 default:
8496 break;
8497 }
8498 CmdArgs.push_back(
8499 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8500 }
8501
8502 std::string WindowsSdkLibPath;
8503 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8504 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8505 WindowsSdkLibPath.c_str()));
8506 }
8507
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008508 CmdArgs.push_back("-nologo");
8509
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008510 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008511 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008512
Hans Wennborge4c47f22015-03-04 23:16:21 +00008513 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8514 options::OPT__SLASH_LDd,
8515 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008516 if (DLL) {
8517 CmdArgs.push_back(Args.MakeArgString("-dll"));
8518
8519 SmallString<128> ImplibName(Output.getFilename());
8520 llvm::sys::path::replace_extension(ImplibName, "lib");
8521 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008522 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008523 }
8524
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008525 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008526 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008527 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008528 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008529 static const char *CompilerRTComponents[] = {
8530 "asan_dynamic",
8531 "asan_dynamic_runtime_thunk",
8532 };
8533 for (const auto &Component : CompilerRTComponents)
8534 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008535 // Make sure the dynamic runtime thunk is not optimized out at link time
8536 // to ensure proper SEH handling.
8537 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008538 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008539 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008540 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008541 static const char *CompilerRTComponents[] = {
8542 "asan",
8543 "asan_cxx",
8544 };
8545 for (const auto &Component : CompilerRTComponents)
8546 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008547 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008548 }
8549
Hans Wennborg2e274592013-08-13 23:38:57 +00008550 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008551
Reid Kleckner337188f2014-09-16 19:22:00 +00008552 // Add filenames, libraries, and other linker inputs.
8553 for (const auto &Input : Inputs) {
8554 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008555 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008556 continue;
8557 }
8558
8559 const Arg &A = Input.getInputArg();
8560
8561 // Render -l options differently for the MSVC linker.
8562 if (A.getOption().matches(options::OPT_l)) {
8563 StringRef Lib = A.getValue();
8564 const char *LinkLibArg;
8565 if (Lib.endswith(".lib"))
8566 LinkLibArg = Args.MakeArgString(Lib);
8567 else
8568 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8569 CmdArgs.push_back(LinkLibArg);
8570 continue;
8571 }
8572
8573 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8574 // or -L. Render it, even if MSVC doesn't understand it.
8575 A.renderAsInput(Args, CmdArgs);
8576 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008577
Zachary Turner719f58c2014-12-01 23:06:47 +00008578 // We need to special case some linker paths. In the case of lld, we need to
8579 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8580 // linker, we need to use a special search algorithm.
8581 llvm::SmallString<128> linkPath;
8582 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8583 if (Linker.equals_lower("lld"))
8584 Linker = "lld-link";
8585
8586 if (Linker.equals_lower("link")) {
8587 // If we're using the MSVC linker, it's not sufficient to just use link
8588 // from the program PATH, because other environments like GnuWin32 install
8589 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008590 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008591 C.getDriver().getClangProgramPath());
8592 } else {
8593 linkPath = Linker;
8594 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008595 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008596 }
8597
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008598 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008599 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008600}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008601
8602void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8603 const InputInfo &Output,
8604 const InputInfoList &Inputs,
8605 const ArgList &Args,
8606 const char *LinkingOutput) const {
8607 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8608}
8609
David Blaikiec11bf802014-09-04 16:04:28 +00008610std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8611 Compilation &C, const JobAction &JA, const InputInfo &Output,
8612 const InputInfoList &Inputs, const ArgList &Args,
8613 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008614 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008615 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008616 CmdArgs.push_back("/c"); // Compile only.
8617 CmdArgs.push_back("/W0"); // No warnings.
8618
8619 // The goal is to be able to invoke this tool correctly based on
8620 // any flag accepted by clang-cl.
8621
8622 // These are spelled the same way in clang and cl.exe,.
8623 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8624 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008625
8626 // Optimization level.
8627 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8628 if (A->getOption().getID() == options::OPT_O0) {
8629 CmdArgs.push_back("/Od");
8630 } else {
8631 StringRef OptLevel = A->getValue();
8632 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8633 A->render(Args, CmdArgs);
8634 else if (OptLevel == "3")
8635 CmdArgs.push_back("/Ox");
8636 }
8637 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008638
Nico Weber3f8dafb2015-03-12 19:37:10 +00008639 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008640 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8641
David Majnemerf6072342014-07-01 22:24:56 +00008642 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8643 /*default=*/false))
8644 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008645 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8646 options::OPT_fno_function_sections))
8647 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8648 ? "/Gy"
8649 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008650 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8651 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008652 CmdArgs.push_back(
8653 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008654 if (Args.hasArg(options::OPT_fsyntax_only))
8655 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008656 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8657 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008658
Nico Weber3f8dafb2015-03-12 19:37:10 +00008659 std::vector<std::string> Includes =
8660 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008661 for (const auto &Include : Includes)
8662 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008663
Hans Wennborg87cfa712013-09-19 20:32:16 +00008664 // Flags that can simply be passed through.
8665 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8666 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008667 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008668
8669 // The order of these flags is relevant, so pick the last one.
8670 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8671 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8672 A->render(Args, CmdArgs);
8673
8674
8675 // Input filename.
8676 assert(Inputs.size() == 1);
8677 const InputInfo &II = Inputs[0];
8678 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8679 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8680 if (II.isFilename())
8681 CmdArgs.push_back(II.getFilename());
8682 else
8683 II.getInputArg().renderAsInput(Args, CmdArgs);
8684
8685 // Output filename.
8686 assert(Output.getType() == types::TY_Object);
8687 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8688 Output.getFilename());
8689 CmdArgs.push_back(Fo);
8690
Hans Wennborg188382e2013-09-20 18:16:35 +00008691 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008692 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8693 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008694 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8695 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008696}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008697
8698
8699/// XCore Tools
8700// We pass assemble and link construction to the xcc tool.
8701
8702void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8703 const InputInfo &Output,
8704 const InputInfoList &Inputs,
8705 const ArgList &Args,
8706 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008707 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008708 ArgStringList CmdArgs;
8709
8710 CmdArgs.push_back("-o");
8711 CmdArgs.push_back(Output.getFilename());
8712
8713 CmdArgs.push_back("-c");
8714
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008715 if (Args.hasArg(options::OPT_v))
8716 CmdArgs.push_back("-v");
8717
Robert Lytton894d25c2014-05-02 09:33:25 +00008718 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8719 if (!A->getOption().matches(options::OPT_g0))
8720 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008721
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008722 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8723 false))
8724 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008725
8726 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8727 options::OPT_Xassembler);
8728
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008729 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008730 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008731
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008732 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008734}
8735
8736void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8737 const InputInfo &Output,
8738 const InputInfoList &Inputs,
8739 const ArgList &Args,
8740 const char *LinkingOutput) const {
8741 ArgStringList CmdArgs;
8742
8743 if (Output.isFilename()) {
8744 CmdArgs.push_back("-o");
8745 CmdArgs.push_back(Output.getFilename());
8746 } else {
8747 assert(Output.isNothing() && "Invalid output.");
8748 }
8749
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008750 if (Args.hasArg(options::OPT_v))
8751 CmdArgs.push_back("-v");
8752
David Majnemer8de68642014-12-05 08:11:58 +00008753 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008754 CmdArgs.push_back("-fexceptions");
8755
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008756 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8757
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008758 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008759 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008760}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008761
8762void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8763 const InputInfo &Output,
8764 const InputInfoList &Inputs,
8765 const ArgList &Args,
8766 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008767 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008768 const auto &TC =
8769 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8770 ArgStringList CmdArgs;
8771 const char *Exec;
8772
8773 switch (TC.getArch()) {
8774 default: llvm_unreachable("unsupported architecture");
8775 case llvm::Triple::arm:
8776 case llvm::Triple::thumb:
8777 break;
8778 case llvm::Triple::x86:
8779 CmdArgs.push_back("--32");
8780 break;
8781 case llvm::Triple::x86_64:
8782 CmdArgs.push_back("--64");
8783 break;
8784 }
8785
8786 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8787
8788 CmdArgs.push_back("-o");
8789 CmdArgs.push_back(Output.getFilename());
8790
8791 for (const auto &Input : Inputs)
8792 CmdArgs.push_back(Input.getFilename());
8793
8794 const std::string Assembler = TC.GetProgramPath("as");
8795 Exec = Args.MakeArgString(Assembler);
8796
8797 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8798}
8799
8800void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8801 const InputInfo &Output,
8802 const InputInfoList &Inputs,
8803 const ArgList &Args,
8804 const char *LinkingOutput) const {
8805 const auto &TC =
8806 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8807 const llvm::Triple &T = TC.getTriple();
8808 const Driver &D = TC.getDriver();
8809 SmallString<128> EntryPoint;
8810 ArgStringList CmdArgs;
8811 const char *Exec;
8812
8813 // Silence warning for "clang -g foo.o -o foo"
8814 Args.ClaimAllArgs(options::OPT_g_Group);
8815 // and "clang -emit-llvm foo.o -o foo"
8816 Args.ClaimAllArgs(options::OPT_emit_llvm);
8817 // and for "clang -w foo.o -o foo"
8818 Args.ClaimAllArgs(options::OPT_w);
8819 // Other warning options are already handled somewhere else.
8820
8821 if (!D.SysRoot.empty())
8822 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8823
8824 if (Args.hasArg(options::OPT_pie))
8825 CmdArgs.push_back("-pie");
8826 if (Args.hasArg(options::OPT_rdynamic))
8827 CmdArgs.push_back("-export-dynamic");
8828 if (Args.hasArg(options::OPT_s))
8829 CmdArgs.push_back("--strip-all");
8830
8831 CmdArgs.push_back("-m");
8832 switch (TC.getArch()) {
8833 default: llvm_unreachable("unsupported architecture");
8834 case llvm::Triple::arm:
8835 case llvm::Triple::thumb:
8836 // FIXME: this is incorrect for WinCE
8837 CmdArgs.push_back("thumb2pe");
8838 break;
8839 case llvm::Triple::x86:
8840 CmdArgs.push_back("i386pe");
8841 EntryPoint.append("_");
8842 break;
8843 case llvm::Triple::x86_64:
8844 CmdArgs.push_back("i386pep");
8845 break;
8846 }
8847
8848 if (Args.hasArg(options::OPT_shared)) {
8849 switch (T.getArch()) {
8850 default: llvm_unreachable("unsupported architecture");
8851 case llvm::Triple::arm:
8852 case llvm::Triple::thumb:
8853 case llvm::Triple::x86_64:
8854 EntryPoint.append("_DllMainCRTStartup");
8855 break;
8856 case llvm::Triple::x86:
8857 EntryPoint.append("_DllMainCRTStartup@12");
8858 break;
8859 }
8860
8861 CmdArgs.push_back("-shared");
8862 CmdArgs.push_back("-Bdynamic");
8863
8864 CmdArgs.push_back("--enable-auto-image-base");
8865
8866 CmdArgs.push_back("--entry");
8867 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8868 } else {
8869 EntryPoint.append("mainCRTStartup");
8870
8871 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8872 : "-Bdynamic");
8873
8874 if (!Args.hasArg(options::OPT_nostdlib) &&
8875 !Args.hasArg(options::OPT_nostartfiles)) {
8876 CmdArgs.push_back("--entry");
8877 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8878 }
8879
8880 // FIXME: handle subsystem
8881 }
8882
8883 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008884 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008885
8886 CmdArgs.push_back("-o");
8887 CmdArgs.push_back(Output.getFilename());
8888
8889 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8890 SmallString<261> ImpLib(Output.getFilename());
8891 llvm::sys::path::replace_extension(ImpLib, ".lib");
8892
8893 CmdArgs.push_back("--out-implib");
8894 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8895 }
8896
8897 if (!Args.hasArg(options::OPT_nostdlib) &&
8898 !Args.hasArg(options::OPT_nostartfiles)) {
8899 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8900 const char *CRTBegin;
8901
8902 CRTBegin =
8903 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8904 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8905 }
8906
8907 Args.AddAllArgs(CmdArgs, options::OPT_L);
8908
8909 const auto &Paths = TC.getFilePaths();
8910 for (const auto &Path : Paths)
8911 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8912
8913 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8914
8915 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8916 !Args.hasArg(options::OPT_nodefaultlibs)) {
8917 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8918 !Args.hasArg(options::OPT_static);
8919 if (StaticCXX)
8920 CmdArgs.push_back("-Bstatic");
8921 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8922 if (StaticCXX)
8923 CmdArgs.push_back("-Bdynamic");
8924 }
8925
8926 if (!Args.hasArg(options::OPT_nostdlib)) {
8927 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8928 // TODO handle /MT[d] /MD[d]
8929 CmdArgs.push_back("-lmsvcrt");
8930 AddRunTimeLibs(TC, D, CmdArgs, Args);
8931 }
8932 }
8933
8934 const std::string Linker = TC.GetProgramPath("ld");
8935 Exec = Args.MakeArgString(Linker);
8936
8937 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8938}