blob: 3c6827af9d8aed794fdb72f3c9d914e2e1b3dd36 [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");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000327
328 if (isa<PrecompileJobAction>(JA))
329 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000330 }
331
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000332 if (Args.hasArg(options::OPT_MG)) {
333 if (!A || A->getOption().matches(options::OPT_MD) ||
334 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000335 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000336 CmdArgs.push_back("-MG");
337 }
338
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000339 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000340
341 // Convert all -MQ <target> args to -MT <quoted target>
342 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
343 options::OPT_MQ),
344 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000345 const Arg *A = *it;
346 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000347
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000350 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000351 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back(Args.MakeArgString(Quoted));
353
354 // -MT flag - no change
355 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000356 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000357 }
358 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000359
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 // Add -i* options, and automatically translate to
361 // -include-pch/-include-pth for transparent PCH support. It's
362 // wonky, but we include looking for .gch so we can support seamless
363 // replacement into a build system already set up to be generating
364 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000365 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000366 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
367 ie = Args.filtered_end(); it != ie; ++it) {
368 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000369
370 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
372 RenderedImplicitInclude = true;
373
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000374 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000375 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000376
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000378 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000379 SmallString<128> P(A->getValue());
380 // We want the files to have a name like foo.h.pch. Add a dummy extension
381 // so that replace_extension does the right thing.
382 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000383 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000384 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000385 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000386 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000387 }
388
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000390 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000391 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000393 }
394
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000396 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000397 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000398 FoundPCH = UsePCH;
399 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000400 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000401 }
402
403 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000404 if (IsFirstImplicitInclude) {
405 A->claim();
406 if (UsePCH)
407 CmdArgs.push_back("-include-pch");
408 else
409 CmdArgs.push_back("-include-pth");
410 CmdArgs.push_back(Args.MakeArgString(P.str()));
411 continue;
412 } else {
413 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000414 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000415 << P.str() << A->getAsString(Args);
416 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000417 }
418 }
419
420 // Not translated, render as usual.
421 A->claim();
422 A->render(Args, CmdArgs);
423 }
424
425 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000426 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
427 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000428
429 // Add -Wp, and -Xassembler if using the preprocessor.
430
431 // FIXME: There is a very unfortunate problem here, some troubled
432 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
433 // really support that we would have to parse and then translate
434 // those options. :(
435 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
436 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000437
438 // -I- is a deprecated GCC feature, reject it.
439 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000440 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000441
442 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
443 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000444 StringRef sysroot = C.getSysRoot();
445 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000446 if (!Args.hasArg(options::OPT_isysroot)) {
447 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000448 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 }
450 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000451
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000453 // FIXME: We should probably sink the logic for handling these from the
454 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // CPATH - included following the user specified includes (but prior to
456 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000457 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000459 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000460 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000461 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000462 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000463 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000464 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000465 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000466
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000467 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000468 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000469 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000470
471 // Add system include arguments.
472 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473}
474
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000475// FIXME: Move to target hook.
476static bool isSignedCharDefault(const llvm::Triple &Triple) {
477 switch (Triple.getArch()) {
478 default:
479 return true;
480
Tim Northover9bb857a2013-01-31 12:13:10 +0000481 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000482 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000483 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000484 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000485 case llvm::Triple::thumb:
486 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000487 if (Triple.isOSDarwin() || Triple.isOSWindows())
488 return true;
489 return false;
490
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000491 case llvm::Triple::ppc:
492 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000493 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 return true;
495 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000496
Bill Schmidt778d3872013-07-26 01:36:11 +0000497 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000498 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000499 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000500 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000501 }
502}
503
Robert Lytton0e076492013-08-13 09:43:10 +0000504static bool isNoCommonDefault(const llvm::Triple &Triple) {
505 switch (Triple.getArch()) {
506 default:
507 return false;
508
509 case llvm::Triple::xcore:
510 return true;
511 }
512}
513
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000514// Handle -mhwdiv=.
515static void getARMHWDivFeatures(const Driver &D, const Arg *A,
516 const ArgList &Args,
517 std::vector<const char *> &Features) {
518 StringRef HWDiv = A->getValue();
519 if (HWDiv == "arm") {
520 Features.push_back("+hwdiv-arm");
521 Features.push_back("-hwdiv");
522 } else if (HWDiv == "thumb") {
523 Features.push_back("-hwdiv-arm");
524 Features.push_back("+hwdiv");
525 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
526 Features.push_back("+hwdiv-arm");
527 Features.push_back("+hwdiv");
528 } else if (HWDiv == "none") {
529 Features.push_back("-hwdiv-arm");
530 Features.push_back("-hwdiv");
531 } else
532 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
533}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000534
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000535// Handle -mfpu=.
536//
537// FIXME: Centralize feature selection, defaulting shouldn't be also in the
538// frontend target.
539static void getARMFPUFeatures(const Driver &D, const Arg *A,
540 const ArgList &Args,
541 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000542 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000543
544 // Set the target features based on the FPU.
545 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
546 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000547 Features.push_back("-vfp2");
548 Features.push_back("-vfp3");
549 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000550 } else if (FPU == "vfp") {
551 Features.push_back("+vfp2");
552 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000553 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000554 Features.push_back("+vfp3");
555 Features.push_back("+d16");
556 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000558 Features.push_back("+vfp3");
559 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000560 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
561 Features.push_back("+vfp4");
562 Features.push_back("+d16");
563 Features.push_back("-neon");
564 } else if (FPU == "vfp4" || FPU == "vfpv4") {
565 Features.push_back("+vfp4");
566 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000567 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
568 Features.push_back("+vfp4");
569 Features.push_back("+d16");
570 Features.push_back("+fp-only-sp");
571 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000572 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
573 Features.push_back("+fp-armv8");
574 Features.push_back("+fp-only-sp");
575 Features.push_back("+d16");
576 Features.push_back("-neon");
577 Features.push_back("-crypto");
578 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
579 FPU == "fp5-d16" || FPU == "fpv5-d16") {
580 Features.push_back("+fp-armv8");
581 Features.push_back("+d16");
582 Features.push_back("-neon");
583 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000584 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000585 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000586 Features.push_back("-neon");
587 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000588 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000589 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000590 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000591 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000592 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000593 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000594 Features.push_back("+neon");
595 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000596 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000597 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000598 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000599 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000600 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000601 } else if (FPU == "neon-vfpv4") {
602 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000603 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000604 } else if (FPU == "none") {
605 Features.push_back("-vfp2");
606 Features.push_back("-vfp3");
607 Features.push_back("-vfp4");
608 Features.push_back("-fp-armv8");
609 Features.push_back("-crypto");
610 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000611 } else
612 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
613}
614
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000615// Select the float ABI as determined by -msoft-float, -mhard-float, and
616// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000617StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000618 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000619 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
621 options::OPT_mhard_float,
622 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000623 if (A->getOption().matches(options::OPT_msoft_float))
624 FloatABI = "soft";
625 else if (A->getOption().matches(options::OPT_mhard_float))
626 FloatABI = "hard";
627 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000628 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000629 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000630 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 << A->getAsString(Args);
632 FloatABI = "soft";
633 }
634 }
635 }
636
637 // If unspecified, choose the default based on the platform.
638 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000639 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000640 case llvm::Triple::Darwin:
641 case llvm::Triple::MacOSX:
642 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000643 // Darwin defaults to "softfp" for v6 and v7.
644 //
645 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000646 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000647 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 if (StringRef(ArchName).startswith("v6") ||
649 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
655
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000656 // FIXME: this is invalid for WindowsCE
657 case llvm::Triple::Win32:
658 FloatABI = "hard";
659 break;
660
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000661 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000662 switch(Triple.getEnvironment()) {
663 case llvm::Triple::GNUEABIHF:
664 FloatABI = "hard";
665 break;
666 default:
667 // FreeBSD defaults to soft float
668 FloatABI = "soft";
669 break;
670 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000671 break;
672
Daniel Dunbar78485922009-09-10 23:00:09 +0000673 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000674 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000675 case llvm::Triple::GNUEABIHF:
676 FloatABI = "hard";
677 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 case llvm::Triple::GNUEABI:
679 FloatABI = "softfp";
680 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000681 case llvm::Triple::EABIHF:
682 FloatABI = "hard";
683 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000684 case llvm::Triple::EABI:
685 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
686 FloatABI = "softfp";
687 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000688 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000689 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000690 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000691 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000692 FloatABI = "softfp";
693 else
694 FloatABI = "soft";
695 break;
696 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000697 default:
698 // Assume "soft", but warn the user we are guessing.
699 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000700 if (Triple.getOS() != llvm::Triple::UnknownOS ||
701 !Triple.isOSBinFormatMachO())
702 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000703 break;
704 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000705 }
706 }
707
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000708 return FloatABI;
709}
710
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000711static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
712 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000713 std::vector<const char *> &Features,
714 bool ForAS) {
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000715 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000716 if (!ForAS) {
717 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
718 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
719 // stripped out by the ARM target. We should probably pass this a new
720 // -target-option, which is handled by the -cc1/-cc1as invocation.
721 //
722 // FIXME2: For consistency, it would be ideal if we set up the target
723 // machine state the same when using the frontend or the assembler. We don't
724 // currently do that for the assembler, we pass the options directly to the
725 // backend and never even instantiate the frontend TargetInfo. If we did,
726 // and used its handleTargetFeatures hook, then we could ensure the
727 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000728
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000729 // Use software floating point operations?
730 if (FloatABI == "soft")
731 Features.push_back("+soft-float");
732
733 // Use software floating point argument passing?
734 if (FloatABI != "hard")
735 Features.push_back("+soft-float-abi");
736 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000737
738 // Honor -mfpu=.
739 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000740 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000741 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
742 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000743
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000744 // Setting -msoft-float effectively disables NEON because of the GCC
745 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000746 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000747 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000748 // Also need to explicitly disable features which imply NEON.
749 Features.push_back("-crypto");
750 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000751
752 // En/disable crc
753 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
754 options::OPT_mnocrc)) {
755 if (A->getOption().matches(options::OPT_mcrc))
756 Features.push_back("+crc");
757 else
758 Features.push_back("-crc");
759 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000760}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000761
762void Clang::AddARMTargetArgs(const ArgList &Args,
763 ArgStringList &CmdArgs,
764 bool KernelOrKext) const {
765 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000766 // Get the effective triple, which takes into account the deployment target.
767 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
768 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000769 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770
771 // Select the ABI to use.
772 //
773 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000774 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000775 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000776 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000777 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000778 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000779 // The backend is hardwired to assume AAPCS for M-class processors, ensure
780 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000781 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000782 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000783 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000784 ABIName = "aapcs";
785 } else {
786 ABIName = "apcs-gnu";
787 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000788 } else if (Triple.isOSWindows()) {
789 // FIXME: this is invalid for WindowsCE
790 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000791 } else {
792 // Select the default based on the platform.
793 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000794 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000795 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000796 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000797 ABIName = "aapcs-linux";
798 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000799 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000800 case llvm::Triple::EABI:
801 ABIName = "aapcs";
802 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000803 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000804 if (Triple.getOS() == llvm::Triple::NetBSD)
805 ABIName = "apcs-gnu";
806 else
807 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000808 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000809 }
810 }
811 CmdArgs.push_back("-target-abi");
812 CmdArgs.push_back(ABIName);
813
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000815 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000816 if (FloatABI == "soft") {
817 // Floating point operations and argument passing are soft.
818 //
819 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000820 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000821 CmdArgs.push_back("-mfloat-abi");
822 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000823 } else if (FloatABI == "softfp") {
824 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000825 CmdArgs.push_back("-mfloat-abi");
826 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000827 } else {
828 // Floating point operations and argument passing are hard.
829 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000830 CmdArgs.push_back("-mfloat-abi");
831 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000832 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000833
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000834 // Kernel code has more strict alignment requirements.
835 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000836 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000837 CmdArgs.push_back("-backend-option");
838 CmdArgs.push_back("-arm-long-calls");
839 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000840
Daniel Dunbar12100e22011-03-22 16:48:17 +0000841 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000842 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000843
844 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000845 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000846 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000847 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000848
Bob Wilson0874e532014-07-29 00:23:18 +0000849 // -mkernel implies -mstrict-align; don't add the redundant option.
850 if (!KernelOrKext) {
851 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
852 options::OPT_munaligned_access)) {
853 CmdArgs.push_back("-backend-option");
854 if (A->getOption().matches(options::OPT_mno_unaligned_access))
855 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000856 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000857 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000858 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000859 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000860 }
Bob Wilson0874e532014-07-29 00:23:18 +0000861 }
862 }
863
Chad Rosierba3df1d2011-08-26 00:26:29 +0000864 // Setting -mno-global-merge disables the codegen global merge pass. Setting
865 // -mglobal-merge has no effect as the pass is enabled by default.
866 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
867 options::OPT_mno_global_merge)) {
868 if (A->getOption().matches(options::OPT_mno_global_merge))
869 CmdArgs.push_back("-mno-global-merge");
870 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000871
Bob Wilson9c8af452013-04-11 18:53:25 +0000872 if (!Args.hasFlag(options::OPT_mimplicit_float,
873 options::OPT_mno_implicit_float,
874 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000875 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000876
Logan Chien749763e2014-04-03 13:12:44 +0000877 // llvm does not support reserving registers in general. There is support
878 // for reserving r9 on ARM though (defined as a platform-specific register
879 // in ARM EABI).
880 if (Args.hasArg(options::OPT_ffixed_r9)) {
881 CmdArgs.push_back("-backend-option");
882 CmdArgs.push_back("-arm-reserve-r9");
883 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000884}
885
Tim Northover573cbee2014-05-24 12:52:07 +0000886/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
887/// targeting.
888static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000889 Arg *A;
890 std::string CPU;
891 // If we have -mtune or -mcpu, use that.
892 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
893 CPU = A->getValue();
894 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
895 StringRef Mcpu = A->getValue();
896 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000897 }
898
Kevin Qin110db6f2014-07-18 07:03:22 +0000899 // Handle CPU name is 'native'.
900 if (CPU == "native")
901 return llvm::sys::getHostCPUName();
902 else if (CPU.size())
903 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000904
James Molloy9b1586b2014-04-17 12:51:17 +0000905 // Make sure we pick "cyclone" if -arch is used.
906 // FIXME: Should this be picked by checking the target triple instead?
907 if (Args.getLastArg(options::OPT_arch))
908 return "cyclone";
909
910 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000911}
912
Tim Northover573cbee2014-05-24 12:52:07 +0000913void Clang::AddAArch64TargetArgs(const ArgList &Args,
914 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000915 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
916 llvm::Triple Triple(TripleStr);
917
918 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
919 Args.hasArg(options::OPT_mkernel) ||
920 Args.hasArg(options::OPT_fapple_kext))
921 CmdArgs.push_back("-disable-red-zone");
922
923 if (!Args.hasFlag(options::OPT_mimplicit_float,
924 options::OPT_mno_implicit_float, true))
925 CmdArgs.push_back("-no-implicit-float");
926
Craig Topper92fc2df2014-05-17 16:56:41 +0000927 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000928 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
929 ABIName = A->getValue();
930 else if (Triple.isOSDarwin())
931 ABIName = "darwinpcs";
932 else
933 ABIName = "aapcs";
934
935 CmdArgs.push_back("-target-abi");
936 CmdArgs.push_back(ABIName);
937
Bob Wilson0874e532014-07-29 00:23:18 +0000938 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
939 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000940 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000941 if (A->getOption().matches(options::OPT_mno_unaligned_access))
942 CmdArgs.push_back("-aarch64-strict-align");
943 else
944 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000945 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000946
Bradley Smith9ff64332014-10-13 10:16:06 +0000947 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
948 options::OPT_mno_fix_cortex_a53_835769)) {
949 CmdArgs.push_back("-backend-option");
950 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
951 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
952 else
953 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000954 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
955 // Enabled A53 errata (835769) workaround by default on android
956 CmdArgs.push_back("-backend-option");
957 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000958 }
959
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000960 // Setting -mno-global-merge disables the codegen global merge pass. Setting
961 // -mglobal-merge has no effect as the pass is enabled by default.
962 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
963 options::OPT_mno_global_merge)) {
964 if (A->getOption().matches(options::OPT_mno_global_merge))
965 CmdArgs.push_back("-mno-global-merge");
966 }
Renato Golinb625f482015-01-25 23:17:48 +0000967
968 if (Args.hasArg(options::OPT_ffixed_x18)) {
969 CmdArgs.push_back("-backend-option");
970 CmdArgs.push_back("-aarch64-reserve-x18");
971 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000972}
973
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000974// Get CPU and ABI names. They are not independent
975// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000976void mips::getMipsCPUAndABI(const ArgList &Args,
977 const llvm::Triple &Triple,
978 StringRef &CPUName,
979 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000980 const char *DefMips32CPU = "mips32r2";
981 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000982
Daniel Sanders2bf13662014-07-10 14:40:57 +0000983 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
984 // default for mips64(el)?-img-linux-gnu.
985 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
986 Triple.getEnvironment() == llvm::Triple::GNU) {
987 DefMips32CPU = "mips32r6";
988 DefMips64CPU = "mips64r6";
989 }
990
Brad Smithba26f582015-01-06 02:53:17 +0000991 // MIPS3 is the default for mips64*-unknown-openbsd.
992 if (Triple.getOS() == llvm::Triple::OpenBSD)
993 DefMips64CPU = "mips3";
994
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000995 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000996 options::OPT_mcpu_EQ))
997 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000998
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000999 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001000 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001001 // Convert a GNU style Mips ABI name to the name
1002 // accepted by LLVM Mips backend.
1003 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1004 .Case("32", "o32")
1005 .Case("64", "n64")
1006 .Default(ABIName);
1007 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001008
1009 // Setup default CPU and ABI names.
1010 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001011 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001012 default:
1013 llvm_unreachable("Unexpected triple arch name");
1014 case llvm::Triple::mips:
1015 case llvm::Triple::mipsel:
1016 CPUName = DefMips32CPU;
1017 break;
1018 case llvm::Triple::mips64:
1019 case llvm::Triple::mips64el:
1020 CPUName = DefMips64CPU;
1021 break;
1022 }
1023 }
1024
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001025 if (ABIName.empty()) {
1026 // Deduce ABI name from the target triple.
1027 if (Triple.getArch() == llvm::Triple::mips ||
1028 Triple.getArch() == llvm::Triple::mipsel)
1029 ABIName = "o32";
1030 else
1031 ABIName = "n64";
1032 }
1033
1034 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001035 // Deduce CPU name from ABI name.
1036 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001037 .Cases("o32", "eabi", DefMips32CPU)
1038 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001039 .Default("");
1040 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001041
1042 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001043}
1044
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001045// Convert ABI name to the GNU tools acceptable variant.
1046static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1047 return llvm::StringSwitch<llvm::StringRef>(ABI)
1048 .Case("o32", "32")
1049 .Case("n64", "64")
1050 .Default(ABI);
1051}
1052
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001053// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1054// and -mfloat-abi=.
1055static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001056 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001057 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001058 options::OPT_mhard_float,
1059 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001060 if (A->getOption().matches(options::OPT_msoft_float))
1061 FloatABI = "soft";
1062 else if (A->getOption().matches(options::OPT_mhard_float))
1063 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001064 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001065 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001066 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001067 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001068 FloatABI = "hard";
1069 }
1070 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001071 }
1072
1073 // If unspecified, choose the default based on the platform.
1074 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001075 // Assume "hard", because it's a default value used by gcc.
1076 // When we start to recognize specific target MIPS processors,
1077 // we will be able to select the default more correctly.
1078 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001079 }
1080
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001081 return FloatABI;
1082}
1083
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001084static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001085 std::vector<const char *> &Features,
1086 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001087 StringRef FeatureName) {
1088 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001089 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001090 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001091 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001092 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001093 }
1094}
1095
Daniel Sanders379d44b2014-07-16 11:52:23 +00001096static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1097 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001098 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001099 StringRef CPUName;
1100 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001101 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001102 ABIName = getGnuCompatibleMipsABIName(ABIName);
1103
Daniel Sandersfeb61302014-08-08 15:47:17 +00001104 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1105 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001106
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001107 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001108 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001109 // FIXME: Note, this is a hack. We need to pass the selected float
1110 // mode to the MipsTargetInfoBase to define appropriate macros there.
1111 // Now it is the only method.
1112 Features.push_back("+soft-float");
1113 }
1114
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001115 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001116 StringRef Val = StringRef(A->getValue());
1117 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001118 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001119 else if (Val == "legacy")
1120 Features.push_back("-nan2008");
1121 else
1122 D.Diag(diag::err_drv_unsupported_option_argument)
1123 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001124 }
1125
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001126 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1127 options::OPT_mdouble_float, "single-float");
1128 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1129 "mips16");
1130 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1131 options::OPT_mno_micromips, "micromips");
1132 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1133 "dsp");
1134 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1135 "dspr2");
1136 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1137 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001138
1139 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1140 // pass -mfpxx
1141 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1142 options::OPT_mfp64)) {
1143 if (A->getOption().matches(options::OPT_mfp32))
1144 Features.push_back(Args.MakeArgString("-fp64"));
1145 else if (A->getOption().matches(options::OPT_mfpxx)) {
1146 Features.push_back(Args.MakeArgString("+fpxx"));
1147 Features.push_back(Args.MakeArgString("+nooddspreg"));
1148 } else
1149 Features.push_back(Args.MakeArgString("+fp64"));
1150 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001151 Features.push_back(Args.MakeArgString("+fpxx"));
1152 Features.push_back(Args.MakeArgString("+nooddspreg"));
1153 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001154
Daniel Sanders28e5d392014-07-10 10:39:51 +00001155 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1156 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001157}
1158
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001159void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001160 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001161 const Driver &D = getToolChain().getDriver();
1162 StringRef CPUName;
1163 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001164 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001165 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001166
1167 CmdArgs.push_back("-target-abi");
1168 CmdArgs.push_back(ABIName.data());
1169
1170 StringRef FloatABI = getMipsFloatABI(D, Args);
1171
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001172 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001173 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001174 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001175 CmdArgs.push_back("-mfloat-abi");
1176 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001177 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001178 else {
1179 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001180 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001181 CmdArgs.push_back("-mfloat-abi");
1182 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001183 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001184
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001185 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1186 if (A->getOption().matches(options::OPT_mxgot)) {
1187 CmdArgs.push_back("-mllvm");
1188 CmdArgs.push_back("-mxgot");
1189 }
1190 }
1191
Simon Atanasyanc580b322013-05-11 06:33:44 +00001192 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1193 options::OPT_mno_ldc1_sdc1)) {
1194 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1195 CmdArgs.push_back("-mllvm");
1196 CmdArgs.push_back("-mno-ldc1-sdc1");
1197 }
1198 }
1199
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001200 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1201 options::OPT_mno_check_zero_division)) {
1202 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1203 CmdArgs.push_back("-mllvm");
1204 CmdArgs.push_back("-mno-check-zero-division");
1205 }
1206 }
1207
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001208 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001209 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001210 CmdArgs.push_back("-mllvm");
1211 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1212 A->claim();
1213 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001214}
1215
Hal Finkel8eb59282012-06-11 22:35:19 +00001216/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1217static std::string getPPCTargetCPU(const ArgList &Args) {
1218 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001219 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001220
1221 if (CPUName == "native") {
1222 std::string CPU = llvm::sys::getHostCPUName();
1223 if (!CPU.empty() && CPU != "generic")
1224 return CPU;
1225 else
1226 return "";
1227 }
1228
1229 return llvm::StringSwitch<const char *>(CPUName)
1230 .Case("common", "generic")
1231 .Case("440", "440")
1232 .Case("440fp", "440")
1233 .Case("450", "450")
1234 .Case("601", "601")
1235 .Case("602", "602")
1236 .Case("603", "603")
1237 .Case("603e", "603e")
1238 .Case("603ev", "603ev")
1239 .Case("604", "604")
1240 .Case("604e", "604e")
1241 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001243 .Case("G3", "g3")
1244 .Case("7400", "7400")
1245 .Case("G4", "g4")
1246 .Case("7450", "7450")
1247 .Case("G4+", "g4+")
1248 .Case("750", "750")
1249 .Case("970", "970")
1250 .Case("G5", "g5")
1251 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001252 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001253 .Case("e500mc", "e500mc")
1254 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power3", "pwr3")
1256 .Case("power4", "pwr4")
1257 .Case("power5", "pwr5")
1258 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001259 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001261 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001262 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 .Case("pwr3", "pwr3")
1264 .Case("pwr4", "pwr4")
1265 .Case("pwr5", "pwr5")
1266 .Case("pwr5x", "pwr5x")
1267 .Case("pwr6", "pwr6")
1268 .Case("pwr6x", "pwr6x")
1269 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001270 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001271 .Case("powerpc", "ppc")
1272 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001273 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001274 .Default("");
1275 }
1276
1277 return "";
1278}
1279
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001280static void getPPCTargetFeatures(const ArgList &Args,
1281 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001282 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1283 ie = Args.filtered_end();
1284 it != ie; ++it) {
1285 StringRef Name = (*it)->getOption().getName();
1286 (*it)->claim();
1287
1288 // Skip over "-m".
1289 assert(Name.startswith("m") && "Invalid feature name.");
1290 Name = Name.substr(1);
1291
1292 bool IsNegative = Name.startswith("no-");
1293 if (IsNegative)
1294 Name = Name.substr(3);
1295
1296 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1297 // pass the correct option to the backend while calling the frontend
1298 // option the same.
1299 // TODO: Change the LLVM backend option maybe?
1300 if (Name == "mfcrf")
1301 Name = "mfocrf";
1302
1303 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1304 }
1305
1306 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307 AddTargetFeature(Args, Features, options::OPT_faltivec,
1308 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001309}
1310
Ulrich Weigand8afad612014-07-28 13:17:52 +00001311void Clang::AddPPCTargetArgs(const ArgList &Args,
1312 ArgStringList &CmdArgs) const {
1313 // Select the ABI to use.
1314 const char *ABIName = nullptr;
1315 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1316 ABIName = A->getValue();
1317 } else if (getToolChain().getTriple().isOSLinux())
1318 switch(getToolChain().getArch()) {
1319 case llvm::Triple::ppc64:
1320 ABIName = "elfv1";
1321 break;
1322 case llvm::Triple::ppc64le:
1323 ABIName = "elfv2";
1324 break;
1325 default:
1326 break;
1327 }
1328
1329 if (ABIName) {
1330 CmdArgs.push_back("-target-abi");
1331 CmdArgs.push_back(ABIName);
1332 }
1333}
1334
1335bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1336 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1337 return A && (A->getValue() == StringRef(Value));
1338}
1339
Tom Stellard6674c702013-04-01 20:56:53 +00001340/// Get the (LLVM) name of the R600 gpu we are targeting.
1341static std::string getR600TargetGPU(const ArgList &Args) {
1342 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001343 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001344 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001345 .Cases("rv630", "rv635", "r600")
1346 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001347 .Case("rv740", "rv770")
1348 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001349 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001350 .Case("hemlock", "cypress")
1351 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001352 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001353 }
1354 return "";
1355}
1356
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001357static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001358 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001359 bool SoftFloatABI = true;
1360 if (Arg *A =
1361 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1362 if (A->getOption().matches(options::OPT_mhard_float))
1363 SoftFloatABI = false;
1364 }
1365 if (SoftFloatABI)
1366 Features.push_back("+soft-float");
1367}
1368
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001369void Clang::AddSparcTargetArgs(const ArgList &Args,
1370 ArgStringList &CmdArgs) const {
1371 const Driver &D = getToolChain().getDriver();
1372
Brad Smith10cd0f42014-07-11 20:12:08 +00001373 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001374 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001375 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1376 options::OPT_mhard_float)) {
1377 if (A->getOption().matches(options::OPT_msoft_float))
1378 FloatABI = "soft";
1379 else if (A->getOption().matches(options::OPT_mhard_float))
1380 FloatABI = "hard";
1381 }
1382
1383 // If unspecified, choose the default based on the platform.
1384 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001385 // Assume "soft", but warn the user we are guessing.
1386 FloatABI = "soft";
1387 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001388 }
1389
1390 if (FloatABI == "soft") {
1391 // Floating point operations and argument passing are soft.
1392 //
1393 // FIXME: This changes CPP defines, we need -target-soft-float.
1394 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001395 } else {
1396 assert(FloatABI == "hard" && "Invalid float abi!");
1397 CmdArgs.push_back("-mhard-float");
1398 }
1399}
1400
Richard Sandiford4652d892013-07-19 16:51:51 +00001401static const char *getSystemZTargetCPU(const ArgList &Args) {
1402 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1403 return A->getValue();
1404 return "z10";
1405}
1406
Chandler Carruth953fb082013-01-13 11:46:33 +00001407static const char *getX86TargetCPU(const ArgList &Args,
1408 const llvm::Triple &Triple) {
1409 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001410 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001411 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001412 return "core-avx2";
1413
Chandler Carruth953fb082013-01-13 11:46:33 +00001414 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001415 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001416
1417 // FIXME: Reject attempts to use -march=native unless the target matches
1418 // the host.
1419 //
1420 // FIXME: We should also incorporate the detected target features for use
1421 // with -native.
1422 std::string CPU = llvm::sys::getHostCPUName();
1423 if (!CPU.empty() && CPU != "generic")
1424 return Args.MakeArgString(CPU);
1425 }
1426
1427 // Select the default CPU if none was given (or detection failed).
1428
1429 if (Triple.getArch() != llvm::Triple::x86_64 &&
1430 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001431 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001432
1433 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1434
1435 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001436 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001437 if (Triple.getArchName() == "x86_64h")
1438 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001439 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001440 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001441
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001442 // Set up default CPU name for PS4 compilers.
1443 if (Triple.isPS4CPU())
1444 return "btver2";
1445
Alexey Bataev286d1b92014-01-31 04:07:13 +00001446 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001447 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001448 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001449
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001450 // Everything else goes to x86-64 in 64-bit mode.
1451 if (Is64Bit)
1452 return "x86-64";
1453
1454 switch (Triple.getOS()) {
1455 case llvm::Triple::FreeBSD:
1456 case llvm::Triple::NetBSD:
1457 case llvm::Triple::OpenBSD:
1458 return "i486";
1459 case llvm::Triple::Haiku:
1460 return "i586";
1461 case llvm::Triple::Bitrig:
1462 return "i686";
1463 default:
1464 // Fallback to p4.
1465 return "pentium4";
1466 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001467}
1468
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001469static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1470 switch(T.getArch()) {
1471 default:
1472 return "";
1473
Amara Emerson703da2e2013-10-31 09:32:33 +00001474 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001475 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001476 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001477
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001478 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001479 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001480 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001481 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001482 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001483
1484 case llvm::Triple::mips:
1485 case llvm::Triple::mipsel:
1486 case llvm::Triple::mips64:
1487 case llvm::Triple::mips64el: {
1488 StringRef CPUName;
1489 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001490 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001491 return CPUName;
1492 }
1493
1494 case llvm::Triple::ppc:
1495 case llvm::Triple::ppc64:
1496 case llvm::Triple::ppc64le: {
1497 std::string TargetCPUName = getPPCTargetCPU(Args);
1498 // LLVM may default to generating code for the native CPU,
1499 // but, like gcc, we default to a more generic option for
1500 // each architecture. (except on Darwin)
1501 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1502 if (T.getArch() == llvm::Triple::ppc64)
1503 TargetCPUName = "ppc64";
1504 else if (T.getArch() == llvm::Triple::ppc64le)
1505 TargetCPUName = "ppc64le";
1506 else
1507 TargetCPUName = "ppc";
1508 }
1509 return TargetCPUName;
1510 }
1511
1512 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001513 case llvm::Triple::sparcv9:
1514 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001515 return A->getValue();
1516 return "";
1517
1518 case llvm::Triple::x86:
1519 case llvm::Triple::x86_64:
1520 return getX86TargetCPU(Args, T);
1521
1522 case llvm::Triple::hexagon:
1523 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1524
1525 case llvm::Triple::systemz:
1526 return getSystemZTargetCPU(Args);
1527
1528 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001529 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001530 return getR600TargetGPU(Args);
1531 }
1532}
1533
Alp Tokerce365ca2013-12-02 12:43:03 +00001534static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1535 ArgStringList &CmdArgs) {
1536 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1537 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1538 // forward.
1539 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001540 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001541 CmdArgs.push_back(Args.MakeArgString(Plugin));
1542
1543 // Try to pass driver level flags relevant to LTO code generation down to
1544 // the plugin.
1545
1546 // Handle flags for selecting CPU variants.
1547 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1548 if (!CPU.empty())
1549 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1550}
1551
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001552static void getX86TargetFeatures(const Driver & D,
1553 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001554 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001555 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001556 if (Triple.getArchName() == "x86_64h") {
1557 // x86_64h implies quite a few of the more modern subtarget features
1558 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1559 Features.push_back("-rdrnd");
1560 Features.push_back("-aes");
1561 Features.push_back("-pclmul");
1562 Features.push_back("-rtm");
1563 Features.push_back("-hle");
1564 Features.push_back("-fsgsbase");
1565 }
1566
Alexey Volkov54ff0802014-06-25 12:15:36 +00001567 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001568 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001569 if (Triple.getArch() == llvm::Triple::x86_64) {
1570 Features.push_back("+sse4.2");
1571 Features.push_back("+popcnt");
1572 } else
1573 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001574 }
1575
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001576 // Set features according to the -arch flag on MSVC
1577 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1578 StringRef Arch = A->getValue();
1579 bool ArchUsed = false;
1580 // First, look for flags that are shared in x86 and x86-64.
1581 if (Triple.getArch() == llvm::Triple::x86_64 ||
1582 Triple.getArch() == llvm::Triple::x86) {
1583 if (Arch == "AVX" || Arch == "AVX2") {
1584 ArchUsed = true;
1585 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1586 }
1587 }
1588 // Then, look for x86-specific flags.
1589 if (Triple.getArch() == llvm::Triple::x86) {
1590 if (Arch == "IA32") {
1591 ArchUsed = true;
1592 } else if (Arch == "SSE" || Arch == "SSE2") {
1593 ArchUsed = true;
1594 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1595 }
1596 }
1597 if (!ArchUsed)
1598 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1599 }
1600
Jim Grosbach82eee262013-11-16 00:53:35 +00001601 // Now add any that the user explicitly requested on the command line,
1602 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001603 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1604 ie = Args.filtered_end();
1605 it != ie; ++it) {
1606 StringRef Name = (*it)->getOption().getName();
1607 (*it)->claim();
1608
1609 // Skip over "-m".
1610 assert(Name.startswith("m") && "Invalid feature name.");
1611 Name = Name.substr(1);
1612
1613 bool IsNegative = Name.startswith("no-");
1614 if (IsNegative)
1615 Name = Name.substr(3);
1616
1617 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1618 }
1619}
1620
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001621void Clang::AddX86TargetArgs(const ArgList &Args,
1622 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001623 if (!Args.hasFlag(options::OPT_mred_zone,
1624 options::OPT_mno_red_zone,
1625 true) ||
1626 Args.hasArg(options::OPT_mkernel) ||
1627 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001628 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001629
Bob Wilson2616e2e2013-02-10 16:01:41 +00001630 // Default to avoid implicit floating-point for kernel/kext code, but allow
1631 // that to be overridden with -mno-soft-float.
1632 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1633 Args.hasArg(options::OPT_fapple_kext));
1634 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1635 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001636 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001637 options::OPT_mno_implicit_float)) {
1638 const Option &O = A->getOption();
1639 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1640 O.matches(options::OPT_msoft_float));
1641 }
1642 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001643 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001644
1645 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1646 StringRef Value = A->getValue();
1647 if (Value == "intel" || Value == "att") {
1648 CmdArgs.push_back("-mllvm");
1649 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1650 } else {
1651 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1652 << A->getOption().getName() << Value;
1653 }
1654 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001655}
1656
Matthew Curtise8f80a12012-12-06 17:49:03 +00001657static inline bool HasPICArg(const ArgList &Args) {
1658 return Args.hasArg(options::OPT_fPIC)
1659 || Args.hasArg(options::OPT_fpic);
1660}
1661
1662static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1663 return Args.getLastArg(options::OPT_G,
1664 options::OPT_G_EQ,
1665 options::OPT_msmall_data_threshold_EQ);
1666}
1667
1668static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1669 std::string value;
1670 if (HasPICArg(Args))
1671 value = "0";
1672 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1673 value = A->getValue();
1674 A->claim();
1675 }
1676 return value;
1677}
1678
Tony Linthicum76329bf2011-12-12 21:14:55 +00001679void Clang::AddHexagonTargetArgs(const ArgList &Args,
1680 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001681 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001682 CmdArgs.push_back("-mqdsp6-compat");
1683 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001684
Matthew Curtise8f80a12012-12-06 17:49:03 +00001685 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1686 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001687 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001688 CmdArgs.push_back(Args.MakeArgString(
1689 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001690 }
1691
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001692 if (!Args.hasArg(options::OPT_fno_short_enums))
1693 CmdArgs.push_back("-fshort-enums");
1694 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1695 CmdArgs.push_back ("-mllvm");
1696 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1697 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001698 CmdArgs.push_back ("-mllvm");
1699 CmdArgs.push_back ("-machine-sink-split=0");
1700}
1701
Kevin Qin110db6f2014-07-18 07:03:22 +00001702// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001703static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001704 std::vector<const char *> &Features) {
1705 SmallVector<StringRef, 8> Split;
1706 text.split(Split, StringRef("+"), -1, false);
1707
1708 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1709 const char *result = llvm::StringSwitch<const char *>(Split[I])
1710 .Case("fp", "+fp-armv8")
1711 .Case("simd", "+neon")
1712 .Case("crc", "+crc")
1713 .Case("crypto", "+crypto")
1714 .Case("nofp", "-fp-armv8")
1715 .Case("nosimd", "-neon")
1716 .Case("nocrc", "-crc")
1717 .Case("nocrypto", "-crypto")
1718 .Default(nullptr);
1719 if (result)
1720 Features.push_back(result);
1721 else if (Split[I] == "neon" || Split[I] == "noneon")
1722 D.Diag(diag::err_drv_no_neon_modifier);
1723 else
1724 return false;
1725 }
1726 return true;
1727}
1728
1729// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1730// decode CPU and feature.
1731static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1732 std::vector<const char *> &Features) {
1733 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1734 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001735 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001736 Features.push_back("+neon");
1737 Features.push_back("+crc");
1738 Features.push_back("+crypto");
1739 } else if (CPU == "generic") {
1740 Features.push_back("+neon");
1741 } else {
1742 return false;
1743 }
1744
1745 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1746 return false;
1747
1748 return true;
1749}
1750
1751static bool
1752getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1753 const ArgList &Args,
1754 std::vector<const char *> &Features) {
1755 std::pair<StringRef, StringRef> Split = March.split("+");
1756 if (Split.first != "armv8-a")
1757 return false;
1758
1759 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1760 return false;
1761
1762 return true;
1763}
1764
1765static bool
1766getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1767 const ArgList &Args,
1768 std::vector<const char *> &Features) {
1769 StringRef CPU;
1770 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1771 return false;
1772
1773 return true;
1774}
1775
1776static bool
1777getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1778 const ArgList &Args,
1779 std::vector<const char *> &Features) {
1780 // Handle CPU name is 'native'.
1781 if (Mtune == "native")
1782 Mtune = llvm::sys::getHostCPUName();
1783 if (Mtune == "cyclone") {
1784 Features.push_back("+zcm");
1785 Features.push_back("+zcz");
1786 }
1787 return true;
1788}
1789
1790static bool
1791getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1792 const ArgList &Args,
1793 std::vector<const char *> &Features) {
1794 StringRef CPU;
1795 std::vector<const char *> DecodedFeature;
1796 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1797 return false;
1798
1799 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1800}
1801
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001802static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1803 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001804 Arg *A;
1805 bool success = true;
1806 // Enable NEON by default.
1807 Features.push_back("+neon");
1808 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1809 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1810 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1811 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001812 else if (Args.hasArg(options::OPT_arch))
1813 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1814 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001815
1816 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1817 success =
1818 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1819 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1820 success =
1821 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001822 else if (Args.hasArg(options::OPT_arch))
1823 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1824 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001825
1826 if (!success)
1827 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001828
1829 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1830 Features.push_back("-fp-armv8");
1831 Features.push_back("-crypto");
1832 Features.push_back("-neon");
1833 }
Bradley Smith418c5932014-05-02 15:17:51 +00001834
1835 // En/disable crc
1836 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1837 options::OPT_mnocrc)) {
1838 if (A->getOption().matches(options::OPT_mcrc))
1839 Features.push_back("+crc");
1840 else
1841 Features.push_back("-crc");
1842 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001843}
1844
1845static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001846 const ArgList &Args, ArgStringList &CmdArgs,
1847 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001848 std::vector<const char *> Features;
1849 switch (Triple.getArch()) {
1850 default:
1851 break;
1852 case llvm::Triple::mips:
1853 case llvm::Triple::mipsel:
1854 case llvm::Triple::mips64:
1855 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001856 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001857 break;
1858
1859 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001860 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001861 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001862 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001863 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001864 break;
1865
1866 case llvm::Triple::ppc:
1867 case llvm::Triple::ppc64:
1868 case llvm::Triple::ppc64le:
1869 getPPCTargetFeatures(Args, Features);
1870 break;
1871 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001872 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001873 getSparcTargetFeatures(Args, Features);
1874 break;
1875 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001876 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001877 getAArch64TargetFeatures(D, Args, Features);
1878 break;
1879 case llvm::Triple::x86:
1880 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001881 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001882 break;
1883 }
Rafael Espindola43964802013-08-21 17:34:32 +00001884
1885 // Find the last of each feature.
1886 llvm::StringMap<unsigned> LastOpt;
1887 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1888 const char *Name = Features[I];
1889 assert(Name[0] == '-' || Name[0] == '+');
1890 LastOpt[Name + 1] = I;
1891 }
1892
1893 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1894 // If this feature was overridden, ignore it.
1895 const char *Name = Features[I];
1896 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1897 assert(LastI != LastOpt.end());
1898 unsigned Last = LastI->second;
1899 if (Last != I)
1900 continue;
1901
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001902 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001903 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001904 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001905}
1906
David Majnemerae394812014-12-09 00:12:30 +00001907static bool
1908shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1909 const llvm::Triple &Triple) {
1910 // We use the zero-cost exception tables for Objective-C if the non-fragile
1911 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1912 // later.
1913 if (runtime.isNonFragile())
1914 return true;
1915
1916 if (!Triple.isMacOSX())
1917 return false;
1918
1919 return (!Triple.isMacOSXVersionLT(10,5) &&
1920 (Triple.getArch() == llvm::Triple::x86_64 ||
1921 Triple.getArch() == llvm::Triple::arm));
1922}
1923
Nico Webere8e53112014-05-11 01:04:02 +00001924// exceptionSettings() exists to share the logic between -cc1 and linker
1925// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001926static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001927 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001928 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001929 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001930 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001931
David Majnemer8de68642014-12-05 08:11:58 +00001932 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001933}
1934
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001935/// Adds exception related arguments to the driver command arguments. There's a
1936/// master flag, -fexceptions and also language specific flags to enable/disable
1937/// C++ and Objective-C exceptions. This makes it possible to for example
1938/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00001939static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001940 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001941 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001942 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001943 const Driver &D = TC.getDriver();
1944 const llvm::Triple &Triple = TC.getTriple();
1945
Chad Rosier4fab82c2012-03-26 22:04:46 +00001946 if (KernelOrKext) {
1947 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1948 // arguments now to avoid warnings about unused arguments.
1949 Args.ClaimAllArgs(options::OPT_fexceptions);
1950 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1951 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1952 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1953 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1954 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001955 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001956 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001957
David Majnemer8de68642014-12-05 08:11:58 +00001958 // Gather the exception settings from the command line arguments.
1959 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001960
David Majnemerae394812014-12-09 00:12:30 +00001961 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1962 // is not necessarily sensible, but follows GCC.
1963 if (types::isObjC(InputType) &&
1964 Args.hasFlag(options::OPT_fobjc_exceptions,
1965 options::OPT_fno_objc_exceptions,
1966 true)) {
1967 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001968
David Majnemerae394812014-12-09 00:12:30 +00001969 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001970 }
1971
1972 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001973 bool CXXExceptionsEnabled =
1974 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001975 Arg *ExceptionArg = Args.getLastArg(
1976 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
1977 options::OPT_fexceptions, options::OPT_fno_exceptions);
1978 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00001979 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001980 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
1981 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001982
1983 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001984 if (Triple.isPS4CPU()) {
1985 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
1986 assert(ExceptionArg &&
1987 "On the PS4 exceptions should only be enabled if passing "
1988 "an argument");
1989 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
1990 const Arg *RTTIArg = TC.getRTTIArg();
1991 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
1992 D.Diag(diag::err_drv_argument_not_allowed_with)
1993 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
1994 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
1995 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
1996 } else
1997 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
1998
Anders Carlssone96ab552011-02-28 02:27:16 +00001999 CmdArgs.push_back("-fcxx-exceptions");
2000
David Majnemer8de68642014-12-05 08:11:58 +00002001 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002002 }
2003 }
2004
David Majnemer8de68642014-12-05 08:11:58 +00002005 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002006 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002007}
2008
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002009static bool ShouldDisableAutolink(const ArgList &Args,
2010 const ToolChain &TC) {
2011 bool Default = true;
2012 if (TC.getTriple().isOSDarwin()) {
2013 // The native darwin assembler doesn't support the linker_option directives,
2014 // so we disable them if we think the .s file will be passed to it.
2015 Default = TC.useIntegratedAs();
2016 }
2017 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2018 Default);
2019}
2020
Ted Kremenek62093662013-03-12 17:02:12 +00002021static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2022 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002023 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2024 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002025 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002026 return !UseDwarfDirectory;
2027}
2028
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002029/// \brief Check whether the given input tree contains any compilation actions.
2030static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002031 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002032 return true;
2033
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002034 for (const auto &Act : *A)
2035 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002036 return true;
2037
2038 return false;
2039}
2040
2041/// \brief Check if -relax-all should be passed to the internal assembler.
2042/// This is done by default when compiling non-assembler source with -O0.
2043static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2044 bool RelaxDefault = true;
2045
2046 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2047 RelaxDefault = A->getOption().matches(options::OPT_O0);
2048
2049 if (RelaxDefault) {
2050 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002051 for (const auto &Act : C.getActions()) {
2052 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002053 RelaxDefault = true;
2054 break;
2055 }
2056 }
2057 }
2058
2059 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2060 RelaxDefault);
2061}
2062
David Blaikie9260ed62013-07-25 21:19:01 +00002063static void CollectArgsForIntegratedAssembler(Compilation &C,
2064 const ArgList &Args,
2065 ArgStringList &CmdArgs,
2066 const Driver &D) {
2067 if (UseRelaxAll(C, Args))
2068 CmdArgs.push_back("-mrelax-all");
2069
David Peixottodfb66142013-11-14 22:52:58 +00002070 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002071 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002072 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2073 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2074 // arg after parsing the '-I' arg.
2075 bool TakeNextArg = false;
2076
David Blaikie9260ed62013-07-25 21:19:01 +00002077 // When using an integrated assembler, translate -Wa, and -Xassembler
2078 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002079 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002080 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2081 options::OPT_Xassembler),
2082 ie = Args.filtered_end(); it != ie; ++it) {
2083 const Arg *A = *it;
2084 A->claim();
2085
2086 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2087 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002088 if (TakeNextArg) {
2089 CmdArgs.push_back(Value.data());
2090 TakeNextArg = false;
2091 continue;
2092 }
David Blaikie9260ed62013-07-25 21:19:01 +00002093
2094 if (Value == "-force_cpusubtype_ALL") {
2095 // Do nothing, this is the default and we don't support anything else.
2096 } else if (Value == "-L") {
2097 CmdArgs.push_back("-msave-temp-labels");
2098 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002099 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002100 } else if (Value == "--noexecstack") {
2101 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002102 } else if (Value == "-compress-debug-sections" ||
2103 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002104 CompressDebugSections = true;
2105 } else if (Value == "-nocompress-debug-sections" ||
2106 Value == "--nocompress-debug-sections") {
2107 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002108 } else if (Value.startswith("-I")) {
2109 CmdArgs.push_back(Value.data());
2110 // We need to consume the next argument if the current arg is a plain
2111 // -I. The next arg will be the include directory.
2112 if (Value == "-I")
2113 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002114 } else if (Value.startswith("-gdwarf-")) {
2115 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002116 } else {
2117 D.Diag(diag::err_drv_unsupported_option_argument)
2118 << A->getOption().getName() << Value;
2119 }
2120 }
2121 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002122 if (CompressDebugSections) {
2123 if (llvm::zlib::isAvailable())
2124 CmdArgs.push_back("-compress-debug-sections");
2125 else
2126 D.Diag(diag::warn_debug_compression_unavailable);
2127 }
David Blaikie9260ed62013-07-25 21:19:01 +00002128}
2129
Renato Goline807c122014-01-31 11:47:28 +00002130// Until ARM libraries are build separately, we have them all in one library
2131static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002132 // FIXME: handle 64-bit
2133 if (TC.getTriple().isOSWindows() &&
2134 !TC.getTriple().isWindowsItaniumEnvironment())
2135 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002136 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002137 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002138 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002139}
2140
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002141static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2142 // The runtimes are located in the OS-specific resource directory.
2143 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002144 const llvm::Triple &Triple = TC.getTriple();
2145 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002146 StringRef OSLibName =
2147 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002148 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002149 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002150}
2151
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002152static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002153 bool Shared = false) {
2154 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2155 ? "-android"
2156 : "";
2157
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002158 bool IsOSWindows = TC.getTriple().isOSWindows();
2159 StringRef Arch = getArchNameForCompilerRTLib(TC);
2160 const char *Prefix = IsOSWindows ? "" : "lib";
2161 const char *Suffix =
2162 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2163
2164 SmallString<128> Path = getCompilerRTLibDir(TC);
2165 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2166 Arch + Env + Suffix);
2167
2168 return Path;
2169}
2170
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002171// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002172// FIXME: Make sure we can also emit shared objects if they're requested
2173// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002174static void addClangRT(const ToolChain &TC, const ArgList &Args,
2175 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002176 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002177
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002178 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002179 // FIXME: why do we link against gcc when we are using compiler-rt?
2180 CmdArgs.push_back("-lgcc_s");
2181 if (TC.getDriver().CCCIsCXX())
2182 CmdArgs.push_back("-lgcc_eh");
2183 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002184}
2185
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002186static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2187 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002188 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2189 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002190 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002191 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002192 Args.hasArg(options::OPT_fcreate_profile) ||
2193 Args.hasArg(options::OPT_coverage)))
2194 return;
2195
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002196 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002197}
2198
Alexey Samsonov52550342014-09-15 19:58:40 +00002199static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2200 ArgStringList &CmdArgs, StringRef Sanitizer,
2201 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002202 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002203 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002204 if (!IsShared)
2205 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002206 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002207 if (!IsShared)
2208 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002209}
2210
Alexey Samsonov52550342014-09-15 19:58:40 +00002211// Tries to use a file with the list of dynamic symbols that need to be exported
2212// from the runtime library. Returns true if the file was found.
2213static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2214 ArgStringList &CmdArgs,
2215 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002216 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2217 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2218 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002219 return true;
2220 }
2221 return false;
2222}
2223
2224static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2225 ArgStringList &CmdArgs) {
2226 // Force linking against the system libraries sanitizers depends on
2227 // (see PR15823 why this is necessary).
2228 CmdArgs.push_back("--no-as-needed");
2229 CmdArgs.push_back("-lpthread");
2230 CmdArgs.push_back("-lrt");
2231 CmdArgs.push_back("-lm");
2232 // There's no libdl on FreeBSD.
2233 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2234 CmdArgs.push_back("-ldl");
2235}
2236
2237static void
2238collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2239 SmallVectorImpl<StringRef> &SharedRuntimes,
2240 SmallVectorImpl<StringRef> &StaticRuntimes,
2241 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2242 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2243 // Collect shared runtimes.
2244 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2245 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002246 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002247
Alexey Samsonov52550342014-09-15 19:58:40 +00002248 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002249 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002250 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2251 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002252 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002253 }
2254 if (SanArgs.needsAsanRt()) {
2255 if (SanArgs.needsSharedAsanRt()) {
2256 HelperStaticRuntimes.push_back("asan-preinit");
2257 } else {
2258 StaticRuntimes.push_back("asan");
2259 if (SanArgs.linkCXXRuntimes())
2260 StaticRuntimes.push_back("asan_cxx");
2261 }
2262 }
2263 if (SanArgs.needsDfsanRt())
2264 StaticRuntimes.push_back("dfsan");
2265 if (SanArgs.needsLsanRt())
2266 StaticRuntimes.push_back("lsan");
2267 if (SanArgs.needsMsanRt())
2268 StaticRuntimes.push_back("msan");
2269 if (SanArgs.needsTsanRt())
2270 StaticRuntimes.push_back("tsan");
2271 // WARNING: UBSan should always go last.
2272 if (SanArgs.needsUbsanRt()) {
2273 // If UBSan is not combined with another sanitizer, we need to pull in
2274 // sanitizer_common explicitly.
2275 if (StaticRuntimes.empty())
2276 HelperStaticRuntimes.push_back("san");
2277 StaticRuntimes.push_back("ubsan");
2278 if (SanArgs.linkCXXRuntimes())
2279 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002280 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002281}
2282
Alexey Samsonov52550342014-09-15 19:58:40 +00002283// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2284// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2285static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002286 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002287 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2288 HelperStaticRuntimes;
2289 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2290 HelperStaticRuntimes);
2291 for (auto RT : SharedRuntimes)
2292 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2293 for (auto RT : HelperStaticRuntimes)
2294 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2295 bool AddExportDynamic = false;
2296 for (auto RT : StaticRuntimes) {
2297 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2298 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2299 }
2300 // If there is a static runtime with no dynamic list, force all the symbols
2301 // to be dynamic to be sure we export sanitizer interface functions.
2302 if (AddExportDynamic)
2303 CmdArgs.push_back("-export-dynamic");
2304 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002305}
2306
Reid Kleckner86ea7702015-02-04 23:45:07 +00002307static bool areOptimizationsEnabled(const ArgList &Args) {
2308 // Find the last -O arg and see if it is non-zero.
2309 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2310 return !A->getOption().matches(options::OPT_O0);
2311 // Defaults to -O0.
2312 return false;
2313}
2314
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002315static bool shouldUseFramePointerForTarget(const ArgList &Args,
2316 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002317 // XCore never wants frame pointers, regardless of OS.
2318 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002319 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002320 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002321
2322 if (Triple.isOSLinux()) {
2323 switch (Triple.getArch()) {
2324 // Don't use a frame pointer on linux if optimizing for certain targets.
2325 case llvm::Triple::mips64:
2326 case llvm::Triple::mips64el:
2327 case llvm::Triple::mips:
2328 case llvm::Triple::mipsel:
2329 case llvm::Triple::systemz:
2330 case llvm::Triple::x86:
2331 case llvm::Triple::x86_64:
2332 return !areOptimizationsEnabled(Args);
2333 default:
2334 return true;
2335 }
2336 }
2337
2338 if (Triple.isOSWindows()) {
2339 switch (Triple.getArch()) {
2340 case llvm::Triple::x86:
2341 return !areOptimizationsEnabled(Args);
2342 default:
2343 // All other supported Windows ISAs use xdata unwind information, so frame
2344 // pointers are not generally useful.
2345 return false;
2346 }
2347 }
2348
2349 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002350}
2351
Rafael Espindola224dd632011-12-14 21:02:23 +00002352static bool shouldUseFramePointer(const ArgList &Args,
2353 const llvm::Triple &Triple) {
2354 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2355 options::OPT_fomit_frame_pointer))
2356 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2357
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002358 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002359}
2360
Eric Christopherb7d97e92013-04-03 01:58:53 +00002361static bool shouldUseLeafFramePointer(const ArgList &Args,
2362 const llvm::Triple &Triple) {
2363 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2364 options::OPT_momit_leaf_frame_pointer))
2365 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2366
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002367 if (Triple.isPS4CPU())
2368 return false;
2369
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002370 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002371}
2372
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002373/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002374static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002375 SmallString<128> cwd;
2376 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002377 CmdArgs.push_back("-fdebug-compilation-dir");
2378 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002379 }
2380}
2381
Eric Christopherd3804002013-02-22 20:12:52 +00002382static const char *SplitDebugName(const ArgList &Args,
2383 const InputInfoList &Inputs) {
2384 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2385 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2386 SmallString<128> T(FinalOutput->getValue());
2387 llvm::sys::path::replace_extension(T, "dwo");
2388 return Args.MakeArgString(T);
2389 } else {
2390 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002391 SmallString<128> T(
2392 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002393 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2394 llvm::sys::path::replace_extension(F, "dwo");
2395 T += F;
2396 return Args.MakeArgString(F);
2397 }
2398}
2399
2400static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2401 const Tool &T, const JobAction &JA,
2402 const ArgList &Args, const InputInfo &Output,
2403 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002404 ArgStringList ExtractArgs;
2405 ExtractArgs.push_back("--extract-dwo");
2406
2407 ArgStringList StripArgs;
2408 StripArgs.push_back("--strip-dwo");
2409
2410 // Grabbing the output of the earlier compile step.
2411 StripArgs.push_back(Output.getFilename());
2412 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002413 ExtractArgs.push_back(OutFile);
2414
2415 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002416 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002417
2418 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002419 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002420
2421 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002422 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002423}
2424
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002425/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002426/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2427static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002428 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002429 if (A->getOption().matches(options::OPT_O4) ||
2430 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002431 return true;
2432
2433 if (A->getOption().matches(options::OPT_O0))
2434 return false;
2435
2436 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2437
Rafael Espindola91780de2013-08-26 14:05:41 +00002438 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002439 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002440 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002441 return true;
2442
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002443 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002444 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002445 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002446
2447 unsigned OptLevel = 0;
2448 if (S.getAsInteger(10, OptLevel))
2449 return false;
2450
2451 return OptLevel > 1;
2452 }
2453
2454 return false;
2455}
2456
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002457/// Add -x lang to \p CmdArgs for \p Input.
2458static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2459 ArgStringList &CmdArgs) {
2460 // When using -verify-pch, we don't want to provide the type
2461 // 'precompiled-header' if it was inferred from the file extension
2462 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2463 return;
2464
2465 CmdArgs.push_back("-x");
2466 if (Args.hasArg(options::OPT_rewrite_objc))
2467 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2468 else
2469 CmdArgs.push_back(types::getTypeName(Input.getType()));
2470}
2471
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002472static std::string getMSCompatibilityVersion(const char *VersionStr) {
2473 unsigned Version;
2474 if (StringRef(VersionStr).getAsInteger(10, Version))
2475 return "0";
2476
2477 if (Version < 100)
2478 return llvm::utostr_32(Version) + ".0";
2479
2480 if (Version < 10000)
2481 return llvm::utostr_32(Version / 100) + "." +
2482 llvm::utostr_32(Version % 100);
2483
2484 unsigned Build = 0, Factor = 1;
2485 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2486 Build = Build + (Version % 10) * Factor;
2487 return llvm::utostr_32(Version / 100) + "." +
2488 llvm::utostr_32(Version % 100) + "." +
2489 llvm::utostr_32(Build);
2490}
2491
Rafael Espindola577637a2015-01-03 00:06:04 +00002492// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002493// options that build systems might add but are unused when assembling or only
2494// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002495static void claimNoWarnArgs(const ArgList &Args) {
2496 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002497 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002498 Args.ClaimAllArgs(options::OPT_flto);
2499 Args.ClaimAllArgs(options::OPT_fno_lto);
2500}
2501
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002502static void appendUserToPath(SmallVectorImpl<char> &Result) {
2503#ifdef LLVM_ON_UNIX
2504 const char *Username = getenv("LOGNAME");
2505#else
2506 const char *Username = getenv("USERNAME");
2507#endif
2508 if (Username) {
2509 // Validate that LoginName can be used in a path, and get its length.
2510 size_t Len = 0;
2511 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002512 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002513 Username = nullptr;
2514 break;
2515 }
2516 }
2517
2518 if (Username && Len > 0) {
2519 Result.append(Username, Username + Len);
2520 return;
2521 }
2522 }
2523
2524 // Fallback to user id.
2525#ifdef LLVM_ON_UNIX
2526 std::string UID = llvm::utostr(getuid());
2527#else
2528 // FIXME: Windows seems to have an 'SID' that might work.
2529 std::string UID = "9999";
2530#endif
2531 Result.append(UID.begin(), UID.end());
2532}
2533
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002534void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002535 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002536 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002537 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002538 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002539 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2540 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002541 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002542 ArgStringList CmdArgs;
2543
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002544 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002545 bool IsWindowsCygnus =
2546 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002547 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2548
Daniel Dunbare521a892009-03-31 20:53:55 +00002549 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2550
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002551 // Invoke ourselves in -cc1 mode.
2552 //
2553 // FIXME: Implement custom jobs for internal actions.
2554 CmdArgs.push_back("-cc1");
2555
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002556 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002557 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002558 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002559 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002560
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002561 const llvm::Triple TT(TripleStr);
2562 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2563 TT.getArch() == llvm::Triple::thumb)) {
2564 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2565 unsigned Version;
2566 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2567 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002568 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2569 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002570 }
2571
Tim Northover336f1892014-03-29 13:16:12 +00002572 // Push all default warning arguments that are specific to
2573 // the given target. These come before user provided warning options
2574 // are provided.
2575 getToolChain().addClangWarningOptions(CmdArgs);
2576
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002577 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002578 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002579
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002580 if (isa<AnalyzeJobAction>(JA)) {
2581 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2582 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002583 } else if (isa<MigrateJobAction>(JA)) {
2584 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002585 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002586 if (Output.getType() == types::TY_Dependencies)
2587 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002588 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002589 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002590 if (Args.hasArg(options::OPT_rewrite_objc) &&
2591 !Args.hasArg(options::OPT_g_Group))
2592 CmdArgs.push_back("-P");
2593 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002594 } else if (isa<AssembleJobAction>(JA)) {
2595 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002596
David Blaikie9260ed62013-07-25 21:19:01 +00002597 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002598
2599 // Also ignore explicit -force_cpusubtype_ALL option.
2600 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002601 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002602 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002603 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002604
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002605 if (JA.getType() == types::TY_Nothing)
2606 CmdArgs.push_back("-fsyntax-only");
2607 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002608 CmdArgs.push_back("-emit-pch");
2609 else
2610 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002611 } else if (isa<VerifyPCHJobAction>(JA)) {
2612 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002613 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002614 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2615 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002616
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002617 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002618 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002619 } else if (JA.getType() == types::TY_LLVM_IR ||
2620 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002621 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002622 } else if (JA.getType() == types::TY_LLVM_BC ||
2623 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002624 CmdArgs.push_back("-emit-llvm-bc");
2625 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002626 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002627 } else if (JA.getType() == types::TY_AST) {
2628 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002629 } else if (JA.getType() == types::TY_ModuleFile) {
2630 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002631 } else if (JA.getType() == types::TY_RewrittenObjC) {
2632 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002633 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002634 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2635 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002636 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002637 } else {
2638 assert(JA.getType() == types::TY_PP_Asm &&
2639 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002640 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002641 }
2642
Justin Bognera88f0122014-06-20 22:59:50 +00002643 // We normally speed up the clang process a bit by skipping destructors at
2644 // exit, but when we're generating diagnostics we can rely on some of the
2645 // cleanup.
2646 if (!C.isForDiagnostics())
2647 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002648
John McCallbb79b5f2010-02-13 03:50:24 +00002649 // Disable the verification pass in -asserts builds.
2650#ifdef NDEBUG
2651 CmdArgs.push_back("-disable-llvm-verifier");
2652#endif
2653
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002654 // Set the main file name, so that debug info works even with
2655 // -save-temps.
2656 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002657 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002658
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002659 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002660 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002661 if (Args.hasArg(options::OPT_static))
2662 CmdArgs.push_back("-static-define");
2663
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002664 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002665 // Enable region store model by default.
2666 CmdArgs.push_back("-analyzer-store=region");
2667
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002668 // Treat blocks as analysis entry points.
2669 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2670
Ted Kremenek49c79792011-03-24 00:28:47 +00002671 CmdArgs.push_back("-analyzer-eagerly-assume");
2672
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002673 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002674 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002675 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002676
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002677 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002678 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002679
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002680 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002681 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002682
2683 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002684
Jordan Rose10ad0812013-04-05 17:55:07 +00002685 if (types::isCXX(Inputs[0].getType()))
2686 CmdArgs.push_back("-analyzer-checker=cplusplus");
2687
Nico Webere8e53112014-05-11 01:04:02 +00002688 // Enable the following experimental checkers for testing.
2689 CmdArgs.push_back(
2690 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2693 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2694 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2695 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002696 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002697
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002698 // Set the output format. The default is plist, for (lame) historical
2699 // reasons.
2700 CmdArgs.push_back("-analyzer-output");
2701 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002702 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002703 else
2704 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002705
Ted Kremenekfe449a22010-03-22 22:32:05 +00002706 // Disable the presentation of standard compiler warnings when
2707 // using --analyze. We only want to show static analyzer diagnostics
2708 // or frontend errors.
2709 CmdArgs.push_back("-w");
2710
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002711 // Add -Xanalyzer arguments when running as analyzer.
2712 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002713 }
2714
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002715 CheckCodeGenerationOptions(D, Args);
2716
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002717 bool PIE = getToolChain().isPIEDefault();
2718 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002719 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002720
Alexey Bataev40e75222014-01-28 06:30:35 +00002721 // Android-specific defaults for PIC/PIE
2722 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2723 switch (getToolChain().getTriple().getArch()) {
2724 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002725 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002726 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002727 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002728 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002729 case llvm::Triple::mips:
2730 case llvm::Triple::mipsel:
2731 case llvm::Triple::mips64:
2732 case llvm::Triple::mips64el:
2733 PIC = true; // "-fpic"
2734 break;
2735
2736 case llvm::Triple::x86:
2737 case llvm::Triple::x86_64:
2738 PIC = true; // "-fPIC"
2739 IsPICLevelTwo = true;
2740 break;
2741
2742 default:
2743 break;
2744 }
2745 }
2746
Brad Smith5b05db82014-06-24 19:51:29 +00002747 // OpenBSD-specific defaults for PIE
2748 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2749 switch (getToolChain().getTriple().getArch()) {
2750 case llvm::Triple::mips64:
2751 case llvm::Triple::mips64el:
2752 case llvm::Triple::sparc:
2753 case llvm::Triple::x86:
2754 case llvm::Triple::x86_64:
2755 IsPICLevelTwo = false; // "-fpie"
2756 break;
2757
2758 case llvm::Triple::ppc:
2759 case llvm::Triple::sparcv9:
2760 IsPICLevelTwo = true; // "-fPIE"
2761 break;
2762
2763 default:
2764 break;
2765 }
2766 }
2767
Alexey Samsonov090301e2013-04-09 12:28:19 +00002768 // For the PIC and PIE flag options, this logic is different from the
2769 // legacy logic in very old versions of GCC, as that logic was just
2770 // a bug no one had ever fixed. This logic is both more rational and
2771 // consistent with GCC's new logic now that the bugs are fixed. The last
2772 // argument relating to either PIC or PIE wins, and no other argument is
2773 // used. If the last argument is any flavor of the '-fno-...' arguments,
2774 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2775 // at the same level.
2776 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2777 options::OPT_fpic, options::OPT_fno_pic,
2778 options::OPT_fPIE, options::OPT_fno_PIE,
2779 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002780 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2781 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002782 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002783 if (LastPICArg) {
2784 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002785 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2786 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2787 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2788 PIC = PIE || O.matches(options::OPT_fPIC) ||
2789 O.matches(options::OPT_fpic);
2790 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2791 O.matches(options::OPT_fPIC);
2792 } else {
2793 PIE = PIC = false;
2794 }
2795 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002796 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002797
Nick Lewycky609dd662013-10-11 03:33:53 +00002798 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002799 // specified while enabling PIC enabled level 1 PIC, just force it back to
2800 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2801 // informal testing).
2802 if (PIC && getToolChain().getTriple().isOSDarwin())
2803 IsPICLevelTwo |= getToolChain().isPICDefault();
2804
Chandler Carruthc0c04552012-04-08 16:40:35 +00002805 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2806 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002807 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002808 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002809 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002810 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002811 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002812
Chandler Carruth76a943b2012-11-19 03:52:03 +00002813 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2814 // This is a very special mode. It trumps the other modes, almost no one
2815 // uses it, and it isn't even valid on any OS but Darwin.
2816 if (!getToolChain().getTriple().isOSDarwin())
2817 D.Diag(diag::err_drv_unsupported_opt_for_target)
2818 << A->getSpelling() << getToolChain().getTriple().str();
2819
2820 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2821
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002822 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002823 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002824
Chandler Carruth76a943b2012-11-19 03:52:03 +00002825 // Only a forced PIC mode can cause the actual compile to have PIC defines
2826 // etc., no flags are sufficient. This behavior was selected to closely
2827 // match that of llvm-gcc and Apple GCC before that.
2828 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2829 CmdArgs.push_back("-pic-level");
2830 CmdArgs.push_back("2");
2831 }
2832 } else {
2833 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2834 // handled in Clang's IRGen by the -pie-level flag.
2835 CmdArgs.push_back("-mrelocation-model");
2836 CmdArgs.push_back(PIC ? "pic" : "static");
2837
2838 if (PIC) {
2839 CmdArgs.push_back("-pic-level");
2840 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2841 if (PIE) {
2842 CmdArgs.push_back("-pie-level");
2843 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2844 }
2845 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002846 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002847
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002848 CmdArgs.push_back("-mthread-model");
2849 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2850 CmdArgs.push_back(A->getValue());
2851 else
2852 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2853
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002854 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2855 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002856 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002857
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002858 // LLVM Code Generator Options.
2859
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002860 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2861 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2862 for (arg_iterator
2863 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2864 options::OPT_frewrite_map_file_EQ),
2865 MFE = Args.filtered_end();
2866 MFI != MFE; ++MFI) {
2867 CmdArgs.push_back("-frewrite-map-file");
2868 CmdArgs.push_back((*MFI)->getValue());
2869 (*MFI)->claim();
2870 }
2871 }
2872
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002873 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2874 StringRef v = A->getValue();
2875 CmdArgs.push_back("-mllvm");
2876 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2877 A->claim();
2878 }
2879
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002880 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2881 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002882 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002883 }
2884
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002885 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2886 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002887 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002888 D.Diag(diag::err_drv_unsupported_opt_for_target)
2889 << A->getSpelling() << getToolChain().getTriple().str();
2890 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2891 CmdArgs.push_back("-fpcc-struct-return");
2892 } else {
2893 assert(A->getOption().matches(options::OPT_freg_struct_return));
2894 CmdArgs.push_back("-freg-struct-return");
2895 }
2896 }
2897
Roman Divacky65b88cd2011-03-01 17:40:53 +00002898 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2899 CmdArgs.push_back("-mrtd");
2900
Rafael Espindola224dd632011-12-14 21:02:23 +00002901 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002902 CmdArgs.push_back("-mdisable-fp-elim");
2903 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2904 options::OPT_fno_zero_initialized_in_bss))
2905 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002906
2907 bool OFastEnabled = isOptimizationLevelFast(Args);
2908 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2909 // enabled. This alias option is being used to simplify the hasFlag logic.
2910 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2911 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002912 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2913 // doesn't do any TBAA.
2914 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002915 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002916 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002917 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002918 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2919 options::OPT_fno_struct_path_tbaa))
2920 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002921 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2922 false))
2923 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002924 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2925 options::OPT_fno_optimize_sibling_calls))
2926 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002927
Eric Christopher006208c2013-04-04 06:29:47 +00002928 // Handle segmented stacks.
2929 if (Args.hasArg(options::OPT_fsplit_stack))
2930 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002931
2932 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2933 // This alias option is being used to simplify the getLastArg logic.
2934 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2935 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002936
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002937 // Handle various floating point optimization flags, mapping them to the
2938 // appropriate LLVM code generation flags. The pattern for all of these is to
2939 // default off the codegen optimizations, and if any flag enables them and no
2940 // flag disables them after the flag enabling them, enable the codegen
2941 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002942 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002943 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002944 options::OPT_ffinite_math_only,
2945 options::OPT_fno_finite_math_only,
2946 options::OPT_fhonor_infinities,
2947 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002948 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2949 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002950 A->getOption().getID() != options::OPT_fhonor_infinities)
2951 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002952 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002953 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002954 options::OPT_ffinite_math_only,
2955 options::OPT_fno_finite_math_only,
2956 options::OPT_fhonor_nans,
2957 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002958 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2959 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002960 A->getOption().getID() != options::OPT_fhonor_nans)
2961 CmdArgs.push_back("-menable-no-nans");
2962
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002963 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2964 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002965 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002966 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002967 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002968 options::OPT_fno_math_errno)) {
2969 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2970 // However, turning *off* -ffast_math merely restores the toolchain default
2971 // (which may be false).
2972 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2973 A->getOption().getID() == options::OPT_ffast_math ||
2974 A->getOption().getID() == options::OPT_Ofast)
2975 MathErrno = false;
2976 else if (A->getOption().getID() == options::OPT_fmath_errno)
2977 MathErrno = true;
2978 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002979 if (MathErrno)
2980 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002981
2982 // There are several flags which require disabling very specific
2983 // optimizations. Any of these being disabled forces us to turn off the
2984 // entire set of LLVM optimizations, so collect them through all the flag
2985 // madness.
2986 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002987 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002988 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002989 options::OPT_funsafe_math_optimizations,
2990 options::OPT_fno_unsafe_math_optimizations,
2991 options::OPT_fassociative_math,
2992 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002993 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2994 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002995 A->getOption().getID() != options::OPT_fno_associative_math)
2996 AssociativeMath = true;
2997 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002998 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002999 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003000 options::OPT_funsafe_math_optimizations,
3001 options::OPT_fno_unsafe_math_optimizations,
3002 options::OPT_freciprocal_math,
3003 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003004 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3005 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003006 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3007 ReciprocalMath = true;
3008 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003009 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003010 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003011 options::OPT_funsafe_math_optimizations,
3012 options::OPT_fno_unsafe_math_optimizations,
3013 options::OPT_fsigned_zeros,
3014 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003015 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3016 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003017 A->getOption().getID() != options::OPT_fsigned_zeros)
3018 SignedZeros = false;
3019 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003020 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003021 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003022 options::OPT_funsafe_math_optimizations,
3023 options::OPT_fno_unsafe_math_optimizations,
3024 options::OPT_ftrapping_math,
3025 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003026 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3027 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003028 A->getOption().getID() != options::OPT_ftrapping_math)
3029 TrappingMath = false;
3030 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3031 !TrappingMath)
3032 CmdArgs.push_back("-menable-unsafe-fp-math");
3033
Sanjay Patel76c9e092015-01-23 16:40:50 +00003034 if (!SignedZeros)
3035 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003036
3037 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003038 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003039 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003040 options::OPT_ffp_contract)) {
3041 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003042 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003043 if (Val == "fast" || Val == "on" || Val == "off") {
3044 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3045 } else {
3046 D.Diag(diag::err_drv_unsupported_option_argument)
3047 << A->getOption().getName() << Val;
3048 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003049 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3050 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003051 // If fast-math is set then set the fp-contract mode to fast.
3052 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3053 }
3054 }
3055
Bob Wilson6a039162012-07-19 03:52:53 +00003056 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3057 // and if we find them, tell the frontend to provide the appropriate
3058 // preprocessor macros. This is distinct from enabling any optimizations as
3059 // these options induce language changes which must survive serialization
3060 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003061 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3062 options::OPT_fno_fast_math))
3063 if (!A->getOption().matches(options::OPT_fno_fast_math))
3064 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003065 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3066 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003067 if (A->getOption().matches(options::OPT_ffinite_math_only))
3068 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003069
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003070 // Decide whether to use verbose asm. Verbose assembly is the default on
3071 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003072 bool IsIntegratedAssemblerDefault =
3073 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003074 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003075 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003076 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003077 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003078
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003079 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003080 IsIntegratedAssemblerDefault))
3081 CmdArgs.push_back("-no-integrated-as");
3082
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003083 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3084 CmdArgs.push_back("-mdebug-pass");
3085 CmdArgs.push_back("Structure");
3086 }
3087 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3088 CmdArgs.push_back("-mdebug-pass");
3089 CmdArgs.push_back("Arguments");
3090 }
3091
John McCall8517abc2010-02-19 02:45:38 +00003092 // Enable -mconstructor-aliases except on darwin, where we have to
3093 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003094 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003095 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003096
John McCall7ef5cb32011-03-18 02:56:14 +00003097 // Darwin's kernel doesn't support guard variables; just die if we
3098 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003099 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003100 CmdArgs.push_back("-fforbid-guard-variables");
3101
Douglas Gregordbe39272011-02-01 15:15:22 +00003102 if (Args.hasArg(options::OPT_mms_bitfields)) {
3103 CmdArgs.push_back("-mms-bitfields");
3104 }
John McCall8517abc2010-02-19 02:45:38 +00003105
Daniel Dunbar306945d2009-09-16 06:17:29 +00003106 // This is a coarse approximation of what llvm-gcc actually does, both
3107 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3108 // complicated ways.
3109 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003110 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3111 options::OPT_fno_asynchronous_unwind_tables,
3112 (getToolChain().IsUnwindTablesDefault() ||
3113 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3114 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003115 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3116 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003117 CmdArgs.push_back("-munwind-tables");
3118
Chandler Carruth05fb5852012-11-21 23:40:23 +00003119 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003120
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003121 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3122 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003123 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003124 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003125
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003126 // FIXME: Handle -mtune=.
3127 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003128
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003129 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003130 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003131 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003132 }
3133
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003134 // Add the target cpu
3135 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3136 llvm::Triple ETriple(ETripleStr);
3137 std::string CPU = getCPUName(Args, ETriple);
3138 if (!CPU.empty()) {
3139 CmdArgs.push_back("-target-cpu");
3140 CmdArgs.push_back(Args.MakeArgString(CPU));
3141 }
3142
Rafael Espindolaeb265472013-08-21 21:59:03 +00003143 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3144 CmdArgs.push_back("-mfpmath");
3145 CmdArgs.push_back(A->getValue());
3146 }
3147
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003148 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003149 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003150
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003151 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003152 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003153 default:
3154 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003155
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003156 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003157 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003158 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003159 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003160 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003161 break;
3162
Tim Northover573cbee2014-05-24 12:52:07 +00003163 case llvm::Triple::aarch64:
3164 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003165 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003166 break;
3167
Eric Christopher0b26a612010-03-02 02:41:08 +00003168 case llvm::Triple::mips:
3169 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003170 case llvm::Triple::mips64:
3171 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003172 AddMIPSTargetArgs(Args, CmdArgs);
3173 break;
3174
Ulrich Weigand8afad612014-07-28 13:17:52 +00003175 case llvm::Triple::ppc:
3176 case llvm::Triple::ppc64:
3177 case llvm::Triple::ppc64le:
3178 AddPPCTargetArgs(Args, CmdArgs);
3179 break;
3180
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003181 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003182 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003183 AddSparcTargetArgs(Args, CmdArgs);
3184 break;
3185
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003186 case llvm::Triple::x86:
3187 case llvm::Triple::x86_64:
3188 AddX86TargetArgs(Args, CmdArgs);
3189 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003190
3191 case llvm::Triple::hexagon:
3192 AddHexagonTargetArgs(Args, CmdArgs);
3193 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003194 }
3195
Hans Wennborg75958c42013-08-08 00:17:41 +00003196 // Add clang-cl arguments.
3197 if (getToolChain().getDriver().IsCLMode())
3198 AddClangCLArgs(Args, CmdArgs);
3199
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003200 // Pass the linker version in use.
3201 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3202 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003203 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003204 }
3205
Eric Christopherb7d97e92013-04-03 01:58:53 +00003206 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003207 CmdArgs.push_back("-momit-leaf-frame-pointer");
3208
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003209 // Explicitly error on some things we know we don't support and can't just
3210 // ignore.
3211 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003212 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3213 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003214 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003215 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003216 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003217 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3218 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003219 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003220 << Unsupported->getOption().getName();
3221 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003222 }
3223
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003224 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003225 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003226 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003227 CmdArgs.push_back("-header-include-file");
3228 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3229 D.CCPrintHeadersFilename : "-");
3230 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003231 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003232 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003233
Chad Rosierbe10f982011-08-02 17:58:04 +00003234 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003235 CmdArgs.push_back("-diagnostic-log-file");
3236 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3237 D.CCLogDiagnosticsFilename : "-");
3238 }
3239
Manman Ren17bdb0f2013-11-20 20:22:14 +00003240 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3241 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003242 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003243 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003244 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3245 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003246 // FIXME: we should support specifying dwarf version with
3247 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003248 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003249 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003250 const llvm::Triple &Triple = getToolChain().getTriple();
3251 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003252 Triple.getOS() == llvm::Triple::FreeBSD ||
3253 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003254 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003255 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003256 CmdArgs.push_back("-gdwarf-2");
3257 else if (A->getOption().matches(options::OPT_gdwarf_3))
3258 CmdArgs.push_back("-gdwarf-3");
3259 else if (A->getOption().matches(options::OPT_gdwarf_4))
3260 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003261 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003262 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003263 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003264 const llvm::Triple &Triple = getToolChain().getTriple();
3265 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003266 Triple.getOS() == llvm::Triple::FreeBSD ||
3267 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003268 CmdArgs.push_back("-gdwarf-2");
3269 else
3270 CmdArgs.push_back("-g");
3271 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003272 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003273
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003274 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3275 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003276 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3277 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003278 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003279
Eric Christopher138c32b2013-09-13 22:37:55 +00003280 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003281 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3282 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003283 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003284 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003285 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003286 CmdArgs.push_back("-g");
3287 CmdArgs.push_back("-backend-option");
3288 CmdArgs.push_back("-split-dwarf=Enable");
3289 }
3290
Eric Christopher138c32b2013-09-13 22:37:55 +00003291 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3292 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3293 CmdArgs.push_back("-backend-option");
3294 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3295 }
Eric Christophereec89c22013-06-18 00:03:50 +00003296
Eric Christopher0d403d22014-02-14 01:27:03 +00003297 // -gdwarf-aranges turns on the emission of the aranges section in the
3298 // backend.
3299 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3300 CmdArgs.push_back("-backend-option");
3301 CmdArgs.push_back("-generate-arange-section");
3302 }
3303
David Blaikief36d9ba2014-01-27 18:52:43 +00003304 if (Args.hasFlag(options::OPT_fdebug_types_section,
3305 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003306 CmdArgs.push_back("-backend-option");
3307 CmdArgs.push_back("-generate-type-units");
3308 }
Eric Christophereec89c22013-06-18 00:03:50 +00003309
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003310 if (Args.hasFlag(options::OPT_ffunction_sections,
3311 options::OPT_fno_function_sections, false)) {
3312 CmdArgs.push_back("-ffunction-sections");
3313 }
3314
3315 if (Args.hasFlag(options::OPT_fdata_sections,
3316 options::OPT_fno_data_sections, false)) {
3317 CmdArgs.push_back("-fdata-sections");
3318 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003319
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003320 if (!Args.hasFlag(options::OPT_funique_section_names,
3321 options::OPT_fno_unique_section_names, true))
3322 CmdArgs.push_back("-fno-unique-section-names");
3323
Chris Lattner3c77a352010-06-22 00:03:40 +00003324 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3325
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003326 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3327 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3328 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3329 D.Diag(diag::err_drv_argument_not_allowed_with)
3330 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3331
3332 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3333
3334 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3335 A->render(Args, CmdArgs);
3336 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3337 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3338
Nick Lewycky207bce32011-04-21 23:44:07 +00003339 if (Args.hasArg(options::OPT_ftest_coverage) ||
3340 Args.hasArg(options::OPT_coverage))
3341 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003342 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3343 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003344 Args.hasArg(options::OPT_coverage))
3345 CmdArgs.push_back("-femit-coverage-data");
3346
Alex Lorenzee024992014-08-04 18:41:51 +00003347 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3348 !Args.hasArg(options::OPT_fprofile_instr_generate))
3349 D.Diag(diag::err_drv_argument_only_allowed_with)
3350 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3351
3352 if (Args.hasArg(options::OPT_fcoverage_mapping))
3353 CmdArgs.push_back("-fcoverage-mapping");
3354
Nick Lewycky480cb992011-05-04 20:46:58 +00003355 if (C.getArgs().hasArg(options::OPT_c) ||
3356 C.getArgs().hasArg(options::OPT_S)) {
3357 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003358 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003359 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003360 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003361 CoverageFilename = FinalOutput->getValue();
3362 } else {
3363 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3364 }
Nick Lewycky737a4522013-03-07 08:28:53 +00003365 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003366 SmallString<128> Pwd;
3367 if (!llvm::sys::fs::current_path(Pwd)) {
3368 llvm::sys::path::append(Pwd, CoverageFilename.str());
3369 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003370 }
3371 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003372 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003373 }
3374 }
3375
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003376 // Pass options for controlling the default header search paths.
3377 if (Args.hasArg(options::OPT_nostdinc)) {
3378 CmdArgs.push_back("-nostdsysteminc");
3379 CmdArgs.push_back("-nobuiltininc");
3380 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003381 if (Args.hasArg(options::OPT_nostdlibinc))
3382 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003383 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3384 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3385 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003386
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003387 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003388 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003389 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003390
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003391 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3392
Ted Kremenekf7639e12012-03-06 20:06:33 +00003393 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003394 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003395 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003396 options::OPT_ccc_arcmt_modify,
3397 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003398 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003399 switch (A->getOption().getID()) {
3400 default:
3401 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003402 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003403 CmdArgs.push_back("-arcmt-check");
3404 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003405 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003406 CmdArgs.push_back("-arcmt-modify");
3407 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003408 case options::OPT_ccc_arcmt_migrate:
3409 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003410 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003411 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003412
3413 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3414 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003415 break;
John McCalld70fb982011-06-15 23:25:17 +00003416 }
3417 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003418 } else {
3419 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3420 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3421 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003422 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003423
Ted Kremenekf7639e12012-03-06 20:06:33 +00003424 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3425 if (ARCMTEnabled) {
3426 D.Diag(diag::err_drv_argument_not_allowed_with)
3427 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3428 }
3429 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003430 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003431
3432 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003433 options::OPT_objcmt_migrate_subscripting,
3434 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003435 // None specified, means enable them all.
3436 CmdArgs.push_back("-objcmt-migrate-literals");
3437 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003438 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003439 } else {
3440 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3441 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003442 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003443 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003444 } else {
3445 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3446 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3447 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3448 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3449 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3450 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003451 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003452 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3453 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3454 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3455 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3456 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3457 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3458 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003459 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003460 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003461 }
3462
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003463 // Add preprocessing options like -I, -D, etc. if we are using the
3464 // preprocessor.
3465 //
3466 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003467 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003468 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003469
Rafael Espindolaa7431922011-07-21 23:40:37 +00003470 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3471 // that "The compiler can only warn and ignore the option if not recognized".
3472 // When building with ccache, it will pass -D options to clang even on
3473 // preprocessed inputs and configure concludes that -fPIC is not supported.
3474 Args.ClaimAllArgs(options::OPT_D);
3475
Alp Toker7874bdc2013-11-15 20:40:58 +00003476 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003477 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3478 if (A->getOption().matches(options::OPT_O4)) {
3479 CmdArgs.push_back("-O3");
3480 D.Diag(diag::warn_O4_is_O3);
3481 } else {
3482 A->render(Args, CmdArgs);
3483 }
3484 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003485
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003486 // Warn about ignored options to clang.
3487 for (arg_iterator it = Args.filtered_begin(
3488 options::OPT_clang_ignored_gcc_optimization_f_Group),
3489 ie = Args.filtered_end(); it != ie; ++it) {
3490 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3491 }
3492
Rafael Espindola577637a2015-01-03 00:06:04 +00003493 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003494
Richard Smith3be1cb22014-08-07 00:24:21 +00003495 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003496 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003497 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3498 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003499 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003500 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003501
3502 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003503 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003504 //
3505 // If a std is supplied, only add -trigraphs if it follows the
3506 // option.
3507 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3508 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003509 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003510 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003511 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003512 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003513 else
3514 Std->render(Args, CmdArgs);
3515
Nico Weber00721502014-12-23 22:32:37 +00003516 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003517 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003518 options::OPT_ftrigraphs,
3519 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003520 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003521 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003522 } else {
3523 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003524 //
3525 // FIXME: Clang doesn't correctly handle -std= when the input language
3526 // doesn't match. For the time being just ignore this for C++ inputs;
3527 // eventually we want to do all the standard defaulting here instead of
3528 // splitting it between the driver and clang -cc1.
3529 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003530 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3531 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003532 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003533 CmdArgs.push_back("-std=c++11");
3534
Nico Weber00721502014-12-23 22:32:37 +00003535 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3536 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003537 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003538
Richard Smith282b4492013-09-04 22:50:31 +00003539 // GCC's behavior for -Wwrite-strings is a bit strange:
3540 // * In C, this "warning flag" changes the types of string literals from
3541 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3542 // for the discarded qualifier.
3543 // * In C++, this is just a normal warning flag.
3544 //
3545 // Implementing this warning correctly in C is hard, so we follow GCC's
3546 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3547 // a non-const char* in C, rather than using this crude hack.
3548 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003549 // FIXME: This should behave just like a warning flag, and thus should also
3550 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3551 Arg *WriteStrings =
3552 Args.getLastArg(options::OPT_Wwrite_strings,
3553 options::OPT_Wno_write_strings, options::OPT_w);
3554 if (WriteStrings &&
3555 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003556 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003557 }
3558
Chandler Carruth61fbf622011-04-23 09:27:53 +00003559 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003560 // during C++ compilation, which it is by default. GCC keeps this define even
3561 // in the presence of '-w', match this behavior bug-for-bug.
3562 if (types::isCXX(InputType) &&
3563 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3564 true)) {
3565 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003566 }
3567
Chandler Carruthe0391482010-05-22 02:21:53 +00003568 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3569 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3570 if (Asm->getOption().matches(options::OPT_fasm))
3571 CmdArgs.push_back("-fgnu-keywords");
3572 else
3573 CmdArgs.push_back("-fno-gnu-keywords");
3574 }
3575
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003576 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3577 CmdArgs.push_back("-fno-dwarf-directory-asm");
3578
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003579 if (ShouldDisableAutolink(Args, getToolChain()))
3580 CmdArgs.push_back("-fno-autolink");
3581
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003582 // Add in -fdebug-compilation-dir if necessary.
3583 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003584
Richard Smith9a568822011-11-21 19:36:32 +00003585 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3586 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003587 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003588 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003589 }
3590
Richard Smith79c927b2013-11-06 19:31:51 +00003591 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3592 CmdArgs.push_back("-foperator-arrow-depth");
3593 CmdArgs.push_back(A->getValue());
3594 }
3595
Richard Smith9a568822011-11-21 19:36:32 +00003596 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3597 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003598 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003599 }
3600
Richard Smitha3d3bd22013-05-08 02:12:03 +00003601 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3602 CmdArgs.push_back("-fconstexpr-steps");
3603 CmdArgs.push_back(A->getValue());
3604 }
3605
Richard Smithb3a14522013-02-22 01:59:51 +00003606 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3607 CmdArgs.push_back("-fbracket-depth");
3608 CmdArgs.push_back(A->getValue());
3609 }
3610
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003611 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3612 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003613 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003614 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003615 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3616 } else
3617 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003618 }
3619
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003620
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003621 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003622 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003623
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003624 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3625 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003626 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003627 }
David Chisnall5778fce2009-08-31 16:41:57 +00003628
Chris Lattnere23003d2010-01-09 21:54:33 +00003629 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3630 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003631 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003632 }
3633
Chris Lattnerb35583d2010-04-07 20:49:23 +00003634 CmdArgs.push_back("-ferror-limit");
3635 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003636 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003637 else
3638 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003639
Chandler Carrutha77a7272010-05-06 04:55:18 +00003640 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3641 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003642 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003643 }
3644
3645 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3646 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003647 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003648 }
3649
Richard Smithf6f003a2011-12-16 19:06:07 +00003650 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3651 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003652 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003653 }
3654
Nick Lewycky24653262014-12-16 21:39:02 +00003655 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3656 CmdArgs.push_back("-fspell-checking-limit");
3657 CmdArgs.push_back(A->getValue());
3658 }
3659
Daniel Dunbar2c978472009-11-04 06:24:47 +00003660 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003661 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003662 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003663 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003664 } else {
3665 // If -fmessage-length=N was not specified, determine whether this is a
3666 // terminal and, if so, implicitly define -fmessage-length appropriately.
3667 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003668 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003669 }
3670
John McCallb4a99d32013-02-19 01:57:35 +00003671 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3672 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3673 options::OPT_fvisibility_ms_compat)) {
3674 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3675 CmdArgs.push_back("-fvisibility");
3676 CmdArgs.push_back(A->getValue());
3677 } else {
3678 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3679 CmdArgs.push_back("-fvisibility");
3680 CmdArgs.push_back("hidden");
3681 CmdArgs.push_back("-ftype-visibility");
3682 CmdArgs.push_back("default");
3683 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003684 }
3685
Douglas Gregor08329632010-06-15 17:05:35 +00003686 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003687
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003688 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3689
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003690 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003691 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3692 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003693 CmdArgs.push_back("-ffreestanding");
3694
Daniel Dunbare357d562009-12-03 18:42:11 +00003695 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003696 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003697 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003698 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3699 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003700 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003701 // AltiVec language extensions aren't relevant for assembling.
3702 if (!isa<PreprocessJobAction>(JA) ||
3703 Output.getType() != types::TY_PP_Asm)
3704 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003705 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3706 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003707
Peter Collingbourne32701642013-11-01 18:16:25 +00003708 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3709 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003710
Eric Christopher459d2712013-02-19 06:16:53 +00003711 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003712 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003713 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003714 getToolChain().getArch() == llvm::Triple::ppc64 ||
3715 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003716 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003717 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003718
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003719 if (getToolChain().SupportsProfiling())
3720 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003721
3722 // -flax-vector-conversions is default.
3723 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3724 options::OPT_fno_lax_vector_conversions))
3725 CmdArgs.push_back("-fno-lax-vector-conversions");
3726
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003727 if (Args.getLastArg(options::OPT_fapple_kext))
3728 CmdArgs.push_back("-fapple-kext");
3729
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003730 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003731 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003732 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003733 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3734 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003735
3736 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3737 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003738 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003739 }
3740
Bob Wilson14adb362012-02-03 06:27:22 +00003741 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003742
Chandler Carruth6e501032011-03-27 00:04:55 +00003743 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3744 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3745 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3746 options::OPT_fno_wrapv)) {
3747 if (A->getOption().matches(options::OPT_fwrapv))
3748 CmdArgs.push_back("-fwrapv");
3749 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3750 options::OPT_fno_strict_overflow)) {
3751 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3752 CmdArgs.push_back("-fwrapv");
3753 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003754
3755 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3756 options::OPT_fno_reroll_loops))
3757 if (A->getOption().matches(options::OPT_freroll_loops))
3758 CmdArgs.push_back("-freroll-loops");
3759
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003760 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003761 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3762 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003763
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003764 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3765
Mahesha S6a682be42012-10-27 07:47:56 +00003766
Daniel Dunbar4930e332009-11-17 08:07:36 +00003767 // -stack-protector=0 is default.
3768 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003769 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3770 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003771 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003772 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003773 if (A->getOption().matches(options::OPT_fstack_protector)) {
3774 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3775 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3776 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003777 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003778 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003779 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003780 } else {
3781 StackProtectorLevel =
3782 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3783 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003784 if (StackProtectorLevel) {
3785 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003786 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003787 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003788
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003789 // --param ssp-buffer-size=
3790 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3791 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003792 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003793 if (Str.startswith("ssp-buffer-size=")) {
3794 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003795 CmdArgs.push_back("-stack-protector-buffer-size");
3796 // FIXME: Verify the argument is a valid integer.
3797 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003798 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003799 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003800 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003801 }
3802
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003803 // Translate -mstackrealign
3804 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3805 false)) {
3806 CmdArgs.push_back("-backend-option");
3807 CmdArgs.push_back("-force-align-stack");
3808 }
3809 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3810 false)) {
3811 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3812 }
3813
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003814 if (Args.hasArg(options::OPT_mstack_alignment)) {
3815 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3816 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003817 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003818
Hans Wennborg77dc2362015-01-20 19:45:50 +00003819 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3820 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3821
3822 if (!Size.empty())
3823 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3824 else
3825 CmdArgs.push_back("-mstack-probe-size=0");
3826 }
3827
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003828 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3829 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3830 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3831
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003832 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3833 options::OPT_mno_restrict_it)) {
3834 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3835 CmdArgs.push_back("-backend-option");
3836 CmdArgs.push_back("-arm-restrict-it");
3837 } else {
3838 CmdArgs.push_back("-backend-option");
3839 CmdArgs.push_back("-arm-no-restrict-it");
3840 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003841 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3842 TT.getArch() == llvm::Triple::thumb)) {
3843 // Windows on ARM expects restricted IT blocks
3844 CmdArgs.push_back("-backend-option");
3845 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003846 }
3847
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003848 if (TT.getArch() == llvm::Triple::arm ||
3849 TT.getArch() == llvm::Triple::thumb) {
3850 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3851 options::OPT_mno_long_calls)) {
3852 if (A->getOption().matches(options::OPT_mlong_calls)) {
3853 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003854 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003855 }
3856 }
3857 }
3858
Daniel Dunbard18049a2009-04-07 21:16:11 +00003859 // Forward -f options with positive and negative forms; we translate
3860 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003861 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3862 StringRef fname = A->getValue();
3863 if (!llvm::sys::fs::exists(fname))
3864 D.Diag(diag::err_drv_no_such_file) << fname;
3865 else
3866 A->render(Args, CmdArgs);
3867 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003868
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003869 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003870 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003871 CmdArgs.push_back("-fapple-kext");
3872 if (!Args.hasArg(options::OPT_fbuiltin))
3873 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003874 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003875 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003876 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003877 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003878 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003879
Nuno Lopes13c88c72009-12-16 16:59:22 +00003880 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3881 options::OPT_fno_assume_sane_operator_new))
3882 CmdArgs.push_back("-fno-assume-sane-operator-new");
3883
Daniel Dunbar4930e332009-11-17 08:07:36 +00003884 // -fblocks=0 is default.
3885 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003886 getToolChain().IsBlocksDefault()) ||
3887 (Args.hasArg(options::OPT_fgnu_runtime) &&
3888 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3889 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003890 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003891
3892 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3893 !getToolChain().hasBlocksRuntime())
3894 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003895 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003896
Richard Smithffb65082014-09-30 23:10:19 +00003897 // -fmodules enables modules (off by default).
3898 // Users can pass -fno-cxx-modules to turn off modules support for
3899 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003900 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003901 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3902 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3903 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003904 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003905 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003906 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003907 HaveModules = true;
3908 }
3909 }
3910
Daniel Jasper07e6c402013-08-05 20:26:17 +00003911 // -fmodule-maps enables module map processing (off by default) for header
3912 // checking. It is implied by -fmodules.
3913 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3914 false)) {
3915 CmdArgs.push_back("-fmodule-maps");
3916 }
3917
Daniel Jasperac42b752013-10-21 06:34:34 +00003918 // -fmodules-decluse checks that modules used are declared so (off by
3919 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003920 if (Args.hasFlag(options::OPT_fmodules_decluse,
3921 options::OPT_fno_modules_decluse,
3922 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003923 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003924 }
3925
Daniel Jasper962b38e2014-04-11 11:47:45 +00003926 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3927 // all #included headers are part of modules.
3928 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3929 options::OPT_fno_modules_strict_decluse,
3930 false)) {
3931 CmdArgs.push_back("-fmodules-strict-decluse");
3932 }
3933
Manuel Klimekd2e8b042015-02-20 11:44:41 +00003934 // -fno-implicit-modules turns off implicitly compiling modules on demand.
3935 if (!Args.hasFlag(options::OPT_fimplicit_modules,
3936 options::OPT_fno_implicit_modules)) {
3937 CmdArgs.push_back("-fno-implicit-modules");
3938 }
3939
Daniel Jasperac42b752013-10-21 06:34:34 +00003940 // -fmodule-name specifies the module that is currently being built (or
3941 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00003942 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00003943
Richard Smith9887d792014-10-17 01:42:53 +00003944 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00003945 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00003946 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00003947
Richard Smithe842a472014-10-22 02:05:46 +00003948 // -fmodule-file can be used to specify files containing precompiled modules.
3949 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
3950
3951 // -fmodule-cache-path specifies where our implicitly-built module files
3952 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00003953 SmallString<128> ModuleCachePath;
3954 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3955 ModuleCachePath = A->getValue();
3956 if (HaveModules) {
3957 if (C.isForDiagnostics()) {
3958 // When generating crash reports, we want to emit the modules along with
3959 // the reproduction sources, so we ignore any provided module path.
3960 ModuleCachePath = Output.getFilename();
3961 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3962 llvm::sys::path::append(ModuleCachePath, "modules");
3963 } else if (ModuleCachePath.empty()) {
3964 // No module path was provided: use the default.
3965 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3966 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003967 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
3968 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00003969 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3970 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003971 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003972 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3973 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3974 }
3975
3976 // When building modules and generating crashdumps, we need to dump a module
3977 // dependency VFS alongside the output.
3978 if (HaveModules && C.isForDiagnostics()) {
3979 SmallString<128> VFSDir(Output.getFilename());
3980 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00003981 // Add the cache directory as a temp so the crash diagnostics pick it up.
3982 C.addTempFile(Args.MakeArgString(VFSDir));
3983
Justin Bognera88f0122014-06-20 22:59:50 +00003984 llvm::sys::path::append(VFSDir, "vfs");
3985 CmdArgs.push_back("-module-dependency-dir");
3986 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003987 }
3988
Richard Smith9887d792014-10-17 01:42:53 +00003989 if (HaveModules)
3990 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003991
Douglas Gregor35b04d62013-02-07 19:01:24 +00003992 // Pass through all -fmodules-ignore-macro arguments.
3993 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003994 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3995 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003996
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003997 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3998
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003999 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4000 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4001 D.Diag(diag::err_drv_argument_not_allowed_with)
4002 << A->getAsString(Args) << "-fbuild-session-timestamp";
4003
4004 llvm::sys::fs::file_status Status;
4005 if (llvm::sys::fs::status(A->getValue(), Status))
4006 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004007 CmdArgs.push_back(Args.MakeArgString(
4008 "-fbuild-session-timestamp=" +
4009 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004010 }
4011
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004012 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004013 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4014 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004015 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4016
4017 Args.AddLastArg(CmdArgs,
4018 options::OPT_fmodules_validate_once_per_build_session);
4019 }
4020
Ben Langmuirdcf73862014-03-12 00:06:17 +00004021 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4022
John McCalldfea9982010-04-09 19:12:06 +00004023 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004024 if (Args.hasFlag(options::OPT_fno_access_control,
4025 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004026 false))
John McCall3155f572010-04-09 19:03:51 +00004027 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004028
Anders Carlssond470fef2010-11-21 00:09:52 +00004029 // -felide-constructors is the default.
4030 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4031 options::OPT_felide_constructors,
4032 false))
4033 CmdArgs.push_back("-fno-elide-constructors");
4034
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004035 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004036
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004037 if (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4038 RTTIMode == ToolChain::RM_DisabledImplicitly)
4039 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004040
Tony Linthicum76329bf2011-12-12 21:14:55 +00004041 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004042 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004043 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004044 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004045 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004046 CmdArgs.push_back("-fshort-enums");
4047
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004048 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004049 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004050 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004051 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004052
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004053 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004054 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004055 options::OPT_fno_threadsafe_statics))
4056 CmdArgs.push_back("-fno-threadsafe-statics");
4057
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004058 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004059 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4060 options::OPT_fno_use_cxa_atexit,
4061 !IsWindowsCygnus && !IsWindowsGNU &&
4062 getToolChain().getArch() != llvm::Triple::hexagon &&
4063 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004064 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004065 CmdArgs.push_back("-fno-use-cxa-atexit");
4066
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004067 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004068 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004069 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004070 CmdArgs.push_back("-fms-extensions");
4071
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004072 // -fno-use-line-directives is default.
4073 if (Args.hasFlag(options::OPT_fuse_line_directives,
4074 options::OPT_fno_use_line_directives, false))
4075 CmdArgs.push_back("-fuse-line-directives");
4076
Francois Pichet1b4f1632011-09-17 04:32:15 +00004077 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004078 if (Args.hasFlag(options::OPT_fms_compatibility,
4079 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004080 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4081 options::OPT_fno_ms_extensions,
4082 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004083 CmdArgs.push_back("-fms-compatibility");
4084
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004085 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004086 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004087 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4088 Args.hasArg(options::OPT_fms_compatibility_version)) {
4089 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4090 const Arg *MSCompatibilityVersion =
4091 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004092
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004093 if (MSCVersion && MSCompatibilityVersion)
4094 D.Diag(diag::err_drv_argument_not_allowed_with)
4095 << MSCVersion->getAsString(Args)
4096 << MSCompatibilityVersion->getAsString(Args);
4097
4098 std::string Ver;
4099 if (MSCompatibilityVersion)
4100 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4101 else if (MSCVersion)
4102 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4103
4104 if (Ver.empty())
Reid Klecknerc4da9c82015-02-23 19:25:48 +00004105 CmdArgs.push_back("-fms-compatibility-version=18.00");
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004106 else
4107 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4108 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004109
Eric Christopher5ecce122013-02-18 00:38:31 +00004110 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004111 if (Args.hasFlag(options::OPT_fborland_extensions,
4112 options::OPT_fno_borland_extensions, false))
4113 CmdArgs.push_back("-fborland-extensions");
4114
Francois Pichet02744872011-09-01 16:38:08 +00004115 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4116 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004117 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004118 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004119 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004120
Chandler Carruthe03aa552010-04-17 20:17:31 +00004121 // -fgnu-keywords default varies depending on language; only pass if
4122 // specified.
4123 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004124 options::OPT_fno_gnu_keywords))
4125 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004126
Rafael Espindola922a6242011-06-02 17:30:53 +00004127 if (Args.hasFlag(options::OPT_fgnu89_inline,
4128 options::OPT_fno_gnu89_inline,
4129 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004130 CmdArgs.push_back("-fgnu89-inline");
4131
Chad Rosier9c76d242012-03-15 22:31:42 +00004132 if (Args.hasArg(options::OPT_fno_inline))
4133 CmdArgs.push_back("-fno-inline");
4134
Chad Rosier64d6be92012-03-06 21:17:19 +00004135 if (Args.hasArg(options::OPT_fno_inline_functions))
4136 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004137
John McCall5fb5df92012-06-20 06:18:46 +00004138 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004139
John McCall5fb5df92012-06-20 06:18:46 +00004140 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004141 // legacy is the default. Except for deployment taget of 10.5,
4142 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4143 // gets ignored silently.
4144 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004145 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4146 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004147 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004148 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004149 if (getToolChain().UseObjCMixedDispatch())
4150 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4151 else
4152 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4153 }
4154 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004155
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004156 // When ObjectiveC legacy runtime is in effect on MacOSX,
4157 // turn on the option to do Array/Dictionary subscripting
4158 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004159 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4160 getToolChain().getTriple().isMacOSX() &&
4161 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4162 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004163 objcRuntime.isNeXTFamily())
4164 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4165
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004166 // -fencode-extended-block-signature=1 is default.
4167 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4168 CmdArgs.push_back("-fencode-extended-block-signature");
4169 }
4170
John McCall24fc0de2011-07-06 00:26:06 +00004171 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4172 // NOTE: This logic is duplicated in ToolChains.cpp.
4173 bool ARC = isObjCAutoRefCount(Args);
4174 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004175 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004176
John McCall24fc0de2011-07-06 00:26:06 +00004177 CmdArgs.push_back("-fobjc-arc");
4178
Chandler Carruth491db322011-11-04 07:34:47 +00004179 // FIXME: It seems like this entire block, and several around it should be
4180 // wrapped in isObjC, but for now we just use it here as this is where it
4181 // was being used previously.
4182 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4183 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4184 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4185 else
4186 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4187 }
4188
John McCall24fc0de2011-07-06 00:26:06 +00004189 // Allow the user to enable full exceptions code emission.
4190 // We define off for Objective-CC, on for Objective-C++.
4191 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4192 options::OPT_fno_objc_arc_exceptions,
4193 /*default*/ types::isCXX(InputType)))
4194 CmdArgs.push_back("-fobjc-arc-exceptions");
4195 }
4196
4197 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4198 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004199 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004200 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004201
John McCall24fc0de2011-07-06 00:26:06 +00004202 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4203 // takes precedence.
4204 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4205 if (!GCArg)
4206 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4207 if (GCArg) {
4208 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004209 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004210 << GCArg->getAsString(Args);
4211 } else if (getToolChain().SupportsObjCGC()) {
4212 GCArg->render(Args, CmdArgs);
4213 } else {
4214 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004215 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004216 << GCArg->getAsString(Args);
4217 }
4218 }
4219
Bob Wilsonb111ec92015-03-02 19:01:14 +00004220 if (Args.hasFlag(options::OPT_fapplication_extension,
4221 options::OPT_fno_application_extension, false))
4222 CmdArgs.push_back("-fapplication-extension");
4223
Reid Klecknerc542d372014-06-27 17:02:02 +00004224 // Handle GCC-style exception args.
4225 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004226 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004227 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004228
4229 if (getToolChain().UseSjLjExceptions())
4230 CmdArgs.push_back("-fsjlj-exceptions");
4231
4232 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004233 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4234 options::OPT_fno_assume_sane_operator_new))
4235 CmdArgs.push_back("-fno-assume-sane-operator-new");
4236
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004237 // -fconstant-cfstrings is default, and may be subject to argument translation
4238 // on Darwin.
4239 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4240 options::OPT_fno_constant_cfstrings) ||
4241 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4242 options::OPT_mno_constant_cfstrings))
4243 CmdArgs.push_back("-fno-constant-cfstrings");
4244
John Thompsoned4e2952009-11-05 20:14:16 +00004245 // -fshort-wchar default varies depending on platform; only
4246 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004247 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4248 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004249 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004250
Hans Wennborg28c96312013-07-31 23:39:13 +00004251 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004252 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004253 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004254 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004255 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004256
Daniel Dunbar096ed292011-10-05 21:04:55 +00004257 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4258 // -fno-pack-struct doesn't apply to -fpack-struct=.
4259 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004260 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004261 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004262 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004263 } else if (Args.hasFlag(options::OPT_fpack_struct,
4264 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004265 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004266 }
4267
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004268 // Handle -fmax-type-align=N and -fno-type-align
4269 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4270 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4271 if (!SkipMaxTypeAlign) {
4272 std::string MaxTypeAlignStr = "-fmax-type-align=";
4273 MaxTypeAlignStr += A->getValue();
4274 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4275 }
4276 } else if (getToolChain().getTriple().isOSDarwin()) {
4277 if (!SkipMaxTypeAlign) {
4278 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4279 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4280 }
4281 }
4282
Robert Lytton0e076492013-08-13 09:43:10 +00004283 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004284 if (!Args.hasArg(options::OPT_fcommon))
4285 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004286 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004287 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004288
Daniel Dunbard18049a2009-04-07 21:16:11 +00004289 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004290 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004291 CmdArgs.push_back("-fno-common");
4292
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004293 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004294 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004295 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004296 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004297 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004298 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4299
Daniel Dunbar6358d682010-10-15 22:30:42 +00004300 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4301 if (!Args.hasFlag(options::OPT_ffor_scope,
4302 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004303 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004304 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4305
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004306 // -finput_charset=UTF-8 is default. Reject others
4307 if (Arg *inputCharset = Args.getLastArg(
4308 options::OPT_finput_charset_EQ)) {
4309 StringRef value = inputCharset->getValue();
4310 if (value != "UTF-8")
4311 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4312 }
4313
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004314 // -fexec_charset=UTF-8 is default. Reject others
4315 if (Arg *execCharset = Args.getLastArg(
4316 options::OPT_fexec_charset_EQ)) {
4317 StringRef value = execCharset->getValue();
4318 if (value != "UTF-8")
4319 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4320 }
4321
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004322 // -fcaret-diagnostics is default.
4323 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4324 options::OPT_fno_caret_diagnostics, true))
4325 CmdArgs.push_back("-fno-caret-diagnostics");
4326
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004327 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004328 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004329 options::OPT_fno_diagnostics_fixit_info))
4330 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004331
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004332 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004333 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004334 options::OPT_fno_diagnostics_show_option))
4335 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004336
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004337 if (const Arg *A =
4338 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4339 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004340 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004341 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004342
Douglas Gregor643c9222011-05-21 17:07:29 +00004343 if (const Arg *A =
4344 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4345 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004346 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004347 }
4348
Chandler Carruthb6766f02011-03-27 01:50:55 +00004349 if (Arg *A = Args.getLastArg(
4350 options::OPT_fdiagnostics_show_note_include_stack,
4351 options::OPT_fno_diagnostics_show_note_include_stack)) {
4352 if (A->getOption().matches(
4353 options::OPT_fdiagnostics_show_note_include_stack))
4354 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4355 else
4356 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4357 }
4358
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004359 // Color diagnostics are the default, unless the terminal doesn't support
4360 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004361 // Support both clang's -f[no-]color-diagnostics and gcc's
4362 // -f[no-]diagnostics-colors[=never|always|auto].
4363 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004364 for (const auto &Arg : Args) {
4365 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004366 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4367 !O.matches(options::OPT_fdiagnostics_color) &&
4368 !O.matches(options::OPT_fno_color_diagnostics) &&
4369 !O.matches(options::OPT_fno_diagnostics_color) &&
4370 !O.matches(options::OPT_fdiagnostics_color_EQ))
4371 continue;
4372
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004373 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004374 if (O.matches(options::OPT_fcolor_diagnostics) ||
4375 O.matches(options::OPT_fdiagnostics_color)) {
4376 ShowColors = Colors_On;
4377 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4378 O.matches(options::OPT_fno_diagnostics_color)) {
4379 ShowColors = Colors_Off;
4380 } else {
4381 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004382 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004383 if (value == "always")
4384 ShowColors = Colors_On;
4385 else if (value == "never")
4386 ShowColors = Colors_Off;
4387 else if (value == "auto")
4388 ShowColors = Colors_Auto;
4389 else
4390 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4391 << ("-fdiagnostics-color=" + value).str();
4392 }
4393 }
4394 if (ShowColors == Colors_On ||
4395 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004396 CmdArgs.push_back("-fcolor-diagnostics");
4397
Nico Rieck7857d462013-09-11 00:38:02 +00004398 if (Args.hasArg(options::OPT_fansi_escape_codes))
4399 CmdArgs.push_back("-fansi-escape-codes");
4400
Daniel Dunbardb097022009-06-08 21:13:54 +00004401 if (!Args.hasFlag(options::OPT_fshow_source_location,
4402 options::OPT_fno_show_source_location))
4403 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004404
Douglas Gregor643c9222011-05-21 17:07:29 +00004405 if (!Args.hasFlag(options::OPT_fshow_column,
4406 options::OPT_fno_show_column,
4407 true))
4408 CmdArgs.push_back("-fno-show-column");
4409
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004410 if (!Args.hasFlag(options::OPT_fspell_checking,
4411 options::OPT_fno_spell_checking))
4412 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004413
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004414
Chad Rosierc8e56e82012-12-05 21:08:21 +00004415 // -fno-asm-blocks is default.
4416 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4417 false))
4418 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004419
Steven Wucb0d13f2015-01-16 23:05:28 +00004420 // -fgnu-inline-asm is default.
4421 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4422 options::OPT_fno_gnu_inline_asm, true))
4423 CmdArgs.push_back("-fno-gnu-inline-asm");
4424
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004425 // Enable vectorization per default according to the optimization level
4426 // selected. For optimization levels that want vectorization we use the alias
4427 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004428 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004429 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004430 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004431 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004432 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004433 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004434
Chad Rosier136d67d2014-04-28 19:30:57 +00004435 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004436 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4437 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004438 options::OPT_fslp_vectorize;
4439 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004440 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004441 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004442
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004443 // -fno-slp-vectorize-aggressive is default.
4444 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004445 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004446 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004447
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004448 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4449 A->render(Args, CmdArgs);
4450
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004451 // -fdollars-in-identifiers default varies depending on platform and
4452 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004453 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004454 options::OPT_fno_dollars_in_identifiers)) {
4455 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004456 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004457 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004458 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004459 }
4460
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004461 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4462 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004463 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004464 options::OPT_fno_unit_at_a_time)) {
4465 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004466 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004467 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004468
Eli Friedman055c9702011-11-02 01:53:16 +00004469 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4470 options::OPT_fno_apple_pragma_pack, false))
4471 CmdArgs.push_back("-fapple-pragma-pack");
4472
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004473 // le32-specific flags:
4474 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4475 // by default.
4476 if (getToolChain().getArch() == llvm::Triple::le32) {
4477 CmdArgs.push_back("-fno-math-builtin");
4478 }
4479
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004480 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004481 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004482 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004483#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004484 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004485 (getToolChain().getArch() == llvm::Triple::arm ||
4486 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004487 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4488 CmdArgs.push_back("-fno-builtin-strcat");
4489 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4490 CmdArgs.push_back("-fno-builtin-strcpy");
4491 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004492#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004493
Justin Bognera88f0122014-06-20 22:59:50 +00004494 // Enable rewrite includes if the user's asked for it or if we're generating
4495 // diagnostics.
4496 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4497 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004498 if (Args.hasFlag(options::OPT_frewrite_includes,
4499 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004500 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004501 CmdArgs.push_back("-frewrite-includes");
4502
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004503 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004504 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004505 options::OPT_traditional_cpp)) {
4506 if (isa<PreprocessJobAction>(JA))
4507 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004508 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004509 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004510 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004511
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004512 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004513 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004514
4515 // Handle serialized diagnostics.
4516 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4517 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004518 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004519 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004520
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004521 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4522 CmdArgs.push_back("-fretain-comments-from-system-headers");
4523
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004524 // Forward -fcomment-block-commands to -cc1.
4525 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004526 // Forward -fparse-all-comments to -cc1.
4527 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004528
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004529 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4530 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004531 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004532 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004533 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4534 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004535 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004536
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004537 // We translate this by hand to the -cc1 argument, since nightly test uses
4538 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004539 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004540 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004541 OptDisabled = true;
4542 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004543 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004544 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004545
Bob Wilson23a55f12014-12-21 07:00:00 +00004546 // With -save-temps, we want to save the unoptimized bitcode output from the
4547 // CompileJobAction, so disable optimizations if they are not already
4548 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004549 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004550 isa<CompileJobAction>(JA))
4551 CmdArgs.push_back("-disable-llvm-optzns");
4552
Daniel Dunbard67a3222009-03-30 06:36:42 +00004553 if (Output.getType() == types::TY_Dependencies) {
4554 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004555 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004556 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004557 CmdArgs.push_back(Output.getFilename());
4558 } else {
4559 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004560 }
4561
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004562 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004563 addDashXForInput(Args, II, CmdArgs);
4564
Daniel Dunbarb440f562010-08-02 02:38:21 +00004565 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004566 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004567 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004568 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004569 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004570
Chris Lattnere9d7d782009-11-03 19:50:27 +00004571 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4572
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004573 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004574
4575 // Optionally embed the -cc1 level arguments into the debug info, for build
4576 // analysis.
4577 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004578 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004579 for (const auto &Arg : Args)
4580 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004581
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004582 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004583 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004584 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004585 SmallString<128> EscapedArg;
4586 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004587 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004588 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004589 }
4590 CmdArgs.push_back("-dwarf-debug-flags");
4591 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4592 }
4593
Eric Christopherd3804002013-02-22 20:12:52 +00004594 // Add the split debug info name to the command lines here so we
4595 // can propagate it to the backend.
4596 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004597 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004598 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4599 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004600 const char *SplitDwarfOut;
4601 if (SplitDwarf) {
4602 CmdArgs.push_back("-split-dwarf-file");
4603 SplitDwarfOut = SplitDebugName(Args, Inputs);
4604 CmdArgs.push_back(SplitDwarfOut);
4605 }
4606
4607 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004608 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004609 Output.getType() == types::TY_Object &&
4610 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004611 auto CLCommand =
4612 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4613 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4614 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004615 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004617 }
4618
Daniel Dunbar17731772009-03-23 19:03:36 +00004619
Eric Christopherf1545832013-02-22 23:50:16 +00004620 // Handle the debug info splitting at object creation time if we're
4621 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004622 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004623 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004624 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004625
Roman Divacky178e01602011-02-10 16:52:03 +00004626 if (Arg *A = Args.getLastArg(options::OPT_pg))
4627 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004628 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004629 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004630
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004631 // Claim some arguments which clang supports automatically.
4632
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004633 // -fpch-preprocess is used with gcc to add a special marker in the output to
4634 // include the PCH file. Clang's PTH solution is completely transparent, so we
4635 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004636 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004637
Daniel Dunbar17731772009-03-23 19:03:36 +00004638 // Claim some arguments which clang doesn't support, but we don't
4639 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004640 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4641 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004642
Rafael Espindolab0092d72013-09-04 19:37:35 +00004643 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004644 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004645}
4646
John McCall5fb5df92012-06-20 06:18:46 +00004647/// Add options related to the Objective-C runtime/ABI.
4648///
4649/// Returns true if the runtime is non-fragile.
4650ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4651 ArgStringList &cmdArgs,
4652 RewriteKind rewriteKind) const {
4653 // Look for the controlling runtime option.
4654 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4655 options::OPT_fgnu_runtime,
4656 options::OPT_fobjc_runtime_EQ);
4657
4658 // Just forward -fobjc-runtime= to the frontend. This supercedes
4659 // options about fragility.
4660 if (runtimeArg &&
4661 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4662 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004663 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004664 if (runtime.tryParse(value)) {
4665 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4666 << value;
4667 }
4668
4669 runtimeArg->render(args, cmdArgs);
4670 return runtime;
4671 }
4672
4673 // Otherwise, we'll need the ABI "version". Version numbers are
4674 // slightly confusing for historical reasons:
4675 // 1 - Traditional "fragile" ABI
4676 // 2 - Non-fragile ABI, version 1
4677 // 3 - Non-fragile ABI, version 2
4678 unsigned objcABIVersion = 1;
4679 // If -fobjc-abi-version= is present, use that to set the version.
4680 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004681 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004682 if (value == "1")
4683 objcABIVersion = 1;
4684 else if (value == "2")
4685 objcABIVersion = 2;
4686 else if (value == "3")
4687 objcABIVersion = 3;
4688 else
4689 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4690 << value;
4691 } else {
4692 // Otherwise, determine if we are using the non-fragile ABI.
4693 bool nonFragileABIIsDefault =
4694 (rewriteKind == RK_NonFragile ||
4695 (rewriteKind == RK_None &&
4696 getToolChain().IsObjCNonFragileABIDefault()));
4697 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4698 options::OPT_fno_objc_nonfragile_abi,
4699 nonFragileABIIsDefault)) {
4700 // Determine the non-fragile ABI version to use.
4701#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4702 unsigned nonFragileABIVersion = 1;
4703#else
4704 unsigned nonFragileABIVersion = 2;
4705#endif
4706
4707 if (Arg *abiArg = args.getLastArg(
4708 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004709 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004710 if (value == "1")
4711 nonFragileABIVersion = 1;
4712 else if (value == "2")
4713 nonFragileABIVersion = 2;
4714 else
4715 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4716 << value;
4717 }
4718
4719 objcABIVersion = 1 + nonFragileABIVersion;
4720 } else {
4721 objcABIVersion = 1;
4722 }
4723 }
4724
4725 // We don't actually care about the ABI version other than whether
4726 // it's non-fragile.
4727 bool isNonFragile = objcABIVersion != 1;
4728
4729 // If we have no runtime argument, ask the toolchain for its default runtime.
4730 // However, the rewriter only really supports the Mac runtime, so assume that.
4731 ObjCRuntime runtime;
4732 if (!runtimeArg) {
4733 switch (rewriteKind) {
4734 case RK_None:
4735 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4736 break;
4737 case RK_Fragile:
4738 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4739 break;
4740 case RK_NonFragile:
4741 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4742 break;
4743 }
4744
4745 // -fnext-runtime
4746 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4747 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004748 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004749 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4750
4751 // Otherwise, build for a generic macosx port.
4752 } else {
4753 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4754 }
4755
4756 // -fgnu-runtime
4757 } else {
4758 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004759 // Legacy behaviour is to target the gnustep runtime if we are i
4760 // non-fragile mode or the GCC runtime in fragile mode.
4761 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004762 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004763 else
4764 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004765 }
4766
4767 cmdArgs.push_back(args.MakeArgString(
4768 "-fobjc-runtime=" + runtime.getAsString()));
4769 return runtime;
4770}
4771
Reid Klecknerc542d372014-06-27 17:02:02 +00004772static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4773 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4774 I += HaveDash;
4775 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004776}
Reid Klecknerc542d372014-06-27 17:02:02 +00004777
4778struct EHFlags {
4779 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4780 bool Synch;
4781 bool Asynch;
4782 bool NoExceptC;
4783};
4784
4785/// /EH controls whether to run destructor cleanups when exceptions are
4786/// thrown. There are three modifiers:
4787/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4788/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4789/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4790/// - c: Assume that extern "C" functions are implicitly noexcept. This
4791/// modifier is an optimization, so we ignore it for now.
4792/// The default is /EHs-c-, meaning cleanups are disabled.
4793static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4794 EHFlags EH;
4795 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4796 for (auto EHVal : EHArgs) {
4797 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4798 switch (EHVal[I]) {
4799 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4800 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4801 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4802 default: break;
4803 }
4804 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4805 break;
4806 }
4807 }
4808 return EH;
4809}
4810
Hans Wennborg75958c42013-08-08 00:17:41 +00004811void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4812 unsigned RTOptionID = options::OPT__SLASH_MT;
4813
Hans Wennborgf1a74252013-09-10 20:18:04 +00004814 if (Args.hasArg(options::OPT__SLASH_LDd))
4815 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4816 // but defining _DEBUG is sticky.
4817 RTOptionID = options::OPT__SLASH_MTd;
4818
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004819 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004820 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004821
Hans Wennborg75958c42013-08-08 00:17:41 +00004822 switch(RTOptionID) {
4823 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004824 if (Args.hasArg(options::OPT__SLASH_LDd))
4825 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004826 CmdArgs.push_back("-D_MT");
4827 CmdArgs.push_back("-D_DLL");
4828 CmdArgs.push_back("--dependent-lib=msvcrt");
4829 break;
4830 case options::OPT__SLASH_MDd:
4831 CmdArgs.push_back("-D_DEBUG");
4832 CmdArgs.push_back("-D_MT");
4833 CmdArgs.push_back("-D_DLL");
4834 CmdArgs.push_back("--dependent-lib=msvcrtd");
4835 break;
4836 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004837 if (Args.hasArg(options::OPT__SLASH_LDd))
4838 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004839 CmdArgs.push_back("-D_MT");
4840 CmdArgs.push_back("--dependent-lib=libcmt");
4841 break;
4842 case options::OPT__SLASH_MTd:
4843 CmdArgs.push_back("-D_DEBUG");
4844 CmdArgs.push_back("-D_MT");
4845 CmdArgs.push_back("--dependent-lib=libcmtd");
4846 break;
4847 default:
4848 llvm_unreachable("Unexpected option ID.");
4849 }
4850
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004851 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4852 // users want. The /Za flag to cl.exe turns this off, but it's not
4853 // implemented in clang.
4854 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004855
Hans Wennborg8858a032014-07-21 23:42:07 +00004856 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4857 // would produce interleaved output, so ignore /showIncludes in such cases.
4858 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4859 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4860 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004861
David Majnemerf6072342014-07-01 22:24:56 +00004862 // This controls whether or not we emit RTTI data for polymorphic types.
4863 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4864 /*default=*/false))
4865 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004866
Reid Klecknerc542d372014-06-27 17:02:02 +00004867 const Driver &D = getToolChain().getDriver();
4868 EHFlags EH = parseClangCLEHFlags(D, Args);
4869 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004870 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004871 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004872 CmdArgs.push_back("-fexceptions");
4873 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004874
Hans Wennborge50cec32014-06-13 20:59:54 +00004875 // /EP should expand to -E -P.
4876 if (Args.hasArg(options::OPT__SLASH_EP)) {
4877 CmdArgs.push_back("-E");
4878 CmdArgs.push_back("-P");
4879 }
4880
David Majnemera5b195a2015-02-14 01:35:12 +00004881 unsigned VolatileOptionID;
4882 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4883 getToolChain().getTriple().getArch() == llvm::Triple::x86)
4884 VolatileOptionID = options::OPT__SLASH_volatile_ms;
4885 else
4886 VolatileOptionID = options::OPT__SLASH_volatile_iso;
4887
4888 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
4889 VolatileOptionID = A->getOption().getID();
4890
4891 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
4892 CmdArgs.push_back("-fms-volatile");
4893
David Majnemer86c318f2014-02-11 21:05:00 +00004894 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4895 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4896 if (MostGeneralArg && BestCaseArg)
4897 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4898 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4899
4900 if (MostGeneralArg) {
4901 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4902 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4903 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4904
4905 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4906 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4907 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4908 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4909 << FirstConflict->getAsString(Args)
4910 << SecondConflict->getAsString(Args);
4911
4912 if (SingleArg)
4913 CmdArgs.push_back("-fms-memptr-rep=single");
4914 else if (MultipleArg)
4915 CmdArgs.push_back("-fms-memptr-rep=multiple");
4916 else
4917 CmdArgs.push_back("-fms-memptr-rep=virtual");
4918 }
4919
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004920 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4921 A->render(Args, CmdArgs);
4922
Hans Wennborg81f74482013-09-10 01:07:07 +00004923 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4924 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004925 if (Args.hasArg(options::OPT__SLASH_fallback))
4926 CmdArgs.push_back("msvc-fallback");
4927 else
4928 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004929 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004930}
4931
Hans Wennborg1da044a2014-06-26 19:59:02 +00004932visualstudio::Compile *Clang::getCLFallback() const {
4933 if (!CLFallback)
4934 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4935 return CLFallback.get();
4936}
4937
Daniel Sanders7f933f42015-01-30 17:35:23 +00004938void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
4939 ArgStringList &CmdArgs) const {
4940 StringRef CPUName;
4941 StringRef ABIName;
4942 const llvm::Triple &Triple = getToolChain().getTriple();
4943 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4944
4945 CmdArgs.push_back("-target-abi");
4946 CmdArgs.push_back(ABIName.data());
4947}
4948
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004949void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004950 const InputInfo &Output,
4951 const InputInfoList &Inputs,
4952 const ArgList &Args,
4953 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004954 ArgStringList CmdArgs;
4955
4956 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4957 const InputInfo &Input = Inputs[0];
4958
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004959 // Don't warn about "clang -w -c foo.s"
4960 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004961 // and "clang -emit-llvm -c foo.s"
4962 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004963
Rafael Espindola577637a2015-01-03 00:06:04 +00004964 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00004965
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004966 // Invoke ourselves in -cc1as mode.
4967 //
4968 // FIXME: Implement custom jobs for internal actions.
4969 CmdArgs.push_back("-cc1as");
4970
4971 // Add the "effective" target triple.
4972 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004973 std::string TripleStr =
4974 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004975 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4976
4977 // Set the output mode, we currently only expect to be used as a real
4978 // assembler.
4979 CmdArgs.push_back("-filetype");
4980 CmdArgs.push_back("obj");
4981
Eric Christopher45f2e712012-12-18 00:31:10 +00004982 // Set the main file name, so that debug info works even with
4983 // -save-temps or preprocessed assembly.
4984 CmdArgs.push_back("-main-file-name");
4985 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4986
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004987 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004988 const llvm::Triple &Triple = getToolChain().getTriple();
4989 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004990 if (!CPU.empty()) {
4991 CmdArgs.push_back("-target-cpu");
4992 CmdArgs.push_back(Args.MakeArgString(CPU));
4993 }
4994
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004995 // Add the target features
4996 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004997 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004998
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004999 // Ignore explicit -force_cpusubtype_ALL option.
5000 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005001
Eric Christopherfc3ee562012-01-10 00:38:01 +00005002 // Determine the original source input.
5003 const Action *SourceAction = &JA;
5004 while (SourceAction->getKind() != Action::InputClass) {
5005 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5006 SourceAction = SourceAction->getInputs()[0];
5007 }
5008
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005009 // Forward -g and handle debug info related flags, assuming we are dealing
5010 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005011 if (SourceAction->getType() == types::TY_Asm ||
5012 SourceAction->getType() == types::TY_PP_Asm) {
5013 Args.ClaimAllArgs(options::OPT_g_Group);
5014 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5015 if (!A->getOption().matches(options::OPT_g0))
5016 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005017
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005018 if (Args.hasArg(options::OPT_gdwarf_2))
5019 CmdArgs.push_back("-gdwarf-2");
5020 if (Args.hasArg(options::OPT_gdwarf_3))
5021 CmdArgs.push_back("-gdwarf-3");
5022 if (Args.hasArg(options::OPT_gdwarf_4))
5023 CmdArgs.push_back("-gdwarf-4");
5024
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005025 // Add the -fdebug-compilation-dir flag if needed.
5026 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005027
5028 // Set the AT_producer to the clang version when using the integrated
5029 // assembler on assembly source files.
5030 CmdArgs.push_back("-dwarf-debug-producer");
5031 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005032 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005033
5034 // Optionally embed the -cc1as level arguments into the debug info, for build
5035 // analysis.
5036 if (getToolChain().UseDwarfDebugFlags()) {
5037 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005038 for (const auto &Arg : Args)
5039 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005040
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005041 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005042 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5043 Flags += Exec;
5044 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005045 SmallString<128> EscapedArg;
5046 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005047 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005048 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005049 }
5050 CmdArgs.push_back("-dwarf-debug-flags");
5051 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
5052 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005053
5054 // FIXME: Add -static support, once we have it.
5055
Daniel Sanders7f933f42015-01-30 17:35:23 +00005056 // Add target specific flags.
5057 switch(getToolChain().getArch()) {
5058 default:
5059 break;
5060
5061 case llvm::Triple::mips:
5062 case llvm::Triple::mipsel:
5063 case llvm::Triple::mips64:
5064 case llvm::Triple::mips64el:
5065 AddMIPSTargetArgs(Args, CmdArgs);
5066 break;
5067 }
5068
David Blaikie372d9502014-01-17 03:17:40 +00005069 // Consume all the warning flags. Usually this would be handled more
5070 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5071 // doesn't handle that so rather than warning about unused flags that are
5072 // actually used, we'll lie by omission instead.
5073 // FIXME: Stop lying and consume only the appropriate driver flags
5074 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5075 ie = Args.filtered_end();
5076 it != ie; ++it)
5077 (*it)->claim();
5078
David Blaikie9260ed62013-07-25 21:19:01 +00005079 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5080 getToolChain().getDriver());
5081
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005082 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005083
5084 assert(Output.isFilename() && "Unexpected lipo output.");
5085 CmdArgs.push_back("-o");
5086 CmdArgs.push_back(Output.getFilename());
5087
Daniel Dunbarb440f562010-08-02 02:38:21 +00005088 assert(Input.isFilename() && "Invalid input.");
5089 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005090
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005091 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005092 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005093
5094 // Handle the debug info splitting at object creation time if we're
5095 // creating an object.
5096 // TODO: Currently only works on linux with newer objcopy.
5097 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005098 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005099 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5100 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005101}
5102
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005103void GnuTool::anchor() {}
5104
Daniel Dunbara3246a02009-03-18 08:07:30 +00005105void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005106 const InputInfo &Output,
5107 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005108 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005109 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005110 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005111 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005112
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005113 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005114 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005115 // Don't forward any -g arguments to assembly steps.
5116 if (isa<AssembleJobAction>(JA) &&
5117 A->getOption().matches(options::OPT_g_Group))
5118 continue;
5119
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005120 // Don't forward any -W arguments to assembly and link steps.
5121 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5122 A->getOption().matches(options::OPT_W_Group))
5123 continue;
5124
Daniel Dunbar2da02722009-03-19 07:55:12 +00005125 // It is unfortunate that we have to claim here, as this means
5126 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005127 // platforms using a generic gcc, even if we are just using gcc
5128 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005129 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005130 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005131 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005132 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005133
Daniel Dunbar4e295052010-01-25 22:35:08 +00005134 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005135
5136 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005137 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005138 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005139 CmdArgs.push_back(
5140 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005141 }
5142
Daniel Dunbar5716d872009-05-02 21:41:52 +00005143 // Try to force gcc to match the tool chain we want, if we recognize
5144 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005145 //
5146 // FIXME: The triple class should directly provide the information we want
5147 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005148 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005149 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005150 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005151 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5152 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005153 CmdArgs.push_back("-m64");
5154
Daniel Dunbarb440f562010-08-02 02:38:21 +00005155 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005156 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005157 CmdArgs.push_back(Output.getFilename());
5158 } else {
5159 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005160 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005161 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005162
Tony Linthicum76329bf2011-12-12 21:14:55 +00005163 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5164 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005165
5166 // Only pass -x if gcc will understand it; otherwise hope gcc
5167 // understands the suffix correctly. The main use case this would go
5168 // wrong in is for linker inputs if they happened to have an odd
5169 // suffix; really the only way to get this to happen is a command
5170 // like '-x foobar a.c' which will treat a.c like a linker input.
5171 //
5172 // FIXME: For the linker case specifically, can we safely convert
5173 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005174 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005175 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005176 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5177 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005178 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005179 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005180 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005181 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005182 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005183 else if (II.getType() == types::TY_ModuleFile)
5184 D.Diag(diag::err_drv_no_module_support)
5185 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005186
Daniel Dunbara3246a02009-03-18 08:07:30 +00005187 if (types::canTypeBeUserSpecified(II.getType())) {
5188 CmdArgs.push_back("-x");
5189 CmdArgs.push_back(types::getTypeName(II.getType()));
5190 }
5191
Daniel Dunbarb440f562010-08-02 02:38:21 +00005192 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005193 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005194 else {
5195 const Arg &A = II.getInputArg();
5196
5197 // Reverse translate some rewritten options.
5198 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5199 CmdArgs.push_back("-lstdc++");
5200 continue;
5201 }
5202
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005203 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005204 A.render(Args, CmdArgs);
5205 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005206 }
5207
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005208 const std::string customGCCName = D.getCCCGenericGCCName();
5209 const char *GCCName;
5210 if (!customGCCName.empty())
5211 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005212 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005213 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005214 } else
5215 GCCName = "gcc";
5216
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005217 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005218 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005219 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005220}
5221
Daniel Dunbar4e295052010-01-25 22:35:08 +00005222void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5223 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005224 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005225}
5226
Daniel Dunbar4e295052010-01-25 22:35:08 +00005227void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5228 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005229 const Driver &D = getToolChain().getDriver();
5230
Eric Christophercc7ff502015-01-29 00:56:17 +00005231 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005232 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005233 case types::TY_LLVM_IR:
5234 case types::TY_LTO_IR:
5235 case types::TY_LLVM_BC:
5236 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005237 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005238 break;
5239 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005240 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005241 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005242 case types::TY_Nothing:
5243 CmdArgs.push_back("-fsyntax-only");
5244 break;
5245 default:
5246 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005247 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005248}
5249
Daniel Dunbar4e295052010-01-25 22:35:08 +00005250void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5251 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005252 // The types are (hopefully) good enough.
5253}
5254
Tony Linthicum76329bf2011-12-12 21:14:55 +00005255// Hexagon tools start.
5256void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5257 ArgStringList &CmdArgs) const {
5258
5259}
5260void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5261 const InputInfo &Output,
5262 const InputInfoList &Inputs,
5263 const ArgList &Args,
5264 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005265 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005266
5267 const Driver &D = getToolChain().getDriver();
5268 ArgStringList CmdArgs;
5269
5270 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005271 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005272 CmdArgs.push_back(Args.MakeArgString(MarchString));
5273
5274 RenderExtraToolArgs(JA, CmdArgs);
5275
5276 if (Output.isFilename()) {
5277 CmdArgs.push_back("-o");
5278 CmdArgs.push_back(Output.getFilename());
5279 } else {
5280 assert(Output.isNothing() && "Unexpected output");
5281 CmdArgs.push_back("-fsyntax-only");
5282 }
5283
Matthew Curtise8f80a12012-12-06 17:49:03 +00005284 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5285 if (!SmallDataThreshold.empty())
5286 CmdArgs.push_back(
5287 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005288
Matthew Curtise5df3812012-12-07 17:23:04 +00005289 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5290 options::OPT_Xassembler);
5291
Tony Linthicum76329bf2011-12-12 21:14:55 +00005292 // Only pass -x if gcc will understand it; otherwise hope gcc
5293 // understands the suffix correctly. The main use case this would go
5294 // wrong in is for linker inputs if they happened to have an odd
5295 // suffix; really the only way to get this to happen is a command
5296 // like '-x foobar a.c' which will treat a.c like a linker input.
5297 //
5298 // FIXME: For the linker case specifically, can we safely convert
5299 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005300 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005301 // Don't try to pass LLVM or AST inputs to a generic gcc.
5302 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5303 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5304 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5305 << getToolChain().getTripleString();
5306 else if (II.getType() == types::TY_AST)
5307 D.Diag(clang::diag::err_drv_no_ast_support)
5308 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005309 else if (II.getType() == types::TY_ModuleFile)
5310 D.Diag(diag::err_drv_no_module_support)
5311 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005312
5313 if (II.isFilename())
5314 CmdArgs.push_back(II.getFilename());
5315 else
5316 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5317 II.getInputArg().render(Args, CmdArgs);
5318 }
5319
5320 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005321 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005322 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005323}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005324
Tony Linthicum76329bf2011-12-12 21:14:55 +00005325void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5326 ArgStringList &CmdArgs) const {
5327 // The types are (hopefully) good enough.
5328}
5329
5330void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5331 const InputInfo &Output,
5332 const InputInfoList &Inputs,
5333 const ArgList &Args,
5334 const char *LinkingOutput) const {
5335
Matthew Curtise689b052012-12-06 15:46:07 +00005336 const toolchains::Hexagon_TC& ToolChain =
5337 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5338 const Driver &D = ToolChain.getDriver();
5339
Tony Linthicum76329bf2011-12-12 21:14:55 +00005340 ArgStringList CmdArgs;
5341
Matthew Curtise689b052012-12-06 15:46:07 +00005342 //----------------------------------------------------------------------------
5343 //
5344 //----------------------------------------------------------------------------
5345 bool hasStaticArg = Args.hasArg(options::OPT_static);
5346 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005347 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005348 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5349 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5350 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5351 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005352
Matthew Curtise689b052012-12-06 15:46:07 +00005353 //----------------------------------------------------------------------------
5354 // Silence warnings for various options
5355 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005356
Matthew Curtise689b052012-12-06 15:46:07 +00005357 Args.ClaimAllArgs(options::OPT_g_Group);
5358 Args.ClaimAllArgs(options::OPT_emit_llvm);
5359 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5360 // handled somewhere else.
5361 Args.ClaimAllArgs(options::OPT_static_libgcc);
5362
5363 //----------------------------------------------------------------------------
5364 //
5365 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005366 for (const auto &Opt : ToolChain.ExtraOpts)
5367 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005368
Matthew Curtisf10a5952012-12-06 14:16:43 +00005369 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5370 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005371
Matthew Curtise689b052012-12-06 15:46:07 +00005372 if (buildingLib) {
5373 CmdArgs.push_back("-shared");
5374 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5375 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005376 }
5377
Matthew Curtise689b052012-12-06 15:46:07 +00005378 if (hasStaticArg)
5379 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005380
Matthew Curtise8f80a12012-12-06 17:49:03 +00005381 if (buildPIE && !buildingLib)
5382 CmdArgs.push_back("-pie");
5383
5384 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5385 if (!SmallDataThreshold.empty()) {
5386 CmdArgs.push_back(
5387 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5388 }
5389
Matthew Curtise689b052012-12-06 15:46:07 +00005390 //----------------------------------------------------------------------------
5391 //
5392 //----------------------------------------------------------------------------
5393 CmdArgs.push_back("-o");
5394 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005395
Matthew Curtise689b052012-12-06 15:46:07 +00005396 const std::string MarchSuffix = "/" + MarchString;
5397 const std::string G0Suffix = "/G0";
5398 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005399 const std::string RootDir =
5400 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005401 const std::string StartFilesDir = RootDir
5402 + "hexagon/lib"
5403 + (buildingLib
5404 ? MarchG0Suffix : MarchSuffix);
5405
5406 //----------------------------------------------------------------------------
5407 // moslib
5408 //----------------------------------------------------------------------------
5409 std::vector<std::string> oslibs;
5410 bool hasStandalone= false;
5411
5412 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5413 ie = Args.filtered_end(); it != ie; ++it) {
5414 (*it)->claim();
5415 oslibs.push_back((*it)->getValue());
5416 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005417 }
Matthew Curtise689b052012-12-06 15:46:07 +00005418 if (oslibs.empty()) {
5419 oslibs.push_back("standalone");
5420 hasStandalone = true;
5421 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005422
Matthew Curtise689b052012-12-06 15:46:07 +00005423 //----------------------------------------------------------------------------
5424 // Start Files
5425 //----------------------------------------------------------------------------
5426 if (incStdLib && incStartFiles) {
5427
5428 if (!buildingLib) {
5429 if (hasStandalone) {
5430 CmdArgs.push_back(
5431 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5432 }
5433 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5434 }
5435 std::string initObj = useShared ? "/initS.o" : "/init.o";
5436 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5437 }
5438
5439 //----------------------------------------------------------------------------
5440 // Library Search Paths
5441 //----------------------------------------------------------------------------
5442 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005443 for (const auto &LibPath : LibPaths)
5444 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005445
5446 //----------------------------------------------------------------------------
5447 //
5448 //----------------------------------------------------------------------------
5449 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5450 Args.AddAllArgs(CmdArgs, options::OPT_e);
5451 Args.AddAllArgs(CmdArgs, options::OPT_s);
5452 Args.AddAllArgs(CmdArgs, options::OPT_t);
5453 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5454
5455 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5456
5457 //----------------------------------------------------------------------------
5458 // Libraries
5459 //----------------------------------------------------------------------------
5460 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005461 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005462 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5463 CmdArgs.push_back("-lm");
5464 }
5465
5466 CmdArgs.push_back("--start-group");
5467
5468 if (!buildingLib) {
5469 for(std::vector<std::string>::iterator i = oslibs.begin(),
5470 e = oslibs.end(); i != e; ++i)
5471 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5472 CmdArgs.push_back("-lc");
5473 }
5474 CmdArgs.push_back("-lgcc");
5475
5476 CmdArgs.push_back("--end-group");
5477 }
5478
5479 //----------------------------------------------------------------------------
5480 // End files
5481 //----------------------------------------------------------------------------
5482 if (incStdLib && incStartFiles) {
5483 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5484 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5485 }
5486
5487 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005488 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5489 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005490}
5491// Hexagon tools end.
5492
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005493/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005494const char *arm::getARMCPUForMArch(const ArgList &Args,
5495 const llvm::Triple &Triple) {
5496 StringRef MArch;
5497 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5498 // Otherwise, if we have -march= choose the base CPU for that arch.
5499 MArch = A->getValue();
5500 } else {
5501 // Otherwise, use the Arch from the triple.
5502 MArch = Triple.getArchName();
5503 }
5504
5505 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005506 if (MArch == "native") {
5507 std::string CPU = llvm::sys::getHostCPUName();
5508 if (CPU != "generic") {
5509 // Translate the native cpu into the architecture. The switch below will
5510 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005511 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005512 }
5513 }
5514
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005515 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005516}
5517
5518/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005519StringRef arm::getARMTargetCPU(const ArgList &Args,
5520 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005521 // FIXME: Warn on inconsistent use of -mcpu and -march.
5522 // If we have -mcpu=, use that.
5523 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5524 StringRef MCPU = A->getValue();
5525 // Handle -mcpu=native.
5526 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005527 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005528 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005529 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005530 }
5531
5532 return getARMCPUForMArch(Args, Triple);
5533}
5534
5535/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5536/// CPU.
5537//
5538// FIXME: This is redundant with -mcpu, why does LLVM use this.
5539// FIXME: tblgen this, or kill it!
5540const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5541 return llvm::StringSwitch<const char *>(CPU)
5542 .Case("strongarm", "v4")
5543 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5544 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5545 .Cases("arm920", "arm920t", "arm922t", "v4t")
5546 .Cases("arm940t", "ep9312","v4t")
5547 .Cases("arm10tdmi", "arm1020t", "v5")
5548 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5549 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5550 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5551 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5552 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5553 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005554 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005555 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bradley Smithd86d6702015-02-18 10:34:48 +00005556 .Cases("cortex-r4", "cortex-r5", "cortex-r7", "v7r")
5557 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5558 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005559 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005560 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005561 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005562 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005563 .Default("");
5564}
5565
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005566void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5567 if (Args.hasArg(options::OPT_r))
5568 return;
5569
5570 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5571 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5572 .Cases("v4", "v4t", "v5", "v5e", nullptr)
5573 .Cases("v6", "v6t2", nullptr)
5574 .Default("--be8");
5575
5576 if (LinkFlag)
5577 CmdArgs.push_back(LinkFlag);
5578}
5579
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005580bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5581 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5582 return A && (A->getValue() == StringRef(Value));
5583}
5584
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005585bool mips::isUCLibc(const ArgList &Args) {
5586 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005587 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005588}
5589
Daniel Sanders2bf13662014-07-10 14:40:57 +00005590bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005591 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5592 return llvm::StringSwitch<bool>(NaNArg->getValue())
5593 .Case("2008", true)
5594 .Case("legacy", false)
5595 .Default(false);
5596
5597 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005598 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5599 .Cases("mips32r6", "mips64r6", true)
5600 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005601
5602 return false;
5603}
5604
Daniel Sanders379d44b2014-07-16 11:52:23 +00005605bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5606 StringRef ABIName) {
5607 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005608 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005609 return false;
5610
5611 if (ABIName != "32")
5612 return false;
5613
5614 return llvm::StringSwitch<bool>(CPUName)
5615 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005616 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5617 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005618 .Default(false);
5619}
5620
Tim Northover157d9112014-01-16 08:48:16 +00005621llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005622 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5623 // archs which Darwin doesn't use.
5624
5625 // The matching this routine does is fairly pointless, since it is neither the
5626 // complete architecture list, nor a reasonable subset. The problem is that
5627 // historically the driver driver accepts this and also ties its -march=
5628 // handling to the architecture name, so we need to be careful before removing
5629 // support for it.
5630
5631 // This code must be kept in sync with Clang's Darwin specific argument
5632 // translation.
5633
5634 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5635 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5636 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5637 .Case("ppc64", llvm::Triple::ppc64)
5638 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5639 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5640 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005641 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005642 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005643 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005644 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005645 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005646 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005647 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005648 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005649 .Case("nvptx", llvm::Triple::nvptx)
5650 .Case("nvptx64", llvm::Triple::nvptx64)
5651 .Case("amdil", llvm::Triple::amdil)
5652 .Case("spir", llvm::Triple::spir)
5653 .Default(llvm::Triple::UnknownArch);
5654}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005655
Tim Northover157d9112014-01-16 08:48:16 +00005656void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5657 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5658 T.setArch(Arch);
5659
5660 if (Str == "x86_64h")
5661 T.setArchName(Str);
5662 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5663 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005664 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005665 }
5666}
5667
Bob Wilsondecc03e2012-11-23 06:14:39 +00005668const char *Clang::getBaseInputName(const ArgList &Args,
5669 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005670 return Args.MakeArgString(
5671 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005672}
5673
Bob Wilsondecc03e2012-11-23 06:14:39 +00005674const char *Clang::getBaseInputStem(const ArgList &Args,
5675 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005676 const char *Str = getBaseInputName(Args, Inputs);
5677
Chris Lattner906bb902011-01-16 08:14:11 +00005678 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005679 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005680
5681 return Str;
5682}
5683
Bob Wilsondecc03e2012-11-23 06:14:39 +00005684const char *Clang::getDependencyFileName(const ArgList &Args,
5685 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005686 // FIXME: Think about this more.
5687 std::string Res;
5688
5689 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005690 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005691 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005692 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005693 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005694 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005695 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005696}
5697
Daniel Dunbarbe220842009-03-20 16:06:39 +00005698void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005699 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005700 const InputInfoList &Inputs,
5701 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005702 const char *LinkingOutput) const {
5703 ArgStringList CmdArgs;
5704
5705 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5706 const InputInfo &Input = Inputs[0];
5707
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005708 // Determine the original source input.
5709 const Action *SourceAction = &JA;
5710 while (SourceAction->getKind() != Action::InputClass) {
5711 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5712 SourceAction = SourceAction->getInputs()[0];
5713 }
5714
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005715 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005716 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005717 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5718 // FIXME: at run-time detect assembler capabilities or rely on version
5719 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005720 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005721 const llvm::Triple &T(getToolChain().getTriple());
5722 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005723 CmdArgs.push_back("-Q");
5724 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005725
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005726 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005727 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005728 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005729 if (Args.hasArg(options::OPT_gstabs))
5730 CmdArgs.push_back("--gstabs");
5731 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005732 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005733 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005734
Daniel Dunbarbe220842009-03-20 16:06:39 +00005735 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005736 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005737
Daniel Dunbar6d484762010-07-22 01:47:22 +00005738 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005739 if (getToolChain().getArch() == llvm::Triple::x86 ||
5740 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005741 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5742 CmdArgs.push_back("-force_cpusubtype_ALL");
5743
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005744 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005745 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005746 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005747 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005748 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005749 CmdArgs.push_back("-static");
5750
Daniel Dunbarbe220842009-03-20 16:06:39 +00005751 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5752 options::OPT_Xassembler);
5753
5754 assert(Output.isFilename() && "Unexpected lipo output.");
5755 CmdArgs.push_back("-o");
5756 CmdArgs.push_back(Output.getFilename());
5757
Daniel Dunbarb440f562010-08-02 02:38:21 +00005758 assert(Input.isFilename() && "Invalid input.");
5759 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005760
5761 // asm_final spec is empty.
5762
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005763 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005764 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005765 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005766}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005767
Tim Northover157d9112014-01-16 08:48:16 +00005768void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005769
Tim Northover157d9112014-01-16 08:48:16 +00005770void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5771 ArgStringList &CmdArgs) const {
5772 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005773
Daniel Dunbarc1964212009-03-26 16:23:12 +00005774 // Derived from darwin_arch spec.
5775 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005776 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005777
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005778 // FIXME: Is this needed anymore?
5779 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005780 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005781}
5782
Bill Wendling3b2000f2012-10-02 18:02:50 +00005783bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5784 // We only need to generate a temp path for LTO if we aren't compiling object
5785 // files. When compiling source files, we run 'dsymutil' after linking. We
5786 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005787 for (const auto &Input : Inputs)
5788 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005789 return true;
5790
5791 return false;
5792}
5793
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005794void darwin::Link::AddLinkArgs(Compilation &C,
5795 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005796 ArgStringList &CmdArgs,
5797 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005798 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005799 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005800
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005801 unsigned Version[3] = { 0, 0, 0 };
5802 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5803 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005804 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005805 Version[1], Version[2], HadExtra) ||
5806 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005807 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005808 << A->getAsString(Args);
5809 }
5810
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005811 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005812 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005813 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5814 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005815
Bob Wilson3d27dad2013-08-02 22:25:34 +00005816 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5817 CmdArgs.push_back("-export_dynamic");
5818
Bob Wilsonb111ec92015-03-02 19:01:14 +00005819 // If we are using App Extension restrictions, pass a flag to the linker
5820 // telling it that the compiled code has been audited.
5821 if (Args.hasFlag(options::OPT_fapplication_extension,
5822 options::OPT_fno_application_extension, false))
5823 CmdArgs.push_back("-application_extension");
5824
Bill Wendling313b6bf2012-11-16 23:03:00 +00005825 // If we are using LTO, then automatically create a temporary file path for
5826 // the linker to use, so that it's lifetime will extend past a possible
5827 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00005828 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
5829 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00005830 const char *TmpPath = C.getArgs().MakeArgString(
5831 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5832 C.addTempFile(TmpPath);
5833 CmdArgs.push_back("-object_path_lto");
5834 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005835 }
5836
Daniel Dunbarc1964212009-03-26 16:23:12 +00005837 // Derived from the "link" spec.
5838 Args.AddAllArgs(CmdArgs, options::OPT_static);
5839 if (!Args.hasArg(options::OPT_static))
5840 CmdArgs.push_back("-dynamic");
5841 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5842 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5843 // here. How do we wish to handle such things?
5844 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005845
Daniel Dunbarc1964212009-03-26 16:23:12 +00005846 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005847 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005848 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005849 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005850
5851 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5852 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5853 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5854
5855 Arg *A;
5856 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5857 (A = Args.getLastArg(options::OPT_current__version)) ||
5858 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005859 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005860 << A->getAsString(Args) << "-dynamiclib";
5861
5862 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5863 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5864 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5865 } else {
5866 CmdArgs.push_back("-dylib");
5867
5868 Arg *A;
5869 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5870 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5871 (A = Args.getLastArg(options::OPT_client__name)) ||
5872 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5873 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5874 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005875 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005876 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005877
Daniel Dunbarc1964212009-03-26 16:23:12 +00005878 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5879 "-dylib_compatibility_version");
5880 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5881 "-dylib_current_version");
5882
Tim Northover157d9112014-01-16 08:48:16 +00005883 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005884
5885 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5886 "-dylib_install_name");
5887 }
5888
5889 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5890 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5891 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005892 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005893 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005894 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5895 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5896 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5897 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5898 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5899 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005900 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005901 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5902 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5903 Args.AddAllArgs(CmdArgs, options::OPT_init);
5904
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005905 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005906 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005907
Daniel Dunbarc1964212009-03-26 16:23:12 +00005908 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5909 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5910 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5911 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5912 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005913
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005914 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5915 options::OPT_fno_pie,
5916 options::OPT_fno_PIE)) {
5917 if (A->getOption().matches(options::OPT_fpie) ||
5918 A->getOption().matches(options::OPT_fPIE))
5919 CmdArgs.push_back("-pie");
5920 else
5921 CmdArgs.push_back("-no_pie");
5922 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005923
5924 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5925 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5926 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5927 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5928 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5929 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5930 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5931 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5932 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5933 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5934 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5935 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5936 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5937 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5938 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5939 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005940
Daniel Dunbar84384642011-05-02 21:03:47 +00005941 // Give --sysroot= preference, over the Apple specific behavior to also use
5942 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005943 StringRef sysroot = C.getSysRoot();
5944 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005945 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005946 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005947 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5948 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005949 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005950 }
5951
Daniel Dunbarc1964212009-03-26 16:23:12 +00005952 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5953 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5954 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5955 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5956 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005957 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005958 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5959 Args.AddAllArgs(CmdArgs, options::OPT_y);
5960 Args.AddLastArg(CmdArgs, options::OPT_w);
5961 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5962 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5963 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5964 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5965 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5966 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5967 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5968 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5969 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5970 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5971 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5972 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5973}
5974
Alexey Bataev186b28a2014-03-06 05:43:53 +00005975enum LibOpenMP {
5976 LibUnknown,
5977 LibGOMP,
5978 LibIOMP5
5979};
5980
Daniel Dunbarc1964212009-03-26 16:23:12 +00005981void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005982 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005983 const InputInfoList &Inputs,
5984 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005985 const char *LinkingOutput) const {
5986 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005987
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005988 // If the number of arguments surpasses the system limits, we will encode the
5989 // input files in a separate file, shortening the command line. To this end,
5990 // build a list of input file names that can be passed via a file with the
5991 // -filelist linker option.
5992 llvm::opt::ArgStringList InputFileList;
5993
Daniel Dunbarc1964212009-03-26 16:23:12 +00005994 // The logic here is derived from gcc's behavior; most of which
5995 // comes from specs (starting with link_command). Consult gcc for
5996 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005997 ArgStringList CmdArgs;
5998
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005999 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6000 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6001 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006002 for (const auto &Arg : Args)
6003 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006004 const char *Exec =
6005 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6006 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006007 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006008 return;
6009 }
6010
Daniel Dunbarc1964212009-03-26 16:23:12 +00006011 // I'm not sure why this particular decomposition exists in gcc, but
6012 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006013 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006014
Daniel Dunbarc1964212009-03-26 16:23:12 +00006015 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6016 Args.AddAllArgs(CmdArgs, options::OPT_s);
6017 Args.AddAllArgs(CmdArgs, options::OPT_t);
6018 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6019 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006020 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006021 Args.AddAllArgs(CmdArgs, options::OPT_r);
6022
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006023 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6024 // members of static archive libraries which implement Objective-C classes or
6025 // categories.
6026 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6027 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006028
Daniel Dunbarc1964212009-03-26 16:23:12 +00006029 CmdArgs.push_back("-o");
6030 CmdArgs.push_back(Output.getFilename());
6031
Chad Rosier06fd3c62012-05-16 23:45:12 +00006032 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006033 !Args.hasArg(options::OPT_nostartfiles))
6034 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006035
6036 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006037
Alexey Bataev186b28a2014-03-06 05:43:53 +00006038 LibOpenMP UsedOpenMPLib = LibUnknown;
6039 if (Args.hasArg(options::OPT_fopenmp)) {
6040 UsedOpenMPLib = LibGOMP;
6041 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6042 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6043 .Case("libgomp", LibGOMP)
6044 .Case("libiomp5", LibIOMP5)
6045 .Default(LibUnknown);
6046 if (UsedOpenMPLib == LibUnknown)
6047 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6048 << A->getOption().getName() << A->getValue();
6049 }
6050 switch (UsedOpenMPLib) {
6051 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006052 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006053 break;
6054 case LibIOMP5:
6055 CmdArgs.push_back("-liomp5");
6056 break;
6057 case LibUnknown:
6058 break;
6059 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006060
Douglas Gregor9295df02012-05-15 21:00:27 +00006061 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006062 // Build the input file for -filelist (list of linker input files) in case we
6063 // need it later
6064 for (const auto &II : Inputs) {
6065 if (!II.isFilename()) {
6066 // This is a linker input argument.
6067 // We cannot mix input arguments and file names in a -filelist input, thus
6068 // we prematurely stop our list (remaining files shall be passed as
6069 // arguments).
6070 if (InputFileList.size() > 0)
6071 break;
6072
6073 continue;
6074 }
6075
6076 InputFileList.push_back(II.getFilename());
6077 }
6078
Bob Wilson16d93952012-05-15 18:57:39 +00006079 if (isObjCRuntimeLinked(Args) &&
6080 !Args.hasArg(options::OPT_nostdlib) &&
6081 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006082 // We use arclite library for both ARC and subscripting support.
6083 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6084
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006085 CmdArgs.push_back("-framework");
6086 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006087 // Link libobj.
6088 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006089 }
John McCall31168b02011-06-15 23:02:42 +00006090
Daniel Dunbarc1964212009-03-26 16:23:12 +00006091 if (LinkingOutput) {
6092 CmdArgs.push_back("-arch_multiple");
6093 CmdArgs.push_back("-final_output");
6094 CmdArgs.push_back(LinkingOutput);
6095 }
6096
Daniel Dunbarc1964212009-03-26 16:23:12 +00006097 if (Args.hasArg(options::OPT_fnested_functions))
6098 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006099
Daniel Dunbarc1964212009-03-26 16:23:12 +00006100 if (!Args.hasArg(options::OPT_nostdlib) &&
6101 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006102 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006103 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006104
Daniel Dunbarc1964212009-03-26 16:23:12 +00006105 // link_ssp spec is empty.
6106
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006107 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006108 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006109 }
6110
Chad Rosier06fd3c62012-05-16 23:45:12 +00006111 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006112 !Args.hasArg(options::OPT_nostartfiles)) {
6113 // endfile_spec is empty.
6114 }
6115
6116 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6117 Args.AddAllArgs(CmdArgs, options::OPT_F);
6118
Steven Wu3ffb61b2015-02-06 18:08:29 +00006119 // -iframework should be forwarded as -F.
6120 for (auto it = Args.filtered_begin(options::OPT_iframework),
6121 ie = Args.filtered_end(); it != ie; ++it)
6122 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6123 (*it)->getValue()));
6124
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006125 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006126 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006127 std::unique_ptr<Command> Cmd =
6128 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6129 Cmd->setInputFileList(std::move(InputFileList));
6130 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006131}
6132
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006133void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006134 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006135 const InputInfoList &Inputs,
6136 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006137 const char *LinkingOutput) const {
6138 ArgStringList CmdArgs;
6139
6140 CmdArgs.push_back("-create");
6141 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006142
6143 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006144 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006145
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006146 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006147 assert(II.isFilename() && "Unexpected lipo input.");
6148 CmdArgs.push_back(II.getFilename());
6149 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006150
6151 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006152 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006153}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006154
Daniel Dunbar88299622010-06-04 18:28:36 +00006155void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006156 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006157 const InputInfoList &Inputs,
6158 const ArgList &Args,
6159 const char *LinkingOutput) const {
6160 ArgStringList CmdArgs;
6161
Daniel Dunbareb86b042011-05-09 17:23:16 +00006162 CmdArgs.push_back("-o");
6163 CmdArgs.push_back(Output.getFilename());
6164
Daniel Dunbar88299622010-06-04 18:28:36 +00006165 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6166 const InputInfo &Input = Inputs[0];
6167 assert(Input.isFilename() && "Unexpected dsymutil input.");
6168 CmdArgs.push_back(Input.getFilename());
6169
Daniel Dunbar88299622010-06-04 18:28:36 +00006170 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006171 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006172 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006173}
6174
Eric Christopher551ef452011-08-23 17:56:55 +00006175void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006176 const InputInfo &Output,
6177 const InputInfoList &Inputs,
6178 const ArgList &Args,
6179 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006180 ArgStringList CmdArgs;
6181 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006182 CmdArgs.push_back("--debug-info");
6183 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006184 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006185
6186 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6187 const InputInfo &Input = Inputs[0];
6188 assert(Input.isFilename() && "Unexpected verify input");
6189
6190 // Grabbing the output of the earlier dsymutil run.
6191 CmdArgs.push_back(Input.getFilename());
6192
6193 const char *Exec =
6194 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006195 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006196}
6197
David Chisnallf571cde2012-02-15 13:39:01 +00006198void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6199 const InputInfo &Output,
6200 const InputInfoList &Inputs,
6201 const ArgList &Args,
6202 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006203 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006204 ArgStringList CmdArgs;
6205
6206 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6207 options::OPT_Xassembler);
6208
6209 CmdArgs.push_back("-o");
6210 CmdArgs.push_back(Output.getFilename());
6211
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006212 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006213 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006214
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006215 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006216 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006217}
6218
David Chisnallf571cde2012-02-15 13:39:01 +00006219void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6220 const InputInfo &Output,
6221 const InputInfoList &Inputs,
6222 const ArgList &Args,
6223 const char *LinkingOutput) const {
6224 // FIXME: Find a real GCC, don't hard-code versions here
6225 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6226 const llvm::Triple &T = getToolChain().getTriple();
6227 std::string LibPath = "/usr/lib/";
6228 llvm::Triple::ArchType Arch = T.getArch();
6229 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006230 case llvm::Triple::x86:
6231 GCCLibPath +=
6232 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6233 break;
6234 case llvm::Triple::x86_64:
6235 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6236 GCCLibPath += "/4.5.2/amd64/";
6237 LibPath += "amd64/";
6238 break;
6239 default:
6240 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006241 }
6242
6243 ArgStringList CmdArgs;
6244
David Chisnall272a0712012-02-29 15:06:12 +00006245 // Demangle C++ names in errors
6246 CmdArgs.push_back("-C");
6247
David Chisnallf571cde2012-02-15 13:39:01 +00006248 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6249 (!Args.hasArg(options::OPT_shared))) {
6250 CmdArgs.push_back("-e");
6251 CmdArgs.push_back("_start");
6252 }
6253
6254 if (Args.hasArg(options::OPT_static)) {
6255 CmdArgs.push_back("-Bstatic");
6256 CmdArgs.push_back("-dn");
6257 } else {
6258 CmdArgs.push_back("-Bdynamic");
6259 if (Args.hasArg(options::OPT_shared)) {
6260 CmdArgs.push_back("-shared");
6261 } else {
6262 CmdArgs.push_back("--dynamic-linker");
6263 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6264 }
6265 }
6266
6267 if (Output.isFilename()) {
6268 CmdArgs.push_back("-o");
6269 CmdArgs.push_back(Output.getFilename());
6270 } else {
6271 assert(Output.isNothing() && "Invalid output.");
6272 }
6273
6274 if (!Args.hasArg(options::OPT_nostdlib) &&
6275 !Args.hasArg(options::OPT_nostartfiles)) {
6276 if (!Args.hasArg(options::OPT_shared)) {
6277 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6278 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006279 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006280 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6281 } else {
6282 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006283 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6284 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006285 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006286 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006287 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006288 }
6289
6290 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6291
6292 Args.AddAllArgs(CmdArgs, options::OPT_L);
6293 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6294 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006295 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006296
6297 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6298
6299 if (!Args.hasArg(options::OPT_nostdlib) &&
6300 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006301 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006302 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006303 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006304 if (!Args.hasArg(options::OPT_shared)) {
6305 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006306 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006307 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006308 }
David Chisnallf571cde2012-02-15 13:39:01 +00006309 }
6310
6311 if (!Args.hasArg(options::OPT_nostdlib) &&
6312 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006313 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006314 }
David Chisnall96de9932012-02-16 16:00:47 +00006315 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006316
Alexey Samsonov7811d192014-02-20 13:57:37 +00006317 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006318
6319 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006320 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006321 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006322}
6323
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006324void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006325 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006326 const InputInfoList &Inputs,
6327 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006328 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006329 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006330 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006331 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006332
Rafael Espindolacc126272014-02-28 01:55:21 +00006333 switch (getToolChain().getArch()) {
6334 case llvm::Triple::x86:
6335 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6336 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006337 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006338 break;
6339
6340 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006341 CmdArgs.push_back("-mppc");
6342 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006343 break;
6344
6345 case llvm::Triple::sparc:
6346 CmdArgs.push_back("-32");
6347 NeedsKPIC = true;
6348 break;
6349
6350 case llvm::Triple::sparcv9:
6351 CmdArgs.push_back("-64");
6352 CmdArgs.push_back("-Av9a");
6353 NeedsKPIC = true;
6354 break;
6355
6356 case llvm::Triple::mips64:
6357 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006358 StringRef CPUName;
6359 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006360 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006361
6362 CmdArgs.push_back("-mabi");
6363 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6364
6365 if (getToolChain().getArch() == llvm::Triple::mips64)
6366 CmdArgs.push_back("-EB");
6367 else
6368 CmdArgs.push_back("-EL");
6369
Rafael Espindolacc126272014-02-28 01:55:21 +00006370 NeedsKPIC = true;
6371 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006372 }
6373
Rafael Espindolacc126272014-02-28 01:55:21 +00006374 default:
6375 break;
6376 }
6377
6378 if (NeedsKPIC)
6379 addAssemblerKPIC(Args, CmdArgs);
6380
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006381 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6382 options::OPT_Xassembler);
6383
6384 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006385 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006386
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006387 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006388 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006389
6390 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006391 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006392 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006393}
6394
6395void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006396 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006397 const InputInfoList &Inputs,
6398 const ArgList &Args,
6399 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006400 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006401 ArgStringList CmdArgs;
6402
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006403 // Silence warning for "clang -g foo.o -o foo"
6404 Args.ClaimAllArgs(options::OPT_g_Group);
6405 // and "clang -emit-llvm foo.o -o foo"
6406 Args.ClaimAllArgs(options::OPT_emit_llvm);
6407 // and for "clang -w foo.o -o foo". Other warning options are already
6408 // handled somewhere else.
6409 Args.ClaimAllArgs(options::OPT_w);
6410
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006411 if (getToolChain().getArch() == llvm::Triple::mips64)
6412 CmdArgs.push_back("-EB");
6413 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6414 CmdArgs.push_back("-EL");
6415
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006416 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006417 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006418 CmdArgs.push_back("-e");
6419 CmdArgs.push_back("__start");
6420 }
6421
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006422 if (Args.hasArg(options::OPT_static)) {
6423 CmdArgs.push_back("-Bstatic");
6424 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006425 if (Args.hasArg(options::OPT_rdynamic))
6426 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006427 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006428 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006429 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006430 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006431 } else {
6432 CmdArgs.push_back("-dynamic-linker");
6433 CmdArgs.push_back("/usr/libexec/ld.so");
6434 }
6435 }
6436
Rafael Espindola044f7832013-06-05 04:28:55 +00006437 if (Args.hasArg(options::OPT_nopie))
6438 CmdArgs.push_back("-nopie");
6439
Daniel Dunbarb440f562010-08-02 02:38:21 +00006440 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006441 CmdArgs.push_back("-o");
6442 CmdArgs.push_back(Output.getFilename());
6443 } else {
6444 assert(Output.isNothing() && "Invalid output.");
6445 }
6446
6447 if (!Args.hasArg(options::OPT_nostdlib) &&
6448 !Args.hasArg(options::OPT_nostartfiles)) {
6449 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006450 if (Args.hasArg(options::OPT_pg))
6451 CmdArgs.push_back(Args.MakeArgString(
6452 getToolChain().GetFilePath("gcrt0.o")));
6453 else
6454 CmdArgs.push_back(Args.MakeArgString(
6455 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006456 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006457 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006458 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006459 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006460 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006461 }
6462 }
6463
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006464 std::string Triple = getToolChain().getTripleString();
6465 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006466 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006467 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006468 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006469
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006470 Args.AddAllArgs(CmdArgs, options::OPT_L);
6471 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6472 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006473 Args.AddAllArgs(CmdArgs, options::OPT_s);
6474 Args.AddAllArgs(CmdArgs, options::OPT_t);
6475 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6476 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006477
Daniel Dunbar54423b22010-09-17 00:24:54 +00006478 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006479
6480 if (!Args.hasArg(options::OPT_nostdlib) &&
6481 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006482 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006483 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006484 if (Args.hasArg(options::OPT_pg))
6485 CmdArgs.push_back("-lm_p");
6486 else
6487 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006488 }
6489
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006490 // FIXME: For some reason GCC passes -lgcc before adding
6491 // the default system libraries. Just mimic this for now.
6492 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006493
Eric Christopher17674ec2012-09-13 06:32:34 +00006494 if (Args.hasArg(options::OPT_pthread)) {
6495 if (!Args.hasArg(options::OPT_shared) &&
6496 Args.hasArg(options::OPT_pg))
6497 CmdArgs.push_back("-lpthread_p");
6498 else
6499 CmdArgs.push_back("-lpthread");
6500 }
6501
Chandler Carruth45661652011-12-17 22:32:42 +00006502 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006503 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006504 CmdArgs.push_back("-lc_p");
6505 else
6506 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006507 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006508
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006509 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006510 }
6511
6512 if (!Args.hasArg(options::OPT_nostdlib) &&
6513 !Args.hasArg(options::OPT_nostartfiles)) {
6514 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006515 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006516 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006517 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006518 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006519 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006520 }
6521
6522 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006523 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006524 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006525}
Ed Schoutene33194b2009-04-02 19:13:12 +00006526
Eli Friedman9fa28852012-08-08 23:57:20 +00006527void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6528 const InputInfo &Output,
6529 const InputInfoList &Inputs,
6530 const ArgList &Args,
6531 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006532 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006533 ArgStringList CmdArgs;
6534
6535 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6536 options::OPT_Xassembler);
6537
6538 CmdArgs.push_back("-o");
6539 CmdArgs.push_back(Output.getFilename());
6540
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006541 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006542 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006543
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006544 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006545 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006546}
6547
6548void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6549 const InputInfo &Output,
6550 const InputInfoList &Inputs,
6551 const ArgList &Args,
6552 const char *LinkingOutput) const {
6553 const Driver &D = getToolChain().getDriver();
6554 ArgStringList CmdArgs;
6555
6556 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6557 (!Args.hasArg(options::OPT_shared))) {
6558 CmdArgs.push_back("-e");
6559 CmdArgs.push_back("__start");
6560 }
6561
6562 if (Args.hasArg(options::OPT_static)) {
6563 CmdArgs.push_back("-Bstatic");
6564 } else {
6565 if (Args.hasArg(options::OPT_rdynamic))
6566 CmdArgs.push_back("-export-dynamic");
6567 CmdArgs.push_back("--eh-frame-hdr");
6568 CmdArgs.push_back("-Bdynamic");
6569 if (Args.hasArg(options::OPT_shared)) {
6570 CmdArgs.push_back("-shared");
6571 } else {
6572 CmdArgs.push_back("-dynamic-linker");
6573 CmdArgs.push_back("/usr/libexec/ld.so");
6574 }
6575 }
6576
6577 if (Output.isFilename()) {
6578 CmdArgs.push_back("-o");
6579 CmdArgs.push_back(Output.getFilename());
6580 } else {
6581 assert(Output.isNothing() && "Invalid output.");
6582 }
6583
6584 if (!Args.hasArg(options::OPT_nostdlib) &&
6585 !Args.hasArg(options::OPT_nostartfiles)) {
6586 if (!Args.hasArg(options::OPT_shared)) {
6587 if (Args.hasArg(options::OPT_pg))
6588 CmdArgs.push_back(Args.MakeArgString(
6589 getToolChain().GetFilePath("gcrt0.o")));
6590 else
6591 CmdArgs.push_back(Args.MakeArgString(
6592 getToolChain().GetFilePath("crt0.o")));
6593 CmdArgs.push_back(Args.MakeArgString(
6594 getToolChain().GetFilePath("crtbegin.o")));
6595 } else {
6596 CmdArgs.push_back(Args.MakeArgString(
6597 getToolChain().GetFilePath("crtbeginS.o")));
6598 }
6599 }
6600
6601 Args.AddAllArgs(CmdArgs, options::OPT_L);
6602 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6603 Args.AddAllArgs(CmdArgs, options::OPT_e);
6604
6605 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6606
6607 if (!Args.hasArg(options::OPT_nostdlib) &&
6608 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006609 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006610 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6611 if (Args.hasArg(options::OPT_pg))
6612 CmdArgs.push_back("-lm_p");
6613 else
6614 CmdArgs.push_back("-lm");
6615 }
6616
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006617 if (Args.hasArg(options::OPT_pthread)) {
6618 if (!Args.hasArg(options::OPT_shared) &&
6619 Args.hasArg(options::OPT_pg))
6620 CmdArgs.push_back("-lpthread_p");
6621 else
6622 CmdArgs.push_back("-lpthread");
6623 }
6624
Eli Friedman9fa28852012-08-08 23:57:20 +00006625 if (!Args.hasArg(options::OPT_shared)) {
6626 if (Args.hasArg(options::OPT_pg))
6627 CmdArgs.push_back("-lc_p");
6628 else
6629 CmdArgs.push_back("-lc");
6630 }
6631
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006632 StringRef MyArch;
6633 switch (getToolChain().getTriple().getArch()) {
6634 case llvm::Triple::arm:
6635 MyArch = "arm";
6636 break;
6637 case llvm::Triple::x86:
6638 MyArch = "i386";
6639 break;
6640 case llvm::Triple::x86_64:
6641 MyArch = "amd64";
6642 break;
6643 default:
6644 llvm_unreachable("Unsupported architecture");
6645 }
6646 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006647 }
6648
6649 if (!Args.hasArg(options::OPT_nostdlib) &&
6650 !Args.hasArg(options::OPT_nostartfiles)) {
6651 if (!Args.hasArg(options::OPT_shared))
6652 CmdArgs.push_back(Args.MakeArgString(
6653 getToolChain().GetFilePath("crtend.o")));
6654 else
6655 CmdArgs.push_back(Args.MakeArgString(
6656 getToolChain().GetFilePath("crtendS.o")));
6657 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006658
6659 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006660 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006661 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006662}
6663
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006664void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006665 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006666 const InputInfoList &Inputs,
6667 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006668 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006669 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006670 ArgStringList CmdArgs;
6671
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006672 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6673 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006674 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006675 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006676 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006677 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006678 else if (getToolChain().getArch() == llvm::Triple::mips ||
6679 getToolChain().getArch() == llvm::Triple::mipsel ||
6680 getToolChain().getArch() == llvm::Triple::mips64 ||
6681 getToolChain().getArch() == llvm::Triple::mips64el) {
6682 StringRef CPUName;
6683 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006684 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006685
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006686 CmdArgs.push_back("-march");
6687 CmdArgs.push_back(CPUName.data());
6688
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006689 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006690 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006691
6692 if (getToolChain().getArch() == llvm::Triple::mips ||
6693 getToolChain().getArch() == llvm::Triple::mips64)
6694 CmdArgs.push_back("-EB");
6695 else
6696 CmdArgs.push_back("-EL");
6697
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006698 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006699 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006700 getToolChain().getArch() == llvm::Triple::armeb ||
6701 getToolChain().getArch() == llvm::Triple::thumb ||
6702 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006703 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006704 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006705 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6706
6707 if (FloatABI == "hard") {
6708 CmdArgs.push_back("-mfpu=vfp");
6709 } else {
6710 CmdArgs.push_back("-mfpu=softvfp");
6711 }
6712
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006713 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006714 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006715 case llvm::Triple::GNUEABI:
6716 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006717 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006718 break;
6719
6720 default:
6721 CmdArgs.push_back("-matpcs");
6722 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006723 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006724 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006725 if (getToolChain().getArch() == llvm::Triple::sparc)
6726 CmdArgs.push_back("-Av8plusa");
6727 else
6728 CmdArgs.push_back("-Av9a");
6729
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006730 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006731 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006732
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006733 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6734 options::OPT_Xassembler);
6735
6736 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006737 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006738
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006739 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006740 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006741
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006742 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006743 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006744}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006745
6746void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006747 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006748 const InputInfoList &Inputs,
6749 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006750 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006751 const toolchains::FreeBSD& ToolChain =
6752 static_cast<const toolchains::FreeBSD&>(getToolChain());
6753 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006754 const bool IsPIE =
6755 !Args.hasArg(options::OPT_shared) &&
6756 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006757 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006758
6759 // Silence warning for "clang -g foo.o -o foo"
6760 Args.ClaimAllArgs(options::OPT_g_Group);
6761 // and "clang -emit-llvm foo.o -o foo"
6762 Args.ClaimAllArgs(options::OPT_emit_llvm);
6763 // and for "clang -w foo.o -o foo". Other warning options are already
6764 // handled somewhere else.
6765 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006766
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006767 if (!D.SysRoot.empty())
6768 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6769
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006770 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006771 CmdArgs.push_back("-pie");
6772
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006773 if (Args.hasArg(options::OPT_static)) {
6774 CmdArgs.push_back("-Bstatic");
6775 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006776 if (Args.hasArg(options::OPT_rdynamic))
6777 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006778 CmdArgs.push_back("--eh-frame-hdr");
6779 if (Args.hasArg(options::OPT_shared)) {
6780 CmdArgs.push_back("-Bshareable");
6781 } else {
6782 CmdArgs.push_back("-dynamic-linker");
6783 CmdArgs.push_back("/libexec/ld-elf.so.1");
6784 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006785 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6786 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006787 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6788 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6789 CmdArgs.push_back("--hash-style=both");
6790 }
6791 }
6792 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006793 }
6794
6795 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6796 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006797 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006798 CmdArgs.push_back("-m");
6799 CmdArgs.push_back("elf_i386_fbsd");
6800 }
6801
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006802 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006803 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006804 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006805 }
6806
Daniel Dunbarb440f562010-08-02 02:38:21 +00006807 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006808 CmdArgs.push_back("-o");
6809 CmdArgs.push_back(Output.getFilename());
6810 } else {
6811 assert(Output.isNothing() && "Invalid output.");
6812 }
6813
6814 if (!Args.hasArg(options::OPT_nostdlib) &&
6815 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006816 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006817 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006818 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006819 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006820 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006821 crt1 = "Scrt1.o";
6822 else
6823 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006824 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006825 if (crt1)
6826 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6827
6828 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6829
Craig Topper92fc2df2014-05-17 16:56:41 +00006830 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006831 if (Args.hasArg(options::OPT_static))
6832 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006833 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006834 crtbegin = "crtbeginS.o";
6835 else
6836 crtbegin = "crtbegin.o";
6837
6838 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006839 }
6840
6841 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006842 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006843 for (const auto &Path : Paths)
6844 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006845 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6846 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006847 Args.AddAllArgs(CmdArgs, options::OPT_s);
6848 Args.AddAllArgs(CmdArgs, options::OPT_t);
6849 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6850 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006851
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006852 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00006853 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006854
Alexey Samsonov52550342014-09-15 19:58:40 +00006855 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006856 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006857
6858 if (!Args.hasArg(options::OPT_nostdlib) &&
6859 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006860 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006861 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006862 if (Args.hasArg(options::OPT_pg))
6863 CmdArgs.push_back("-lm_p");
6864 else
6865 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006866 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006867 if (NeedsSanitizerDeps)
6868 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006869 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6870 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006871 if (Args.hasArg(options::OPT_pg))
6872 CmdArgs.push_back("-lgcc_p");
6873 else
6874 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006875 if (Args.hasArg(options::OPT_static)) {
6876 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006877 } else if (Args.hasArg(options::OPT_pg)) {
6878 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006879 } else {
6880 CmdArgs.push_back("--as-needed");
6881 CmdArgs.push_back("-lgcc_s");
6882 CmdArgs.push_back("--no-as-needed");
6883 }
6884
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006885 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006886 if (Args.hasArg(options::OPT_pg))
6887 CmdArgs.push_back("-lpthread_p");
6888 else
6889 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006890 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006891
Roman Divacky66f22762011-02-10 16:59:40 +00006892 if (Args.hasArg(options::OPT_pg)) {
6893 if (Args.hasArg(options::OPT_shared))
6894 CmdArgs.push_back("-lc");
6895 else
6896 CmdArgs.push_back("-lc_p");
6897 CmdArgs.push_back("-lgcc_p");
6898 } else {
6899 CmdArgs.push_back("-lc");
6900 CmdArgs.push_back("-lgcc");
6901 }
6902
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006903 if (Args.hasArg(options::OPT_static)) {
6904 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006905 } else if (Args.hasArg(options::OPT_pg)) {
6906 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006907 } else {
6908 CmdArgs.push_back("--as-needed");
6909 CmdArgs.push_back("-lgcc_s");
6910 CmdArgs.push_back("--no-as-needed");
6911 }
6912 }
6913
6914 if (!Args.hasArg(options::OPT_nostdlib) &&
6915 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006916 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006917 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006918 else
6919 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006920 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006921 }
6922
Alexey Samsonov7811d192014-02-20 13:57:37 +00006923 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006924
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006925 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006926 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006927 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006928}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006929
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006930void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6931 const InputInfo &Output,
6932 const InputInfoList &Inputs,
6933 const ArgList &Args,
6934 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006935 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006936 ArgStringList CmdArgs;
6937
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006938 // GNU as needs different flags for creating the correct output format
6939 // on architectures with different ABIs or optional feature sets.
6940 switch (getToolChain().getArch()) {
6941 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006942 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006943 break;
6944 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006945 case llvm::Triple::armeb:
6946 case llvm::Triple::thumb:
6947 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006948 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006949 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006950 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006951 }
6952
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006953 case llvm::Triple::mips:
6954 case llvm::Triple::mipsel:
6955 case llvm::Triple::mips64:
6956 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006957 StringRef CPUName;
6958 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006959 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006960
6961 CmdArgs.push_back("-march");
6962 CmdArgs.push_back(CPUName.data());
6963
6964 CmdArgs.push_back("-mabi");
6965 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6966
6967 if (getToolChain().getArch() == llvm::Triple::mips ||
6968 getToolChain().getArch() == llvm::Triple::mips64)
6969 CmdArgs.push_back("-EB");
6970 else
6971 CmdArgs.push_back("-EL");
6972
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006973 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006974 break;
6975 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006976
6977 case llvm::Triple::sparc:
6978 CmdArgs.push_back("-32");
6979 addAssemblerKPIC(Args, CmdArgs);
6980 break;
6981
6982 case llvm::Triple::sparcv9:
6983 CmdArgs.push_back("-64");
6984 CmdArgs.push_back("-Av9");
6985 addAssemblerKPIC(Args, CmdArgs);
6986 break;
6987
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006988 default:
6989 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006990 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006991
6992 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6993 options::OPT_Xassembler);
6994
6995 CmdArgs.push_back("-o");
6996 CmdArgs.push_back(Output.getFilename());
6997
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006998 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006999 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007000
David Chisnallddbd68f2011-09-27 22:03:18 +00007001 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007002 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007003}
7004
7005void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7006 const InputInfo &Output,
7007 const InputInfoList &Inputs,
7008 const ArgList &Args,
7009 const char *LinkingOutput) const {
7010 const Driver &D = getToolChain().getDriver();
7011 ArgStringList CmdArgs;
7012
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007013 if (!D.SysRoot.empty())
7014 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7015
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007016 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007017 if (Args.hasArg(options::OPT_static)) {
7018 CmdArgs.push_back("-Bstatic");
7019 } else {
7020 if (Args.hasArg(options::OPT_rdynamic))
7021 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007022 if (Args.hasArg(options::OPT_shared)) {
7023 CmdArgs.push_back("-Bshareable");
7024 } else {
7025 CmdArgs.push_back("-dynamic-linker");
7026 CmdArgs.push_back("/libexec/ld.elf_so");
7027 }
7028 }
7029
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007030 // Many NetBSD architectures support more than one ABI.
7031 // Determine the correct emulation for ld.
7032 switch (getToolChain().getArch()) {
7033 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007034 CmdArgs.push_back("-m");
7035 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007036 break;
7037 case llvm::Triple::arm:
7038 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007039 CmdArgs.push_back("-m");
7040 switch (getToolChain().getTriple().getEnvironment()) {
7041 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007042 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007043 CmdArgs.push_back("armelf_nbsd_eabi");
7044 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007045 case llvm::Triple::EABIHF:
7046 case llvm::Triple::GNUEABIHF:
7047 CmdArgs.push_back("armelf_nbsd_eabihf");
7048 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007049 default:
7050 CmdArgs.push_back("armelf_nbsd");
7051 break;
7052 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007053 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007054 case llvm::Triple::armeb:
7055 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007056 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007057 CmdArgs.push_back("-m");
7058 switch (getToolChain().getTriple().getEnvironment()) {
7059 case llvm::Triple::EABI:
7060 case llvm::Triple::GNUEABI:
7061 CmdArgs.push_back("armelfb_nbsd_eabi");
7062 break;
7063 case llvm::Triple::EABIHF:
7064 case llvm::Triple::GNUEABIHF:
7065 CmdArgs.push_back("armelfb_nbsd_eabihf");
7066 break;
7067 default:
7068 CmdArgs.push_back("armelfb_nbsd");
7069 break;
7070 }
7071 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007072 case llvm::Triple::mips64:
7073 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007074 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007075 CmdArgs.push_back("-m");
7076 if (getToolChain().getArch() == llvm::Triple::mips64)
7077 CmdArgs.push_back("elf32btsmip");
7078 else
7079 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007080 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007081 CmdArgs.push_back("-m");
7082 if (getToolChain().getArch() == llvm::Triple::mips64)
7083 CmdArgs.push_back("elf64btsmip");
7084 else
7085 CmdArgs.push_back("elf64ltsmip");
7086 }
7087 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007088 case llvm::Triple::ppc:
7089 CmdArgs.push_back("-m");
7090 CmdArgs.push_back("elf32ppc_nbsd");
7091 break;
7092
7093 case llvm::Triple::ppc64:
7094 case llvm::Triple::ppc64le:
7095 CmdArgs.push_back("-m");
7096 CmdArgs.push_back("elf64ppc");
7097 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007098
7099 case llvm::Triple::sparc:
7100 CmdArgs.push_back("-m");
7101 CmdArgs.push_back("elf32_sparc");
7102 break;
7103
7104 case llvm::Triple::sparcv9:
7105 CmdArgs.push_back("-m");
7106 CmdArgs.push_back("elf64_sparc");
7107 break;
7108
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007109 default:
7110 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007111 }
7112
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007113 if (Output.isFilename()) {
7114 CmdArgs.push_back("-o");
7115 CmdArgs.push_back(Output.getFilename());
7116 } else {
7117 assert(Output.isNothing() && "Invalid output.");
7118 }
7119
7120 if (!Args.hasArg(options::OPT_nostdlib) &&
7121 !Args.hasArg(options::OPT_nostartfiles)) {
7122 if (!Args.hasArg(options::OPT_shared)) {
7123 CmdArgs.push_back(Args.MakeArgString(
7124 getToolChain().GetFilePath("crt0.o")));
7125 CmdArgs.push_back(Args.MakeArgString(
7126 getToolChain().GetFilePath("crti.o")));
7127 CmdArgs.push_back(Args.MakeArgString(
7128 getToolChain().GetFilePath("crtbegin.o")));
7129 } else {
7130 CmdArgs.push_back(Args.MakeArgString(
7131 getToolChain().GetFilePath("crti.o")));
7132 CmdArgs.push_back(Args.MakeArgString(
7133 getToolChain().GetFilePath("crtbeginS.o")));
7134 }
7135 }
7136
7137 Args.AddAllArgs(CmdArgs, options::OPT_L);
7138 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7139 Args.AddAllArgs(CmdArgs, options::OPT_e);
7140 Args.AddAllArgs(CmdArgs, options::OPT_s);
7141 Args.AddAllArgs(CmdArgs, options::OPT_t);
7142 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7143 Args.AddAllArgs(CmdArgs, options::OPT_r);
7144
7145 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7146
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007147 unsigned Major, Minor, Micro;
7148 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7149 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007150 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007151 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007152 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007153 case llvm::Triple::arm:
7154 case llvm::Triple::armeb:
7155 case llvm::Triple::thumb:
7156 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007157 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007158 case llvm::Triple::ppc64:
7159 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007160 case llvm::Triple::x86:
7161 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007162 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007163 break;
7164 default:
7165 break;
7166 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007167 }
7168
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007169 if (!Args.hasArg(options::OPT_nostdlib) &&
7170 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007171 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007172 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7173 CmdArgs.push_back("-lm");
7174 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007175 if (Args.hasArg(options::OPT_pthread))
7176 CmdArgs.push_back("-lpthread");
7177 CmdArgs.push_back("-lc");
7178
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007179 if (useLibgcc) {
7180 if (Args.hasArg(options::OPT_static)) {
7181 // libgcc_eh depends on libc, so resolve as much as possible,
7182 // pull in any new requirements from libc and then get the rest
7183 // of libgcc.
7184 CmdArgs.push_back("-lgcc_eh");
7185 CmdArgs.push_back("-lc");
7186 CmdArgs.push_back("-lgcc");
7187 } else {
7188 CmdArgs.push_back("-lgcc");
7189 CmdArgs.push_back("--as-needed");
7190 CmdArgs.push_back("-lgcc_s");
7191 CmdArgs.push_back("--no-as-needed");
7192 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007193 }
7194 }
7195
7196 if (!Args.hasArg(options::OPT_nostdlib) &&
7197 !Args.hasArg(options::OPT_nostartfiles)) {
7198 if (!Args.hasArg(options::OPT_shared))
7199 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7200 "crtend.o")));
7201 else
7202 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7203 "crtendS.o")));
7204 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7205 "crtn.o")));
7206 }
7207
Alexey Samsonov7811d192014-02-20 13:57:37 +00007208 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007209
Logan Chieneb9162f2014-06-26 14:23:45 +00007210 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007211 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007212}
7213
Thomas Schwinge4e555262013-03-28 19:04:25 +00007214void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7215 const InputInfo &Output,
7216 const InputInfoList &Inputs,
7217 const ArgList &Args,
7218 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007219 claimNoWarnArgs(Args);
7220
Rafael Espindola92b00932010-08-10 00:25:48 +00007221 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007222 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007223
7224 // Add --32/--64 to make sure we get the format we want.
7225 // This is incomplete
7226 if (getToolChain().getArch() == llvm::Triple::x86) {
7227 CmdArgs.push_back("--32");
7228 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007229 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7230 CmdArgs.push_back("--x32");
7231 else
7232 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007233 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7234 CmdArgs.push_back("-a32");
7235 CmdArgs.push_back("-mppc");
7236 CmdArgs.push_back("-many");
7237 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7238 CmdArgs.push_back("-a64");
7239 CmdArgs.push_back("-mppc64");
7240 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007241 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7242 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007243 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007244 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007245 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007246 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7247 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007248 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007249 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007250 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7251 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007252 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007253 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007254 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7255 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007256 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007257 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7258 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007259 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7260 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007261 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007262
Tim Northover9c7e0352013-12-12 11:55:52 +00007263 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7264 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007265 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007266
7267 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007268
7269 // FIXME: remove krait check when GNU tools support krait cpu
7270 // for now replace it with -march=armv7-a to avoid a lower
7271 // march from being picked in the absence of a cpu flag.
7272 Arg *A;
7273 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7274 StringRef(A->getValue()) == "krait")
7275 CmdArgs.push_back("-march=armv7-a");
7276 else
7277 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007278 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007279 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7280 getToolChain().getArch() == llvm::Triple::mipsel ||
7281 getToolChain().getArch() == llvm::Triple::mips64 ||
7282 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007283 StringRef CPUName;
7284 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007285 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007286 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007287
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007288 CmdArgs.push_back("-march");
7289 CmdArgs.push_back(CPUName.data());
7290
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007291 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007292 CmdArgs.push_back(ABIName.data());
7293
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007294 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7295 // or -mshared (not implemented) is in effect.
7296 bool IsPicOrPie = false;
7297 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7298 options::OPT_fpic, options::OPT_fno_pic,
7299 options::OPT_fPIE, options::OPT_fno_PIE,
7300 options::OPT_fpie, options::OPT_fno_pie)) {
7301 if (A->getOption().matches(options::OPT_fPIC) ||
7302 A->getOption().matches(options::OPT_fpic) ||
7303 A->getOption().matches(options::OPT_fPIE) ||
7304 A->getOption().matches(options::OPT_fpie))
7305 IsPicOrPie = true;
7306 }
7307 if (!IsPicOrPie)
7308 CmdArgs.push_back("-mno-shared");
7309
Daniel Sanders379d44b2014-07-16 11:52:23 +00007310 // LLVM doesn't support -mplt yet and acts as if it is always given.
7311 // However, -mplt has no effect with the N64 ABI.
7312 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007313
7314 if (getToolChain().getArch() == llvm::Triple::mips ||
7315 getToolChain().getArch() == llvm::Triple::mips64)
7316 CmdArgs.push_back("-EB");
7317 else
7318 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007319
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007320 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7321 if (StringRef(A->getValue()) == "2008")
7322 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7323 }
7324
Daniel Sanders379d44b2014-07-16 11:52:23 +00007325 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7326 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7327 options::OPT_mfp64)) {
7328 A->claim();
7329 A->render(Args, CmdArgs);
7330 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7331 ABIName))
7332 CmdArgs.push_back("-mfpxx");
7333
7334 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7335 // -mno-mips16 is actually -no-mips16.
7336 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7337 options::OPT_mno_mips16)) {
7338 if (A->getOption().matches(options::OPT_mips16)) {
7339 A->claim();
7340 A->render(Args, CmdArgs);
7341 } else {
7342 A->claim();
7343 CmdArgs.push_back("-no-mips16");
7344 }
7345 }
7346
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007347 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7348 options::OPT_mno_micromips);
7349 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7350 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7351
Simon Atanasyanbd986632013-11-26 11:58:04 +00007352 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7353 // Do not use AddLastArg because not all versions of MIPS assembler
7354 // support -mmsa / -mno-msa options.
7355 if (A->getOption().matches(options::OPT_mmsa))
7356 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7357 }
7358
Daniel Sanders379d44b2014-07-16 11:52:23 +00007359 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7360 options::OPT_msoft_float);
7361
7362 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7363 options::OPT_mno_odd_spreg);
7364
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007365 NeedsKPIC = true;
7366 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7367 // Always pass an -march option, since our default of z10 is later
7368 // than the GNU assembler's default.
7369 StringRef CPUName = getSystemZTargetCPU(Args);
7370 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7371 }
7372
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007373 if (NeedsKPIC)
7374 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007375
7376 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7377 options::OPT_Xassembler);
7378
7379 CmdArgs.push_back("-o");
7380 CmdArgs.push_back(Output.getFilename());
7381
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007382 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007383 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007384
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007385 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007386 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007387
7388 // Handle the debug info splitting at object creation time if we're
7389 // creating an object.
7390 // TODO: Currently only works on linux with newer objcopy.
7391 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007392 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007393 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7394 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007395}
7396
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007397static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007398 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007399 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007400 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7401 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007402 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007403 CmdArgs.push_back("-lgcc");
7404
Logan Chien3d3373c2012-11-19 12:04:11 +00007405 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007406 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007407 CmdArgs.push_back("-lgcc");
7408 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007409 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007410 CmdArgs.push_back("--as-needed");
7411 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007412 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007413 CmdArgs.push_back("--no-as-needed");
7414 }
7415
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007416 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007417 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007418 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007419 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007420
7421 // According to Android ABI, we have to link with libdl if we are
7422 // linking with non-static libgcc.
7423 //
7424 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7425 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7426 if (isAndroid && !StaticLibgcc)
7427 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007428}
7429
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007430static std::string getLinuxDynamicLinker(const ArgList &Args,
7431 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007432 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7433 if (ToolChain.getTriple().isArch64Bit())
7434 return "/system/bin/linker64";
7435 else
7436 return "/system/bin/linker";
7437 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7438 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007439 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007440 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007441 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007442 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007443 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007444 else if (ToolChain.getArch() == llvm::Triple::arm ||
7445 ToolChain.getArch() == llvm::Triple::thumb) {
7446 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7447 return "/lib/ld-linux-armhf.so.3";
7448 else
7449 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007450 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7451 ToolChain.getArch() == llvm::Triple::thumbeb) {
7452 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7453 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7454 else
7455 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007456 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007457 ToolChain.getArch() == llvm::Triple::mipsel ||
7458 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007459 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007460 StringRef CPUName;
7461 StringRef ABIName;
7462 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7463 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7464
7465 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7466 .Case("o32", "/lib")
7467 .Case("n32", "/lib32")
7468 .Case("n64", "/lib64")
7469 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007470 StringRef LibName;
7471 if (mips::isUCLibc(Args))
7472 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7473 else
7474 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007475
7476 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007477 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7478 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007479 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7480 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7481 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007482 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007483 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7484 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7485 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007486 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007487 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7488 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007489 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7490 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007491 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7492 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7493 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007494 else
7495 return "/lib64/ld-linux-x86-64.so.2";
7496}
7497
Renato Golinc4b49242014-02-13 10:01:16 +00007498static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007499 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007500 // Make use of compiler-rt if --rtlib option is used
7501 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7502
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007503 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007504 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007505 switch (TC.getTriple().getOS()) {
7506 default: llvm_unreachable("unsupported OS");
7507 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007508 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007509 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007510 break;
7511 }
Renato Golinc4b49242014-02-13 10:01:16 +00007512 break;
7513 case ToolChain::RLT_Libgcc:
7514 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7515 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007516 }
7517}
7518
Rafael Espindola1e085772014-08-15 17:14:35 +00007519static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7520 switch (T.getArch()) {
7521 case llvm::Triple::x86:
7522 return "elf_i386";
7523 case llvm::Triple::aarch64:
7524 return "aarch64linux";
7525 case llvm::Triple::aarch64_be:
7526 return "aarch64_be_linux";
7527 case llvm::Triple::arm:
7528 case llvm::Triple::thumb:
7529 return "armelf_linux_eabi";
7530 case llvm::Triple::armeb:
7531 case llvm::Triple::thumbeb:
7532 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7533 case llvm::Triple::ppc:
7534 return "elf32ppclinux";
7535 case llvm::Triple::ppc64:
7536 return "elf64ppc";
7537 case llvm::Triple::ppc64le:
7538 return "elf64lppc";
7539 case llvm::Triple::sparc:
7540 return "elf32_sparc";
7541 case llvm::Triple::sparcv9:
7542 return "elf64_sparc";
7543 case llvm::Triple::mips:
7544 return "elf32btsmip";
7545 case llvm::Triple::mipsel:
7546 return "elf32ltsmip";
7547 case llvm::Triple::mips64:
7548 if (mips::hasMipsAbiArg(Args, "n32"))
7549 return "elf32btsmipn32";
7550 return "elf64btsmip";
7551 case llvm::Triple::mips64el:
7552 if (mips::hasMipsAbiArg(Args, "n32"))
7553 return "elf32ltsmipn32";
7554 return "elf64ltsmip";
7555 case llvm::Triple::systemz:
7556 return "elf64_s390";
7557 case llvm::Triple::x86_64:
7558 if (T.getEnvironment() == llvm::Triple::GNUX32)
7559 return "elf32_x86_64";
7560 return "elf_x86_64";
7561 default:
7562 llvm_unreachable("Unexpected arch");
7563 }
7564}
7565
Thomas Schwinge4e555262013-03-28 19:04:25 +00007566void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7567 const InputInfo &Output,
7568 const InputInfoList &Inputs,
7569 const ArgList &Args,
7570 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007571 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007572 static_cast<const toolchains::Linux&>(getToolChain());
7573 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007574 const bool isAndroid =
7575 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007576 const bool IsPIE =
7577 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007578 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007579 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007580
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007581 ArgStringList CmdArgs;
7582
Rafael Espindolad1002f62010-11-15 18:28:16 +00007583 // Silence warning for "clang -g foo.o -o foo"
7584 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007585 // and "clang -emit-llvm foo.o -o foo"
7586 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007587 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007588 // handled somewhere else.
7589 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007590
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007591 if (!D.SysRoot.empty())
7592 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007593
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007594 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007595 CmdArgs.push_back("-pie");
7596
Rafael Espindola1c76c592010-11-07 22:57:16 +00007597 if (Args.hasArg(options::OPT_rdynamic))
7598 CmdArgs.push_back("-export-dynamic");
7599
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007600 if (Args.hasArg(options::OPT_s))
7601 CmdArgs.push_back("-s");
7602
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007603 if (ToolChain.getArch() == llvm::Triple::armeb ||
7604 ToolChain.getArch() == llvm::Triple::thumbeb)
7605 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7606
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007607 for (const auto &Opt : ToolChain.ExtraOpts)
7608 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007609
7610 if (!Args.hasArg(options::OPT_static)) {
7611 CmdArgs.push_back("--eh-frame-hdr");
7612 }
7613
7614 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007615 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007616
7617 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007618 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007619 ToolChain.getArch() == llvm::Triple::armeb ||
7620 ToolChain.getArch() == llvm::Triple::thumb ||
7621 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007622 CmdArgs.push_back("-Bstatic");
7623 else
7624 CmdArgs.push_back("-static");
7625 } else if (Args.hasArg(options::OPT_shared)) {
7626 CmdArgs.push_back("-shared");
7627 }
7628
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007629 if (ToolChain.getArch() == llvm::Triple::arm ||
7630 ToolChain.getArch() == llvm::Triple::armeb ||
7631 ToolChain.getArch() == llvm::Triple::thumb ||
7632 ToolChain.getArch() == llvm::Triple::thumbeb ||
7633 (!Args.hasArg(options::OPT_static) &&
7634 !Args.hasArg(options::OPT_shared))) {
7635 CmdArgs.push_back("-dynamic-linker");
7636 CmdArgs.push_back(Args.MakeArgString(
7637 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7638 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007639
7640 CmdArgs.push_back("-o");
7641 CmdArgs.push_back(Output.getFilename());
7642
Rafael Espindola81937ec2010-12-01 01:52:43 +00007643 if (!Args.hasArg(options::OPT_nostdlib) &&
7644 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007645 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007646 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007647 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007648 if (Args.hasArg(options::OPT_pg))
7649 crt1 = "gcrt1.o";
7650 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007651 crt1 = "Scrt1.o";
7652 else
7653 crt1 = "crt1.o";
7654 }
7655 if (crt1)
7656 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007657
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007658 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7659 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007660
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007661 const char *crtbegin;
7662 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007663 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007664 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007665 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007666 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007667 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007668 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007669 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007670 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007671
7672 // Add crtfastmath.o if available and fast math is enabled.
7673 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007674 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007675
7676 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007677 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007678
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007679 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007680
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007681 for (const auto &Path : Paths)
7682 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007683
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007684 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007685 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007686
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007687 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7688 CmdArgs.push_back("--no-demangle");
7689
Alexey Samsonov52550342014-09-15 19:58:40 +00007690 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007691 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007692 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007693 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007694
Hans Wennborg70850d82013-07-18 20:29:38 +00007695 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007696 !Args.hasArg(options::OPT_nostdlib) &&
7697 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007698 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7699 !Args.hasArg(options::OPT_static);
7700 if (OnlyLibstdcxxStatic)
7701 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007702 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007703 if (OnlyLibstdcxxStatic)
7704 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007705 CmdArgs.push_back("-lm");
7706 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007707 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7708 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007709
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007710 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007711 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7712 if (Args.hasArg(options::OPT_static))
7713 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007714
Alexey Samsonov52550342014-09-15 19:58:40 +00007715 if (NeedsSanitizerDeps)
7716 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7717
Alexey Bataev186b28a2014-03-06 05:43:53 +00007718 LibOpenMP UsedOpenMPLib = LibUnknown;
7719 if (Args.hasArg(options::OPT_fopenmp)) {
7720 UsedOpenMPLib = LibGOMP;
7721 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7722 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7723 .Case("libgomp", LibGOMP)
7724 .Case("libiomp5", LibIOMP5)
7725 .Default(LibUnknown);
7726 if (UsedOpenMPLib == LibUnknown)
7727 D.Diag(diag::err_drv_unsupported_option_argument)
7728 << A->getOption().getName() << A->getValue();
7729 }
7730 switch (UsedOpenMPLib) {
7731 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007732 CmdArgs.push_back("-lgomp");
7733
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007734 // FIXME: Exclude this for platforms with libgomp that don't require
7735 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007736 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007737 break;
7738 case LibIOMP5:
7739 CmdArgs.push_back("-liomp5");
7740 break;
7741 case LibUnknown:
7742 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007743 }
Renato Golinc4b49242014-02-13 10:01:16 +00007744 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007745
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007746 if ((Args.hasArg(options::OPT_pthread) ||
7747 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7748 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007749 CmdArgs.push_back("-lpthread");
7750
7751 CmdArgs.push_back("-lc");
7752
7753 if (Args.hasArg(options::OPT_static))
7754 CmdArgs.push_back("--end-group");
7755 else
Renato Golinc4b49242014-02-13 10:01:16 +00007756 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007757 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007758
Rafael Espindola81937ec2010-12-01 01:52:43 +00007759 if (!Args.hasArg(options::OPT_nostartfiles)) {
7760 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007761 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007762 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007763 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007764 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007765 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007766 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007767
Rafael Espindola81937ec2010-12-01 01:52:43 +00007768 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007769 if (!isAndroid)
7770 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007771 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007772 }
7773
David Blaikiec11bf802014-09-04 16:04:28 +00007774 C.addCommand(
7775 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007776}
7777
Chris Lattner3e2ee142010-07-07 16:01:42 +00007778void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007779 const InputInfo &Output,
7780 const InputInfoList &Inputs,
7781 const ArgList &Args,
7782 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007783 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007784 ArgStringList CmdArgs;
7785
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007786 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007787
7788 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007789 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007790
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007791 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007792 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007793
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007794 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007795 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007796}
7797
7798void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007799 const InputInfo &Output,
7800 const InputInfoList &Inputs,
7801 const ArgList &Args,
7802 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007803 const Driver &D = getToolChain().getDriver();
7804 ArgStringList CmdArgs;
7805
Daniel Dunbarb440f562010-08-02 02:38:21 +00007806 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007807 CmdArgs.push_back("-o");
7808 CmdArgs.push_back(Output.getFilename());
7809 } else {
7810 assert(Output.isNothing() && "Invalid output.");
7811 }
7812
7813 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007814 !Args.hasArg(options::OPT_nostartfiles)) {
7815 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7816 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7817 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7818 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7819 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007820
7821 Args.AddAllArgs(CmdArgs, options::OPT_L);
7822 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7823 Args.AddAllArgs(CmdArgs, options::OPT_e);
7824
Daniel Dunbar54423b22010-09-17 00:24:54 +00007825 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007826
Alexey Samsonov7811d192014-02-20 13:57:37 +00007827 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007828
Chris Lattner3e2ee142010-07-07 16:01:42 +00007829 if (!Args.hasArg(options::OPT_nostdlib) &&
7830 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007831 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007832 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007833 CmdArgs.push_back("-lm");
7834 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007835 }
7836
7837 if (!Args.hasArg(options::OPT_nostdlib) &&
7838 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007839 if (Args.hasArg(options::OPT_pthread))
7840 CmdArgs.push_back("-lpthread");
7841 CmdArgs.push_back("-lc");
7842 CmdArgs.push_back("-lCompilerRT-Generic");
7843 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7844 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007845 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007846 }
7847
Logan Chieneb9162f2014-06-26 14:23:45 +00007848 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007849 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007850}
7851
Daniel Dunbarcc912342009-05-02 18:28:39 +00007852/// DragonFly Tools
7853
7854// For now, DragonFly Assemble does just about the same as for
7855// FreeBSD, but this may change soon.
7856void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007857 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007858 const InputInfoList &Inputs,
7859 const ArgList &Args,
7860 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007861 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007862 ArgStringList CmdArgs;
7863
7864 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7865 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007866 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007867 CmdArgs.push_back("--32");
7868
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007869 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007870
7871 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007872 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007873
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007874 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007875 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007876
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007877 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007879}
7880
7881void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007882 const InputInfo &Output,
7883 const InputInfoList &Inputs,
7884 const ArgList &Args,
7885 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007886 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007887 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007888 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007889
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007890 if (!D.SysRoot.empty())
7891 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7892
John McCall65b8da02013-04-11 22:55:55 +00007893 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007894 if (Args.hasArg(options::OPT_static)) {
7895 CmdArgs.push_back("-Bstatic");
7896 } else {
John McCall65b8da02013-04-11 22:55:55 +00007897 if (Args.hasArg(options::OPT_rdynamic))
7898 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007899 if (Args.hasArg(options::OPT_shared))
7900 CmdArgs.push_back("-Bshareable");
7901 else {
7902 CmdArgs.push_back("-dynamic-linker");
7903 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7904 }
John McCall65b8da02013-04-11 22:55:55 +00007905 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007906 }
7907
7908 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7909 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007910 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007911 CmdArgs.push_back("-m");
7912 CmdArgs.push_back("elf_i386");
7913 }
7914
Daniel Dunbarb440f562010-08-02 02:38:21 +00007915 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007916 CmdArgs.push_back("-o");
7917 CmdArgs.push_back(Output.getFilename());
7918 } else {
7919 assert(Output.isNothing() && "Invalid output.");
7920 }
7921
7922 if (!Args.hasArg(options::OPT_nostdlib) &&
7923 !Args.hasArg(options::OPT_nostartfiles)) {
7924 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007925 if (Args.hasArg(options::OPT_pg))
7926 CmdArgs.push_back(Args.MakeArgString(
7927 getToolChain().GetFilePath("gcrt1.o")));
7928 else {
7929 if (Args.hasArg(options::OPT_pie))
7930 CmdArgs.push_back(Args.MakeArgString(
7931 getToolChain().GetFilePath("Scrt1.o")));
7932 else
7933 CmdArgs.push_back(Args.MakeArgString(
7934 getToolChain().GetFilePath("crt1.o")));
7935 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007936 }
John McCall65b8da02013-04-11 22:55:55 +00007937 CmdArgs.push_back(Args.MakeArgString(
7938 getToolChain().GetFilePath("crti.o")));
7939 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7940 CmdArgs.push_back(Args.MakeArgString(
7941 getToolChain().GetFilePath("crtbeginS.o")));
7942 else
7943 CmdArgs.push_back(Args.MakeArgString(
7944 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007945 }
7946
7947 Args.AddAllArgs(CmdArgs, options::OPT_L);
7948 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7949 Args.AddAllArgs(CmdArgs, options::OPT_e);
7950
Daniel Dunbar54423b22010-09-17 00:24:54 +00007951 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007952
7953 if (!Args.hasArg(options::OPT_nostdlib) &&
7954 !Args.hasArg(options::OPT_nodefaultlibs)) {
7955 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7956 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007957 if (UseGCC47)
7958 CmdArgs.push_back("-L/usr/lib/gcc47");
7959 else
7960 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007961
7962 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007963 if (UseGCC47) {
7964 CmdArgs.push_back("-rpath");
7965 CmdArgs.push_back("/usr/lib/gcc47");
7966 } else {
7967 CmdArgs.push_back("-rpath");
7968 CmdArgs.push_back("/usr/lib/gcc44");
7969 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007970 }
7971
Hans Wennborg70850d82013-07-18 20:29:38 +00007972 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007973 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007974 CmdArgs.push_back("-lm");
7975 }
7976
Daniel Dunbarcc912342009-05-02 18:28:39 +00007977 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007978 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007979
7980 if (!Args.hasArg(options::OPT_nolibc)) {
7981 CmdArgs.push_back("-lc");
7982 }
7983
John McCall65b8da02013-04-11 22:55:55 +00007984 if (UseGCC47) {
7985 if (Args.hasArg(options::OPT_static) ||
7986 Args.hasArg(options::OPT_static_libgcc)) {
7987 CmdArgs.push_back("-lgcc");
7988 CmdArgs.push_back("-lgcc_eh");
7989 } else {
7990 if (Args.hasArg(options::OPT_shared_libgcc)) {
7991 CmdArgs.push_back("-lgcc_pic");
7992 if (!Args.hasArg(options::OPT_shared))
7993 CmdArgs.push_back("-lgcc");
7994 } else {
7995 CmdArgs.push_back("-lgcc");
7996 CmdArgs.push_back("--as-needed");
7997 CmdArgs.push_back("-lgcc_pic");
7998 CmdArgs.push_back("--no-as-needed");
7999 }
8000 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008001 } else {
John McCall65b8da02013-04-11 22:55:55 +00008002 if (Args.hasArg(options::OPT_shared)) {
8003 CmdArgs.push_back("-lgcc_pic");
8004 } else {
8005 CmdArgs.push_back("-lgcc");
8006 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008007 }
8008 }
8009
8010 if (!Args.hasArg(options::OPT_nostdlib) &&
8011 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008012 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008013 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008014 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008015 else
8016 CmdArgs.push_back(Args.MakeArgString(
8017 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008018 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008019 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008020 }
8021
Alexey Samsonov7811d192014-02-20 13:57:37 +00008022 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008023
Logan Chieneb9162f2014-06-26 14:23:45 +00008024 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008025 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008026}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008027
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008028// Try to find Exe from a Visual Studio distribution. This first tries to find
8029// an installed copy of Visual Studio and, failing that, looks in the PATH,
8030// making sure that whatever executable that's found is not a same-named exe
8031// from clang itself to prevent clang from falling back to itself.
8032static std::string FindVisualStudioExecutable(const ToolChain &TC,
8033 const char *Exe,
8034 const char *ClangProgramPath) {
8035 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8036 std::string visualStudioBinDir;
8037 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8038 visualStudioBinDir)) {
8039 SmallString<128> FilePath(visualStudioBinDir);
8040 llvm::sys::path::append(FilePath, Exe);
8041 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8042 return FilePath.str();
8043 }
8044
8045 return Exe;
8046}
8047
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008048void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8049 const InputInfo &Output,
8050 const InputInfoList &Inputs,
8051 const ArgList &Args,
8052 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008053 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008054 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008055
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008056 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8057 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008058 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8059 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008060
8061 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008062 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008063 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008064
Zachary Turner10d75b22014-10-22 20:40:43 +00008065 if (!llvm::sys::Process::GetEnv("LIB")) {
8066 // If the VC environment hasn't been configured (perhaps because the user
8067 // did not run vcvarsall), try to build a consistent link environment. If
8068 // the environment variable is set however, assume the user knows what he's
8069 // doing.
8070 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008071 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008072 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8073 SmallString<128> LibDir(VisualStudioDir);
8074 llvm::sys::path::append(LibDir, "VC", "lib");
8075 switch (MSVC.getArch()) {
8076 case llvm::Triple::x86:
8077 // x86 just puts the libraries directly in lib
8078 break;
8079 case llvm::Triple::x86_64:
8080 llvm::sys::path::append(LibDir, "amd64");
8081 break;
8082 case llvm::Triple::arm:
8083 llvm::sys::path::append(LibDir, "arm");
8084 break;
8085 default:
8086 break;
8087 }
8088 CmdArgs.push_back(
8089 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8090 }
8091
8092 std::string WindowsSdkLibPath;
8093 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8094 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8095 WindowsSdkLibPath.c_str()));
8096 }
8097
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008098 CmdArgs.push_back("-nologo");
8099
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008100 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008101 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008102
Hans Wennborge4c47f22015-03-04 23:16:21 +00008103 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8104 options::OPT__SLASH_LDd,
8105 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008106 if (DLL) {
8107 CmdArgs.push_back(Args.MakeArgString("-dll"));
8108
8109 SmallString<128> ImplibName(Output.getFilename());
8110 llvm::sys::path::replace_extension(ImplibName, "lib");
8111 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
8112 ImplibName.str()));
8113 }
8114
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008115 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008116 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008117 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008118 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008119 static const char *CompilerRTComponents[] = {
8120 "asan_dynamic",
8121 "asan_dynamic_runtime_thunk",
8122 };
8123 for (const auto &Component : CompilerRTComponents)
8124 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008125 // Make sure the dynamic runtime thunk is not optimized out at link time
8126 // to ensure proper SEH handling.
8127 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008128 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008129 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008130 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008131 static const char *CompilerRTComponents[] = {
8132 "asan",
8133 "asan_cxx",
8134 };
8135 for (const auto &Component : CompilerRTComponents)
8136 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008137 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008138 }
8139
Hans Wennborg2e274592013-08-13 23:38:57 +00008140 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008141
Reid Kleckner337188f2014-09-16 19:22:00 +00008142 // Add filenames, libraries, and other linker inputs.
8143 for (const auto &Input : Inputs) {
8144 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008145 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008146 continue;
8147 }
8148
8149 const Arg &A = Input.getInputArg();
8150
8151 // Render -l options differently for the MSVC linker.
8152 if (A.getOption().matches(options::OPT_l)) {
8153 StringRef Lib = A.getValue();
8154 const char *LinkLibArg;
8155 if (Lib.endswith(".lib"))
8156 LinkLibArg = Args.MakeArgString(Lib);
8157 else
8158 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8159 CmdArgs.push_back(LinkLibArg);
8160 continue;
8161 }
8162
8163 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8164 // or -L. Render it, even if MSVC doesn't understand it.
8165 A.renderAsInput(Args, CmdArgs);
8166 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008167
Zachary Turner719f58c2014-12-01 23:06:47 +00008168 // We need to special case some linker paths. In the case of lld, we need to
8169 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8170 // linker, we need to use a special search algorithm.
8171 llvm::SmallString<128> linkPath;
8172 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8173 if (Linker.equals_lower("lld"))
8174 Linker = "lld-link";
8175
8176 if (Linker.equals_lower("link")) {
8177 // If we're using the MSVC linker, it's not sufficient to just use link
8178 // from the program PATH, because other environments like GnuWin32 install
8179 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008180 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008181 C.getDriver().getClangProgramPath());
8182 } else {
8183 linkPath = Linker;
8184 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008185 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008186 }
8187
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008188 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008189 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008190}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008191
8192void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8193 const InputInfo &Output,
8194 const InputInfoList &Inputs,
8195 const ArgList &Args,
8196 const char *LinkingOutput) const {
8197 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8198}
8199
David Blaikiec11bf802014-09-04 16:04:28 +00008200std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8201 Compilation &C, const JobAction &JA, const InputInfo &Output,
8202 const InputInfoList &Inputs, const ArgList &Args,
8203 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008204 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008205 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008206 CmdArgs.push_back("/c"); // Compile only.
8207 CmdArgs.push_back("/W0"); // No warnings.
8208
8209 // The goal is to be able to invoke this tool correctly based on
8210 // any flag accepted by clang-cl.
8211
8212 // These are spelled the same way in clang and cl.exe,.
8213 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8214 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008215
8216 // Optimization level.
8217 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8218 if (A->getOption().getID() == options::OPT_O0) {
8219 CmdArgs.push_back("/Od");
8220 } else {
8221 StringRef OptLevel = A->getValue();
8222 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8223 A->render(Args, CmdArgs);
8224 else if (OptLevel == "3")
8225 CmdArgs.push_back("/Ox");
8226 }
8227 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008228
8229 // Flags for which clang-cl have an alias.
8230 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8231
David Majnemerf6072342014-07-01 22:24:56 +00008232 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8233 /*default=*/false))
8234 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008235 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8236 options::OPT_fno_function_sections))
8237 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8238 ? "/Gy"
8239 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008240 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8241 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008242 CmdArgs.push_back(
8243 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008244 if (Args.hasArg(options::OPT_fsyntax_only))
8245 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008246 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8247 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008248
Hans Wennborg260ff402013-09-27 17:54:18 +00008249 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008250 for (const auto &Include : Includes)
8251 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008252
Hans Wennborg87cfa712013-09-19 20:32:16 +00008253 // Flags that can simply be passed through.
8254 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8255 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008256 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008257
8258 // The order of these flags is relevant, so pick the last one.
8259 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8260 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8261 A->render(Args, CmdArgs);
8262
8263
8264 // Input filename.
8265 assert(Inputs.size() == 1);
8266 const InputInfo &II = Inputs[0];
8267 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8268 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8269 if (II.isFilename())
8270 CmdArgs.push_back(II.getFilename());
8271 else
8272 II.getInputArg().renderAsInput(Args, CmdArgs);
8273
8274 // Output filename.
8275 assert(Output.getType() == types::TY_Object);
8276 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8277 Output.getFilename());
8278 CmdArgs.push_back(Fo);
8279
Hans Wennborg188382e2013-09-20 18:16:35 +00008280 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008281 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8282 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008283 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8284 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008285}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008286
8287
8288/// XCore Tools
8289// We pass assemble and link construction to the xcc tool.
8290
8291void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8292 const InputInfo &Output,
8293 const InputInfoList &Inputs,
8294 const ArgList &Args,
8295 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008296 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008297 ArgStringList CmdArgs;
8298
8299 CmdArgs.push_back("-o");
8300 CmdArgs.push_back(Output.getFilename());
8301
8302 CmdArgs.push_back("-c");
8303
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008304 if (Args.hasArg(options::OPT_v))
8305 CmdArgs.push_back("-v");
8306
Robert Lytton894d25c2014-05-02 09:33:25 +00008307 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8308 if (!A->getOption().matches(options::OPT_g0))
8309 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008310
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008311 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8312 false))
8313 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008314
8315 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8316 options::OPT_Xassembler);
8317
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008318 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008319 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008320
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008321 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008322 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008323}
8324
8325void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8326 const InputInfo &Output,
8327 const InputInfoList &Inputs,
8328 const ArgList &Args,
8329 const char *LinkingOutput) const {
8330 ArgStringList CmdArgs;
8331
8332 if (Output.isFilename()) {
8333 CmdArgs.push_back("-o");
8334 CmdArgs.push_back(Output.getFilename());
8335 } else {
8336 assert(Output.isNothing() && "Invalid output.");
8337 }
8338
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008339 if (Args.hasArg(options::OPT_v))
8340 CmdArgs.push_back("-v");
8341
David Majnemer8de68642014-12-05 08:11:58 +00008342 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008343 CmdArgs.push_back("-fexceptions");
8344
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008345 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8346
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008347 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008348 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008349}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008350
8351void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8352 const InputInfo &Output,
8353 const InputInfoList &Inputs,
8354 const ArgList &Args,
8355 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008356 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008357 const auto &TC =
8358 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8359 ArgStringList CmdArgs;
8360 const char *Exec;
8361
8362 switch (TC.getArch()) {
8363 default: llvm_unreachable("unsupported architecture");
8364 case llvm::Triple::arm:
8365 case llvm::Triple::thumb:
8366 break;
8367 case llvm::Triple::x86:
8368 CmdArgs.push_back("--32");
8369 break;
8370 case llvm::Triple::x86_64:
8371 CmdArgs.push_back("--64");
8372 break;
8373 }
8374
8375 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8376
8377 CmdArgs.push_back("-o");
8378 CmdArgs.push_back(Output.getFilename());
8379
8380 for (const auto &Input : Inputs)
8381 CmdArgs.push_back(Input.getFilename());
8382
8383 const std::string Assembler = TC.GetProgramPath("as");
8384 Exec = Args.MakeArgString(Assembler);
8385
8386 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8387}
8388
8389void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8390 const InputInfo &Output,
8391 const InputInfoList &Inputs,
8392 const ArgList &Args,
8393 const char *LinkingOutput) const {
8394 const auto &TC =
8395 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8396 const llvm::Triple &T = TC.getTriple();
8397 const Driver &D = TC.getDriver();
8398 SmallString<128> EntryPoint;
8399 ArgStringList CmdArgs;
8400 const char *Exec;
8401
8402 // Silence warning for "clang -g foo.o -o foo"
8403 Args.ClaimAllArgs(options::OPT_g_Group);
8404 // and "clang -emit-llvm foo.o -o foo"
8405 Args.ClaimAllArgs(options::OPT_emit_llvm);
8406 // and for "clang -w foo.o -o foo"
8407 Args.ClaimAllArgs(options::OPT_w);
8408 // Other warning options are already handled somewhere else.
8409
8410 if (!D.SysRoot.empty())
8411 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8412
8413 if (Args.hasArg(options::OPT_pie))
8414 CmdArgs.push_back("-pie");
8415 if (Args.hasArg(options::OPT_rdynamic))
8416 CmdArgs.push_back("-export-dynamic");
8417 if (Args.hasArg(options::OPT_s))
8418 CmdArgs.push_back("--strip-all");
8419
8420 CmdArgs.push_back("-m");
8421 switch (TC.getArch()) {
8422 default: llvm_unreachable("unsupported architecture");
8423 case llvm::Triple::arm:
8424 case llvm::Triple::thumb:
8425 // FIXME: this is incorrect for WinCE
8426 CmdArgs.push_back("thumb2pe");
8427 break;
8428 case llvm::Triple::x86:
8429 CmdArgs.push_back("i386pe");
8430 EntryPoint.append("_");
8431 break;
8432 case llvm::Triple::x86_64:
8433 CmdArgs.push_back("i386pep");
8434 break;
8435 }
8436
8437 if (Args.hasArg(options::OPT_shared)) {
8438 switch (T.getArch()) {
8439 default: llvm_unreachable("unsupported architecture");
8440 case llvm::Triple::arm:
8441 case llvm::Triple::thumb:
8442 case llvm::Triple::x86_64:
8443 EntryPoint.append("_DllMainCRTStartup");
8444 break;
8445 case llvm::Triple::x86:
8446 EntryPoint.append("_DllMainCRTStartup@12");
8447 break;
8448 }
8449
8450 CmdArgs.push_back("-shared");
8451 CmdArgs.push_back("-Bdynamic");
8452
8453 CmdArgs.push_back("--enable-auto-image-base");
8454
8455 CmdArgs.push_back("--entry");
8456 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8457 } else {
8458 EntryPoint.append("mainCRTStartup");
8459
8460 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8461 : "-Bdynamic");
8462
8463 if (!Args.hasArg(options::OPT_nostdlib) &&
8464 !Args.hasArg(options::OPT_nostartfiles)) {
8465 CmdArgs.push_back("--entry");
8466 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8467 }
8468
8469 // FIXME: handle subsystem
8470 }
8471
8472 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008473 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008474
8475 CmdArgs.push_back("-o");
8476 CmdArgs.push_back(Output.getFilename());
8477
8478 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8479 SmallString<261> ImpLib(Output.getFilename());
8480 llvm::sys::path::replace_extension(ImpLib, ".lib");
8481
8482 CmdArgs.push_back("--out-implib");
8483 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8484 }
8485
8486 if (!Args.hasArg(options::OPT_nostdlib) &&
8487 !Args.hasArg(options::OPT_nostartfiles)) {
8488 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8489 const char *CRTBegin;
8490
8491 CRTBegin =
8492 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8493 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8494 }
8495
8496 Args.AddAllArgs(CmdArgs, options::OPT_L);
8497
8498 const auto &Paths = TC.getFilePaths();
8499 for (const auto &Path : Paths)
8500 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8501
8502 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8503
8504 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8505 !Args.hasArg(options::OPT_nodefaultlibs)) {
8506 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8507 !Args.hasArg(options::OPT_static);
8508 if (StaticCXX)
8509 CmdArgs.push_back("-Bstatic");
8510 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8511 if (StaticCXX)
8512 CmdArgs.push_back("-Bdynamic");
8513 }
8514
8515 if (!Args.hasArg(options::OPT_nostdlib)) {
8516 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8517 // TODO handle /MT[d] /MD[d]
8518 CmdArgs.push_back("-lmsvcrt");
8519 AddRunTimeLibs(TC, D, CmdArgs, Args);
8520 }
8521 }
8522
8523 const std::string Linker = TC.GetProgramPath("ld");
8524 Exec = Args.MakeArgString(Linker);
8525
8526 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8527}