blob: a54a592643429fbf556aceb5c60aaa97438fc512 [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"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
87 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
88 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000090 << A->getAsString(Args) << "-static";
91}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
98 for ( ; *Arg; ++Arg) {
99 switch (*Arg) {
100 default: break;
101 case ' ':
102 case '\\':
103 Res.push_back('\\');
104 break;
105 }
106 Res.push_back(*Arg);
107 }
108}
109
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000110// Quote target names for inclusion in GNU Make dependency files.
111// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112static void QuoteTarget(StringRef Target,
113 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Bill Wendlingc0938f32012-03-12 22:10:06 +0000139static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000140 ArgStringList &CmdArgs,
141 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000142 const char *EnvVar) {
143 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 bool CombinedArg = false;
145
Bill Wendling281ca292012-03-12 21:22:35 +0000146 if (!DirList)
147 return; // Nothing to do.
148
Chad Rosier616e8a52012-10-30 21:42:09 +0000149 StringRef Name(ArgName);
150 if (Name.equals("-I") || Name.equals("-L"))
151 CombinedArg = true;
152
Bill Wendling281ca292012-03-12 21:22:35 +0000153 StringRef Dirs(DirList);
154 if (Dirs.empty()) // Empty string should not add '.'.
155 return;
156
157 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000158 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000159 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000160 if (CombinedArg) {
161 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
162 } else {
163 CmdArgs.push_back(ArgName);
164 CmdArgs.push_back(".");
165 }
Bill Wendling281ca292012-03-12 21:22:35 +0000166 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000167 if (CombinedArg) {
168 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
169 } else {
170 CmdArgs.push_back(ArgName);
171 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
172 }
Bill Wendling281ca292012-03-12 21:22:35 +0000173 }
Nico Weber89355782012-03-19 15:00:03 +0000174 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000175 }
176
177 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000178 if (CombinedArg) {
179 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
180 } else {
181 CmdArgs.push_back(ArgName);
182 CmdArgs.push_back(".");
183 }
Bill Wendling281ca292012-03-12 21:22:35 +0000184 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000185 if (CombinedArg) {
186 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
187 } else {
188 CmdArgs.push_back(ArgName);
189 CmdArgs.push_back(Args.MakeArgString(Dirs));
190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191 }
192}
193
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194static void AddLinkerInputs(const ToolChain &TC,
195 const InputInfoList &Inputs, const ArgList &Args,
196 ArgStringList &CmdArgs) {
197 const Driver &D = TC.getDriver();
198
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000199 // Add extra linker input arguments which are not treated as inputs
200 // (constructed via -Xarch_).
201 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
202
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000203 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000204 if (!TC.HasNativeLLVMSupport()) {
205 // Don't try to pass LLVM inputs unless we have native support.
206 if (II.getType() == types::TY_LLVM_IR ||
207 II.getType() == types::TY_LTO_IR ||
208 II.getType() == types::TY_LLVM_BC ||
209 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000210 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 << TC.getTripleString();
212 }
213
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000214 // Add filenames immediately.
215 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000216 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000217 continue;
218 }
219
220 // Otherwise, this is a linker input argument.
221 const Arg &A = II.getInputArg();
222
223 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000224 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000225 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000226 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000227 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000228 else if (A.getOption().matches(options::OPT_z)) {
229 // Pass -z prefix for gcc linker compatibility.
230 A.claim();
231 A.render(Args, CmdArgs);
232 } else {
233 A.renderAsInput(Args, CmdArgs);
234 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000235 }
Bill Wendling281ca292012-03-12 21:22:35 +0000236
237 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000238 // and only supported on native toolchains.
239 if (!TC.isCrossCompiling())
240 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000241}
242
John McCall31168b02011-06-15 23:02:42 +0000243/// \brief Determine whether Objective-C automated reference counting is
244/// enabled.
245static bool isObjCAutoRefCount(const ArgList &Args) {
246 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
247}
248
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249/// \brief Determine whether we are linking the ObjC runtime.
250static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000251 if (isObjCAutoRefCount(Args)) {
252 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000253 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000254 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000255 return Args.hasArg(options::OPT_fobjc_link_runtime);
256}
257
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000258static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000259 // Don't forward inputs from the original command line. They are added from
260 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000261 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000262 !O.hasFlag(options::DriverOption) &&
263 !O.hasFlag(options::LinkerInput);
264}
265
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000266void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000268 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000269 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000270 ArgStringList &CmdArgs,
271 const InputInfo &Output,
272 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000274
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000275 CheckPreprocessingOptions(D, Args);
276
277 Args.AddLastArg(CmdArgs, options::OPT_C);
278 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000279
280 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000281 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 (A = Args.getLastArg(options::OPT_MD)) ||
283 (A = Args.getLastArg(options::OPT_MMD))) {
284 // Determine the output location.
285 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000286 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000287 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000288 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000289 } else if (Output.getType() == types::TY_Dependencies) {
290 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000291 } else if (A->getOption().matches(options::OPT_M) ||
292 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 DepFile = "-";
294 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000295 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000296 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 }
298 CmdArgs.push_back("-dependency-file");
299 CmdArgs.push_back(DepFile);
300
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000301 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
303 const char *DepTarget;
304
305 // If user provided -o, that is the dependency target, except
306 // when we are only generating a dependency file.
307 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
308 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000309 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 } else {
311 // Otherwise derive from the base input.
312 //
313 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000315 llvm::sys::path::replace_extension(P, "o");
316 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 }
318
319 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 QuoteTarget(DepTarget, Quoted);
322 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000325 if (A->getOption().matches(options::OPT_M) ||
326 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000328 if ((isa<PrecompileJobAction>(JA) &&
329 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
330 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000331 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332 }
333
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000334 if (Args.hasArg(options::OPT_MG)) {
335 if (!A || A->getOption().matches(options::OPT_MD) ||
336 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000337 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000338 CmdArgs.push_back("-MG");
339 }
340
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000342 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000343
344 // Convert all -MQ <target> args to -MT <quoted target>
345 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
346 options::OPT_MQ),
347 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 const Arg *A = *it;
349 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350
Daniel Dunbara442fd52010-06-11 22:00:13 +0000351 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000353 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000354 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back(Args.MakeArgString(Quoted));
356
357 // -MT flag - no change
358 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000359 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000360 }
361 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 // Add -i* options, and automatically translate to
364 // -include-pch/-include-pth for transparent PCH support. It's
365 // wonky, but we include looking for .gch so we can support seamless
366 // replacement into a build system already set up to be generating
367 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000368 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000369 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
370 ie = Args.filtered_end(); it != ie; ++it) {
371 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372
373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
428 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000429 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
430 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
432 // Add -Wp, and -Xassembler if using the preprocessor.
433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000470 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000471 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000472 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000473
474 // Add system include arguments.
475 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000476}
477
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478// FIXME: Move to target hook.
479static bool isSignedCharDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return true;
483
Tim Northover9bb857a2013-01-31 12:13:10 +0000484 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000485 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000487 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000488 case llvm::Triple::thumb:
489 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000490 if (Triple.isOSDarwin() || Triple.isOSWindows())
491 return true;
492 return false;
493
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 case llvm::Triple::ppc:
495 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000496 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000497 return true;
498 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000499
Bill Schmidt778d3872013-07-26 01:36:11 +0000500 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000501 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000502 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000503 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000504 }
505}
506
Robert Lytton0e076492013-08-13 09:43:10 +0000507static bool isNoCommonDefault(const llvm::Triple &Triple) {
508 switch (Triple.getArch()) {
509 default:
510 return false;
511
512 case llvm::Triple::xcore:
513 return true;
514 }
515}
516
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000517// Handle -mhwdiv=.
518static void getARMHWDivFeatures(const Driver &D, const Arg *A,
519 const ArgList &Args,
520 std::vector<const char *> &Features) {
521 StringRef HWDiv = A->getValue();
522 if (HWDiv == "arm") {
523 Features.push_back("+hwdiv-arm");
524 Features.push_back("-hwdiv");
525 } else if (HWDiv == "thumb") {
526 Features.push_back("-hwdiv-arm");
527 Features.push_back("+hwdiv");
528 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
529 Features.push_back("+hwdiv-arm");
530 Features.push_back("+hwdiv");
531 } else if (HWDiv == "none") {
532 Features.push_back("-hwdiv-arm");
533 Features.push_back("-hwdiv");
534 } else
535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
539//
540// FIXME: Centralize feature selection, defaulting shouldn't be also in the
541// frontend target.
542static void getARMFPUFeatures(const Driver &D, const Arg *A,
543 const ArgList &Args,
544 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000545 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000546
Renato Golin0600e1e2015-05-08 21:04:50 +0000547 // FIXME: Why does "none" disable more than "invalid"?
548 if (FPU == "none") {
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000549 Features.push_back("-vfp2");
550 Features.push_back("-vfp3");
551 Features.push_back("-vfp4");
552 Features.push_back("-fp-armv8");
553 Features.push_back("-crypto");
554 Features.push_back("-neon");
Renato Golin0600e1e2015-05-08 21:04:50 +0000555 return;
556 }
557
558 // FIXME: Make sure we differentiate sp-only.
559 if (FPU.find("-sp-") != StringRef::npos) {
560 Features.push_back("+fp-only-sp");
561 }
562
563 // All other FPU types, valid or invalid.
564 switch(llvm::ARMTargetParser::parseFPU(FPU)) {
Renato Golincb3b0c62015-05-12 10:34:10 +0000565 case llvm::ARM::FK_INVALID:
566 case llvm::ARM::FK_SOFTVFP:
Renato Golin0600e1e2015-05-08 21:04:50 +0000567 Features.push_back("-vfp2");
568 Features.push_back("-vfp3");
569 Features.push_back("-neon");
570 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000571 case llvm::ARM::FK_VFP:
572 case llvm::ARM::FK_VFPV2:
Renato Golin0600e1e2015-05-08 21:04:50 +0000573 Features.push_back("+vfp2");
574 Features.push_back("-neon");
575 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000576 case llvm::ARM::FK_VFPV3_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000577 Features.push_back("+d16");
578 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000579 case llvm::ARM::FK_VFPV3:
Renato Golin0600e1e2015-05-08 21:04:50 +0000580 Features.push_back("+vfp3");
581 Features.push_back("-neon");
582 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000583 case llvm::ARM::FK_VFPV4_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000584 Features.push_back("+d16");
585 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000586 case llvm::ARM::FK_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000587 Features.push_back("+vfp4");
588 Features.push_back("-neon");
589 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000590 case llvm::ARM::FK_FPV5_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000591 Features.push_back("+d16");
592 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000593 case llvm::ARM::FK_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000594 Features.push_back("+fp-armv8");
595 Features.push_back("-neon");
596 Features.push_back("-crypto");
597 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000598 case llvm::ARM::FK_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000599 Features.push_back("+fp-armv8");
600 Features.push_back("+neon");
601 Features.push_back("-crypto");
602 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000603 case llvm::ARM::FK_CRYPTO_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000604 Features.push_back("+fp-armv8");
605 Features.push_back("+neon");
606 Features.push_back("+crypto");
607 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000608 case llvm::ARM::FK_NEON:
Renato Golin0600e1e2015-05-08 21:04:50 +0000609 Features.push_back("+neon");
610 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000611 case llvm::ARM::FK_NEON_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000612 Features.push_back("+neon");
613 Features.push_back("+vfp4");
614 break;
615 default:
Chad Rosiercfbfc582012-04-04 20:51:35 +0000616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Renato Golin0600e1e2015-05-08 21:04:50 +0000617 }
Chad Rosiercfbfc582012-04-04 20:51:35 +0000618}
619
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620// Select the float ABI as determined by -msoft-float, -mhard-float, and
621// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000622StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000623 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000624 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000625 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
626 options::OPT_mhard_float,
627 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 if (A->getOption().matches(options::OPT_msoft_float))
629 FloatABI = "soft";
630 else if (A->getOption().matches(options::OPT_mhard_float))
631 FloatABI = "hard";
632 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000633 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000635 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000636 << A->getAsString(Args);
637 FloatABI = "soft";
638 }
639 }
640 }
641
642 // If unspecified, choose the default based on the platform.
643 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000644 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000645 case llvm::Triple::Darwin:
646 case llvm::Triple::MacOSX:
647 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000648 // Darwin defaults to "softfp" for v6 and v7.
649 //
650 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000651 std::string ArchName =
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000652 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple),
653 arm::getARMArch(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000654 if (StringRef(ArchName).startswith("v6") ||
655 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000656 FloatABI = "softfp";
657 else
658 FloatABI = "soft";
659 break;
660 }
661
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000662 // FIXME: this is invalid for WindowsCE
663 case llvm::Triple::Win32:
664 FloatABI = "hard";
665 break;
666
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000667 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000668 switch(Triple.getEnvironment()) {
669 case llvm::Triple::GNUEABIHF:
670 FloatABI = "hard";
671 break;
672 default:
673 // FreeBSD defaults to soft float
674 FloatABI = "soft";
675 break;
676 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000677 break;
678
Daniel Dunbar78485922009-09-10 23:00:09 +0000679 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000680 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000681 case llvm::Triple::GNUEABIHF:
682 FloatABI = "hard";
683 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000684 case llvm::Triple::GNUEABI:
685 FloatABI = "softfp";
686 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000687 case llvm::Triple::EABIHF:
688 FloatABI = "hard";
689 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000690 case llvm::Triple::EABI:
691 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
692 FloatABI = "softfp";
693 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000694 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000695 std::string ArchName =
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000696 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple),
697 arm::getARMArch(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000698 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000699 FloatABI = "softfp";
700 else
701 FloatABI = "soft";
702 break;
703 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000704 default:
705 // Assume "soft", but warn the user we are guessing.
706 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000707 if (Triple.getOS() != llvm::Triple::UnknownOS ||
708 !Triple.isOSBinFormatMachO())
709 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000710 break;
711 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000712 }
713 }
714
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000715 return FloatABI;
716}
717
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000718static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
719 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000720 std::vector<const char *> &Features,
721 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000722 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
723 if (!ForAS) {
724 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
725 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
726 // stripped out by the ARM target. We should probably pass this a new
727 // -target-option, which is handled by the -cc1/-cc1as invocation.
728 //
729 // FIXME2: For consistency, it would be ideal if we set up the target
730 // machine state the same when using the frontend or the assembler. We don't
731 // currently do that for the assembler, we pass the options directly to the
732 // backend and never even instantiate the frontend TargetInfo. If we did,
733 // and used its handleTargetFeatures hook, then we could ensure the
734 // assembler and the frontend behave the same.
735
736 // Use software floating point operations?
737 if (FloatABI == "soft")
738 Features.push_back("+soft-float");
739
740 // Use software floating point argument passing?
741 if (FloatABI != "hard")
742 Features.push_back("+soft-float-abi");
743 }
744
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000745 // Honor -mfpu=.
746 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000747 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000748 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
749 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000750
John Brawna95c1a82015-05-08 12:52:18 +0000751 // -march is handled in getARMCPUForMarch by translating it into a CPU name,
752 // but it needs to return an empty string on invalid arguments. We therefore
753 // check and give an error here if the -march is invalid.
754 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
755 if (!Triple.getARMCPUForArch(A->getValue()))
756 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
757
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000758 // Setting -msoft-float effectively disables NEON because of the GCC
759 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000760 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000761 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000762 // Also need to explicitly disable features which imply NEON.
763 Features.push_back("-crypto");
764 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000765
Eric Christopher269c2a22015-04-04 03:34:43 +0000766 // En/disable crc code generation.
767 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000768 if (A->getOption().matches(options::OPT_mcrc))
769 Features.push_back("+crc");
770 else
771 Features.push_back("-crc");
772 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000773
774 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
775 Features.insert(Features.begin(), "+v8.1a");
776 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000777}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000778
779void Clang::AddARMTargetArgs(const ArgList &Args,
780 ArgStringList &CmdArgs,
781 bool KernelOrKext) const {
782 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000783 // Get the effective triple, which takes into account the deployment target.
784 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
785 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000786 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000787
788 // Select the ABI to use.
789 //
790 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000791 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000792 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000793 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000794 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000795 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000796 // The backend is hardwired to assume AAPCS for M-class processors, ensure
797 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000798 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000799 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000800 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000801 ABIName = "aapcs";
802 } else {
803 ABIName = "apcs-gnu";
804 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000805 } else if (Triple.isOSWindows()) {
806 // FIXME: this is invalid for WindowsCE
807 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 } else {
809 // Select the default based on the platform.
810 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000811 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000812 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000813 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814 ABIName = "aapcs-linux";
815 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000816 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817 case llvm::Triple::EABI:
818 ABIName = "aapcs";
819 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000820 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000821 if (Triple.getOS() == llvm::Triple::NetBSD)
822 ABIName = "apcs-gnu";
823 else
824 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000825 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000826 }
827 }
828 CmdArgs.push_back("-target-abi");
829 CmdArgs.push_back(ABIName);
830
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000831 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000832 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000833 if (FloatABI == "soft") {
834 // Floating point operations and argument passing are soft.
835 //
836 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000837 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000838 CmdArgs.push_back("-mfloat-abi");
839 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000840 } else if (FloatABI == "softfp") {
841 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000842 CmdArgs.push_back("-mfloat-abi");
843 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000844 } else {
845 // Floating point operations and argument passing are hard.
846 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000847 CmdArgs.push_back("-mfloat-abi");
848 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000849 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000850
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000851 // Kernel code has more strict alignment requirements.
852 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000853 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000854 CmdArgs.push_back("-backend-option");
855 CmdArgs.push_back("-arm-long-calls");
856 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000857
Daniel Dunbar12100e22011-03-22 16:48:17 +0000858 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000859 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000860
861 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000862 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000863 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000864 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000865
Bob Wilson0874e532014-07-29 00:23:18 +0000866 // -mkernel implies -mstrict-align; don't add the redundant option.
867 if (!KernelOrKext) {
868 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
869 options::OPT_munaligned_access)) {
870 CmdArgs.push_back("-backend-option");
871 if (A->getOption().matches(options::OPT_mno_unaligned_access))
872 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000873 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000874 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000875 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000876 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000877 }
Bob Wilson0874e532014-07-29 00:23:18 +0000878 }
879 }
880
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000881 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000882 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
883 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000884 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000885 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000886 CmdArgs.push_back("-arm-global-merge=false");
887 else
888 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000889 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000890
Bob Wilson9c8af452013-04-11 18:53:25 +0000891 if (!Args.hasFlag(options::OPT_mimplicit_float,
892 options::OPT_mno_implicit_float,
893 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000894 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000895
Logan Chien749763e2014-04-03 13:12:44 +0000896 // llvm does not support reserving registers in general. There is support
897 // for reserving r9 on ARM though (defined as a platform-specific register
898 // in ARM EABI).
899 if (Args.hasArg(options::OPT_ffixed_r9)) {
900 CmdArgs.push_back("-backend-option");
901 CmdArgs.push_back("-arm-reserve-r9");
902 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000903}
904
Tim Northover573cbee2014-05-24 12:52:07 +0000905/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
906/// targeting.
907static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000908 Arg *A;
909 std::string CPU;
910 // If we have -mtune or -mcpu, use that.
911 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
912 CPU = A->getValue();
913 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000914 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000915 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000916 }
917
Kevin Qin110db6f2014-07-18 07:03:22 +0000918 // Handle CPU name is 'native'.
919 if (CPU == "native")
920 return llvm::sys::getHostCPUName();
921 else if (CPU.size())
922 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000923
James Molloy9b1586b2014-04-17 12:51:17 +0000924 // Make sure we pick "cyclone" if -arch is used.
925 // FIXME: Should this be picked by checking the target triple instead?
926 if (Args.getLastArg(options::OPT_arch))
927 return "cyclone";
928
929 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000930}
931
Tim Northover573cbee2014-05-24 12:52:07 +0000932void Clang::AddAArch64TargetArgs(const ArgList &Args,
933 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000934 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
935 llvm::Triple Triple(TripleStr);
936
937 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
938 Args.hasArg(options::OPT_mkernel) ||
939 Args.hasArg(options::OPT_fapple_kext))
940 CmdArgs.push_back("-disable-red-zone");
941
942 if (!Args.hasFlag(options::OPT_mimplicit_float,
943 options::OPT_mno_implicit_float, true))
944 CmdArgs.push_back("-no-implicit-float");
945
Craig Topper92fc2df2014-05-17 16:56:41 +0000946 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000947 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
948 ABIName = A->getValue();
949 else if (Triple.isOSDarwin())
950 ABIName = "darwinpcs";
951 else
952 ABIName = "aapcs";
953
954 CmdArgs.push_back("-target-abi");
955 CmdArgs.push_back(ABIName);
956
Bob Wilson0874e532014-07-29 00:23:18 +0000957 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
958 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000959 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000960 if (A->getOption().matches(options::OPT_mno_unaligned_access))
961 CmdArgs.push_back("-aarch64-strict-align");
962 else
963 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000964 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000965
Bradley Smith9ff64332014-10-13 10:16:06 +0000966 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
967 options::OPT_mno_fix_cortex_a53_835769)) {
968 CmdArgs.push_back("-backend-option");
969 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
970 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
971 else
972 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000973 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
974 // Enabled A53 errata (835769) workaround by default on android
975 CmdArgs.push_back("-backend-option");
976 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000977 }
978
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000979 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000980 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
981 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000982 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000983 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000984 CmdArgs.push_back("-aarch64-global-merge=false");
985 else
986 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000987 }
Renato Golinb625f482015-01-25 23:17:48 +0000988
989 if (Args.hasArg(options::OPT_ffixed_x18)) {
990 CmdArgs.push_back("-backend-option");
991 CmdArgs.push_back("-aarch64-reserve-x18");
992 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000993}
994
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000995// Get CPU and ABI names. They are not independent
996// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000997void mips::getMipsCPUAndABI(const ArgList &Args,
998 const llvm::Triple &Triple,
999 StringRef &CPUName,
1000 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001001 const char *DefMips32CPU = "mips32r2";
1002 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001003
Daniel Sanders2bf13662014-07-10 14:40:57 +00001004 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1005 // default for mips64(el)?-img-linux-gnu.
1006 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1007 Triple.getEnvironment() == llvm::Triple::GNU) {
1008 DefMips32CPU = "mips32r6";
1009 DefMips64CPU = "mips64r6";
1010 }
1011
Brad Smithba26f582015-01-06 02:53:17 +00001012 // MIPS3 is the default for mips64*-unknown-openbsd.
1013 if (Triple.getOS() == llvm::Triple::OpenBSD)
1014 DefMips64CPU = "mips3";
1015
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001016 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001017 options::OPT_mcpu_EQ))
1018 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001019
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001020 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001021 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001022 // Convert a GNU style Mips ABI name to the name
1023 // accepted by LLVM Mips backend.
1024 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1025 .Case("32", "o32")
1026 .Case("64", "n64")
1027 .Default(ABIName);
1028 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001029
1030 // Setup default CPU and ABI names.
1031 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001032 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001033 default:
1034 llvm_unreachable("Unexpected triple arch name");
1035 case llvm::Triple::mips:
1036 case llvm::Triple::mipsel:
1037 CPUName = DefMips32CPU;
1038 break;
1039 case llvm::Triple::mips64:
1040 case llvm::Triple::mips64el:
1041 CPUName = DefMips64CPU;
1042 break;
1043 }
1044 }
1045
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001046 if (ABIName.empty()) {
1047 // Deduce ABI name from the target triple.
1048 if (Triple.getArch() == llvm::Triple::mips ||
1049 Triple.getArch() == llvm::Triple::mipsel)
1050 ABIName = "o32";
1051 else
1052 ABIName = "n64";
1053 }
1054
1055 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001056 // Deduce CPU name from ABI name.
1057 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001058 .Cases("o32", "eabi", DefMips32CPU)
1059 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001060 .Default("");
1061 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001062
1063 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001064}
1065
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001066// Convert ABI name to the GNU tools acceptable variant.
1067static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1068 return llvm::StringSwitch<llvm::StringRef>(ABI)
1069 .Case("o32", "32")
1070 .Case("n64", "64")
1071 .Default(ABI);
1072}
1073
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001074// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1075// and -mfloat-abi=.
1076static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001077 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001078 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001079 options::OPT_mhard_float,
1080 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001081 if (A->getOption().matches(options::OPT_msoft_float))
1082 FloatABI = "soft";
1083 else if (A->getOption().matches(options::OPT_mhard_float))
1084 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001085 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001086 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001087 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001088 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001089 FloatABI = "hard";
1090 }
1091 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001092 }
1093
1094 // If unspecified, choose the default based on the platform.
1095 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001096 // Assume "hard", because it's a default value used by gcc.
1097 // When we start to recognize specific target MIPS processors,
1098 // we will be able to select the default more correctly.
1099 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001100 }
1101
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001102 return FloatABI;
1103}
1104
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001105static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001106 std::vector<const char *> &Features,
1107 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001108 StringRef FeatureName) {
1109 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001110 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001111 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001112 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001113 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001114 }
1115}
1116
Daniel Sanders379d44b2014-07-16 11:52:23 +00001117static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1118 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001119 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001120 StringRef CPUName;
1121 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001122 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001123 ABIName = getGnuCompatibleMipsABIName(ABIName);
1124
Daniel Sandersfeb61302014-08-08 15:47:17 +00001125 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1126 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001127
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001128 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001129 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 // FIXME: Note, this is a hack. We need to pass the selected float
1131 // mode to the MipsTargetInfoBase to define appropriate macros there.
1132 // Now it is the only method.
1133 Features.push_back("+soft-float");
1134 }
1135
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001137 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001138 if (Val == "2008") {
1139 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1140 Features.push_back("+nan2008");
1141 else {
1142 Features.push_back("-nan2008");
1143 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1144 }
1145 } else if (Val == "legacy") {
1146 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1147 Features.push_back("-nan2008");
1148 else {
1149 Features.push_back("+nan2008");
1150 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1151 }
1152 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001153 D.Diag(diag::err_drv_unsupported_option_argument)
1154 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001155 }
1156
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001157 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1158 options::OPT_mdouble_float, "single-float");
1159 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1160 "mips16");
1161 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1162 options::OPT_mno_micromips, "micromips");
1163 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1164 "dsp");
1165 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1166 "dspr2");
1167 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1168 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001169
1170 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1171 // pass -mfpxx
1172 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1173 options::OPT_mfp64)) {
1174 if (A->getOption().matches(options::OPT_mfp32))
1175 Features.push_back(Args.MakeArgString("-fp64"));
1176 else if (A->getOption().matches(options::OPT_mfpxx)) {
1177 Features.push_back(Args.MakeArgString("+fpxx"));
1178 Features.push_back(Args.MakeArgString("+nooddspreg"));
1179 } else
1180 Features.push_back(Args.MakeArgString("+fp64"));
1181 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001182 Features.push_back(Args.MakeArgString("+fpxx"));
1183 Features.push_back(Args.MakeArgString("+nooddspreg"));
1184 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001185
Daniel Sanders28e5d392014-07-10 10:39:51 +00001186 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1187 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001188}
1189
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001190void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001191 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001192 const Driver &D = getToolChain().getDriver();
1193 StringRef CPUName;
1194 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001195 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001196 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001197
1198 CmdArgs.push_back("-target-abi");
1199 CmdArgs.push_back(ABIName.data());
1200
1201 StringRef FloatABI = getMipsFloatABI(D, Args);
1202
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001203 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001204 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001205 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001206 CmdArgs.push_back("-mfloat-abi");
1207 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001209 else {
1210 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001211 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001212 CmdArgs.push_back("-mfloat-abi");
1213 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001214 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001215
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001216 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1217 if (A->getOption().matches(options::OPT_mxgot)) {
1218 CmdArgs.push_back("-mllvm");
1219 CmdArgs.push_back("-mxgot");
1220 }
1221 }
1222
Simon Atanasyanc580b322013-05-11 06:33:44 +00001223 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1224 options::OPT_mno_ldc1_sdc1)) {
1225 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1226 CmdArgs.push_back("-mllvm");
1227 CmdArgs.push_back("-mno-ldc1-sdc1");
1228 }
1229 }
1230
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001231 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1232 options::OPT_mno_check_zero_division)) {
1233 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1234 CmdArgs.push_back("-mllvm");
1235 CmdArgs.push_back("-mno-check-zero-division");
1236 }
1237 }
1238
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001239 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001240 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001241 CmdArgs.push_back("-mllvm");
1242 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1243 A->claim();
1244 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001245}
1246
Hal Finkel8eb59282012-06-11 22:35:19 +00001247/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1248static std::string getPPCTargetCPU(const ArgList &Args) {
1249 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001250 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001251
1252 if (CPUName == "native") {
1253 std::string CPU = llvm::sys::getHostCPUName();
1254 if (!CPU.empty() && CPU != "generic")
1255 return CPU;
1256 else
1257 return "";
1258 }
1259
1260 return llvm::StringSwitch<const char *>(CPUName)
1261 .Case("common", "generic")
1262 .Case("440", "440")
1263 .Case("440fp", "440")
1264 .Case("450", "450")
1265 .Case("601", "601")
1266 .Case("602", "602")
1267 .Case("603", "603")
1268 .Case("603e", "603e")
1269 .Case("603ev", "603ev")
1270 .Case("604", "604")
1271 .Case("604e", "604e")
1272 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001273 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001274 .Case("G3", "g3")
1275 .Case("7400", "7400")
1276 .Case("G4", "g4")
1277 .Case("7450", "7450")
1278 .Case("G4+", "g4+")
1279 .Case("750", "750")
1280 .Case("970", "970")
1281 .Case("G5", "g5")
1282 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001283 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001284 .Case("e500mc", "e500mc")
1285 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001286 .Case("power3", "pwr3")
1287 .Case("power4", "pwr4")
1288 .Case("power5", "pwr5")
1289 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001290 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001291 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001292 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001293 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 .Case("pwr3", "pwr3")
1295 .Case("pwr4", "pwr4")
1296 .Case("pwr5", "pwr5")
1297 .Case("pwr5x", "pwr5x")
1298 .Case("pwr6", "pwr6")
1299 .Case("pwr6x", "pwr6x")
1300 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001301 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001302 .Case("powerpc", "ppc")
1303 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001304 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001305 .Default("");
1306 }
1307
1308 return "";
1309}
1310
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001311static void getPPCTargetFeatures(const ArgList &Args,
1312 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001313 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1314 ie = Args.filtered_end();
1315 it != ie; ++it) {
1316 StringRef Name = (*it)->getOption().getName();
1317 (*it)->claim();
1318
1319 // Skip over "-m".
1320 assert(Name.startswith("m") && "Invalid feature name.");
1321 Name = Name.substr(1);
1322
1323 bool IsNegative = Name.startswith("no-");
1324 if (IsNegative)
1325 Name = Name.substr(3);
1326
1327 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1328 // pass the correct option to the backend while calling the frontend
1329 // option the same.
1330 // TODO: Change the LLVM backend option maybe?
1331 if (Name == "mfcrf")
1332 Name = "mfocrf";
1333
1334 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1335 }
1336
1337 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001338 AddTargetFeature(Args, Features, options::OPT_faltivec,
1339 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001340}
1341
Ulrich Weigand8afad612014-07-28 13:17:52 +00001342void Clang::AddPPCTargetArgs(const ArgList &Args,
1343 ArgStringList &CmdArgs) const {
1344 // Select the ABI to use.
1345 const char *ABIName = nullptr;
1346 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1347 ABIName = A->getValue();
1348 } else if (getToolChain().getTriple().isOSLinux())
1349 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001350 case llvm::Triple::ppc64: {
1351 // When targeting a processor that supports QPX, or if QPX is
1352 // specifically enabled, default to using the ABI that supports QPX (so
1353 // long as it is not specifically disabled).
1354 bool HasQPX = false;
1355 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1356 HasQPX = A->getValue() == StringRef("a2q");
1357 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1358 if (HasQPX) {
1359 ABIName = "elfv1-qpx";
1360 break;
1361 }
1362
Ulrich Weigand8afad612014-07-28 13:17:52 +00001363 ABIName = "elfv1";
1364 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001365 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001366 case llvm::Triple::ppc64le:
1367 ABIName = "elfv2";
1368 break;
1369 default:
1370 break;
1371 }
1372
1373 if (ABIName) {
1374 CmdArgs.push_back("-target-abi");
1375 CmdArgs.push_back(ABIName);
1376 }
1377}
1378
1379bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1380 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1381 return A && (A->getValue() == StringRef(Value));
1382}
1383
Tom Stellard6674c702013-04-01 20:56:53 +00001384/// Get the (LLVM) name of the R600 gpu we are targeting.
1385static std::string getR600TargetGPU(const ArgList &Args) {
1386 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001387 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001388 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001389 .Cases("rv630", "rv635", "r600")
1390 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001391 .Case("rv740", "rv770")
1392 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001393 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001394 .Case("hemlock", "cypress")
1395 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001396 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001397 }
1398 return "";
1399}
1400
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001401static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001402 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001403 bool SoftFloatABI = true;
1404 if (Arg *A =
1405 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1406 if (A->getOption().matches(options::OPT_mhard_float))
1407 SoftFloatABI = false;
1408 }
1409 if (SoftFloatABI)
1410 Features.push_back("+soft-float");
1411}
1412
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001413void Clang::AddSparcTargetArgs(const ArgList &Args,
1414 ArgStringList &CmdArgs) const {
1415 const Driver &D = getToolChain().getDriver();
1416
Brad Smith10cd0f42014-07-11 20:12:08 +00001417 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001418 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001419 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1420 options::OPT_mhard_float)) {
1421 if (A->getOption().matches(options::OPT_msoft_float))
1422 FloatABI = "soft";
1423 else if (A->getOption().matches(options::OPT_mhard_float))
1424 FloatABI = "hard";
1425 }
1426
1427 // If unspecified, choose the default based on the platform.
1428 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001429 // Assume "soft", but warn the user we are guessing.
1430 FloatABI = "soft";
1431 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001432 }
1433
1434 if (FloatABI == "soft") {
1435 // Floating point operations and argument passing are soft.
1436 //
1437 // FIXME: This changes CPP defines, we need -target-soft-float.
1438 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001439 } else {
1440 assert(FloatABI == "hard" && "Invalid float abi!");
1441 CmdArgs.push_back("-mhard-float");
1442 }
1443}
1444
Richard Sandiford4652d892013-07-19 16:51:51 +00001445static const char *getSystemZTargetCPU(const ArgList &Args) {
1446 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1447 return A->getValue();
1448 return "z10";
1449}
1450
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001451static void getSystemZTargetFeatures(const ArgList &Args,
1452 std::vector<const char *> &Features) {
1453 // -m(no-)htm overrides use of the transactional-execution facility.
1454 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1455 options::OPT_mno_htm)) {
1456 if (A->getOption().matches(options::OPT_mhtm))
1457 Features.push_back("+transactional-execution");
1458 else
1459 Features.push_back("-transactional-execution");
1460 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001461 // -m(no-)vx overrides use of the vector facility.
1462 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1463 options::OPT_mno_vx)) {
1464 if (A->getOption().matches(options::OPT_mvx))
1465 Features.push_back("+vector");
1466 else
1467 Features.push_back("-vector");
1468 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001469}
1470
Chandler Carruth953fb082013-01-13 11:46:33 +00001471static const char *getX86TargetCPU(const ArgList &Args,
1472 const llvm::Triple &Triple) {
1473 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001474 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001475 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001476 return "core-avx2";
1477
Chandler Carruth953fb082013-01-13 11:46:33 +00001478 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001479 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001480
1481 // FIXME: Reject attempts to use -march=native unless the target matches
1482 // the host.
1483 //
1484 // FIXME: We should also incorporate the detected target features for use
1485 // with -native.
1486 std::string CPU = llvm::sys::getHostCPUName();
1487 if (!CPU.empty() && CPU != "generic")
1488 return Args.MakeArgString(CPU);
1489 }
1490
1491 // Select the default CPU if none was given (or detection failed).
1492
1493 if (Triple.getArch() != llvm::Triple::x86_64 &&
1494 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001495 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001496
1497 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1498
1499 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001500 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001501 if (Triple.getArchName() == "x86_64h")
1502 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001503 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001504 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001505
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001506 // Set up default CPU name for PS4 compilers.
1507 if (Triple.isPS4CPU())
1508 return "btver2";
1509
Alexey Bataev286d1b92014-01-31 04:07:13 +00001510 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001511 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001512 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001513
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001514 // Everything else goes to x86-64 in 64-bit mode.
1515 if (Is64Bit)
1516 return "x86-64";
1517
1518 switch (Triple.getOS()) {
1519 case llvm::Triple::FreeBSD:
1520 case llvm::Triple::NetBSD:
1521 case llvm::Triple::OpenBSD:
1522 return "i486";
1523 case llvm::Triple::Haiku:
1524 return "i586";
1525 case llvm::Triple::Bitrig:
1526 return "i686";
1527 default:
1528 // Fallback to p4.
1529 return "pentium4";
1530 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001531}
1532
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001533static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1534 switch(T.getArch()) {
1535 default:
1536 return "";
1537
Amara Emerson703da2e2013-10-31 09:32:33 +00001538 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001539 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001540 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001541
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001542 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001543 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001544 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001545 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001546 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001547
1548 case llvm::Triple::mips:
1549 case llvm::Triple::mipsel:
1550 case llvm::Triple::mips64:
1551 case llvm::Triple::mips64el: {
1552 StringRef CPUName;
1553 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001554 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001555 return CPUName;
1556 }
1557
1558 case llvm::Triple::ppc:
1559 case llvm::Triple::ppc64:
1560 case llvm::Triple::ppc64le: {
1561 std::string TargetCPUName = getPPCTargetCPU(Args);
1562 // LLVM may default to generating code for the native CPU,
1563 // but, like gcc, we default to a more generic option for
1564 // each architecture. (except on Darwin)
1565 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1566 if (T.getArch() == llvm::Triple::ppc64)
1567 TargetCPUName = "ppc64";
1568 else if (T.getArch() == llvm::Triple::ppc64le)
1569 TargetCPUName = "ppc64le";
1570 else
1571 TargetCPUName = "ppc";
1572 }
1573 return TargetCPUName;
1574 }
1575
1576 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001577 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001578 case llvm::Triple::sparcv9:
1579 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001580 return A->getValue();
1581 return "";
1582
1583 case llvm::Triple::x86:
1584 case llvm::Triple::x86_64:
1585 return getX86TargetCPU(Args, T);
1586
1587 case llvm::Triple::hexagon:
1588 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1589
1590 case llvm::Triple::systemz:
1591 return getSystemZTargetCPU(Args);
1592
1593 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001594 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001595 return getR600TargetGPU(Args);
1596 }
1597}
1598
Alp Tokerce365ca2013-12-02 12:43:03 +00001599static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1600 ArgStringList &CmdArgs) {
1601 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1602 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1603 // forward.
1604 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001605 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001606 CmdArgs.push_back(Args.MakeArgString(Plugin));
1607
1608 // Try to pass driver level flags relevant to LTO code generation down to
1609 // the plugin.
1610
1611 // Handle flags for selecting CPU variants.
1612 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1613 if (!CPU.empty())
1614 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1615}
1616
Eric Christopherc54920a2015-03-23 19:26:05 +00001617static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001618 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001619 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001620 // If -march=native, autodetect the feature list.
1621 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1622 if (StringRef(A->getValue()) == "native") {
1623 llvm::StringMap<bool> HostFeatures;
1624 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1625 for (auto &F : HostFeatures)
1626 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1627 F.first()));
1628 }
1629 }
1630
Jim Grosbach82eee262013-11-16 00:53:35 +00001631 if (Triple.getArchName() == "x86_64h") {
1632 // x86_64h implies quite a few of the more modern subtarget features
1633 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1634 Features.push_back("-rdrnd");
1635 Features.push_back("-aes");
1636 Features.push_back("-pclmul");
1637 Features.push_back("-rtm");
1638 Features.push_back("-hle");
1639 Features.push_back("-fsgsbase");
1640 }
1641
Eric Christopherc54920a2015-03-23 19:26:05 +00001642 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001643 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001644 if (Triple.getArch() == llvm::Triple::x86_64) {
1645 Features.push_back("+sse4.2");
1646 Features.push_back("+popcnt");
1647 } else
1648 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001649 }
1650
Eric Christopherc54920a2015-03-23 19:26:05 +00001651 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001652 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1653 StringRef Arch = A->getValue();
1654 bool ArchUsed = false;
1655 // First, look for flags that are shared in x86 and x86-64.
1656 if (Triple.getArch() == llvm::Triple::x86_64 ||
1657 Triple.getArch() == llvm::Triple::x86) {
1658 if (Arch == "AVX" || Arch == "AVX2") {
1659 ArchUsed = true;
1660 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1661 }
1662 }
1663 // Then, look for x86-specific flags.
1664 if (Triple.getArch() == llvm::Triple::x86) {
1665 if (Arch == "IA32") {
1666 ArchUsed = true;
1667 } else if (Arch == "SSE" || Arch == "SSE2") {
1668 ArchUsed = true;
1669 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1670 }
1671 }
1672 if (!ArchUsed)
1673 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1674 }
1675
Jim Grosbach82eee262013-11-16 00:53:35 +00001676 // Now add any that the user explicitly requested on the command line,
1677 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001678 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1679 ie = Args.filtered_end();
1680 it != ie; ++it) {
1681 StringRef Name = (*it)->getOption().getName();
1682 (*it)->claim();
1683
1684 // Skip over "-m".
1685 assert(Name.startswith("m") && "Invalid feature name.");
1686 Name = Name.substr(1);
1687
1688 bool IsNegative = Name.startswith("no-");
1689 if (IsNegative)
1690 Name = Name.substr(3);
1691
1692 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1693 }
1694}
1695
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001696void Clang::AddX86TargetArgs(const ArgList &Args,
1697 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001698 if (!Args.hasFlag(options::OPT_mred_zone,
1699 options::OPT_mno_red_zone,
1700 true) ||
1701 Args.hasArg(options::OPT_mkernel) ||
1702 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001703 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001704
Bob Wilson2616e2e2013-02-10 16:01:41 +00001705 // Default to avoid implicit floating-point for kernel/kext code, but allow
1706 // that to be overridden with -mno-soft-float.
1707 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1708 Args.hasArg(options::OPT_fapple_kext));
1709 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1710 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001711 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001712 options::OPT_mno_implicit_float)) {
1713 const Option &O = A->getOption();
1714 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1715 O.matches(options::OPT_msoft_float));
1716 }
1717 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001718 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001719
1720 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1721 StringRef Value = A->getValue();
1722 if (Value == "intel" || Value == "att") {
1723 CmdArgs.push_back("-mllvm");
1724 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1725 } else {
1726 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1727 << A->getOption().getName() << Value;
1728 }
1729 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001730}
1731
Tony Linthicum76329bf2011-12-12 21:14:55 +00001732void Clang::AddHexagonTargetArgs(const ArgList &Args,
1733 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001734 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001735 CmdArgs.push_back("-mqdsp6-compat");
1736 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001737
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001738 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1739 std::string SmallDataThreshold="-hexagon-small-data-threshold=";
1740 SmallDataThreshold += v;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001741 CmdArgs.push_back ("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001742 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001743 }
1744
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001745 if (!Args.hasArg(options::OPT_fno_short_enums))
1746 CmdArgs.push_back("-fshort-enums");
1747 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1748 CmdArgs.push_back ("-mllvm");
1749 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1750 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001751 CmdArgs.push_back ("-mllvm");
1752 CmdArgs.push_back ("-machine-sink-split=0");
1753}
1754
Kevin Qin110db6f2014-07-18 07:03:22 +00001755// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001756static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001757 std::vector<const char *> &Features) {
1758 SmallVector<StringRef, 8> Split;
1759 text.split(Split, StringRef("+"), -1, false);
1760
1761 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1762 const char *result = llvm::StringSwitch<const char *>(Split[I])
1763 .Case("fp", "+fp-armv8")
1764 .Case("simd", "+neon")
1765 .Case("crc", "+crc")
1766 .Case("crypto", "+crypto")
1767 .Case("nofp", "-fp-armv8")
1768 .Case("nosimd", "-neon")
1769 .Case("nocrc", "-crc")
1770 .Case("nocrypto", "-crypto")
1771 .Default(nullptr);
1772 if (result)
1773 Features.push_back(result);
1774 else if (Split[I] == "neon" || Split[I] == "noneon")
1775 D.Diag(diag::err_drv_no_neon_modifier);
1776 else
1777 return false;
1778 }
1779 return true;
1780}
1781
1782// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1783// decode CPU and feature.
1784static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1785 std::vector<const char *> &Features) {
1786 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1787 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001788 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001789 Features.push_back("+neon");
1790 Features.push_back("+crc");
1791 Features.push_back("+crypto");
1792 } else if (CPU == "generic") {
1793 Features.push_back("+neon");
1794 } else {
1795 return false;
1796 }
1797
1798 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1799 return false;
1800
1801 return true;
1802}
1803
1804static bool
1805getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1806 const ArgList &Args,
1807 std::vector<const char *> &Features) {
1808 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001809
1810 if (Split.first == "armv8-a" ||
1811 Split.first == "armv8a") {
1812 // ok, no additional features.
1813 } else if (
1814 Split.first == "armv8.1-a" ||
1815 Split.first == "armv8.1a" ) {
1816 Features.push_back("+v8.1a");
1817 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001818 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001819 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001820
1821 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1822 return false;
1823
1824 return true;
1825}
1826
1827static bool
1828getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1829 const ArgList &Args,
1830 std::vector<const char *> &Features) {
1831 StringRef CPU;
1832 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1833 return false;
1834
1835 return true;
1836}
1837
1838static bool
1839getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1840 const ArgList &Args,
1841 std::vector<const char *> &Features) {
1842 // Handle CPU name is 'native'.
1843 if (Mtune == "native")
1844 Mtune = llvm::sys::getHostCPUName();
1845 if (Mtune == "cyclone") {
1846 Features.push_back("+zcm");
1847 Features.push_back("+zcz");
1848 }
1849 return true;
1850}
1851
1852static bool
1853getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1854 const ArgList &Args,
1855 std::vector<const char *> &Features) {
1856 StringRef CPU;
1857 std::vector<const char *> DecodedFeature;
1858 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1859 return false;
1860
1861 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1862}
1863
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001864static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1865 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001866 Arg *A;
1867 bool success = true;
1868 // Enable NEON by default.
1869 Features.push_back("+neon");
1870 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1871 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1872 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1873 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001874 else if (Args.hasArg(options::OPT_arch))
1875 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1876 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001877
1878 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1879 success =
1880 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1881 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1882 success =
1883 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001884 else if (Args.hasArg(options::OPT_arch))
1885 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1886 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001887
1888 if (!success)
1889 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001890
1891 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1892 Features.push_back("-fp-armv8");
1893 Features.push_back("-crypto");
1894 Features.push_back("-neon");
1895 }
Bradley Smith418c5932014-05-02 15:17:51 +00001896
1897 // En/disable crc
1898 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1899 options::OPT_mnocrc)) {
1900 if (A->getOption().matches(options::OPT_mcrc))
1901 Features.push_back("+crc");
1902 else
1903 Features.push_back("-crc");
1904 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001905}
1906
1907static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001908 const ArgList &Args, ArgStringList &CmdArgs,
1909 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001910 std::vector<const char *> Features;
1911 switch (Triple.getArch()) {
1912 default:
1913 break;
1914 case llvm::Triple::mips:
1915 case llvm::Triple::mipsel:
1916 case llvm::Triple::mips64:
1917 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001918 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001919 break;
1920
1921 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001922 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001923 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001924 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001925 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001926 break;
1927
1928 case llvm::Triple::ppc:
1929 case llvm::Triple::ppc64:
1930 case llvm::Triple::ppc64le:
1931 getPPCTargetFeatures(Args, Features);
1932 break;
1933 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001934 case llvm::Triple::sparcel:
Brad Smithf436e9e2014-08-19 21:50:15 +00001935 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001936 getSparcTargetFeatures(Args, Features);
1937 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001938 case llvm::Triple::systemz:
1939 getSystemZTargetFeatures(Args, Features);
1940 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001941 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001942 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001943 getAArch64TargetFeatures(D, Args, Features);
1944 break;
1945 case llvm::Triple::x86:
1946 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001947 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001948 break;
1949 }
Rafael Espindola43964802013-08-21 17:34:32 +00001950
1951 // Find the last of each feature.
1952 llvm::StringMap<unsigned> LastOpt;
1953 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1954 const char *Name = Features[I];
1955 assert(Name[0] == '-' || Name[0] == '+');
1956 LastOpt[Name + 1] = I;
1957 }
1958
1959 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1960 // If this feature was overridden, ignore it.
1961 const char *Name = Features[I];
1962 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1963 assert(LastI != LastOpt.end());
1964 unsigned Last = LastI->second;
1965 if (Last != I)
1966 continue;
1967
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001968 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001969 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001970 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001971}
1972
David Majnemerae394812014-12-09 00:12:30 +00001973static bool
1974shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1975 const llvm::Triple &Triple) {
1976 // We use the zero-cost exception tables for Objective-C if the non-fragile
1977 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1978 // later.
1979 if (runtime.isNonFragile())
1980 return true;
1981
1982 if (!Triple.isMacOSX())
1983 return false;
1984
1985 return (!Triple.isMacOSXVersionLT(10,5) &&
1986 (Triple.getArch() == llvm::Triple::x86_64 ||
1987 Triple.getArch() == llvm::Triple::arm));
1988}
1989
Nico Webere8e53112014-05-11 01:04:02 +00001990// exceptionSettings() exists to share the logic between -cc1 and linker
1991// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001992static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001993 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001994 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001995 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001996 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001997
David Majnemer8de68642014-12-05 08:11:58 +00001998 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001999}
2000
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002001/// Adds exception related arguments to the driver command arguments. There's a
2002/// master flag, -fexceptions and also language specific flags to enable/disable
2003/// C++ and Objective-C exceptions. This makes it possible to for example
2004/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002005static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002006 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002007 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002008 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002009 const Driver &D = TC.getDriver();
2010 const llvm::Triple &Triple = TC.getTriple();
2011
Chad Rosier4fab82c2012-03-26 22:04:46 +00002012 if (KernelOrKext) {
2013 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2014 // arguments now to avoid warnings about unused arguments.
2015 Args.ClaimAllArgs(options::OPT_fexceptions);
2016 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2017 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2018 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2019 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2020 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002021 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002022 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002023
David Majnemer8de68642014-12-05 08:11:58 +00002024 // Gather the exception settings from the command line arguments.
2025 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002026
David Majnemerae394812014-12-09 00:12:30 +00002027 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2028 // is not necessarily sensible, but follows GCC.
2029 if (types::isObjC(InputType) &&
2030 Args.hasFlag(options::OPT_fobjc_exceptions,
2031 options::OPT_fno_objc_exceptions,
2032 true)) {
2033 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002034
David Majnemerae394812014-12-09 00:12:30 +00002035 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002036 }
2037
2038 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002039 bool CXXExceptionsEnabled =
2040 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002041 Arg *ExceptionArg = Args.getLastArg(
2042 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2043 options::OPT_fexceptions, options::OPT_fno_exceptions);
2044 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002045 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002046 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2047 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002048
2049 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002050 if (Triple.isPS4CPU()) {
2051 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2052 assert(ExceptionArg &&
2053 "On the PS4 exceptions should only be enabled if passing "
2054 "an argument");
2055 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2056 const Arg *RTTIArg = TC.getRTTIArg();
2057 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2058 D.Diag(diag::err_drv_argument_not_allowed_with)
2059 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2060 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2061 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2062 } else
2063 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2064
Anders Carlssone96ab552011-02-28 02:27:16 +00002065 CmdArgs.push_back("-fcxx-exceptions");
2066
David Majnemer8de68642014-12-05 08:11:58 +00002067 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002068 }
2069 }
2070
David Majnemer8de68642014-12-05 08:11:58 +00002071 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002072 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002073}
2074
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002075static bool ShouldDisableAutolink(const ArgList &Args,
2076 const ToolChain &TC) {
2077 bool Default = true;
2078 if (TC.getTriple().isOSDarwin()) {
2079 // The native darwin assembler doesn't support the linker_option directives,
2080 // so we disable them if we think the .s file will be passed to it.
2081 Default = TC.useIntegratedAs();
2082 }
2083 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2084 Default);
2085}
2086
Ted Kremenek62093662013-03-12 17:02:12 +00002087static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2088 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002089 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2090 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002091 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002092 return !UseDwarfDirectory;
2093}
2094
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002095/// \brief Check whether the given input tree contains any compilation actions.
2096static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002097 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002098 return true;
2099
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002100 for (const auto &Act : *A)
2101 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002102 return true;
2103
2104 return false;
2105}
2106
2107/// \brief Check if -relax-all should be passed to the internal assembler.
2108/// This is done by default when compiling non-assembler source with -O0.
2109static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2110 bool RelaxDefault = true;
2111
2112 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2113 RelaxDefault = A->getOption().matches(options::OPT_O0);
2114
2115 if (RelaxDefault) {
2116 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002117 for (const auto &Act : C.getActions()) {
2118 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002119 RelaxDefault = true;
2120 break;
2121 }
2122 }
2123 }
2124
2125 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2126 RelaxDefault);
2127}
2128
David Blaikie9260ed62013-07-25 21:19:01 +00002129static void CollectArgsForIntegratedAssembler(Compilation &C,
2130 const ArgList &Args,
2131 ArgStringList &CmdArgs,
2132 const Driver &D) {
2133 if (UseRelaxAll(C, Args))
2134 CmdArgs.push_back("-mrelax-all");
2135
David Peixottodfb66142013-11-14 22:52:58 +00002136 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002137 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002138 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2139 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2140 // arg after parsing the '-I' arg.
2141 bool TakeNextArg = false;
2142
David Blaikie9260ed62013-07-25 21:19:01 +00002143 // When using an integrated assembler, translate -Wa, and -Xassembler
2144 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002145 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002146 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2147 options::OPT_Xassembler),
2148 ie = Args.filtered_end(); it != ie; ++it) {
2149 const Arg *A = *it;
2150 A->claim();
2151
2152 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2153 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002154 if (TakeNextArg) {
2155 CmdArgs.push_back(Value.data());
2156 TakeNextArg = false;
2157 continue;
2158 }
David Blaikie9260ed62013-07-25 21:19:01 +00002159
2160 if (Value == "-force_cpusubtype_ALL") {
2161 // Do nothing, this is the default and we don't support anything else.
2162 } else if (Value == "-L") {
2163 CmdArgs.push_back("-msave-temp-labels");
2164 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002165 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002166 } else if (Value == "--noexecstack") {
2167 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002168 } else if (Value == "-compress-debug-sections" ||
2169 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002170 CompressDebugSections = true;
2171 } else if (Value == "-nocompress-debug-sections" ||
2172 Value == "--nocompress-debug-sections") {
2173 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002174 } else if (Value.startswith("-I")) {
2175 CmdArgs.push_back(Value.data());
2176 // We need to consume the next argument if the current arg is a plain
2177 // -I. The next arg will be the include directory.
2178 if (Value == "-I")
2179 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002180 } else if (Value.startswith("-gdwarf-")) {
2181 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002182 } else {
2183 D.Diag(diag::err_drv_unsupported_option_argument)
2184 << A->getOption().getName() << Value;
2185 }
2186 }
2187 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002188 if (CompressDebugSections) {
2189 if (llvm::zlib::isAvailable())
2190 CmdArgs.push_back("-compress-debug-sections");
2191 else
2192 D.Diag(diag::warn_debug_compression_unavailable);
2193 }
David Blaikie9260ed62013-07-25 21:19:01 +00002194}
2195
Renato Goline807c122014-01-31 11:47:28 +00002196// Until ARM libraries are build separately, we have them all in one library
2197static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002198 // FIXME: handle 64-bit
2199 if (TC.getTriple().isOSWindows() &&
2200 !TC.getTriple().isWindowsItaniumEnvironment())
2201 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002202 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002203 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002204 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002205}
2206
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002207static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2208 // The runtimes are located in the OS-specific resource directory.
2209 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002210 const llvm::Triple &Triple = TC.getTriple();
2211 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002212 StringRef OSLibName =
2213 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002214 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002215 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002216}
2217
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002218static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002219 bool Shared = false) {
2220 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2221 ? "-android"
2222 : "";
2223
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002224 bool IsOSWindows = TC.getTriple().isOSWindows();
2225 StringRef Arch = getArchNameForCompilerRTLib(TC);
2226 const char *Prefix = IsOSWindows ? "" : "lib";
2227 const char *Suffix =
2228 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2229
2230 SmallString<128> Path = getCompilerRTLibDir(TC);
2231 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2232 Arch + Env + Suffix);
2233
2234 return Path;
2235}
2236
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002237// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002238// FIXME: Make sure we can also emit shared objects if they're requested
2239// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002240static void addClangRT(const ToolChain &TC, const ArgList &Args,
2241 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002242 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002243
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002244 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002245 // FIXME: why do we link against gcc when we are using compiler-rt?
2246 CmdArgs.push_back("-lgcc_s");
2247 if (TC.getDriver().CCCIsCXX())
2248 CmdArgs.push_back("-lgcc_eh");
2249 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002250}
2251
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002252static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2253 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002254 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2255 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002256 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002257 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002258 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002259 Args.hasArg(options::OPT_fcreate_profile) ||
2260 Args.hasArg(options::OPT_coverage)))
2261 return;
2262
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002263 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002264}
2265
Alexey Samsonov52550342014-09-15 19:58:40 +00002266static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2267 ArgStringList &CmdArgs, StringRef Sanitizer,
2268 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002269 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002270 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002271 if (!IsShared)
2272 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002273 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002274 if (!IsShared)
2275 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002276}
2277
Alexey Samsonov52550342014-09-15 19:58:40 +00002278// Tries to use a file with the list of dynamic symbols that need to be exported
2279// from the runtime library. Returns true if the file was found.
2280static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2281 ArgStringList &CmdArgs,
2282 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002283 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2284 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2285 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002286 return true;
2287 }
2288 return false;
2289}
2290
2291static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2292 ArgStringList &CmdArgs) {
2293 // Force linking against the system libraries sanitizers depends on
2294 // (see PR15823 why this is necessary).
2295 CmdArgs.push_back("--no-as-needed");
2296 CmdArgs.push_back("-lpthread");
2297 CmdArgs.push_back("-lrt");
2298 CmdArgs.push_back("-lm");
2299 // There's no libdl on FreeBSD.
2300 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2301 CmdArgs.push_back("-ldl");
2302}
2303
2304static void
2305collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2306 SmallVectorImpl<StringRef> &SharedRuntimes,
2307 SmallVectorImpl<StringRef> &StaticRuntimes,
2308 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2309 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2310 // Collect shared runtimes.
2311 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2312 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002313 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002314
Alexey Samsonov52550342014-09-15 19:58:40 +00002315 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002316 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002317 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2318 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002319 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002320 }
2321 if (SanArgs.needsAsanRt()) {
2322 if (SanArgs.needsSharedAsanRt()) {
2323 HelperStaticRuntimes.push_back("asan-preinit");
2324 } else {
2325 StaticRuntimes.push_back("asan");
2326 if (SanArgs.linkCXXRuntimes())
2327 StaticRuntimes.push_back("asan_cxx");
2328 }
2329 }
2330 if (SanArgs.needsDfsanRt())
2331 StaticRuntimes.push_back("dfsan");
2332 if (SanArgs.needsLsanRt())
2333 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002334 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002335 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002336 if (SanArgs.linkCXXRuntimes())
2337 StaticRuntimes.push_back("msan_cxx");
2338 }
2339 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002340 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002341 if (SanArgs.linkCXXRuntimes())
2342 StaticRuntimes.push_back("tsan_cxx");
2343 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002344 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002345 StaticRuntimes.push_back("ubsan_standalone");
2346 if (SanArgs.linkCXXRuntimes())
2347 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002348 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002349}
2350
Alexey Samsonov52550342014-09-15 19:58:40 +00002351// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2352// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2353static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002354 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002355 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2356 HelperStaticRuntimes;
2357 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2358 HelperStaticRuntimes);
2359 for (auto RT : SharedRuntimes)
2360 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2361 for (auto RT : HelperStaticRuntimes)
2362 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2363 bool AddExportDynamic = false;
2364 for (auto RT : StaticRuntimes) {
2365 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2366 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2367 }
2368 // If there is a static runtime with no dynamic list, force all the symbols
2369 // to be dynamic to be sure we export sanitizer interface functions.
2370 if (AddExportDynamic)
2371 CmdArgs.push_back("-export-dynamic");
2372 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002373}
2374
Reid Kleckner86ea7702015-02-04 23:45:07 +00002375static bool areOptimizationsEnabled(const ArgList &Args) {
2376 // Find the last -O arg and see if it is non-zero.
2377 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2378 return !A->getOption().matches(options::OPT_O0);
2379 // Defaults to -O0.
2380 return false;
2381}
2382
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002383static bool shouldUseFramePointerForTarget(const ArgList &Args,
2384 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002385 // XCore never wants frame pointers, regardless of OS.
2386 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002387 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002388 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002389
2390 if (Triple.isOSLinux()) {
2391 switch (Triple.getArch()) {
2392 // Don't use a frame pointer on linux if optimizing for certain targets.
2393 case llvm::Triple::mips64:
2394 case llvm::Triple::mips64el:
2395 case llvm::Triple::mips:
2396 case llvm::Triple::mipsel:
2397 case llvm::Triple::systemz:
2398 case llvm::Triple::x86:
2399 case llvm::Triple::x86_64:
2400 return !areOptimizationsEnabled(Args);
2401 default:
2402 return true;
2403 }
2404 }
2405
2406 if (Triple.isOSWindows()) {
2407 switch (Triple.getArch()) {
2408 case llvm::Triple::x86:
2409 return !areOptimizationsEnabled(Args);
2410 default:
2411 // All other supported Windows ISAs use xdata unwind information, so frame
2412 // pointers are not generally useful.
2413 return false;
2414 }
2415 }
2416
2417 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002418}
2419
Rafael Espindola224dd632011-12-14 21:02:23 +00002420static bool shouldUseFramePointer(const ArgList &Args,
2421 const llvm::Triple &Triple) {
2422 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2423 options::OPT_fomit_frame_pointer))
2424 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2425
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002426 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002427}
2428
Eric Christopherb7d97e92013-04-03 01:58:53 +00002429static bool shouldUseLeafFramePointer(const ArgList &Args,
2430 const llvm::Triple &Triple) {
2431 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2432 options::OPT_momit_leaf_frame_pointer))
2433 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2434
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002435 if (Triple.isPS4CPU())
2436 return false;
2437
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002438 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002439}
2440
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002441/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002442static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002443 SmallString<128> cwd;
2444 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002445 CmdArgs.push_back("-fdebug-compilation-dir");
2446 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002447 }
2448}
2449
Eric Christopherd3804002013-02-22 20:12:52 +00002450static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002451 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002452 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2453 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2454 SmallString<128> T(FinalOutput->getValue());
2455 llvm::sys::path::replace_extension(T, "dwo");
2456 return Args.MakeArgString(T);
2457 } else {
2458 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002459 SmallString<128> T(
2460 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002461 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002462 llvm::sys::path::replace_extension(F, "dwo");
2463 T += F;
2464 return Args.MakeArgString(F);
2465 }
2466}
2467
2468static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2469 const Tool &T, const JobAction &JA,
2470 const ArgList &Args, const InputInfo &Output,
2471 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002472 ArgStringList ExtractArgs;
2473 ExtractArgs.push_back("--extract-dwo");
2474
2475 ArgStringList StripArgs;
2476 StripArgs.push_back("--strip-dwo");
2477
2478 // Grabbing the output of the earlier compile step.
2479 StripArgs.push_back(Output.getFilename());
2480 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002481 ExtractArgs.push_back(OutFile);
2482
2483 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002484 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002485
2486 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002487 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002488
2489 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002490 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002491}
2492
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002493/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002494/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2495static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002496 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002497 if (A->getOption().matches(options::OPT_O4) ||
2498 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002499 return true;
2500
2501 if (A->getOption().matches(options::OPT_O0))
2502 return false;
2503
2504 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2505
Rafael Espindola91780de2013-08-26 14:05:41 +00002506 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002507 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002508 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002509 return true;
2510
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002511 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002512 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002513 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002514
2515 unsigned OptLevel = 0;
2516 if (S.getAsInteger(10, OptLevel))
2517 return false;
2518
2519 return OptLevel > 1;
2520 }
2521
2522 return false;
2523}
2524
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002525/// Add -x lang to \p CmdArgs for \p Input.
2526static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2527 ArgStringList &CmdArgs) {
2528 // When using -verify-pch, we don't want to provide the type
2529 // 'precompiled-header' if it was inferred from the file extension
2530 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2531 return;
2532
2533 CmdArgs.push_back("-x");
2534 if (Args.hasArg(options::OPT_rewrite_objc))
2535 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2536 else
2537 CmdArgs.push_back(types::getTypeName(Input.getType()));
2538}
2539
David Majnemerc371ff02015-03-22 08:39:22 +00002540static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002541 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002542 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002543
2544 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002545 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002546
2547 unsigned Build = 0, Factor = 1;
2548 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2549 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002550 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002551}
2552
Rafael Espindola577637a2015-01-03 00:06:04 +00002553// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002554// options that build systems might add but are unused when assembling or only
2555// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002556static void claimNoWarnArgs(const ArgList &Args) {
2557 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002558 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002559 Args.ClaimAllArgs(options::OPT_flto);
2560 Args.ClaimAllArgs(options::OPT_fno_lto);
2561}
2562
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002563static void appendUserToPath(SmallVectorImpl<char> &Result) {
2564#ifdef LLVM_ON_UNIX
2565 const char *Username = getenv("LOGNAME");
2566#else
2567 const char *Username = getenv("USERNAME");
2568#endif
2569 if (Username) {
2570 // Validate that LoginName can be used in a path, and get its length.
2571 size_t Len = 0;
2572 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002573 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002574 Username = nullptr;
2575 break;
2576 }
2577 }
2578
2579 if (Username && Len > 0) {
2580 Result.append(Username, Username + Len);
2581 return;
2582 }
2583 }
2584
2585 // Fallback to user id.
2586#ifdef LLVM_ON_UNIX
2587 std::string UID = llvm::utostr(getuid());
2588#else
2589 // FIXME: Windows seems to have an 'SID' that might work.
2590 std::string UID = "9999";
2591#endif
2592 Result.append(UID.begin(), UID.end());
2593}
2594
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002595void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002596 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002597 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002598 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002599 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002600 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2601 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002602 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002603 ArgStringList CmdArgs;
2604
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002605 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002606 bool IsWindowsCygnus =
2607 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002608 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2609
Daniel Dunbare521a892009-03-31 20:53:55 +00002610 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002611 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002612
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002613 // Invoke ourselves in -cc1 mode.
2614 //
2615 // FIXME: Implement custom jobs for internal actions.
2616 CmdArgs.push_back("-cc1");
2617
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002618 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002619 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002620 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002621 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002622
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002623 const llvm::Triple TT(TripleStr);
2624 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2625 TT.getArch() == llvm::Triple::thumb)) {
2626 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2627 unsigned Version;
2628 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2629 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002630 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2631 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002632 }
2633
Tim Northover336f1892014-03-29 13:16:12 +00002634 // Push all default warning arguments that are specific to
2635 // the given target. These come before user provided warning options
2636 // are provided.
2637 getToolChain().addClangWarningOptions(CmdArgs);
2638
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002639 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002640 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002641
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002642 if (isa<AnalyzeJobAction>(JA)) {
2643 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2644 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002645 } else if (isa<MigrateJobAction>(JA)) {
2646 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002647 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002648 if (Output.getType() == types::TY_Dependencies)
2649 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002650 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002651 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002652 if (Args.hasArg(options::OPT_rewrite_objc) &&
2653 !Args.hasArg(options::OPT_g_Group))
2654 CmdArgs.push_back("-P");
2655 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002656 } else if (isa<AssembleJobAction>(JA)) {
2657 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002658
David Blaikie9260ed62013-07-25 21:19:01 +00002659 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002660
2661 // Also ignore explicit -force_cpusubtype_ALL option.
2662 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002663 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002664 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002665 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002666
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002667 if (JA.getType() == types::TY_Nothing)
2668 CmdArgs.push_back("-fsyntax-only");
2669 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002670 CmdArgs.push_back("-emit-pch");
2671 else
2672 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002673 } else if (isa<VerifyPCHJobAction>(JA)) {
2674 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002675 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002676 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2677 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002678
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002679 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002680 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002681 } else if (JA.getType() == types::TY_LLVM_IR ||
2682 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002683 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002684 } else if (JA.getType() == types::TY_LLVM_BC ||
2685 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002686 CmdArgs.push_back("-emit-llvm-bc");
2687 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002688 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002689 } else if (JA.getType() == types::TY_AST) {
2690 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002691 } else if (JA.getType() == types::TY_ModuleFile) {
2692 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002693 } else if (JA.getType() == types::TY_RewrittenObjC) {
2694 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002695 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002696 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2697 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002698 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002699 } else {
2700 assert(JA.getType() == types::TY_PP_Asm &&
2701 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002702 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002703
2704 // Preserve use-list order by default when emitting bitcode, so that
2705 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2706 // same result as running passes here. For LTO, we don't need to preserve
2707 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002708 if (JA.getType() == types::TY_LLVM_BC)
2709 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002710 }
2711
Justin Bognera88f0122014-06-20 22:59:50 +00002712 // We normally speed up the clang process a bit by skipping destructors at
2713 // exit, but when we're generating diagnostics we can rely on some of the
2714 // cleanup.
2715 if (!C.isForDiagnostics())
2716 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002717
John McCallbb79b5f2010-02-13 03:50:24 +00002718 // Disable the verification pass in -asserts builds.
2719#ifdef NDEBUG
2720 CmdArgs.push_back("-disable-llvm-verifier");
2721#endif
2722
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002723 // Set the main file name, so that debug info works even with
2724 // -save-temps.
2725 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002726 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002727
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002728 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002729 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002730 if (Args.hasArg(options::OPT_static))
2731 CmdArgs.push_back("-static-define");
2732
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002733 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002734 // Enable region store model by default.
2735 CmdArgs.push_back("-analyzer-store=region");
2736
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002737 // Treat blocks as analysis entry points.
2738 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2739
Ted Kremenek49c79792011-03-24 00:28:47 +00002740 CmdArgs.push_back("-analyzer-eagerly-assume");
2741
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002742 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002743 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002744 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002745
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002746 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002747 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002748
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002749 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002750 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002751
2752 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002753
Artem Belevichba558952015-05-06 18:20:23 +00002754 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002755 CmdArgs.push_back("-analyzer-checker=cplusplus");
2756
Nico Webere8e53112014-05-11 01:04:02 +00002757 // Enable the following experimental checkers for testing.
2758 CmdArgs.push_back(
2759 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002760 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2761 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2762 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2763 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2764 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002765 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002766
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002767 // Set the output format. The default is plist, for (lame) historical
2768 // reasons.
2769 CmdArgs.push_back("-analyzer-output");
2770 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002771 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002772 else
2773 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002774
Ted Kremenekfe449a22010-03-22 22:32:05 +00002775 // Disable the presentation of standard compiler warnings when
2776 // using --analyze. We only want to show static analyzer diagnostics
2777 // or frontend errors.
2778 CmdArgs.push_back("-w");
2779
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002780 // Add -Xanalyzer arguments when running as analyzer.
2781 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002782 }
2783
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002784 CheckCodeGenerationOptions(D, Args);
2785
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002786 bool PIE = getToolChain().isPIEDefault();
2787 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002788 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002789
Alexey Bataev40e75222014-01-28 06:30:35 +00002790 // Android-specific defaults for PIC/PIE
2791 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2792 switch (getToolChain().getTriple().getArch()) {
2793 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002794 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002795 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002796 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002797 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002798 case llvm::Triple::mips:
2799 case llvm::Triple::mipsel:
2800 case llvm::Triple::mips64:
2801 case llvm::Triple::mips64el:
2802 PIC = true; // "-fpic"
2803 break;
2804
2805 case llvm::Triple::x86:
2806 case llvm::Triple::x86_64:
2807 PIC = true; // "-fPIC"
2808 IsPICLevelTwo = true;
2809 break;
2810
2811 default:
2812 break;
2813 }
2814 }
2815
Brad Smith5b05db82014-06-24 19:51:29 +00002816 // OpenBSD-specific defaults for PIE
2817 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2818 switch (getToolChain().getTriple().getArch()) {
2819 case llvm::Triple::mips64:
2820 case llvm::Triple::mips64el:
2821 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002822 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002823 case llvm::Triple::x86:
2824 case llvm::Triple::x86_64:
2825 IsPICLevelTwo = false; // "-fpie"
2826 break;
2827
2828 case llvm::Triple::ppc:
2829 case llvm::Triple::sparcv9:
2830 IsPICLevelTwo = true; // "-fPIE"
2831 break;
2832
2833 default:
2834 break;
2835 }
2836 }
2837
Alexey Samsonov090301e2013-04-09 12:28:19 +00002838 // For the PIC and PIE flag options, this logic is different from the
2839 // legacy logic in very old versions of GCC, as that logic was just
2840 // a bug no one had ever fixed. This logic is both more rational and
2841 // consistent with GCC's new logic now that the bugs are fixed. The last
2842 // argument relating to either PIC or PIE wins, and no other argument is
2843 // used. If the last argument is any flavor of the '-fno-...' arguments,
2844 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2845 // at the same level.
2846 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2847 options::OPT_fpic, options::OPT_fno_pic,
2848 options::OPT_fPIE, options::OPT_fno_PIE,
2849 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002850 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2851 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002852 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002853 if (LastPICArg) {
2854 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002855 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2856 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2857 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2858 PIC = PIE || O.matches(options::OPT_fPIC) ||
2859 O.matches(options::OPT_fpic);
2860 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2861 O.matches(options::OPT_fPIC);
2862 } else {
2863 PIE = PIC = false;
2864 }
2865 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002866 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002867
Nick Lewycky609dd662013-10-11 03:33:53 +00002868 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002869 // specified while enabling PIC enabled level 1 PIC, just force it back to
2870 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2871 // informal testing).
2872 if (PIC && getToolChain().getTriple().isOSDarwin())
2873 IsPICLevelTwo |= getToolChain().isPICDefault();
2874
Chandler Carruthc0c04552012-04-08 16:40:35 +00002875 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2876 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002877 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002878 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002879 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002880 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002881 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002882
Chandler Carruth76a943b2012-11-19 03:52:03 +00002883 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2884 // This is a very special mode. It trumps the other modes, almost no one
2885 // uses it, and it isn't even valid on any OS but Darwin.
2886 if (!getToolChain().getTriple().isOSDarwin())
2887 D.Diag(diag::err_drv_unsupported_opt_for_target)
2888 << A->getSpelling() << getToolChain().getTriple().str();
2889
2890 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2891
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002892 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002893 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002894
Chandler Carruth76a943b2012-11-19 03:52:03 +00002895 // Only a forced PIC mode can cause the actual compile to have PIC defines
2896 // etc., no flags are sufficient. This behavior was selected to closely
2897 // match that of llvm-gcc and Apple GCC before that.
2898 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2899 CmdArgs.push_back("-pic-level");
2900 CmdArgs.push_back("2");
2901 }
2902 } else {
2903 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2904 // handled in Clang's IRGen by the -pie-level flag.
2905 CmdArgs.push_back("-mrelocation-model");
2906 CmdArgs.push_back(PIC ? "pic" : "static");
2907
2908 if (PIC) {
2909 CmdArgs.push_back("-pic-level");
2910 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2911 if (PIE) {
2912 CmdArgs.push_back("-pie-level");
2913 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2914 }
2915 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002916 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002917
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002918 CmdArgs.push_back("-mthread-model");
2919 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2920 CmdArgs.push_back(A->getValue());
2921 else
2922 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2923
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002924 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2925
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002926 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2927 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002928 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002929
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002930 // LLVM Code Generator Options.
2931
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002932 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2933 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2934 for (arg_iterator
2935 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2936 options::OPT_frewrite_map_file_EQ),
2937 MFE = Args.filtered_end();
2938 MFI != MFE; ++MFI) {
2939 CmdArgs.push_back("-frewrite-map-file");
2940 CmdArgs.push_back((*MFI)->getValue());
2941 (*MFI)->claim();
2942 }
2943 }
2944
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002945 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2946 StringRef v = A->getValue();
2947 CmdArgs.push_back("-mllvm");
2948 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2949 A->claim();
2950 }
2951
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002952 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2953 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002954 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002955 }
2956
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002957 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2958 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002959 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002960 D.Diag(diag::err_drv_unsupported_opt_for_target)
2961 << A->getSpelling() << getToolChain().getTriple().str();
2962 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2963 CmdArgs.push_back("-fpcc-struct-return");
2964 } else {
2965 assert(A->getOption().matches(options::OPT_freg_struct_return));
2966 CmdArgs.push_back("-freg-struct-return");
2967 }
2968 }
2969
Roman Divacky65b88cd2011-03-01 17:40:53 +00002970 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2971 CmdArgs.push_back("-mrtd");
2972
Rafael Espindola224dd632011-12-14 21:02:23 +00002973 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002974 CmdArgs.push_back("-mdisable-fp-elim");
2975 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2976 options::OPT_fno_zero_initialized_in_bss))
2977 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002978
2979 bool OFastEnabled = isOptimizationLevelFast(Args);
2980 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2981 // enabled. This alias option is being used to simplify the hasFlag logic.
2982 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2983 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002984 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2985 // doesn't do any TBAA.
2986 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002987 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002988 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002989 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002990 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2991 options::OPT_fno_struct_path_tbaa))
2992 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002993 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2994 false))
2995 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002996 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2997 options::OPT_fno_optimize_sibling_calls))
2998 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002999
Eric Christopher006208c2013-04-04 06:29:47 +00003000 // Handle segmented stacks.
3001 if (Args.hasArg(options::OPT_fsplit_stack))
3002 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003003
3004 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3005 // This alias option is being used to simplify the getLastArg logic.
3006 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3007 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003008
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003009 // Handle various floating point optimization flags, mapping them to the
3010 // appropriate LLVM code generation flags. The pattern for all of these is to
3011 // default off the codegen optimizations, and if any flag enables them and no
3012 // flag disables them after the flag enabling them, enable the codegen
3013 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003014 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003015 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003016 options::OPT_ffinite_math_only,
3017 options::OPT_fno_finite_math_only,
3018 options::OPT_fhonor_infinities,
3019 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003020 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3021 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003022 A->getOption().getID() != options::OPT_fhonor_infinities)
3023 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003024 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003025 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003026 options::OPT_ffinite_math_only,
3027 options::OPT_fno_finite_math_only,
3028 options::OPT_fhonor_nans,
3029 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003030 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3031 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003032 A->getOption().getID() != options::OPT_fhonor_nans)
3033 CmdArgs.push_back("-menable-no-nans");
3034
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003035 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3036 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003037 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003038 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003039 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003040 options::OPT_fno_math_errno)) {
3041 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3042 // However, turning *off* -ffast_math merely restores the toolchain default
3043 // (which may be false).
3044 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3045 A->getOption().getID() == options::OPT_ffast_math ||
3046 A->getOption().getID() == options::OPT_Ofast)
3047 MathErrno = false;
3048 else if (A->getOption().getID() == options::OPT_fmath_errno)
3049 MathErrno = true;
3050 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003051 if (MathErrno)
3052 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003053
3054 // There are several flags which require disabling very specific
3055 // optimizations. Any of these being disabled forces us to turn off the
3056 // entire set of LLVM optimizations, so collect them through all the flag
3057 // madness.
3058 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003059 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003060 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003061 options::OPT_funsafe_math_optimizations,
3062 options::OPT_fno_unsafe_math_optimizations,
3063 options::OPT_fassociative_math,
3064 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003065 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3066 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003067 A->getOption().getID() != options::OPT_fno_associative_math)
3068 AssociativeMath = true;
3069 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003070 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003071 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003072 options::OPT_funsafe_math_optimizations,
3073 options::OPT_fno_unsafe_math_optimizations,
3074 options::OPT_freciprocal_math,
3075 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003076 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3077 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003078 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3079 ReciprocalMath = true;
3080 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003081 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003082 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003083 options::OPT_funsafe_math_optimizations,
3084 options::OPT_fno_unsafe_math_optimizations,
3085 options::OPT_fsigned_zeros,
3086 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003087 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3088 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003089 A->getOption().getID() != options::OPT_fsigned_zeros)
3090 SignedZeros = false;
3091 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003092 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003093 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003094 options::OPT_funsafe_math_optimizations,
3095 options::OPT_fno_unsafe_math_optimizations,
3096 options::OPT_ftrapping_math,
3097 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003098 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3099 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003100 A->getOption().getID() != options::OPT_ftrapping_math)
3101 TrappingMath = false;
3102 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3103 !TrappingMath)
3104 CmdArgs.push_back("-menable-unsafe-fp-math");
3105
Sanjay Patel76c9e092015-01-23 16:40:50 +00003106 if (!SignedZeros)
3107 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003108
Sanjay Patel359b1052015-04-09 15:03:23 +00003109 if (ReciprocalMath)
3110 CmdArgs.push_back("-freciprocal-math");
3111
Lang Hamesaa53b932012-07-06 00:59:19 +00003112 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003113 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003114 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003115 options::OPT_ffp_contract)) {
3116 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003117 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003118 if (Val == "fast" || Val == "on" || Val == "off") {
3119 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3120 } else {
3121 D.Diag(diag::err_drv_unsupported_option_argument)
3122 << A->getOption().getName() << Val;
3123 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003124 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3125 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003126 // If fast-math is set then set the fp-contract mode to fast.
3127 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3128 }
3129 }
3130
Bob Wilson6a039162012-07-19 03:52:53 +00003131 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3132 // and if we find them, tell the frontend to provide the appropriate
3133 // preprocessor macros. This is distinct from enabling any optimizations as
3134 // these options induce language changes which must survive serialization
3135 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003136 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3137 options::OPT_fno_fast_math))
3138 if (!A->getOption().matches(options::OPT_fno_fast_math))
3139 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003140 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3141 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003142 if (A->getOption().matches(options::OPT_ffinite_math_only))
3143 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003144
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003145 // Decide whether to use verbose asm. Verbose assembly is the default on
3146 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003147 bool IsIntegratedAssemblerDefault =
3148 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003149 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003150 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003151 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003152 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003153
Rafael Espindola298059a2015-04-06 04:36:45 +00003154 bool UsingIntegratedAssembler =
3155 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3156 IsIntegratedAssemblerDefault);
3157 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003158 CmdArgs.push_back("-no-integrated-as");
3159
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003160 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3161 CmdArgs.push_back("-mdebug-pass");
3162 CmdArgs.push_back("Structure");
3163 }
3164 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3165 CmdArgs.push_back("-mdebug-pass");
3166 CmdArgs.push_back("Arguments");
3167 }
3168
John McCall8517abc2010-02-19 02:45:38 +00003169 // Enable -mconstructor-aliases except on darwin, where we have to
3170 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003171 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003172 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003173
John McCall7ef5cb32011-03-18 02:56:14 +00003174 // Darwin's kernel doesn't support guard variables; just die if we
3175 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003176 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003177 CmdArgs.push_back("-fforbid-guard-variables");
3178
Douglas Gregordbe39272011-02-01 15:15:22 +00003179 if (Args.hasArg(options::OPT_mms_bitfields)) {
3180 CmdArgs.push_back("-mms-bitfields");
3181 }
John McCall8517abc2010-02-19 02:45:38 +00003182
Daniel Dunbar306945d2009-09-16 06:17:29 +00003183 // This is a coarse approximation of what llvm-gcc actually does, both
3184 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3185 // complicated ways.
3186 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003187 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3188 options::OPT_fno_asynchronous_unwind_tables,
3189 (getToolChain().IsUnwindTablesDefault() ||
3190 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3191 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003192 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3193 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003194 CmdArgs.push_back("-munwind-tables");
3195
Chandler Carruth05fb5852012-11-21 23:40:23 +00003196 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003197
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003198 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3199 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003200 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003201 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003202
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003203 // FIXME: Handle -mtune=.
3204 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003205
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003206 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003207 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003208 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003209 }
3210
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003211 // Add the target cpu
3212 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3213 llvm::Triple ETriple(ETripleStr);
3214 std::string CPU = getCPUName(Args, ETriple);
3215 if (!CPU.empty()) {
3216 CmdArgs.push_back("-target-cpu");
3217 CmdArgs.push_back(Args.MakeArgString(CPU));
3218 }
3219
Rafael Espindolaeb265472013-08-21 21:59:03 +00003220 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3221 CmdArgs.push_back("-mfpmath");
3222 CmdArgs.push_back(A->getValue());
3223 }
3224
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003225 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003226 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003227
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003228 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003229 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003230 default:
3231 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003232
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003233 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003234 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003235 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003236 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003237 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003238 break;
3239
Tim Northover573cbee2014-05-24 12:52:07 +00003240 case llvm::Triple::aarch64:
3241 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003242 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003243 break;
3244
Eric Christopher0b26a612010-03-02 02:41:08 +00003245 case llvm::Triple::mips:
3246 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003247 case llvm::Triple::mips64:
3248 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003249 AddMIPSTargetArgs(Args, CmdArgs);
3250 break;
3251
Ulrich Weigand8afad612014-07-28 13:17:52 +00003252 case llvm::Triple::ppc:
3253 case llvm::Triple::ppc64:
3254 case llvm::Triple::ppc64le:
3255 AddPPCTargetArgs(Args, CmdArgs);
3256 break;
3257
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003258 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003259 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003260 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003261 AddSparcTargetArgs(Args, CmdArgs);
3262 break;
3263
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003264 case llvm::Triple::x86:
3265 case llvm::Triple::x86_64:
3266 AddX86TargetArgs(Args, CmdArgs);
3267 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003268
3269 case llvm::Triple::hexagon:
3270 AddHexagonTargetArgs(Args, CmdArgs);
3271 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003272 }
3273
Hans Wennborg75958c42013-08-08 00:17:41 +00003274 // Add clang-cl arguments.
3275 if (getToolChain().getDriver().IsCLMode())
3276 AddClangCLArgs(Args, CmdArgs);
3277
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003278 // Pass the linker version in use.
3279 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3280 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003281 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003282 }
3283
Eric Christopherb7d97e92013-04-03 01:58:53 +00003284 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003285 CmdArgs.push_back("-momit-leaf-frame-pointer");
3286
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003287 // Explicitly error on some things we know we don't support and can't just
3288 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003289 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003290 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3291 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003292 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003293 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003294 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003295 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3296 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003297 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003298 << Unsupported->getOption().getName();
3299 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003300 }
3301
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003302 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003303 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003304 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003305 CmdArgs.push_back("-header-include-file");
3306 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3307 D.CCPrintHeadersFilename : "-");
3308 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003309 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003310 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003311
Chad Rosierbe10f982011-08-02 17:58:04 +00003312 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003313 CmdArgs.push_back("-diagnostic-log-file");
3314 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3315 D.CCLogDiagnosticsFilename : "-");
3316 }
3317
Manman Ren17bdb0f2013-11-20 20:22:14 +00003318 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3319 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003320 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003321 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003322 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3323 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003324 // FIXME: we should support specifying dwarf version with
3325 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003326 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003327 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003328 const llvm::Triple &Triple = getToolChain().getTriple();
3329 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003330 Triple.getOS() == llvm::Triple::FreeBSD ||
3331 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003332 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003333 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003334 CmdArgs.push_back("-gdwarf-2");
3335 else if (A->getOption().matches(options::OPT_gdwarf_3))
3336 CmdArgs.push_back("-gdwarf-3");
3337 else if (A->getOption().matches(options::OPT_gdwarf_4))
3338 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003339 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003340 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003341 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003342 const llvm::Triple &Triple = getToolChain().getTriple();
3343 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003344 Triple.getOS() == llvm::Triple::FreeBSD ||
3345 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003346 CmdArgs.push_back("-gdwarf-2");
3347 else
3348 CmdArgs.push_back("-g");
3349 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003350 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003351
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003352 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3353 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003354 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3355 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003356 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003357
Eric Christopher138c32b2013-09-13 22:37:55 +00003358 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003359 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3360 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003361 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003362 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003363 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003364 CmdArgs.push_back("-g");
3365 CmdArgs.push_back("-backend-option");
3366 CmdArgs.push_back("-split-dwarf=Enable");
3367 }
3368
Eric Christopher138c32b2013-09-13 22:37:55 +00003369 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3370 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3371 CmdArgs.push_back("-backend-option");
3372 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3373 }
Eric Christophereec89c22013-06-18 00:03:50 +00003374
Eric Christopher0d403d22014-02-14 01:27:03 +00003375 // -gdwarf-aranges turns on the emission of the aranges section in the
3376 // backend.
3377 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3378 CmdArgs.push_back("-backend-option");
3379 CmdArgs.push_back("-generate-arange-section");
3380 }
3381
David Blaikief36d9ba2014-01-27 18:52:43 +00003382 if (Args.hasFlag(options::OPT_fdebug_types_section,
3383 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003384 CmdArgs.push_back("-backend-option");
3385 CmdArgs.push_back("-generate-type-units");
3386 }
Eric Christophereec89c22013-06-18 00:03:50 +00003387
Ed Schouten6e576152015-03-26 17:50:28 +00003388 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3389 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3390
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003391 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003392 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003393 CmdArgs.push_back("-ffunction-sections");
3394 }
3395
3396 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003397 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003398 CmdArgs.push_back("-fdata-sections");
3399 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003400
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003401 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003402 options::OPT_fno_unique_section_names,
3403 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003404 CmdArgs.push_back("-fno-unique-section-names");
3405
Chris Lattner3c77a352010-06-22 00:03:40 +00003406 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3407
Justin Bognera71e6812015-04-30 23:49:42 +00003408 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3409 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003410 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3411 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3412 D.Diag(diag::err_drv_argument_not_allowed_with)
3413 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3414
Justin Bognera71e6812015-04-30 23:49:42 +00003415 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3416 A->render(Args, CmdArgs);
3417 else
3418 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003419
3420 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3421 A->render(Args, CmdArgs);
3422 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3423 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3424
Nick Lewycky207bce32011-04-21 23:44:07 +00003425 if (Args.hasArg(options::OPT_ftest_coverage) ||
3426 Args.hasArg(options::OPT_coverage))
3427 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003428 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3429 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003430 Args.hasArg(options::OPT_coverage))
3431 CmdArgs.push_back("-femit-coverage-data");
3432
Alex Lorenzee024992014-08-04 18:41:51 +00003433 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003434 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3435 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003436 D.Diag(diag::err_drv_argument_only_allowed_with)
3437 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3438
3439 if (Args.hasArg(options::OPT_fcoverage_mapping))
3440 CmdArgs.push_back("-fcoverage-mapping");
3441
Nick Lewycky480cb992011-05-04 20:46:58 +00003442 if (C.getArgs().hasArg(options::OPT_c) ||
3443 C.getArgs().hasArg(options::OPT_S)) {
3444 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003445 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003446 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003447 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003448 CoverageFilename = FinalOutput->getValue();
3449 } else {
3450 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3451 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003452 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003453 SmallString<128> Pwd;
3454 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003455 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003456 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003457 }
3458 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003459 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003460 }
3461 }
3462
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003463 // Pass options for controlling the default header search paths.
3464 if (Args.hasArg(options::OPT_nostdinc)) {
3465 CmdArgs.push_back("-nostdsysteminc");
3466 CmdArgs.push_back("-nobuiltininc");
3467 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003468 if (Args.hasArg(options::OPT_nostdlibinc))
3469 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003470 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3471 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3472 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003473
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003474 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003475 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003476 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003477
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003478 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3479
Ted Kremenekf7639e12012-03-06 20:06:33 +00003480 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003481 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003482 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003483 options::OPT_ccc_arcmt_modify,
3484 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003485 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003486 switch (A->getOption().getID()) {
3487 default:
3488 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003489 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003490 CmdArgs.push_back("-arcmt-check");
3491 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003492 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003493 CmdArgs.push_back("-arcmt-modify");
3494 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003495 case options::OPT_ccc_arcmt_migrate:
3496 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003497 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003498 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003499
3500 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3501 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003502 break;
John McCalld70fb982011-06-15 23:25:17 +00003503 }
3504 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003505 } else {
3506 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3507 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3508 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003509 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003510
Ted Kremenekf7639e12012-03-06 20:06:33 +00003511 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3512 if (ARCMTEnabled) {
3513 D.Diag(diag::err_drv_argument_not_allowed_with)
3514 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3515 }
3516 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003517 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003518
3519 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003520 options::OPT_objcmt_migrate_subscripting,
3521 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003522 // None specified, means enable them all.
3523 CmdArgs.push_back("-objcmt-migrate-literals");
3524 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003525 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003526 } else {
3527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3528 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003529 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003530 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003531 } else {
3532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3533 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3534 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3535 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003548 }
3549
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003550 // Add preprocessing options like -I, -D, etc. if we are using the
3551 // preprocessor.
3552 //
3553 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003554 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003555 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003556
Rafael Espindolaa7431922011-07-21 23:40:37 +00003557 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3558 // that "The compiler can only warn and ignore the option if not recognized".
3559 // When building with ccache, it will pass -D options to clang even on
3560 // preprocessed inputs and configure concludes that -fPIC is not supported.
3561 Args.ClaimAllArgs(options::OPT_D);
3562
Alp Toker7874bdc2013-11-15 20:40:58 +00003563 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003564 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3565 if (A->getOption().matches(options::OPT_O4)) {
3566 CmdArgs.push_back("-O3");
3567 D.Diag(diag::warn_O4_is_O3);
3568 } else {
3569 A->render(Args, CmdArgs);
3570 }
3571 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003572
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003573 // Warn about ignored options to clang.
3574 for (arg_iterator it = Args.filtered_begin(
3575 options::OPT_clang_ignored_gcc_optimization_f_Group),
3576 ie = Args.filtered_end(); it != ie; ++it) {
3577 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3578 }
3579
Rafael Espindola577637a2015-01-03 00:06:04 +00003580 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003581
Richard Smith3be1cb22014-08-07 00:24:21 +00003582 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003583 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003584 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3585 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003586 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003587 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003588
3589 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003590 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003591 //
3592 // If a std is supplied, only add -trigraphs if it follows the
3593 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003594 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003595 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3596 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003597 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003598 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003599 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003600 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003601 else
3602 Std->render(Args, CmdArgs);
3603
Nico Weber00721502014-12-23 22:32:37 +00003604 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003605 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003606 options::OPT_ftrigraphs,
3607 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003608 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003609 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003610 } else {
3611 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003612 //
3613 // FIXME: Clang doesn't correctly handle -std= when the input language
3614 // doesn't match. For the time being just ignore this for C++ inputs;
3615 // eventually we want to do all the standard defaulting here instead of
3616 // splitting it between the driver and clang -cc1.
3617 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003618 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3619 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003620 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003621 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003622
Nico Weber00721502014-12-23 22:32:37 +00003623 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3624 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003625 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003626
Richard Smith282b4492013-09-04 22:50:31 +00003627 // GCC's behavior for -Wwrite-strings is a bit strange:
3628 // * In C, this "warning flag" changes the types of string literals from
3629 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3630 // for the discarded qualifier.
3631 // * In C++, this is just a normal warning flag.
3632 //
3633 // Implementing this warning correctly in C is hard, so we follow GCC's
3634 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3635 // a non-const char* in C, rather than using this crude hack.
3636 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003637 // FIXME: This should behave just like a warning flag, and thus should also
3638 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3639 Arg *WriteStrings =
3640 Args.getLastArg(options::OPT_Wwrite_strings,
3641 options::OPT_Wno_write_strings, options::OPT_w);
3642 if (WriteStrings &&
3643 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003644 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003645 }
3646
Chandler Carruth61fbf622011-04-23 09:27:53 +00003647 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003648 // during C++ compilation, which it is by default. GCC keeps this define even
3649 // in the presence of '-w', match this behavior bug-for-bug.
3650 if (types::isCXX(InputType) &&
3651 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3652 true)) {
3653 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003654 }
3655
Chandler Carruthe0391482010-05-22 02:21:53 +00003656 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3657 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3658 if (Asm->getOption().matches(options::OPT_fasm))
3659 CmdArgs.push_back("-fgnu-keywords");
3660 else
3661 CmdArgs.push_back("-fno-gnu-keywords");
3662 }
3663
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003664 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3665 CmdArgs.push_back("-fno-dwarf-directory-asm");
3666
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003667 if (ShouldDisableAutolink(Args, getToolChain()))
3668 CmdArgs.push_back("-fno-autolink");
3669
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003670 // Add in -fdebug-compilation-dir if necessary.
3671 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003672
Richard Smith9a568822011-11-21 19:36:32 +00003673 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3674 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003675 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003676 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003677 }
3678
Richard Smith79c927b2013-11-06 19:31:51 +00003679 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3680 CmdArgs.push_back("-foperator-arrow-depth");
3681 CmdArgs.push_back(A->getValue());
3682 }
3683
Richard Smith9a568822011-11-21 19:36:32 +00003684 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3685 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003686 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003687 }
3688
Richard Smitha3d3bd22013-05-08 02:12:03 +00003689 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3690 CmdArgs.push_back("-fconstexpr-steps");
3691 CmdArgs.push_back(A->getValue());
3692 }
3693
Richard Smithb3a14522013-02-22 01:59:51 +00003694 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3695 CmdArgs.push_back("-fbracket-depth");
3696 CmdArgs.push_back(A->getValue());
3697 }
3698
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003699 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3700 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003701 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003702 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003703 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3704 } else
3705 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003706 }
3707
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003708
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003709 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003710 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003711
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003712 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3713 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003714 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003715 }
David Chisnall5778fce2009-08-31 16:41:57 +00003716
Chris Lattnere23003d2010-01-09 21:54:33 +00003717 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3718 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003719 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003720 }
3721
Chris Lattnerb35583d2010-04-07 20:49:23 +00003722 CmdArgs.push_back("-ferror-limit");
3723 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003724 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003725 else
3726 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003727
Chandler Carrutha77a7272010-05-06 04:55:18 +00003728 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3729 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003730 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003731 }
3732
3733 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3734 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003735 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003736 }
3737
Richard Smithf6f003a2011-12-16 19:06:07 +00003738 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3739 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003740 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003741 }
3742
Nick Lewycky24653262014-12-16 21:39:02 +00003743 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3744 CmdArgs.push_back("-fspell-checking-limit");
3745 CmdArgs.push_back(A->getValue());
3746 }
3747
Daniel Dunbar2c978472009-11-04 06:24:47 +00003748 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003749 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003750 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003751 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003752 } else {
3753 // If -fmessage-length=N was not specified, determine whether this is a
3754 // terminal and, if so, implicitly define -fmessage-length appropriately.
3755 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003756 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003757 }
3758
John McCallb4a99d32013-02-19 01:57:35 +00003759 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3760 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3761 options::OPT_fvisibility_ms_compat)) {
3762 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3763 CmdArgs.push_back("-fvisibility");
3764 CmdArgs.push_back(A->getValue());
3765 } else {
3766 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3767 CmdArgs.push_back("-fvisibility");
3768 CmdArgs.push_back("hidden");
3769 CmdArgs.push_back("-ftype-visibility");
3770 CmdArgs.push_back("default");
3771 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003772 }
3773
Douglas Gregor08329632010-06-15 17:05:35 +00003774 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003775
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003776 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3777
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003778 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003779 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3780 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003781 CmdArgs.push_back("-ffreestanding");
3782
Daniel Dunbare357d562009-12-03 18:42:11 +00003783 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003784 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003785 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003786 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3787 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003788 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003789 // AltiVec language extensions aren't relevant for assembling.
3790 if (!isa<PreprocessJobAction>(JA) ||
3791 Output.getType() != types::TY_PP_Asm)
3792 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003793 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3794 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003795
Alexey Bataevdb390212015-05-20 04:24:19 +00003796 // Forward flags for OpenMP
3797 if (Args.hasArg(options::OPT_fopenmp_EQ) ||
3798 Args.hasArg(options::OPT_fopenmp)) {
3799 CmdArgs.push_back("-fopenmp");
3800 }
3801
Peter Collingbourne32701642013-11-01 18:16:25 +00003802 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3803 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003804
Eric Christopher459d2712013-02-19 06:16:53 +00003805 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003806 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003807 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003808 getToolChain().getArch() == llvm::Triple::ppc64 ||
3809 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003810 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003811 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003812
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003813 if (getToolChain().SupportsProfiling())
3814 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003815
3816 // -flax-vector-conversions is default.
3817 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3818 options::OPT_fno_lax_vector_conversions))
3819 CmdArgs.push_back("-fno-lax-vector-conversions");
3820
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003821 if (Args.getLastArg(options::OPT_fapple_kext))
3822 CmdArgs.push_back("-fapple-kext");
3823
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003824 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003825 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003826 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003827 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3828 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003829
3830 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3831 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003832 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003833 }
3834
Bob Wilson14adb362012-02-03 06:27:22 +00003835 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003836
Chandler Carruth6e501032011-03-27 00:04:55 +00003837 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3838 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3839 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3840 options::OPT_fno_wrapv)) {
3841 if (A->getOption().matches(options::OPT_fwrapv))
3842 CmdArgs.push_back("-fwrapv");
3843 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3844 options::OPT_fno_strict_overflow)) {
3845 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3846 CmdArgs.push_back("-fwrapv");
3847 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003848
3849 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3850 options::OPT_fno_reroll_loops))
3851 if (A->getOption().matches(options::OPT_freroll_loops))
3852 CmdArgs.push_back("-freroll-loops");
3853
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003854 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003855 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3856 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003857
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003858 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3859
Mahesha S6a682be42012-10-27 07:47:56 +00003860
Daniel Dunbar4930e332009-11-17 08:07:36 +00003861 // -stack-protector=0 is default.
3862 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003863 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3864 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003865 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003866 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003867 if (A->getOption().matches(options::OPT_fstack_protector)) {
3868 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3869 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3870 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003871 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003872 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003873 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003874 } else {
3875 StackProtectorLevel =
3876 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3877 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003878 if (StackProtectorLevel) {
3879 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003880 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003881 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003882
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003883 // --param ssp-buffer-size=
3884 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3885 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003886 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003887 if (Str.startswith("ssp-buffer-size=")) {
3888 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003889 CmdArgs.push_back("-stack-protector-buffer-size");
3890 // FIXME: Verify the argument is a valid integer.
3891 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003892 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003893 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003894 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003895 }
3896
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003897 // Translate -mstackrealign
3898 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3899 false)) {
3900 CmdArgs.push_back("-backend-option");
3901 CmdArgs.push_back("-force-align-stack");
3902 }
3903 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3904 false)) {
3905 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3906 }
3907
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003908 if (Args.hasArg(options::OPT_mstack_alignment)) {
3909 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3910 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003911 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003912
Hans Wennborg77dc2362015-01-20 19:45:50 +00003913 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3914 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3915
3916 if (!Size.empty())
3917 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3918 else
3919 CmdArgs.push_back("-mstack-probe-size=0");
3920 }
3921
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003922 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3923 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3924 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3925
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003926 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3927 options::OPT_mno_restrict_it)) {
3928 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3929 CmdArgs.push_back("-backend-option");
3930 CmdArgs.push_back("-arm-restrict-it");
3931 } else {
3932 CmdArgs.push_back("-backend-option");
3933 CmdArgs.push_back("-arm-no-restrict-it");
3934 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003935 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3936 TT.getArch() == llvm::Triple::thumb)) {
3937 // Windows on ARM expects restricted IT blocks
3938 CmdArgs.push_back("-backend-option");
3939 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003940 }
3941
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003942 if (TT.getArch() == llvm::Triple::arm ||
3943 TT.getArch() == llvm::Triple::thumb) {
3944 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3945 options::OPT_mno_long_calls)) {
3946 if (A->getOption().matches(options::OPT_mlong_calls)) {
3947 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003948 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003949 }
3950 }
3951 }
3952
Daniel Dunbard18049a2009-04-07 21:16:11 +00003953 // Forward -f options with positive and negative forms; we translate
3954 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003955 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3956 StringRef fname = A->getValue();
3957 if (!llvm::sys::fs::exists(fname))
3958 D.Diag(diag::err_drv_no_such_file) << fname;
3959 else
3960 A->render(Args, CmdArgs);
3961 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003962
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003963 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003964 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003965 CmdArgs.push_back("-fapple-kext");
3966 if (!Args.hasArg(options::OPT_fbuiltin))
3967 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003968 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003969 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003970 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003971 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003972 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003973
Nuno Lopes13c88c72009-12-16 16:59:22 +00003974 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3975 options::OPT_fno_assume_sane_operator_new))
3976 CmdArgs.push_back("-fno-assume-sane-operator-new");
3977
Daniel Dunbar4930e332009-11-17 08:07:36 +00003978 // -fblocks=0 is default.
3979 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003980 getToolChain().IsBlocksDefault()) ||
3981 (Args.hasArg(options::OPT_fgnu_runtime) &&
3982 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3983 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003984 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003985
3986 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3987 !getToolChain().hasBlocksRuntime())
3988 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003989 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003990
Richard Smithffb65082014-09-30 23:10:19 +00003991 // -fmodules enables modules (off by default).
3992 // Users can pass -fno-cxx-modules to turn off modules support for
3993 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003994 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003995 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3996 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3997 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003998 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003999 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004000 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004001 HaveModules = true;
4002 }
4003 }
4004
Daniel Jasper07e6c402013-08-05 20:26:17 +00004005 // -fmodule-maps enables module map processing (off by default) for header
4006 // checking. It is implied by -fmodules.
4007 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4008 false)) {
4009 CmdArgs.push_back("-fmodule-maps");
4010 }
4011
Daniel Jasperac42b752013-10-21 06:34:34 +00004012 // -fmodules-decluse checks that modules used are declared so (off by
4013 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004014 if (Args.hasFlag(options::OPT_fmodules_decluse,
4015 options::OPT_fno_modules_decluse,
4016 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004017 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004018 }
4019
Daniel Jasper962b38e2014-04-11 11:47:45 +00004020 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4021 // all #included headers are part of modules.
4022 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4023 options::OPT_fno_modules_strict_decluse,
4024 false)) {
4025 CmdArgs.push_back("-fmodules-strict-decluse");
4026 }
4027
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004028 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4029 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4030 options::OPT_fno_implicit_modules)) {
4031 CmdArgs.push_back("-fno-implicit-modules");
4032 }
4033
Daniel Jasperac42b752013-10-21 06:34:34 +00004034 // -fmodule-name specifies the module that is currently being built (or
4035 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004036 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004037
Richard Smith9887d792014-10-17 01:42:53 +00004038 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004039 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004040 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004041
Richard Smithe842a472014-10-22 02:05:46 +00004042 // -fmodule-file can be used to specify files containing precompiled modules.
4043 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4044
4045 // -fmodule-cache-path specifies where our implicitly-built module files
4046 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004047 SmallString<128> ModuleCachePath;
4048 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4049 ModuleCachePath = A->getValue();
4050 if (HaveModules) {
4051 if (C.isForDiagnostics()) {
4052 // When generating crash reports, we want to emit the modules along with
4053 // the reproduction sources, so we ignore any provided module path.
4054 ModuleCachePath = Output.getFilename();
4055 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4056 llvm::sys::path::append(ModuleCachePath, "modules");
4057 } else if (ModuleCachePath.empty()) {
4058 // No module path was provided: use the default.
4059 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4060 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004061 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4062 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004063 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4064 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004065 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004066 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4067 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4068 }
4069
4070 // When building modules and generating crashdumps, we need to dump a module
4071 // dependency VFS alongside the output.
4072 if (HaveModules && C.isForDiagnostics()) {
4073 SmallString<128> VFSDir(Output.getFilename());
4074 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004075 // Add the cache directory as a temp so the crash diagnostics pick it up.
4076 C.addTempFile(Args.MakeArgString(VFSDir));
4077
Justin Bognera88f0122014-06-20 22:59:50 +00004078 llvm::sys::path::append(VFSDir, "vfs");
4079 CmdArgs.push_back("-module-dependency-dir");
4080 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004081 }
4082
Richard Smith9887d792014-10-17 01:42:53 +00004083 if (HaveModules)
4084 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004085
Douglas Gregor35b04d62013-02-07 19:01:24 +00004086 // Pass through all -fmodules-ignore-macro arguments.
4087 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004088 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4089 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004090
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004091 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4092
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004093 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4094 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4095 D.Diag(diag::err_drv_argument_not_allowed_with)
4096 << A->getAsString(Args) << "-fbuild-session-timestamp";
4097
4098 llvm::sys::fs::file_status Status;
4099 if (llvm::sys::fs::status(A->getValue(), Status))
4100 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004101 CmdArgs.push_back(Args.MakeArgString(
4102 "-fbuild-session-timestamp=" +
4103 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004104 }
4105
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004106 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004107 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4108 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004109 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4110
4111 Args.AddLastArg(CmdArgs,
4112 options::OPT_fmodules_validate_once_per_build_session);
4113 }
4114
Ben Langmuirdcf73862014-03-12 00:06:17 +00004115 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4116
John McCalldfea9982010-04-09 19:12:06 +00004117 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004118 if (Args.hasFlag(options::OPT_fno_access_control,
4119 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004120 false))
John McCall3155f572010-04-09 19:03:51 +00004121 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004122
Anders Carlssond470fef2010-11-21 00:09:52 +00004123 // -felide-constructors is the default.
4124 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4125 options::OPT_felide_constructors,
4126 false))
4127 CmdArgs.push_back("-fno-elide-constructors");
4128
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004129 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004130
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004131 if (KernelOrKext || (types::isCXX(InputType) &&
4132 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4133 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004134 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004135
Tony Linthicum76329bf2011-12-12 21:14:55 +00004136 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004137 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004138 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004139 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004140 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004141 CmdArgs.push_back("-fshort-enums");
4142
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004143 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004144 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004145 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004146 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004147
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004148 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004149 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4150 options::OPT_fno_use_cxa_atexit,
4151 !IsWindowsCygnus && !IsWindowsGNU &&
4152 getToolChain().getArch() != llvm::Triple::hexagon &&
4153 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004154 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004155 CmdArgs.push_back("-fno-use-cxa-atexit");
4156
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004157 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004158 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004159 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004160 CmdArgs.push_back("-fms-extensions");
4161
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004162 // -fno-use-line-directives is default.
4163 if (Args.hasFlag(options::OPT_fuse_line_directives,
4164 options::OPT_fno_use_line_directives, false))
4165 CmdArgs.push_back("-fuse-line-directives");
4166
Francois Pichet1b4f1632011-09-17 04:32:15 +00004167 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004168 if (Args.hasFlag(options::OPT_fms_compatibility,
4169 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004170 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4171 options::OPT_fno_ms_extensions,
4172 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004173 CmdArgs.push_back("-fms-compatibility");
4174
David Majnemerc371ff02015-03-22 08:39:22 +00004175 // -fms-compatibility-version=18.00 is default.
4176 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004177 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004178 IsWindowsMSVC) ||
4179 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004180 Args.hasArg(options::OPT_fms_compatibility_version)) {
4181 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4182 const Arg *MSCompatibilityVersion =
4183 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004184
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004185 if (MSCVersion && MSCompatibilityVersion)
4186 D.Diag(diag::err_drv_argument_not_allowed_with)
4187 << MSCVersion->getAsString(Args)
4188 << MSCompatibilityVersion->getAsString(Args);
4189
David Majnemerc371ff02015-03-22 08:39:22 +00004190 if (MSCompatibilityVersion) {
4191 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4192 D.Diag(diag::err_drv_invalid_value)
4193 << MSCompatibilityVersion->getAsString(Args)
4194 << MSCompatibilityVersion->getValue();
4195 } else if (MSCVersion) {
4196 unsigned Version = 0;
4197 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4198 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4199 << MSCVersion->getValue();
4200 MSVT = getMSCompatibilityVersion(Version);
4201 } else {
4202 MSVT = VersionTuple(18);
4203 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004204
David Majnemerc371ff02015-03-22 08:39:22 +00004205 CmdArgs.push_back(
4206 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004207 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004208
David Majnemer8db91762015-05-18 04:49:30 +00004209 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4210 if (ImplyVCPPCXXVer) {
4211 if (IsMSVC2015Compatible)
4212 CmdArgs.push_back("-std=c++14");
4213 else
4214 CmdArgs.push_back("-std=c++11");
4215 }
4216
Eric Christopher5ecce122013-02-18 00:38:31 +00004217 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004218 if (Args.hasFlag(options::OPT_fborland_extensions,
4219 options::OPT_fno_borland_extensions, false))
4220 CmdArgs.push_back("-fborland-extensions");
4221
David Majnemerc371ff02015-03-22 08:39:22 +00004222 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4223 // than 19.
4224 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4225 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004226 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004227 CmdArgs.push_back("-fno-threadsafe-statics");
4228
Francois Pichet02744872011-09-01 16:38:08 +00004229 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4230 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004231 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004232 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004233 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004234
Chandler Carruthe03aa552010-04-17 20:17:31 +00004235 // -fgnu-keywords default varies depending on language; only pass if
4236 // specified.
4237 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004238 options::OPT_fno_gnu_keywords))
4239 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004240
Rafael Espindola922a6242011-06-02 17:30:53 +00004241 if (Args.hasFlag(options::OPT_fgnu89_inline,
4242 options::OPT_fno_gnu89_inline,
4243 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004244 CmdArgs.push_back("-fgnu89-inline");
4245
Chad Rosier9c76d242012-03-15 22:31:42 +00004246 if (Args.hasArg(options::OPT_fno_inline))
4247 CmdArgs.push_back("-fno-inline");
4248
Chad Rosier64d6be92012-03-06 21:17:19 +00004249 if (Args.hasArg(options::OPT_fno_inline_functions))
4250 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004251
John McCall5fb5df92012-06-20 06:18:46 +00004252 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004253
John McCall5fb5df92012-06-20 06:18:46 +00004254 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004255 // legacy is the default. Except for deployment taget of 10.5,
4256 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4257 // gets ignored silently.
4258 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004259 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4260 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004261 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004262 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004263 if (getToolChain().UseObjCMixedDispatch())
4264 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4265 else
4266 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4267 }
4268 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004269
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004270 // When ObjectiveC legacy runtime is in effect on MacOSX,
4271 // turn on the option to do Array/Dictionary subscripting
4272 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004273 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4274 getToolChain().getTriple().isMacOSX() &&
4275 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4276 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004277 objcRuntime.isNeXTFamily())
4278 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4279
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004280 // -fencode-extended-block-signature=1 is default.
4281 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4282 CmdArgs.push_back("-fencode-extended-block-signature");
4283 }
4284
John McCall24fc0de2011-07-06 00:26:06 +00004285 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4286 // NOTE: This logic is duplicated in ToolChains.cpp.
4287 bool ARC = isObjCAutoRefCount(Args);
4288 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004289 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004290
John McCall24fc0de2011-07-06 00:26:06 +00004291 CmdArgs.push_back("-fobjc-arc");
4292
Chandler Carruth491db322011-11-04 07:34:47 +00004293 // FIXME: It seems like this entire block, and several around it should be
4294 // wrapped in isObjC, but for now we just use it here as this is where it
4295 // was being used previously.
4296 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4297 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4298 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4299 else
4300 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4301 }
4302
John McCall24fc0de2011-07-06 00:26:06 +00004303 // Allow the user to enable full exceptions code emission.
4304 // We define off for Objective-CC, on for Objective-C++.
4305 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4306 options::OPT_fno_objc_arc_exceptions,
4307 /*default*/ types::isCXX(InputType)))
4308 CmdArgs.push_back("-fobjc-arc-exceptions");
4309 }
4310
4311 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4312 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004313 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004314 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004315
John McCall24fc0de2011-07-06 00:26:06 +00004316 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4317 // takes precedence.
4318 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4319 if (!GCArg)
4320 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4321 if (GCArg) {
4322 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004323 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004324 << GCArg->getAsString(Args);
4325 } else if (getToolChain().SupportsObjCGC()) {
4326 GCArg->render(Args, CmdArgs);
4327 } else {
4328 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004329 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004330 << GCArg->getAsString(Args);
4331 }
4332 }
4333
Bob Wilsonb111ec92015-03-02 19:01:14 +00004334 if (Args.hasFlag(options::OPT_fapplication_extension,
4335 options::OPT_fno_application_extension, false))
4336 CmdArgs.push_back("-fapplication-extension");
4337
Reid Klecknerc542d372014-06-27 17:02:02 +00004338 // Handle GCC-style exception args.
4339 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004340 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004341 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004342
4343 if (getToolChain().UseSjLjExceptions())
4344 CmdArgs.push_back("-fsjlj-exceptions");
4345
4346 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004347 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4348 options::OPT_fno_assume_sane_operator_new))
4349 CmdArgs.push_back("-fno-assume-sane-operator-new");
4350
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004351 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4352 // most platforms.
4353 if (Args.hasFlag(options::OPT_fsized_deallocation,
4354 options::OPT_fno_sized_deallocation, false))
4355 CmdArgs.push_back("-fsized-deallocation");
4356
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004357 // -fconstant-cfstrings is default, and may be subject to argument translation
4358 // on Darwin.
4359 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4360 options::OPT_fno_constant_cfstrings) ||
4361 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4362 options::OPT_mno_constant_cfstrings))
4363 CmdArgs.push_back("-fno-constant-cfstrings");
4364
John Thompsoned4e2952009-11-05 20:14:16 +00004365 // -fshort-wchar default varies depending on platform; only
4366 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004367 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4368 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004369 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004370
Hans Wennborg28c96312013-07-31 23:39:13 +00004371 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004372 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004373 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004374 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004375 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004376
Daniel Dunbar096ed292011-10-05 21:04:55 +00004377 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4378 // -fno-pack-struct doesn't apply to -fpack-struct=.
4379 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004380 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004381 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004382 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004383 } else if (Args.hasFlag(options::OPT_fpack_struct,
4384 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004385 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004386 }
4387
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004388 // Handle -fmax-type-align=N and -fno-type-align
4389 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4390 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4391 if (!SkipMaxTypeAlign) {
4392 std::string MaxTypeAlignStr = "-fmax-type-align=";
4393 MaxTypeAlignStr += A->getValue();
4394 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4395 }
4396 } else if (getToolChain().getTriple().isOSDarwin()) {
4397 if (!SkipMaxTypeAlign) {
4398 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4399 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4400 }
4401 }
4402
Robert Lytton0e076492013-08-13 09:43:10 +00004403 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004404 if (!Args.hasArg(options::OPT_fcommon))
4405 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004406 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004407 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004408
Daniel Dunbard18049a2009-04-07 21:16:11 +00004409 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004410 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004411 CmdArgs.push_back("-fno-common");
4412
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004413 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004414 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004415 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004416 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004417 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004418 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4419
Daniel Dunbar6358d682010-10-15 22:30:42 +00004420 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4421 if (!Args.hasFlag(options::OPT_ffor_scope,
4422 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004423 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004424 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4425
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004426 // -finput_charset=UTF-8 is default. Reject others
4427 if (Arg *inputCharset = Args.getLastArg(
4428 options::OPT_finput_charset_EQ)) {
4429 StringRef value = inputCharset->getValue();
4430 if (value != "UTF-8")
4431 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4432 }
4433
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004434 // -fexec_charset=UTF-8 is default. Reject others
4435 if (Arg *execCharset = Args.getLastArg(
4436 options::OPT_fexec_charset_EQ)) {
4437 StringRef value = execCharset->getValue();
4438 if (value != "UTF-8")
4439 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4440 }
4441
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004442 // -fcaret-diagnostics is default.
4443 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4444 options::OPT_fno_caret_diagnostics, true))
4445 CmdArgs.push_back("-fno-caret-diagnostics");
4446
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004447 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004448 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004449 options::OPT_fno_diagnostics_fixit_info))
4450 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004451
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004452 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004453 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004454 options::OPT_fno_diagnostics_show_option))
4455 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004456
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004457 if (const Arg *A =
4458 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4459 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004460 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004461 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004462
Douglas Gregor643c9222011-05-21 17:07:29 +00004463 if (const Arg *A =
4464 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4465 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004466 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004467 }
4468
Chandler Carruthb6766f02011-03-27 01:50:55 +00004469 if (Arg *A = Args.getLastArg(
4470 options::OPT_fdiagnostics_show_note_include_stack,
4471 options::OPT_fno_diagnostics_show_note_include_stack)) {
4472 if (A->getOption().matches(
4473 options::OPT_fdiagnostics_show_note_include_stack))
4474 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4475 else
4476 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4477 }
4478
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004479 // Color diagnostics are the default, unless the terminal doesn't support
4480 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004481 // Support both clang's -f[no-]color-diagnostics and gcc's
4482 // -f[no-]diagnostics-colors[=never|always|auto].
4483 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004484 for (const auto &Arg : Args) {
4485 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004486 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4487 !O.matches(options::OPT_fdiagnostics_color) &&
4488 !O.matches(options::OPT_fno_color_diagnostics) &&
4489 !O.matches(options::OPT_fno_diagnostics_color) &&
4490 !O.matches(options::OPT_fdiagnostics_color_EQ))
4491 continue;
4492
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004493 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004494 if (O.matches(options::OPT_fcolor_diagnostics) ||
4495 O.matches(options::OPT_fdiagnostics_color)) {
4496 ShowColors = Colors_On;
4497 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4498 O.matches(options::OPT_fno_diagnostics_color)) {
4499 ShowColors = Colors_Off;
4500 } else {
4501 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004502 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004503 if (value == "always")
4504 ShowColors = Colors_On;
4505 else if (value == "never")
4506 ShowColors = Colors_Off;
4507 else if (value == "auto")
4508 ShowColors = Colors_Auto;
4509 else
4510 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4511 << ("-fdiagnostics-color=" + value).str();
4512 }
4513 }
4514 if (ShowColors == Colors_On ||
4515 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004516 CmdArgs.push_back("-fcolor-diagnostics");
4517
Nico Rieck7857d462013-09-11 00:38:02 +00004518 if (Args.hasArg(options::OPT_fansi_escape_codes))
4519 CmdArgs.push_back("-fansi-escape-codes");
4520
Daniel Dunbardb097022009-06-08 21:13:54 +00004521 if (!Args.hasFlag(options::OPT_fshow_source_location,
4522 options::OPT_fno_show_source_location))
4523 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004524
Douglas Gregor643c9222011-05-21 17:07:29 +00004525 if (!Args.hasFlag(options::OPT_fshow_column,
4526 options::OPT_fno_show_column,
4527 true))
4528 CmdArgs.push_back("-fno-show-column");
4529
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004530 if (!Args.hasFlag(options::OPT_fspell_checking,
4531 options::OPT_fno_spell_checking))
4532 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004533
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004534
Chad Rosierc8e56e82012-12-05 21:08:21 +00004535 // -fno-asm-blocks is default.
4536 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4537 false))
4538 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004539
Steven Wucb0d13f2015-01-16 23:05:28 +00004540 // -fgnu-inline-asm is default.
4541 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4542 options::OPT_fno_gnu_inline_asm, true))
4543 CmdArgs.push_back("-fno-gnu-inline-asm");
4544
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004545 // Enable vectorization per default according to the optimization level
4546 // selected. For optimization levels that want vectorization we use the alias
4547 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004548 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004549 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004550 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004551 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004552 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004553 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004554
Chad Rosier136d67d2014-04-28 19:30:57 +00004555 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004556 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4557 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004558 options::OPT_fslp_vectorize;
4559 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004560 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004561 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004562
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004563 // -fno-slp-vectorize-aggressive is default.
4564 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004565 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004566 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004567
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004568 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4569 A->render(Args, CmdArgs);
4570
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004571 // -fdollars-in-identifiers default varies depending on platform and
4572 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004573 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004574 options::OPT_fno_dollars_in_identifiers)) {
4575 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004576 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004577 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004578 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004579 }
4580
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004581 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4582 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004583 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004584 options::OPT_fno_unit_at_a_time)) {
4585 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004586 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004587 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004588
Eli Friedman055c9702011-11-02 01:53:16 +00004589 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4590 options::OPT_fno_apple_pragma_pack, false))
4591 CmdArgs.push_back("-fapple-pragma-pack");
4592
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004593 // le32-specific flags:
4594 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4595 // by default.
4596 if (getToolChain().getArch() == llvm::Triple::le32) {
4597 CmdArgs.push_back("-fno-math-builtin");
4598 }
4599
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004600 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004601 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004602 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004603#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004604 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004605 (getToolChain().getArch() == llvm::Triple::arm ||
4606 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004607 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4608 CmdArgs.push_back("-fno-builtin-strcat");
4609 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4610 CmdArgs.push_back("-fno-builtin-strcpy");
4611 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004612#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004613
Justin Bognera88f0122014-06-20 22:59:50 +00004614 // Enable rewrite includes if the user's asked for it or if we're generating
4615 // diagnostics.
4616 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4617 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004618 if (Args.hasFlag(options::OPT_frewrite_includes,
4619 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004620 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004621 CmdArgs.push_back("-frewrite-includes");
4622
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004623 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004624 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004625 options::OPT_traditional_cpp)) {
4626 if (isa<PreprocessJobAction>(JA))
4627 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004628 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004629 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004630 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004631
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004632 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004633 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004634
4635 // Handle serialized diagnostics.
4636 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4637 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004638 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004639 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004640
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004641 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4642 CmdArgs.push_back("-fretain-comments-from-system-headers");
4643
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004644 // Forward -fcomment-block-commands to -cc1.
4645 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004646 // Forward -fparse-all-comments to -cc1.
4647 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004648
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004649 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4650 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004651 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004652 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004653 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4654 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004655 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004656
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004657 // We translate this by hand to the -cc1 argument, since nightly test uses
4658 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004659 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004660 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004661 OptDisabled = true;
4662 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004663 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004664 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004665
Bob Wilson23a55f12014-12-21 07:00:00 +00004666 // With -save-temps, we want to save the unoptimized bitcode output from the
4667 // CompileJobAction, so disable optimizations if they are not already
4668 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004669 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004670 isa<CompileJobAction>(JA))
4671 CmdArgs.push_back("-disable-llvm-optzns");
4672
Daniel Dunbard67a3222009-03-30 06:36:42 +00004673 if (Output.getType() == types::TY_Dependencies) {
4674 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004675 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004676 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004677 CmdArgs.push_back(Output.getFilename());
4678 } else {
4679 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004680 }
4681
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004682 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004683 addDashXForInput(Args, II, CmdArgs);
4684
Daniel Dunbarb440f562010-08-02 02:38:21 +00004685 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004686 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004687 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004688 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004689 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004690
Chris Lattnere9d7d782009-11-03 19:50:27 +00004691 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4692
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004693 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004694
4695 // Optionally embed the -cc1 level arguments into the debug info, for build
4696 // analysis.
4697 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004698 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004699 for (const auto &Arg : Args)
4700 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004701
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004702 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004703 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004704 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004705 SmallString<128> EscapedArg;
4706 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004707 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004708 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004709 }
4710 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004711 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004712 }
4713
Eric Christopherd3804002013-02-22 20:12:52 +00004714 // Add the split debug info name to the command lines here so we
4715 // can propagate it to the backend.
4716 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004717 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004718 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4719 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004720 const char *SplitDwarfOut;
4721 if (SplitDwarf) {
4722 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004723 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004724 CmdArgs.push_back(SplitDwarfOut);
4725 }
4726
4727 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004728 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004729 Output.getType() == types::TY_Object &&
4730 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004731 auto CLCommand =
4732 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4733 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4734 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004735 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004736 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004737 }
4738
Daniel Dunbar17731772009-03-23 19:03:36 +00004739
Eric Christopherf1545832013-02-22 23:50:16 +00004740 // Handle the debug info splitting at object creation time if we're
4741 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004742 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004743 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004744 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004745
Roman Divacky178e01602011-02-10 16:52:03 +00004746 if (Arg *A = Args.getLastArg(options::OPT_pg))
4747 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004748 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004749 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004750
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004751 // Claim some arguments which clang supports automatically.
4752
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004753 // -fpch-preprocess is used with gcc to add a special marker in the output to
4754 // include the PCH file. Clang's PTH solution is completely transparent, so we
4755 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004756 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004757
Daniel Dunbar17731772009-03-23 19:03:36 +00004758 // Claim some arguments which clang doesn't support, but we don't
4759 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004760 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4761 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004762
Rafael Espindolab0092d72013-09-04 19:37:35 +00004763 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004764 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004765}
4766
John McCall5fb5df92012-06-20 06:18:46 +00004767/// Add options related to the Objective-C runtime/ABI.
4768///
4769/// Returns true if the runtime is non-fragile.
4770ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4771 ArgStringList &cmdArgs,
4772 RewriteKind rewriteKind) const {
4773 // Look for the controlling runtime option.
4774 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4775 options::OPT_fgnu_runtime,
4776 options::OPT_fobjc_runtime_EQ);
4777
4778 // Just forward -fobjc-runtime= to the frontend. This supercedes
4779 // options about fragility.
4780 if (runtimeArg &&
4781 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4782 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004783 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004784 if (runtime.tryParse(value)) {
4785 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4786 << value;
4787 }
4788
4789 runtimeArg->render(args, cmdArgs);
4790 return runtime;
4791 }
4792
4793 // Otherwise, we'll need the ABI "version". Version numbers are
4794 // slightly confusing for historical reasons:
4795 // 1 - Traditional "fragile" ABI
4796 // 2 - Non-fragile ABI, version 1
4797 // 3 - Non-fragile ABI, version 2
4798 unsigned objcABIVersion = 1;
4799 // If -fobjc-abi-version= is present, use that to set the version.
4800 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004801 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004802 if (value == "1")
4803 objcABIVersion = 1;
4804 else if (value == "2")
4805 objcABIVersion = 2;
4806 else if (value == "3")
4807 objcABIVersion = 3;
4808 else
4809 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4810 << value;
4811 } else {
4812 // Otherwise, determine if we are using the non-fragile ABI.
4813 bool nonFragileABIIsDefault =
4814 (rewriteKind == RK_NonFragile ||
4815 (rewriteKind == RK_None &&
4816 getToolChain().IsObjCNonFragileABIDefault()));
4817 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4818 options::OPT_fno_objc_nonfragile_abi,
4819 nonFragileABIIsDefault)) {
4820 // Determine the non-fragile ABI version to use.
4821#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4822 unsigned nonFragileABIVersion = 1;
4823#else
4824 unsigned nonFragileABIVersion = 2;
4825#endif
4826
4827 if (Arg *abiArg = args.getLastArg(
4828 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004829 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004830 if (value == "1")
4831 nonFragileABIVersion = 1;
4832 else if (value == "2")
4833 nonFragileABIVersion = 2;
4834 else
4835 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4836 << value;
4837 }
4838
4839 objcABIVersion = 1 + nonFragileABIVersion;
4840 } else {
4841 objcABIVersion = 1;
4842 }
4843 }
4844
4845 // We don't actually care about the ABI version other than whether
4846 // it's non-fragile.
4847 bool isNonFragile = objcABIVersion != 1;
4848
4849 // If we have no runtime argument, ask the toolchain for its default runtime.
4850 // However, the rewriter only really supports the Mac runtime, so assume that.
4851 ObjCRuntime runtime;
4852 if (!runtimeArg) {
4853 switch (rewriteKind) {
4854 case RK_None:
4855 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4856 break;
4857 case RK_Fragile:
4858 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4859 break;
4860 case RK_NonFragile:
4861 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4862 break;
4863 }
4864
4865 // -fnext-runtime
4866 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4867 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004868 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004869 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4870
4871 // Otherwise, build for a generic macosx port.
4872 } else {
4873 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4874 }
4875
4876 // -fgnu-runtime
4877 } else {
4878 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004879 // Legacy behaviour is to target the gnustep runtime if we are i
4880 // non-fragile mode or the GCC runtime in fragile mode.
4881 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004882 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004883 else
4884 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004885 }
4886
4887 cmdArgs.push_back(args.MakeArgString(
4888 "-fobjc-runtime=" + runtime.getAsString()));
4889 return runtime;
4890}
4891
Reid Klecknerc542d372014-06-27 17:02:02 +00004892static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4893 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4894 I += HaveDash;
4895 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004896}
Reid Klecknerc542d372014-06-27 17:02:02 +00004897
4898struct EHFlags {
4899 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4900 bool Synch;
4901 bool Asynch;
4902 bool NoExceptC;
4903};
4904
4905/// /EH controls whether to run destructor cleanups when exceptions are
4906/// thrown. There are three modifiers:
4907/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4908/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4909/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4910/// - c: Assume that extern "C" functions are implicitly noexcept. This
4911/// modifier is an optimization, so we ignore it for now.
4912/// The default is /EHs-c-, meaning cleanups are disabled.
4913static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4914 EHFlags EH;
4915 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4916 for (auto EHVal : EHArgs) {
4917 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4918 switch (EHVal[I]) {
4919 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4920 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4921 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4922 default: break;
4923 }
4924 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4925 break;
4926 }
4927 }
4928 return EH;
4929}
4930
Hans Wennborg75958c42013-08-08 00:17:41 +00004931void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4932 unsigned RTOptionID = options::OPT__SLASH_MT;
4933
Hans Wennborgf1a74252013-09-10 20:18:04 +00004934 if (Args.hasArg(options::OPT__SLASH_LDd))
4935 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4936 // but defining _DEBUG is sticky.
4937 RTOptionID = options::OPT__SLASH_MTd;
4938
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004939 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004940 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004941
Hans Wennborg75958c42013-08-08 00:17:41 +00004942 switch(RTOptionID) {
4943 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004944 if (Args.hasArg(options::OPT__SLASH_LDd))
4945 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004946 CmdArgs.push_back("-D_MT");
4947 CmdArgs.push_back("-D_DLL");
4948 CmdArgs.push_back("--dependent-lib=msvcrt");
4949 break;
4950 case options::OPT__SLASH_MDd:
4951 CmdArgs.push_back("-D_DEBUG");
4952 CmdArgs.push_back("-D_MT");
4953 CmdArgs.push_back("-D_DLL");
4954 CmdArgs.push_back("--dependent-lib=msvcrtd");
4955 break;
4956 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004957 if (Args.hasArg(options::OPT__SLASH_LDd))
4958 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004959 CmdArgs.push_back("-D_MT");
4960 CmdArgs.push_back("--dependent-lib=libcmt");
4961 break;
4962 case options::OPT__SLASH_MTd:
4963 CmdArgs.push_back("-D_DEBUG");
4964 CmdArgs.push_back("-D_MT");
4965 CmdArgs.push_back("--dependent-lib=libcmtd");
4966 break;
4967 default:
4968 llvm_unreachable("Unexpected option ID.");
4969 }
4970
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004971 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4972 // users want. The /Za flag to cl.exe turns this off, but it's not
4973 // implemented in clang.
4974 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004975
Hans Wennborg8858a032014-07-21 23:42:07 +00004976 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4977 // would produce interleaved output, so ignore /showIncludes in such cases.
4978 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4979 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4980 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004981
David Majnemerf6072342014-07-01 22:24:56 +00004982 // This controls whether or not we emit RTTI data for polymorphic types.
4983 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4984 /*default=*/false))
4985 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004986
Reid Klecknerc542d372014-06-27 17:02:02 +00004987 const Driver &D = getToolChain().getDriver();
4988 EHFlags EH = parseClangCLEHFlags(D, Args);
4989 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004990 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004991 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004992 CmdArgs.push_back("-fexceptions");
4993 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004994
Hans Wennborge50cec32014-06-13 20:59:54 +00004995 // /EP should expand to -E -P.
4996 if (Args.hasArg(options::OPT__SLASH_EP)) {
4997 CmdArgs.push_back("-E");
4998 CmdArgs.push_back("-P");
4999 }
5000
David Majnemera5b195a2015-02-14 01:35:12 +00005001 unsigned VolatileOptionID;
5002 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
5003 getToolChain().getTriple().getArch() == llvm::Triple::x86)
5004 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5005 else
5006 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5007
5008 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5009 VolatileOptionID = A->getOption().getID();
5010
5011 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5012 CmdArgs.push_back("-fms-volatile");
5013
David Majnemer86c318f2014-02-11 21:05:00 +00005014 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5015 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5016 if (MostGeneralArg && BestCaseArg)
5017 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5018 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5019
5020 if (MostGeneralArg) {
5021 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5022 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5023 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5024
5025 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5026 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5027 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5028 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5029 << FirstConflict->getAsString(Args)
5030 << SecondConflict->getAsString(Args);
5031
5032 if (SingleArg)
5033 CmdArgs.push_back("-fms-memptr-rep=single");
5034 else if (MultipleArg)
5035 CmdArgs.push_back("-fms-memptr-rep=multiple");
5036 else
5037 CmdArgs.push_back("-fms-memptr-rep=virtual");
5038 }
5039
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005040 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5041 A->render(Args, CmdArgs);
5042
Hans Wennborg81f74482013-09-10 01:07:07 +00005043 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5044 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005045 if (Args.hasArg(options::OPT__SLASH_fallback))
5046 CmdArgs.push_back("msvc-fallback");
5047 else
5048 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005049 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005050}
5051
Hans Wennborg1da044a2014-06-26 19:59:02 +00005052visualstudio::Compile *Clang::getCLFallback() const {
5053 if (!CLFallback)
5054 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5055 return CLFallback.get();
5056}
5057
Daniel Sanders7f933f42015-01-30 17:35:23 +00005058void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5059 ArgStringList &CmdArgs) const {
5060 StringRef CPUName;
5061 StringRef ABIName;
5062 const llvm::Triple &Triple = getToolChain().getTriple();
5063 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5064
5065 CmdArgs.push_back("-target-abi");
5066 CmdArgs.push_back(ABIName.data());
5067}
5068
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005069void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005070 const InputInfo &Output,
5071 const InputInfoList &Inputs,
5072 const ArgList &Args,
5073 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005074 ArgStringList CmdArgs;
5075
5076 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5077 const InputInfo &Input = Inputs[0];
5078
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005079 // Don't warn about "clang -w -c foo.s"
5080 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005081 // and "clang -emit-llvm -c foo.s"
5082 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005083
Rafael Espindola577637a2015-01-03 00:06:04 +00005084 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005085
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005086 // Invoke ourselves in -cc1as mode.
5087 //
5088 // FIXME: Implement custom jobs for internal actions.
5089 CmdArgs.push_back("-cc1as");
5090
5091 // Add the "effective" target triple.
5092 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005093 std::string TripleStr =
5094 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005095 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5096
5097 // Set the output mode, we currently only expect to be used as a real
5098 // assembler.
5099 CmdArgs.push_back("-filetype");
5100 CmdArgs.push_back("obj");
5101
Eric Christopher45f2e712012-12-18 00:31:10 +00005102 // Set the main file name, so that debug info works even with
5103 // -save-temps or preprocessed assembly.
5104 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005105 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005106
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005107 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005108 const llvm::Triple &Triple = getToolChain().getTriple();
5109 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005110 if (!CPU.empty()) {
5111 CmdArgs.push_back("-target-cpu");
5112 CmdArgs.push_back(Args.MakeArgString(CPU));
5113 }
5114
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005115 // Add the target features
5116 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005117 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005118
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005119 // Ignore explicit -force_cpusubtype_ALL option.
5120 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005121
Eric Christopherfc3ee562012-01-10 00:38:01 +00005122 // Determine the original source input.
5123 const Action *SourceAction = &JA;
5124 while (SourceAction->getKind() != Action::InputClass) {
5125 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5126 SourceAction = SourceAction->getInputs()[0];
5127 }
5128
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005129 // Forward -g and handle debug info related flags, assuming we are dealing
5130 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005131 if (SourceAction->getType() == types::TY_Asm ||
5132 SourceAction->getType() == types::TY_PP_Asm) {
5133 Args.ClaimAllArgs(options::OPT_g_Group);
5134 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5135 if (!A->getOption().matches(options::OPT_g0))
5136 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005137
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005138 if (Args.hasArg(options::OPT_gdwarf_2))
5139 CmdArgs.push_back("-gdwarf-2");
5140 if (Args.hasArg(options::OPT_gdwarf_3))
5141 CmdArgs.push_back("-gdwarf-3");
5142 if (Args.hasArg(options::OPT_gdwarf_4))
5143 CmdArgs.push_back("-gdwarf-4");
5144
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005145 // Add the -fdebug-compilation-dir flag if needed.
5146 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005147
5148 // Set the AT_producer to the clang version when using the integrated
5149 // assembler on assembly source files.
5150 CmdArgs.push_back("-dwarf-debug-producer");
5151 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005152 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005153
5154 // Optionally embed the -cc1as level arguments into the debug info, for build
5155 // analysis.
5156 if (getToolChain().UseDwarfDebugFlags()) {
5157 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005158 for (const auto &Arg : Args)
5159 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005160
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005161 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005162 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5163 Flags += Exec;
5164 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005165 SmallString<128> EscapedArg;
5166 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005167 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005168 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005169 }
5170 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005171 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005172 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005173
5174 // FIXME: Add -static support, once we have it.
5175
Daniel Sanders7f933f42015-01-30 17:35:23 +00005176 // Add target specific flags.
5177 switch(getToolChain().getArch()) {
5178 default:
5179 break;
5180
5181 case llvm::Triple::mips:
5182 case llvm::Triple::mipsel:
5183 case llvm::Triple::mips64:
5184 case llvm::Triple::mips64el:
5185 AddMIPSTargetArgs(Args, CmdArgs);
5186 break;
5187 }
5188
David Blaikie372d9502014-01-17 03:17:40 +00005189 // Consume all the warning flags. Usually this would be handled more
5190 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5191 // doesn't handle that so rather than warning about unused flags that are
5192 // actually used, we'll lie by omission instead.
5193 // FIXME: Stop lying and consume only the appropriate driver flags
5194 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5195 ie = Args.filtered_end();
5196 it != ie; ++it)
5197 (*it)->claim();
5198
David Blaikie9260ed62013-07-25 21:19:01 +00005199 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5200 getToolChain().getDriver());
5201
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005202 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005203
5204 assert(Output.isFilename() && "Unexpected lipo output.");
5205 CmdArgs.push_back("-o");
5206 CmdArgs.push_back(Output.getFilename());
5207
Daniel Dunbarb440f562010-08-02 02:38:21 +00005208 assert(Input.isFilename() && "Invalid input.");
5209 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005210
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005211 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005212 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005213
5214 // Handle the debug info splitting at object creation time if we're
5215 // creating an object.
5216 // TODO: Currently only works on linux with newer objcopy.
5217 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005218 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005219 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005220 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005221}
5222
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005223void GnuTool::anchor() {}
5224
Daniel Dunbara3246a02009-03-18 08:07:30 +00005225void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005226 const InputInfo &Output,
5227 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005228 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005229 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005230 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005231 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005232
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005233 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005234 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005235 // Don't forward any -g arguments to assembly steps.
5236 if (isa<AssembleJobAction>(JA) &&
5237 A->getOption().matches(options::OPT_g_Group))
5238 continue;
5239
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005240 // Don't forward any -W arguments to assembly and link steps.
5241 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5242 A->getOption().matches(options::OPT_W_Group))
5243 continue;
5244
Daniel Dunbar2da02722009-03-19 07:55:12 +00005245 // It is unfortunate that we have to claim here, as this means
5246 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005247 // platforms using a generic gcc, even if we are just using gcc
5248 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005249 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005250 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005251 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005252 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005253
Daniel Dunbar4e295052010-01-25 22:35:08 +00005254 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005255
5256 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005257 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005258 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005259 CmdArgs.push_back(
5260 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005261 }
5262
Daniel Dunbar5716d872009-05-02 21:41:52 +00005263 // Try to force gcc to match the tool chain we want, if we recognize
5264 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005265 //
5266 // FIXME: The triple class should directly provide the information we want
5267 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005268 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005269 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005270 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005271 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5272 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005273 CmdArgs.push_back("-m64");
5274
Daniel Dunbarb440f562010-08-02 02:38:21 +00005275 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005276 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005277 CmdArgs.push_back(Output.getFilename());
5278 } else {
5279 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005280 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005281 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005282
Tony Linthicum76329bf2011-12-12 21:14:55 +00005283 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5284 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005285
5286 // Only pass -x if gcc will understand it; otherwise hope gcc
5287 // understands the suffix correctly. The main use case this would go
5288 // wrong in is for linker inputs if they happened to have an odd
5289 // suffix; really the only way to get this to happen is a command
5290 // like '-x foobar a.c' which will treat a.c like a linker input.
5291 //
5292 // FIXME: For the linker case specifically, can we safely convert
5293 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005294 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005295 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005296 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5297 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005298 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005299 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005300 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005301 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005302 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005303 else if (II.getType() == types::TY_ModuleFile)
5304 D.Diag(diag::err_drv_no_module_support)
5305 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005306
Daniel Dunbara3246a02009-03-18 08:07:30 +00005307 if (types::canTypeBeUserSpecified(II.getType())) {
5308 CmdArgs.push_back("-x");
5309 CmdArgs.push_back(types::getTypeName(II.getType()));
5310 }
5311
Daniel Dunbarb440f562010-08-02 02:38:21 +00005312 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005313 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005314 else {
5315 const Arg &A = II.getInputArg();
5316
5317 // Reverse translate some rewritten options.
5318 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5319 CmdArgs.push_back("-lstdc++");
5320 continue;
5321 }
5322
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005323 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005324 A.render(Args, CmdArgs);
5325 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005326 }
5327
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005328 const std::string customGCCName = D.getCCCGenericGCCName();
5329 const char *GCCName;
5330 if (!customGCCName.empty())
5331 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005332 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005333 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005334 } else
5335 GCCName = "gcc";
5336
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005337 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005338 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005339 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005340}
5341
Daniel Dunbar4e295052010-01-25 22:35:08 +00005342void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5343 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005344 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005345}
5346
Daniel Dunbar4e295052010-01-25 22:35:08 +00005347void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5348 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005349 const Driver &D = getToolChain().getDriver();
5350
Eric Christophercc7ff502015-01-29 00:56:17 +00005351 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005352 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005353 case types::TY_LLVM_IR:
5354 case types::TY_LTO_IR:
5355 case types::TY_LLVM_BC:
5356 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005357 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005358 break;
5359 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005360 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005361 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005362 case types::TY_Nothing:
5363 CmdArgs.push_back("-fsyntax-only");
5364 break;
5365 default:
5366 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005367 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005368}
5369
Daniel Dunbar4e295052010-01-25 22:35:08 +00005370void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5371 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005372 // The types are (hopefully) good enough.
5373}
5374
Tony Linthicum76329bf2011-12-12 21:14:55 +00005375// Hexagon tools start.
5376void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5377 ArgStringList &CmdArgs) const {
5378
5379}
5380void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5381 const InputInfo &Output,
5382 const InputInfoList &Inputs,
5383 const ArgList &Args,
5384 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005385 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005386
5387 const Driver &D = getToolChain().getDriver();
5388 ArgStringList CmdArgs;
5389
5390 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005391 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005392 CmdArgs.push_back(Args.MakeArgString(MarchString));
5393
5394 RenderExtraToolArgs(JA, CmdArgs);
5395
5396 if (Output.isFilename()) {
5397 CmdArgs.push_back("-o");
5398 CmdArgs.push_back(Output.getFilename());
5399 } else {
5400 assert(Output.isNothing() && "Unexpected output");
5401 CmdArgs.push_back("-fsyntax-only");
5402 }
5403
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005404 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
5405 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005406
Matthew Curtise5df3812012-12-07 17:23:04 +00005407 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5408 options::OPT_Xassembler);
5409
Tony Linthicum76329bf2011-12-12 21:14:55 +00005410 // Only pass -x if gcc will understand it; otherwise hope gcc
5411 // understands the suffix correctly. The main use case this would go
5412 // wrong in is for linker inputs if they happened to have an odd
5413 // suffix; really the only way to get this to happen is a command
5414 // like '-x foobar a.c' which will treat a.c like a linker input.
5415 //
5416 // FIXME: For the linker case specifically, can we safely convert
5417 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005418 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005419 // Don't try to pass LLVM or AST inputs to a generic gcc.
5420 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5421 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5422 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5423 << getToolChain().getTripleString();
5424 else if (II.getType() == types::TY_AST)
5425 D.Diag(clang::diag::err_drv_no_ast_support)
5426 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005427 else if (II.getType() == types::TY_ModuleFile)
5428 D.Diag(diag::err_drv_no_module_support)
5429 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005430
5431 if (II.isFilename())
5432 CmdArgs.push_back(II.getFilename());
5433 else
5434 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5435 II.getInputArg().render(Args, CmdArgs);
5436 }
5437
5438 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005439 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005440 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005441}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005442
Tony Linthicum76329bf2011-12-12 21:14:55 +00005443void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5444 ArgStringList &CmdArgs) const {
5445 // The types are (hopefully) good enough.
5446}
5447
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005448static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5449 const toolchains::Hexagon_TC& ToolChain,
5450 const InputInfo &Output,
5451 const InputInfoList &Inputs,
5452 const ArgList &Args,
5453 ArgStringList &CmdArgs,
5454 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005455
Matthew Curtise689b052012-12-06 15:46:07 +00005456 const Driver &D = ToolChain.getDriver();
5457
Tony Linthicum76329bf2011-12-12 21:14:55 +00005458
Matthew Curtise689b052012-12-06 15:46:07 +00005459 //----------------------------------------------------------------------------
5460 //
5461 //----------------------------------------------------------------------------
5462 bool hasStaticArg = Args.hasArg(options::OPT_static);
5463 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005464 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005465 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5466 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5467 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005468 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005469 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005470
Matthew Curtise689b052012-12-06 15:46:07 +00005471 //----------------------------------------------------------------------------
5472 // Silence warnings for various options
5473 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005474
Matthew Curtise689b052012-12-06 15:46:07 +00005475 Args.ClaimAllArgs(options::OPT_g_Group);
5476 Args.ClaimAllArgs(options::OPT_emit_llvm);
5477 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5478 // handled somewhere else.
5479 Args.ClaimAllArgs(options::OPT_static_libgcc);
5480
5481 //----------------------------------------------------------------------------
5482 //
5483 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005484 for (const auto &Opt : ToolChain.ExtraOpts)
5485 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005486
Matthew Curtisf10a5952012-12-06 14:16:43 +00005487 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5488 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005489
Matthew Curtise689b052012-12-06 15:46:07 +00005490 if (buildingLib) {
5491 CmdArgs.push_back("-shared");
5492 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5493 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005494 }
5495
Matthew Curtise689b052012-12-06 15:46:07 +00005496 if (hasStaticArg)
5497 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005498
Matthew Curtise8f80a12012-12-06 17:49:03 +00005499 if (buildPIE && !buildingLib)
5500 CmdArgs.push_back("-pie");
5501
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005502 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
5503 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5504 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005505 }
5506
Matthew Curtise689b052012-12-06 15:46:07 +00005507 //----------------------------------------------------------------------------
5508 //
5509 //----------------------------------------------------------------------------
5510 CmdArgs.push_back("-o");
5511 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005512
Matthew Curtise689b052012-12-06 15:46:07 +00005513 const std::string MarchSuffix = "/" + MarchString;
5514 const std::string G0Suffix = "/G0";
5515 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005516 const std::string RootDir =
5517 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005518 const std::string StartFilesDir = RootDir
5519 + "hexagon/lib"
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005520 + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005521
5522 //----------------------------------------------------------------------------
5523 // moslib
5524 //----------------------------------------------------------------------------
5525 std::vector<std::string> oslibs;
5526 bool hasStandalone= false;
5527
5528 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5529 ie = Args.filtered_end(); it != ie; ++it) {
5530 (*it)->claim();
5531 oslibs.push_back((*it)->getValue());
5532 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005533 }
Matthew Curtise689b052012-12-06 15:46:07 +00005534 if (oslibs.empty()) {
5535 oslibs.push_back("standalone");
5536 hasStandalone = true;
5537 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005538
Matthew Curtise689b052012-12-06 15:46:07 +00005539 //----------------------------------------------------------------------------
5540 // Start Files
5541 //----------------------------------------------------------------------------
5542 if (incStdLib && incStartFiles) {
5543
5544 if (!buildingLib) {
5545 if (hasStandalone) {
5546 CmdArgs.push_back(
5547 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5548 }
5549 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5550 }
5551 std::string initObj = useShared ? "/initS.o" : "/init.o";
5552 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5553 }
5554
5555 //----------------------------------------------------------------------------
5556 // Library Search Paths
5557 //----------------------------------------------------------------------------
5558 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005559 for (const auto &LibPath : LibPaths)
5560 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005561
5562 //----------------------------------------------------------------------------
5563 //
5564 //----------------------------------------------------------------------------
5565 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5566 Args.AddAllArgs(CmdArgs, options::OPT_e);
5567 Args.AddAllArgs(CmdArgs, options::OPT_s);
5568 Args.AddAllArgs(CmdArgs, options::OPT_t);
5569 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5570
5571 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5572
5573 //----------------------------------------------------------------------------
5574 // Libraries
5575 //----------------------------------------------------------------------------
5576 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005577 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005578 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5579 CmdArgs.push_back("-lm");
5580 }
5581
5582 CmdArgs.push_back("--start-group");
5583
5584 if (!buildingLib) {
5585 for(std::vector<std::string>::iterator i = oslibs.begin(),
5586 e = oslibs.end(); i != e; ++i)
5587 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5588 CmdArgs.push_back("-lc");
5589 }
5590 CmdArgs.push_back("-lgcc");
5591
5592 CmdArgs.push_back("--end-group");
5593 }
5594
5595 //----------------------------------------------------------------------------
5596 // End files
5597 //----------------------------------------------------------------------------
5598 if (incStdLib && incStartFiles) {
5599 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5600 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5601 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005602}
5603
5604void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5605 const InputInfo &Output,
5606 const InputInfoList &Inputs,
5607 const ArgList &Args,
5608 const char *LinkingOutput) const {
5609
5610 const toolchains::Hexagon_TC& ToolChain =
5611 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5612
5613 ArgStringList CmdArgs;
5614 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5615 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005616
5617 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005618 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5619 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005620}
5621// Hexagon tools end.
5622
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005623const StringRef arm::getARMArch(const ArgList &Args,
5624 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005625 StringRef MArch;
5626 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5627 // Otherwise, if we have -march= choose the base CPU for that arch.
5628 MArch = A->getValue();
5629 } else {
5630 // Otherwise, use the Arch from the triple.
5631 MArch = Triple.getArchName();
5632 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005633 return MArch;
5634}
5635/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5636const char *arm::getARMCPUForMArch(const ArgList &Args,
5637 const llvm::Triple &Triple) {
5638 StringRef MArch = getARMArch(Args, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00005639
5640 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005641 if (MArch == "native") {
5642 std::string CPU = llvm::sys::getHostCPUName();
5643 if (CPU != "generic") {
5644 // Translate the native cpu into the architecture. The switch below will
5645 // then chose the minimum cpu for that arch.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005646 MArch = std::string("arm") +
5647 arm::getLLVMArchSuffixForARM(CPU, arm::getARMArch(Args, Triple));
Bernard Ogden31561762013-12-12 13:27:11 +00005648 }
5649 }
5650
John Brawna95c1a82015-05-08 12:52:18 +00005651 // We need to return an empty string here on invalid MArch values as the
5652 // various places that call this function can't cope with a null result.
5653 const char *result = Triple.getARMCPUForArch(MArch);
5654 if (result)
5655 return result;
5656 else
5657 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005658}
5659
5660/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005661StringRef arm::getARMTargetCPU(const ArgList &Args,
5662 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005663 // FIXME: Warn on inconsistent use of -mcpu and -march.
5664 // If we have -mcpu=, use that.
5665 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin4045f662015-05-08 15:44:36 +00005666 StringRef MCPU = A->getValue();
Bernard Ogden31561762013-12-12 13:27:11 +00005667 // Handle -mcpu=native.
5668 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005669 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005670 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005671 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005672 }
5673
5674 return getARMCPUForMArch(Args, Triple);
5675}
5676
5677/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005678/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005679//
5680// FIXME: This is redundant with -mcpu, why does LLVM use this.
5681// FIXME: tblgen this, or kill it!
Renato Golin0600e1e2015-05-08 21:04:50 +00005682// FIXME: Use ARMTargetParser.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005683const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
5684 // FIXME: Use ARMTargetParser
5685 if (CPU == "generic") {
5686 if (Arch == "armv8.1a" || Arch == "armv8.1-a" ||
5687 Arch == "armebv8.1a" || Arch == "armebv8.1-a") {
5688 return "v8.1a";
5689 }
5690 }
5691
Bernard Ogden31561762013-12-12 13:27:11 +00005692 return llvm::StringSwitch<const char *>(CPU)
5693 .Case("strongarm", "v4")
5694 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5695 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5696 .Cases("arm920", "arm920t", "arm922t", "v4t")
5697 .Cases("arm940t", "ep9312","v4t")
5698 .Cases("arm10tdmi", "arm1020t", "v5")
5699 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5700 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5701 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005702 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5703 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5704 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005705 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005706 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005707 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005708 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005709 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5710 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005711 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005712 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005713 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005714 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005715 .Default("");
5716}
5717
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005718void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
5719 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005720 if (Args.hasArg(options::OPT_r))
5721 return;
5722
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005723 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple),
5724 getARMArch(Args, Triple));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005725 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5726 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005727 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005728 .Default("--be8");
5729
5730 if (LinkFlag)
5731 CmdArgs.push_back(LinkFlag);
5732}
5733
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005734mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5735 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5736 .Case("mips1", NanLegacy)
5737 .Case("mips2", NanLegacy)
5738 .Case("mips3", NanLegacy)
5739 .Case("mips4", NanLegacy)
5740 .Case("mips5", NanLegacy)
5741 .Case("mips32", NanLegacy)
5742 .Case("mips32r2", NanLegacy)
5743 .Case("mips32r3", NanLegacy | Nan2008)
5744 .Case("mips32r5", NanLegacy | Nan2008)
5745 .Case("mips32r6", Nan2008)
5746 .Case("mips64", NanLegacy)
5747 .Case("mips64r2", NanLegacy)
5748 .Case("mips64r3", NanLegacy | Nan2008)
5749 .Case("mips64r5", NanLegacy | Nan2008)
5750 .Case("mips64r6", Nan2008)
5751 .Default(NanLegacy);
5752}
5753
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005754bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5755 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5756 return A && (A->getValue() == StringRef(Value));
5757}
5758
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005759bool mips::isUCLibc(const ArgList &Args) {
5760 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005761 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005762}
5763
Daniel Sanders2bf13662014-07-10 14:40:57 +00005764bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005765 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5766 return llvm::StringSwitch<bool>(NaNArg->getValue())
5767 .Case("2008", true)
5768 .Case("legacy", false)
5769 .Default(false);
5770
5771 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005772 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5773 .Cases("mips32r6", "mips64r6", true)
5774 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005775
5776 return false;
5777}
5778
Daniel Sanders379d44b2014-07-16 11:52:23 +00005779bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5780 StringRef ABIName) {
5781 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005782 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005783 return false;
5784
5785 if (ABIName != "32")
5786 return false;
5787
5788 return llvm::StringSwitch<bool>(CPUName)
5789 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005790 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5791 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005792 .Default(false);
5793}
5794
Tim Northover157d9112014-01-16 08:48:16 +00005795llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005796 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5797 // archs which Darwin doesn't use.
5798
5799 // The matching this routine does is fairly pointless, since it is neither the
5800 // complete architecture list, nor a reasonable subset. The problem is that
5801 // historically the driver driver accepts this and also ties its -march=
5802 // handling to the architecture name, so we need to be careful before removing
5803 // support for it.
5804
5805 // This code must be kept in sync with Clang's Darwin specific argument
5806 // translation.
5807
5808 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5809 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5810 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5811 .Case("ppc64", llvm::Triple::ppc64)
5812 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5813 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5814 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005815 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005816 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005817 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005818 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005819 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005820 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005821 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005822 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005823 .Case("nvptx", llvm::Triple::nvptx)
5824 .Case("nvptx64", llvm::Triple::nvptx64)
5825 .Case("amdil", llvm::Triple::amdil)
5826 .Case("spir", llvm::Triple::spir)
5827 .Default(llvm::Triple::UnknownArch);
5828}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005829
Tim Northover157d9112014-01-16 08:48:16 +00005830void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5831 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5832 T.setArch(Arch);
5833
5834 if (Str == "x86_64h")
5835 T.setArchName(Str);
5836 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5837 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005838 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005839 }
5840}
5841
Bob Wilsondecc03e2012-11-23 06:14:39 +00005842const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005843 const InputInfo &Input) {
5844 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005845}
5846
Bob Wilsondecc03e2012-11-23 06:14:39 +00005847const char *Clang::getBaseInputStem(const ArgList &Args,
5848 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005849 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005850
Chris Lattner906bb902011-01-16 08:14:11 +00005851 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005852 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005853
5854 return Str;
5855}
5856
Bob Wilsondecc03e2012-11-23 06:14:39 +00005857const char *Clang::getDependencyFileName(const ArgList &Args,
5858 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005859 // FIXME: Think about this more.
5860 std::string Res;
5861
5862 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005863 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005864 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005865 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005866 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005867 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005868 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005869}
5870
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005871void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5872 const InputInfo &Output,
5873 const InputInfoList &Inputs,
5874 const ArgList &Args,
5875 const char *LinkingOutput) const {
5876 const ToolChain &ToolChain = getToolChain();
5877 const Driver &D = ToolChain.getDriver();
5878 ArgStringList CmdArgs;
5879
5880 // Silence warning for "clang -g foo.o -o foo"
5881 Args.ClaimAllArgs(options::OPT_g_Group);
5882 // and "clang -emit-llvm foo.o -o foo"
5883 Args.ClaimAllArgs(options::OPT_emit_llvm);
5884 // and for "clang -w foo.o -o foo". Other warning options are already
5885 // handled somewhere else.
5886 Args.ClaimAllArgs(options::OPT_w);
5887
5888 if (!D.SysRoot.empty())
5889 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5890
5891 // CloudABI only supports static linkage.
5892 CmdArgs.push_back("-Bstatic");
5893 CmdArgs.push_back("--eh-frame-hdr");
5894 CmdArgs.push_back("--gc-sections");
5895
5896 if (Output.isFilename()) {
5897 CmdArgs.push_back("-o");
5898 CmdArgs.push_back(Output.getFilename());
5899 } else {
5900 assert(Output.isNothing() && "Invalid output.");
5901 }
5902
5903 if (!Args.hasArg(options::OPT_nostdlib) &&
5904 !Args.hasArg(options::OPT_nostartfiles)) {
5905 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5906 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5907 }
5908
5909 Args.AddAllArgs(CmdArgs, options::OPT_L);
5910 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5911 for (const auto &Path : Paths)
5912 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5913 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5914 Args.AddAllArgs(CmdArgs, options::OPT_e);
5915 Args.AddAllArgs(CmdArgs, options::OPT_s);
5916 Args.AddAllArgs(CmdArgs, options::OPT_t);
5917 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5918 Args.AddAllArgs(CmdArgs, options::OPT_r);
5919
5920 if (D.IsUsingLTO(ToolChain, Args))
5921 AddGoldPlugin(ToolChain, Args, CmdArgs);
5922
5923 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5924
5925 if (!Args.hasArg(options::OPT_nostdlib) &&
5926 !Args.hasArg(options::OPT_nodefaultlibs)) {
5927 if (D.CCCIsCXX())
5928 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5929 CmdArgs.push_back("-lc");
5930 CmdArgs.push_back("-lcompiler_rt");
5931 }
5932
5933 if (!Args.hasArg(options::OPT_nostdlib) &&
5934 !Args.hasArg(options::OPT_nostartfiles))
5935 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5936
5937 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5938 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5939}
5940
Daniel Dunbarbe220842009-03-20 16:06:39 +00005941void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005942 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005943 const InputInfoList &Inputs,
5944 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005945 const char *LinkingOutput) const {
5946 ArgStringList CmdArgs;
5947
5948 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5949 const InputInfo &Input = Inputs[0];
5950
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005951 // Determine the original source input.
5952 const Action *SourceAction = &JA;
5953 while (SourceAction->getKind() != Action::InputClass) {
5954 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5955 SourceAction = SourceAction->getInputs()[0];
5956 }
5957
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005958 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005959 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005960 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5961 // FIXME: at run-time detect assembler capabilities or rely on version
5962 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005963 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005964 const llvm::Triple &T(getToolChain().getTriple());
5965 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005966 CmdArgs.push_back("-Q");
5967 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005968
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005969 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005970 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005971 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005972 if (Args.hasArg(options::OPT_gstabs))
5973 CmdArgs.push_back("--gstabs");
5974 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005975 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005976 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005977
Daniel Dunbarbe220842009-03-20 16:06:39 +00005978 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005979 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005980
Daniel Dunbar6d484762010-07-22 01:47:22 +00005981 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005982 if (getToolChain().getArch() == llvm::Triple::x86 ||
5983 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005984 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5985 CmdArgs.push_back("-force_cpusubtype_ALL");
5986
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005987 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005988 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005989 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005990 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005991 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005992 CmdArgs.push_back("-static");
5993
Daniel Dunbarbe220842009-03-20 16:06:39 +00005994 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5995 options::OPT_Xassembler);
5996
5997 assert(Output.isFilename() && "Unexpected lipo output.");
5998 CmdArgs.push_back("-o");
5999 CmdArgs.push_back(Output.getFilename());
6000
Daniel Dunbarb440f562010-08-02 02:38:21 +00006001 assert(Input.isFilename() && "Invalid input.");
6002 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006003
6004 // asm_final spec is empty.
6005
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006006 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006007 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006008 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006009}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006010
Tim Northover157d9112014-01-16 08:48:16 +00006011void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006012
Tim Northover157d9112014-01-16 08:48:16 +00006013void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6014 ArgStringList &CmdArgs) const {
6015 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006016
Daniel Dunbarc1964212009-03-26 16:23:12 +00006017 // Derived from darwin_arch spec.
6018 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006019 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006020
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006021 // FIXME: Is this needed anymore?
6022 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006023 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006024}
6025
Bill Wendling3b2000f2012-10-02 18:02:50 +00006026bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
6027 // We only need to generate a temp path for LTO if we aren't compiling object
6028 // files. When compiling source files, we run 'dsymutil' after linking. We
6029 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006030 for (const auto &Input : Inputs)
6031 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006032 return true;
6033
6034 return false;
6035}
6036
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006037void darwin::Link::AddLinkArgs(Compilation &C,
6038 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006039 ArgStringList &CmdArgs,
6040 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006041 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006042 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006043
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006044 unsigned Version[3] = { 0, 0, 0 };
6045 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6046 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006047 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006048 Version[1], Version[2], HadExtra) ||
6049 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006050 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006051 << A->getAsString(Args);
6052 }
6053
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006054 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006055 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006056 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6057 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006058
Bob Wilson3d27dad2013-08-02 22:25:34 +00006059 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6060 CmdArgs.push_back("-export_dynamic");
6061
Bob Wilsonb111ec92015-03-02 19:01:14 +00006062 // If we are using App Extension restrictions, pass a flag to the linker
6063 // telling it that the compiled code has been audited.
6064 if (Args.hasFlag(options::OPT_fapplication_extension,
6065 options::OPT_fno_application_extension, false))
6066 CmdArgs.push_back("-application_extension");
6067
Bill Wendling313b6bf2012-11-16 23:03:00 +00006068 // If we are using LTO, then automatically create a temporary file path for
6069 // the linker to use, so that it's lifetime will extend past a possible
6070 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006071 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6072 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006073 const char *TmpPath = C.getArgs().MakeArgString(
6074 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6075 C.addTempFile(TmpPath);
6076 CmdArgs.push_back("-object_path_lto");
6077 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006078 }
6079
Daniel Dunbarc1964212009-03-26 16:23:12 +00006080 // Derived from the "link" spec.
6081 Args.AddAllArgs(CmdArgs, options::OPT_static);
6082 if (!Args.hasArg(options::OPT_static))
6083 CmdArgs.push_back("-dynamic");
6084 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6085 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6086 // here. How do we wish to handle such things?
6087 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006088
Daniel Dunbarc1964212009-03-26 16:23:12 +00006089 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006090 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006091 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006092 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006093
6094 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6095 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6096 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6097
6098 Arg *A;
6099 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6100 (A = Args.getLastArg(options::OPT_current__version)) ||
6101 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006102 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006103 << A->getAsString(Args) << "-dynamiclib";
6104
6105 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6106 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6107 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6108 } else {
6109 CmdArgs.push_back("-dylib");
6110
6111 Arg *A;
6112 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6113 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6114 (A = Args.getLastArg(options::OPT_client__name)) ||
6115 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6116 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6117 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006118 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006119 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006120
Daniel Dunbarc1964212009-03-26 16:23:12 +00006121 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6122 "-dylib_compatibility_version");
6123 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6124 "-dylib_current_version");
6125
Tim Northover157d9112014-01-16 08:48:16 +00006126 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006127
6128 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6129 "-dylib_install_name");
6130 }
6131
6132 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6133 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6134 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006135 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006136 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006137 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6138 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6139 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6140 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6141 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6142 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006143 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006144 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6145 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6146 Args.AddAllArgs(CmdArgs, options::OPT_init);
6147
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006148 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006149 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006150
Daniel Dunbarc1964212009-03-26 16:23:12 +00006151 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6152 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6153 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6154 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6155 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006156
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006157 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6158 options::OPT_fno_pie,
6159 options::OPT_fno_PIE)) {
6160 if (A->getOption().matches(options::OPT_fpie) ||
6161 A->getOption().matches(options::OPT_fPIE))
6162 CmdArgs.push_back("-pie");
6163 else
6164 CmdArgs.push_back("-no_pie");
6165 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006166
6167 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6168 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6169 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6170 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6171 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6172 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6173 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6174 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6175 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6176 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6177 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6178 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6179 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6180 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6181 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6182 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006183
Daniel Dunbar84384642011-05-02 21:03:47 +00006184 // Give --sysroot= preference, over the Apple specific behavior to also use
6185 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006186 StringRef sysroot = C.getSysRoot();
6187 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006188 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006189 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006190 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6191 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006192 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006193 }
6194
Daniel Dunbarc1964212009-03-26 16:23:12 +00006195 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6196 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6197 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6198 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6199 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006200 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006201 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6202 Args.AddAllArgs(CmdArgs, options::OPT_y);
6203 Args.AddLastArg(CmdArgs, options::OPT_w);
6204 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6205 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6206 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6207 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6208 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6209 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6210 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6211 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6212 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6213 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6214 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6215 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6216}
6217
Alexey Bataev186b28a2014-03-06 05:43:53 +00006218enum LibOpenMP {
6219 LibUnknown,
6220 LibGOMP,
6221 LibIOMP5
6222};
6223
Richard Smith31d1de22015-05-20 22:48:44 +00006224/// Map a -fopenmp=<blah> macro to the corresponding library.
6225static LibOpenMP getOpenMPLibByName(StringRef Name) {
6226 return llvm::StringSwitch<LibOpenMP>(Name).Case("libgomp", LibGOMP)
6227 .Case("libiomp5", LibIOMP5)
6228 .Default(LibUnknown);
6229}
6230
6231/// Get the default -l<blah> flag to use for -fopenmp, if no library is
6232/// specified. This can be overridden at configure time.
6233static const char *getDefaultOpenMPLibFlag() {
6234#ifndef OPENMP_DEFAULT_LIB
6235#define OPENMP_DEFAULT_LIB iomp5
6236#endif
6237
6238#define STR2(lib) #lib
6239#define STR(lib) STR2(lib)
6240 return "-l" STR(OPENMP_DEFAULT_LIB);
6241#undef STR
6242#undef STR2
6243}
6244
Daniel Dunbarc1964212009-03-26 16:23:12 +00006245void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006246 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006247 const InputInfoList &Inputs,
6248 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006249 const char *LinkingOutput) const {
6250 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006251
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006252 // If the number of arguments surpasses the system limits, we will encode the
6253 // input files in a separate file, shortening the command line. To this end,
6254 // build a list of input file names that can be passed via a file with the
6255 // -filelist linker option.
6256 llvm::opt::ArgStringList InputFileList;
6257
Daniel Dunbarc1964212009-03-26 16:23:12 +00006258 // The logic here is derived from gcc's behavior; most of which
6259 // comes from specs (starting with link_command). Consult gcc for
6260 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006261 ArgStringList CmdArgs;
6262
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006263 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6264 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6265 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006266 for (const auto &Arg : Args)
6267 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006268 const char *Exec =
6269 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6270 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006271 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006272 return;
6273 }
6274
Daniel Dunbarc1964212009-03-26 16:23:12 +00006275 // I'm not sure why this particular decomposition exists in gcc, but
6276 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006277 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006278
Daniel Dunbarc1964212009-03-26 16:23:12 +00006279 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6280 Args.AddAllArgs(CmdArgs, options::OPT_s);
6281 Args.AddAllArgs(CmdArgs, options::OPT_t);
6282 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6283 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006284 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006285 Args.AddAllArgs(CmdArgs, options::OPT_r);
6286
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006287 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6288 // members of static archive libraries which implement Objective-C classes or
6289 // categories.
6290 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6291 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006292
Daniel Dunbarc1964212009-03-26 16:23:12 +00006293 CmdArgs.push_back("-o");
6294 CmdArgs.push_back(Output.getFilename());
6295
Chad Rosier06fd3c62012-05-16 23:45:12 +00006296 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006297 !Args.hasArg(options::OPT_nostartfiles))
6298 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006299
6300 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006301
Alexey Bataevdb390212015-05-20 04:24:19 +00006302 if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
Richard Smith31d1de22015-05-20 22:48:44 +00006303 switch (getOpenMPLibByName(A->getValue())) {
6304 case LibGOMP:
6305 CmdArgs.push_back("-lgomp");
6306 break;
6307 case LibIOMP5:
6308 CmdArgs.push_back("-liomp5");
6309 break;
6310 case LibUnknown:
Alexey Bataev186b28a2014-03-06 05:43:53 +00006311 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6312 << A->getOption().getName() << A->getValue();
Richard Smith31d1de22015-05-20 22:48:44 +00006313 break;
6314 }
Alexey Bataevdb390212015-05-20 04:24:19 +00006315 } else if (Args.hasArg(options::OPT_fopenmp)) {
Richard Smith31d1de22015-05-20 22:48:44 +00006316 CmdArgs.push_back(getDefaultOpenMPLibFlag());
Alexey Bataev186b28a2014-03-06 05:43:53 +00006317 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006318
Douglas Gregor9295df02012-05-15 21:00:27 +00006319 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006320 // Build the input file for -filelist (list of linker input files) in case we
6321 // need it later
6322 for (const auto &II : Inputs) {
6323 if (!II.isFilename()) {
6324 // This is a linker input argument.
6325 // We cannot mix input arguments and file names in a -filelist input, thus
6326 // we prematurely stop our list (remaining files shall be passed as
6327 // arguments).
6328 if (InputFileList.size() > 0)
6329 break;
6330
6331 continue;
6332 }
6333
6334 InputFileList.push_back(II.getFilename());
6335 }
6336
Bob Wilson16d93952012-05-15 18:57:39 +00006337 if (isObjCRuntimeLinked(Args) &&
6338 !Args.hasArg(options::OPT_nostdlib) &&
6339 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006340 // We use arclite library for both ARC and subscripting support.
6341 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6342
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006343 CmdArgs.push_back("-framework");
6344 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006345 // Link libobj.
6346 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006347 }
John McCall31168b02011-06-15 23:02:42 +00006348
Daniel Dunbarc1964212009-03-26 16:23:12 +00006349 if (LinkingOutput) {
6350 CmdArgs.push_back("-arch_multiple");
6351 CmdArgs.push_back("-final_output");
6352 CmdArgs.push_back(LinkingOutput);
6353 }
6354
Daniel Dunbarc1964212009-03-26 16:23:12 +00006355 if (Args.hasArg(options::OPT_fnested_functions))
6356 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006357
Justin Bognerc7701242015-05-12 05:44:36 +00006358 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6359 // paths are different enough from other toolchains that this needs a fair
6360 // amount of refactoring done first.
6361 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6362
Daniel Dunbarc1964212009-03-26 16:23:12 +00006363 if (!Args.hasArg(options::OPT_nostdlib) &&
6364 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006365 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006366 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006367
Daniel Dunbarc1964212009-03-26 16:23:12 +00006368 // link_ssp spec is empty.
6369
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006370 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006371 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006372 }
6373
Chad Rosier06fd3c62012-05-16 23:45:12 +00006374 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006375 !Args.hasArg(options::OPT_nostartfiles)) {
6376 // endfile_spec is empty.
6377 }
6378
6379 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6380 Args.AddAllArgs(CmdArgs, options::OPT_F);
6381
Steven Wu3ffb61b2015-02-06 18:08:29 +00006382 // -iframework should be forwarded as -F.
6383 for (auto it = Args.filtered_begin(options::OPT_iframework),
6384 ie = Args.filtered_end(); it != ie; ++it)
6385 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6386 (*it)->getValue()));
6387
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006388 if (!Args.hasArg(options::OPT_nostdlib) &&
6389 !Args.hasArg(options::OPT_nodefaultlibs)) {
6390 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6391 if (A->getValue() == StringRef("Accelerate")) {
6392 CmdArgs.push_back("-framework");
6393 CmdArgs.push_back("Accelerate");
6394 }
6395 }
6396 }
6397
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006398 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006399 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006400 std::unique_ptr<Command> Cmd =
6401 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6402 Cmd->setInputFileList(std::move(InputFileList));
6403 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006404}
6405
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006406void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006407 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006408 const InputInfoList &Inputs,
6409 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006410 const char *LinkingOutput) const {
6411 ArgStringList CmdArgs;
6412
6413 CmdArgs.push_back("-create");
6414 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006415
6416 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006417 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006418
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006419 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006420 assert(II.isFilename() && "Unexpected lipo input.");
6421 CmdArgs.push_back(II.getFilename());
6422 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006423
6424 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006425 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006426}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006427
Daniel Dunbar88299622010-06-04 18:28:36 +00006428void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006429 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006430 const InputInfoList &Inputs,
6431 const ArgList &Args,
6432 const char *LinkingOutput) const {
6433 ArgStringList CmdArgs;
6434
Daniel Dunbareb86b042011-05-09 17:23:16 +00006435 CmdArgs.push_back("-o");
6436 CmdArgs.push_back(Output.getFilename());
6437
Daniel Dunbar88299622010-06-04 18:28:36 +00006438 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6439 const InputInfo &Input = Inputs[0];
6440 assert(Input.isFilename() && "Unexpected dsymutil input.");
6441 CmdArgs.push_back(Input.getFilename());
6442
Daniel Dunbar88299622010-06-04 18:28:36 +00006443 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006444 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006445 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006446}
6447
Eric Christopher551ef452011-08-23 17:56:55 +00006448void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006449 const InputInfo &Output,
6450 const InputInfoList &Inputs,
6451 const ArgList &Args,
6452 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006453 ArgStringList CmdArgs;
6454 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006455 CmdArgs.push_back("--debug-info");
6456 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006457 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006458
6459 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6460 const InputInfo &Input = Inputs[0];
6461 assert(Input.isFilename() && "Unexpected verify input");
6462
6463 // Grabbing the output of the earlier dsymutil run.
6464 CmdArgs.push_back(Input.getFilename());
6465
6466 const char *Exec =
6467 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006468 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006469}
6470
David Chisnallf571cde2012-02-15 13:39:01 +00006471void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6472 const InputInfo &Output,
6473 const InputInfoList &Inputs,
6474 const ArgList &Args,
6475 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006476 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006477 ArgStringList CmdArgs;
6478
6479 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6480 options::OPT_Xassembler);
6481
6482 CmdArgs.push_back("-o");
6483 CmdArgs.push_back(Output.getFilename());
6484
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006485 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006486 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006487
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006488 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006489 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006490}
6491
David Chisnallf571cde2012-02-15 13:39:01 +00006492void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6493 const InputInfo &Output,
6494 const InputInfoList &Inputs,
6495 const ArgList &Args,
6496 const char *LinkingOutput) const {
6497 // FIXME: Find a real GCC, don't hard-code versions here
6498 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6499 const llvm::Triple &T = getToolChain().getTriple();
6500 std::string LibPath = "/usr/lib/";
6501 llvm::Triple::ArchType Arch = T.getArch();
6502 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006503 case llvm::Triple::x86:
6504 GCCLibPath +=
6505 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6506 break;
6507 case llvm::Triple::x86_64:
6508 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6509 GCCLibPath += "/4.5.2/amd64/";
6510 LibPath += "amd64/";
6511 break;
6512 default:
6513 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006514 }
6515
6516 ArgStringList CmdArgs;
6517
David Chisnall272a0712012-02-29 15:06:12 +00006518 // Demangle C++ names in errors
6519 CmdArgs.push_back("-C");
6520
David Chisnallf571cde2012-02-15 13:39:01 +00006521 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6522 (!Args.hasArg(options::OPT_shared))) {
6523 CmdArgs.push_back("-e");
6524 CmdArgs.push_back("_start");
6525 }
6526
6527 if (Args.hasArg(options::OPT_static)) {
6528 CmdArgs.push_back("-Bstatic");
6529 CmdArgs.push_back("-dn");
6530 } else {
6531 CmdArgs.push_back("-Bdynamic");
6532 if (Args.hasArg(options::OPT_shared)) {
6533 CmdArgs.push_back("-shared");
6534 } else {
6535 CmdArgs.push_back("--dynamic-linker");
6536 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6537 }
6538 }
6539
6540 if (Output.isFilename()) {
6541 CmdArgs.push_back("-o");
6542 CmdArgs.push_back(Output.getFilename());
6543 } else {
6544 assert(Output.isNothing() && "Invalid output.");
6545 }
6546
6547 if (!Args.hasArg(options::OPT_nostdlib) &&
6548 !Args.hasArg(options::OPT_nostartfiles)) {
6549 if (!Args.hasArg(options::OPT_shared)) {
6550 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6551 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006552 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006553 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6554 } else {
6555 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006556 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6557 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006558 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006559 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006560 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006561 }
6562
6563 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6564
6565 Args.AddAllArgs(CmdArgs, options::OPT_L);
6566 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6567 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006568 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006569
6570 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6571
6572 if (!Args.hasArg(options::OPT_nostdlib) &&
6573 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006574 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006575 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006576 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006577 if (!Args.hasArg(options::OPT_shared)) {
6578 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006579 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006580 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006581 }
David Chisnallf571cde2012-02-15 13:39:01 +00006582 }
6583
6584 if (!Args.hasArg(options::OPT_nostdlib) &&
6585 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006586 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006587 }
David Chisnall96de9932012-02-16 16:00:47 +00006588 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006589
Alexey Samsonov7811d192014-02-20 13:57:37 +00006590 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006591
6592 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006593 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006594 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006595}
6596
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006597void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006598 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006599 const InputInfoList &Inputs,
6600 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006601 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006602 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006603 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006604 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006605
Rafael Espindolacc126272014-02-28 01:55:21 +00006606 switch (getToolChain().getArch()) {
6607 case llvm::Triple::x86:
6608 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6609 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006610 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006611 break;
6612
6613 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006614 CmdArgs.push_back("-mppc");
6615 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006616 break;
6617
6618 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006619 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006620 CmdArgs.push_back("-32");
6621 NeedsKPIC = true;
6622 break;
6623
6624 case llvm::Triple::sparcv9:
6625 CmdArgs.push_back("-64");
6626 CmdArgs.push_back("-Av9a");
6627 NeedsKPIC = true;
6628 break;
6629
6630 case llvm::Triple::mips64:
6631 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006632 StringRef CPUName;
6633 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006634 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006635
6636 CmdArgs.push_back("-mabi");
6637 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6638
6639 if (getToolChain().getArch() == llvm::Triple::mips64)
6640 CmdArgs.push_back("-EB");
6641 else
6642 CmdArgs.push_back("-EL");
6643
Rafael Espindolacc126272014-02-28 01:55:21 +00006644 NeedsKPIC = true;
6645 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006646 }
6647
Rafael Espindolacc126272014-02-28 01:55:21 +00006648 default:
6649 break;
6650 }
6651
6652 if (NeedsKPIC)
6653 addAssemblerKPIC(Args, CmdArgs);
6654
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006655 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6656 options::OPT_Xassembler);
6657
6658 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006659 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006660
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006661 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006662 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006663
6664 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006665 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006666 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006667}
6668
6669void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006670 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006671 const InputInfoList &Inputs,
6672 const ArgList &Args,
6673 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006674 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006675 ArgStringList CmdArgs;
6676
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006677 // Silence warning for "clang -g foo.o -o foo"
6678 Args.ClaimAllArgs(options::OPT_g_Group);
6679 // and "clang -emit-llvm foo.o -o foo"
6680 Args.ClaimAllArgs(options::OPT_emit_llvm);
6681 // and for "clang -w foo.o -o foo". Other warning options are already
6682 // handled somewhere else.
6683 Args.ClaimAllArgs(options::OPT_w);
6684
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006685 if (getToolChain().getArch() == llvm::Triple::mips64)
6686 CmdArgs.push_back("-EB");
6687 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6688 CmdArgs.push_back("-EL");
6689
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006690 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006691 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006692 CmdArgs.push_back("-e");
6693 CmdArgs.push_back("__start");
6694 }
6695
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006696 if (Args.hasArg(options::OPT_static)) {
6697 CmdArgs.push_back("-Bstatic");
6698 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006699 if (Args.hasArg(options::OPT_rdynamic))
6700 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006701 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006702 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006703 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006704 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006705 } else {
6706 CmdArgs.push_back("-dynamic-linker");
6707 CmdArgs.push_back("/usr/libexec/ld.so");
6708 }
6709 }
6710
Rafael Espindola044f7832013-06-05 04:28:55 +00006711 if (Args.hasArg(options::OPT_nopie))
6712 CmdArgs.push_back("-nopie");
6713
Daniel Dunbarb440f562010-08-02 02:38:21 +00006714 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006715 CmdArgs.push_back("-o");
6716 CmdArgs.push_back(Output.getFilename());
6717 } else {
6718 assert(Output.isNothing() && "Invalid output.");
6719 }
6720
6721 if (!Args.hasArg(options::OPT_nostdlib) &&
6722 !Args.hasArg(options::OPT_nostartfiles)) {
6723 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006724 if (Args.hasArg(options::OPT_pg))
6725 CmdArgs.push_back(Args.MakeArgString(
6726 getToolChain().GetFilePath("gcrt0.o")));
6727 else
6728 CmdArgs.push_back(Args.MakeArgString(
6729 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006730 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006731 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006732 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006733 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006734 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006735 }
6736 }
6737
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006738 std::string Triple = getToolChain().getTripleString();
6739 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006740 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006741 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006742 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006743
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006744 Args.AddAllArgs(CmdArgs, options::OPT_L);
6745 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6746 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006747 Args.AddAllArgs(CmdArgs, options::OPT_s);
6748 Args.AddAllArgs(CmdArgs, options::OPT_t);
6749 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6750 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006751
Daniel Dunbar54423b22010-09-17 00:24:54 +00006752 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006753
6754 if (!Args.hasArg(options::OPT_nostdlib) &&
6755 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006756 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006757 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006758 if (Args.hasArg(options::OPT_pg))
6759 CmdArgs.push_back("-lm_p");
6760 else
6761 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006762 }
6763
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006764 // FIXME: For some reason GCC passes -lgcc before adding
6765 // the default system libraries. Just mimic this for now.
6766 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006767
Eric Christopher17674ec2012-09-13 06:32:34 +00006768 if (Args.hasArg(options::OPT_pthread)) {
6769 if (!Args.hasArg(options::OPT_shared) &&
6770 Args.hasArg(options::OPT_pg))
6771 CmdArgs.push_back("-lpthread_p");
6772 else
6773 CmdArgs.push_back("-lpthread");
6774 }
6775
Chandler Carruth45661652011-12-17 22:32:42 +00006776 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006777 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006778 CmdArgs.push_back("-lc_p");
6779 else
6780 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006781 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006782
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006783 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006784 }
6785
6786 if (!Args.hasArg(options::OPT_nostdlib) &&
6787 !Args.hasArg(options::OPT_nostartfiles)) {
6788 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006789 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006790 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006791 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006792 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006793 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006794 }
6795
6796 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006797 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006799}
Ed Schoutene33194b2009-04-02 19:13:12 +00006800
Eli Friedman9fa28852012-08-08 23:57:20 +00006801void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6802 const InputInfo &Output,
6803 const InputInfoList &Inputs,
6804 const ArgList &Args,
6805 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006806 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006807 ArgStringList CmdArgs;
6808
6809 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6810 options::OPT_Xassembler);
6811
6812 CmdArgs.push_back("-o");
6813 CmdArgs.push_back(Output.getFilename());
6814
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006815 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006816 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006817
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006818 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006819 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006820}
6821
6822void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6823 const InputInfo &Output,
6824 const InputInfoList &Inputs,
6825 const ArgList &Args,
6826 const char *LinkingOutput) const {
6827 const Driver &D = getToolChain().getDriver();
6828 ArgStringList CmdArgs;
6829
6830 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6831 (!Args.hasArg(options::OPT_shared))) {
6832 CmdArgs.push_back("-e");
6833 CmdArgs.push_back("__start");
6834 }
6835
6836 if (Args.hasArg(options::OPT_static)) {
6837 CmdArgs.push_back("-Bstatic");
6838 } else {
6839 if (Args.hasArg(options::OPT_rdynamic))
6840 CmdArgs.push_back("-export-dynamic");
6841 CmdArgs.push_back("--eh-frame-hdr");
6842 CmdArgs.push_back("-Bdynamic");
6843 if (Args.hasArg(options::OPT_shared)) {
6844 CmdArgs.push_back("-shared");
6845 } else {
6846 CmdArgs.push_back("-dynamic-linker");
6847 CmdArgs.push_back("/usr/libexec/ld.so");
6848 }
6849 }
6850
6851 if (Output.isFilename()) {
6852 CmdArgs.push_back("-o");
6853 CmdArgs.push_back(Output.getFilename());
6854 } else {
6855 assert(Output.isNothing() && "Invalid output.");
6856 }
6857
6858 if (!Args.hasArg(options::OPT_nostdlib) &&
6859 !Args.hasArg(options::OPT_nostartfiles)) {
6860 if (!Args.hasArg(options::OPT_shared)) {
6861 if (Args.hasArg(options::OPT_pg))
6862 CmdArgs.push_back(Args.MakeArgString(
6863 getToolChain().GetFilePath("gcrt0.o")));
6864 else
6865 CmdArgs.push_back(Args.MakeArgString(
6866 getToolChain().GetFilePath("crt0.o")));
6867 CmdArgs.push_back(Args.MakeArgString(
6868 getToolChain().GetFilePath("crtbegin.o")));
6869 } else {
6870 CmdArgs.push_back(Args.MakeArgString(
6871 getToolChain().GetFilePath("crtbeginS.o")));
6872 }
6873 }
6874
6875 Args.AddAllArgs(CmdArgs, options::OPT_L);
6876 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6877 Args.AddAllArgs(CmdArgs, options::OPT_e);
6878
6879 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6880
6881 if (!Args.hasArg(options::OPT_nostdlib) &&
6882 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006883 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006884 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6885 if (Args.hasArg(options::OPT_pg))
6886 CmdArgs.push_back("-lm_p");
6887 else
6888 CmdArgs.push_back("-lm");
6889 }
6890
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006891 if (Args.hasArg(options::OPT_pthread)) {
6892 if (!Args.hasArg(options::OPT_shared) &&
6893 Args.hasArg(options::OPT_pg))
6894 CmdArgs.push_back("-lpthread_p");
6895 else
6896 CmdArgs.push_back("-lpthread");
6897 }
6898
Eli Friedman9fa28852012-08-08 23:57:20 +00006899 if (!Args.hasArg(options::OPT_shared)) {
6900 if (Args.hasArg(options::OPT_pg))
6901 CmdArgs.push_back("-lc_p");
6902 else
6903 CmdArgs.push_back("-lc");
6904 }
6905
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006906 StringRef MyArch;
6907 switch (getToolChain().getTriple().getArch()) {
6908 case llvm::Triple::arm:
6909 MyArch = "arm";
6910 break;
6911 case llvm::Triple::x86:
6912 MyArch = "i386";
6913 break;
6914 case llvm::Triple::x86_64:
6915 MyArch = "amd64";
6916 break;
6917 default:
6918 llvm_unreachable("Unsupported architecture");
6919 }
6920 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006921 }
6922
6923 if (!Args.hasArg(options::OPT_nostdlib) &&
6924 !Args.hasArg(options::OPT_nostartfiles)) {
6925 if (!Args.hasArg(options::OPT_shared))
6926 CmdArgs.push_back(Args.MakeArgString(
6927 getToolChain().GetFilePath("crtend.o")));
6928 else
6929 CmdArgs.push_back(Args.MakeArgString(
6930 getToolChain().GetFilePath("crtendS.o")));
6931 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006932
6933 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006934 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006935 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006936}
6937
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006938void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006939 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006940 const InputInfoList &Inputs,
6941 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006942 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006943 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006944 ArgStringList CmdArgs;
6945
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006946 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6947 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006948 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006949 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006950 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006951 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006952 else if (getToolChain().getArch() == llvm::Triple::mips ||
6953 getToolChain().getArch() == llvm::Triple::mipsel ||
6954 getToolChain().getArch() == llvm::Triple::mips64 ||
6955 getToolChain().getArch() == llvm::Triple::mips64el) {
6956 StringRef CPUName;
6957 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006958 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006959
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006960 CmdArgs.push_back("-march");
6961 CmdArgs.push_back(CPUName.data());
6962
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006963 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006964 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006965
6966 if (getToolChain().getArch() == llvm::Triple::mips ||
6967 getToolChain().getArch() == llvm::Triple::mips64)
6968 CmdArgs.push_back("-EB");
6969 else
6970 CmdArgs.push_back("-EL");
6971
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006972 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006973 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006974 getToolChain().getArch() == llvm::Triple::armeb ||
6975 getToolChain().getArch() == llvm::Triple::thumb ||
6976 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006977 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006978 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006979 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6980
6981 if (FloatABI == "hard") {
6982 CmdArgs.push_back("-mfpu=vfp");
6983 } else {
6984 CmdArgs.push_back("-mfpu=softvfp");
6985 }
6986
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006987 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006988 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006989 case llvm::Triple::GNUEABI:
6990 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006991 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006992 break;
6993
6994 default:
6995 CmdArgs.push_back("-matpcs");
6996 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006997 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006998 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006999 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007000 if (getToolChain().getArch() == llvm::Triple::sparc)
7001 CmdArgs.push_back("-Av8plusa");
7002 else
7003 CmdArgs.push_back("-Av9a");
7004
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007005 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007006 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007007
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007008 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7009 options::OPT_Xassembler);
7010
7011 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007012 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007013
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007014 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007015 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007016
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007017 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007018 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007019}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007020
7021void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007022 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007023 const InputInfoList &Inputs,
7024 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00007025 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00007026 const toolchains::FreeBSD& ToolChain =
7027 static_cast<const toolchains::FreeBSD&>(getToolChain());
7028 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007029 const bool IsPIE =
7030 !Args.hasArg(options::OPT_shared) &&
7031 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007032 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007033
7034 // Silence warning for "clang -g foo.o -o foo"
7035 Args.ClaimAllArgs(options::OPT_g_Group);
7036 // and "clang -emit-llvm foo.o -o foo"
7037 Args.ClaimAllArgs(options::OPT_emit_llvm);
7038 // and for "clang -w foo.o -o foo". Other warning options are already
7039 // handled somewhere else.
7040 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007041
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007042 if (!D.SysRoot.empty())
7043 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7044
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007045 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007046 CmdArgs.push_back("-pie");
7047
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007048 if (Args.hasArg(options::OPT_static)) {
7049 CmdArgs.push_back("-Bstatic");
7050 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007051 if (Args.hasArg(options::OPT_rdynamic))
7052 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007053 CmdArgs.push_back("--eh-frame-hdr");
7054 if (Args.hasArg(options::OPT_shared)) {
7055 CmdArgs.push_back("-Bshareable");
7056 } else {
7057 CmdArgs.push_back("-dynamic-linker");
7058 CmdArgs.push_back("/libexec/ld-elf.so.1");
7059 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007060 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
7061 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00007062 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7063 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7064 CmdArgs.push_back("--hash-style=both");
7065 }
7066 }
7067 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007068 }
7069
7070 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7071 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007072 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007073 CmdArgs.push_back("-m");
7074 CmdArgs.push_back("elf_i386_fbsd");
7075 }
7076
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007077 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007078 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007079 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007080 }
7081
Daniel Dunbarb440f562010-08-02 02:38:21 +00007082 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007083 CmdArgs.push_back("-o");
7084 CmdArgs.push_back(Output.getFilename());
7085 } else {
7086 assert(Output.isNothing() && "Invalid output.");
7087 }
7088
7089 if (!Args.hasArg(options::OPT_nostdlib) &&
7090 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007091 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007092 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007093 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007094 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007095 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007096 crt1 = "Scrt1.o";
7097 else
7098 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007099 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007100 if (crt1)
7101 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7102
7103 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7104
Craig Topper92fc2df2014-05-17 16:56:41 +00007105 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007106 if (Args.hasArg(options::OPT_static))
7107 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007108 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007109 crtbegin = "crtbeginS.o";
7110 else
7111 crtbegin = "crtbegin.o";
7112
7113 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007114 }
7115
7116 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007117 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007118 for (const auto &Path : Paths)
7119 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007120 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7121 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007122 Args.AddAllArgs(CmdArgs, options::OPT_s);
7123 Args.AddAllArgs(CmdArgs, options::OPT_t);
7124 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7125 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007126
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007127 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007128 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007129
Alexey Samsonov52550342014-09-15 19:58:40 +00007130 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007131 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007132
7133 if (!Args.hasArg(options::OPT_nostdlib) &&
7134 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007135 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007136 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007137 if (Args.hasArg(options::OPT_pg))
7138 CmdArgs.push_back("-lm_p");
7139 else
7140 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007141 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007142 if (NeedsSanitizerDeps)
7143 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007144 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7145 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007146 if (Args.hasArg(options::OPT_pg))
7147 CmdArgs.push_back("-lgcc_p");
7148 else
7149 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007150 if (Args.hasArg(options::OPT_static)) {
7151 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007152 } else if (Args.hasArg(options::OPT_pg)) {
7153 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007154 } else {
7155 CmdArgs.push_back("--as-needed");
7156 CmdArgs.push_back("-lgcc_s");
7157 CmdArgs.push_back("--no-as-needed");
7158 }
7159
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007160 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007161 if (Args.hasArg(options::OPT_pg))
7162 CmdArgs.push_back("-lpthread_p");
7163 else
7164 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007165 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007166
Roman Divacky66f22762011-02-10 16:59:40 +00007167 if (Args.hasArg(options::OPT_pg)) {
7168 if (Args.hasArg(options::OPT_shared))
7169 CmdArgs.push_back("-lc");
7170 else
7171 CmdArgs.push_back("-lc_p");
7172 CmdArgs.push_back("-lgcc_p");
7173 } else {
7174 CmdArgs.push_back("-lc");
7175 CmdArgs.push_back("-lgcc");
7176 }
7177
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007178 if (Args.hasArg(options::OPT_static)) {
7179 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007180 } else if (Args.hasArg(options::OPT_pg)) {
7181 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007182 } else {
7183 CmdArgs.push_back("--as-needed");
7184 CmdArgs.push_back("-lgcc_s");
7185 CmdArgs.push_back("--no-as-needed");
7186 }
7187 }
7188
7189 if (!Args.hasArg(options::OPT_nostdlib) &&
7190 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007191 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007192 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007193 else
7194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007195 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007196 }
7197
Alexey Samsonov7811d192014-02-20 13:57:37 +00007198 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007199
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007200 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007201 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007202 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007203}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007204
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007205void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7206 const InputInfo &Output,
7207 const InputInfoList &Inputs,
7208 const ArgList &Args,
7209 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007210 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007211 ArgStringList CmdArgs;
7212
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007213 // GNU as needs different flags for creating the correct output format
7214 // on architectures with different ABIs or optional feature sets.
7215 switch (getToolChain().getArch()) {
7216 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007217 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007218 break;
7219 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007220 case llvm::Triple::armeb:
7221 case llvm::Triple::thumb:
7222 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007223 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007224 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007225 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007226 }
7227
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007228 case llvm::Triple::mips:
7229 case llvm::Triple::mipsel:
7230 case llvm::Triple::mips64:
7231 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007232 StringRef CPUName;
7233 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007234 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007235
7236 CmdArgs.push_back("-march");
7237 CmdArgs.push_back(CPUName.data());
7238
7239 CmdArgs.push_back("-mabi");
7240 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7241
7242 if (getToolChain().getArch() == llvm::Triple::mips ||
7243 getToolChain().getArch() == llvm::Triple::mips64)
7244 CmdArgs.push_back("-EB");
7245 else
7246 CmdArgs.push_back("-EL");
7247
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007248 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007249 break;
7250 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007251
7252 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007253 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007254 CmdArgs.push_back("-32");
7255 addAssemblerKPIC(Args, CmdArgs);
7256 break;
7257
7258 case llvm::Triple::sparcv9:
7259 CmdArgs.push_back("-64");
7260 CmdArgs.push_back("-Av9");
7261 addAssemblerKPIC(Args, CmdArgs);
7262 break;
7263
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007264 default:
7265 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007266 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007267
7268 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7269 options::OPT_Xassembler);
7270
7271 CmdArgs.push_back("-o");
7272 CmdArgs.push_back(Output.getFilename());
7273
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007274 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007275 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007276
David Chisnallddbd68f2011-09-27 22:03:18 +00007277 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007279}
7280
7281void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7282 const InputInfo &Output,
7283 const InputInfoList &Inputs,
7284 const ArgList &Args,
7285 const char *LinkingOutput) const {
7286 const Driver &D = getToolChain().getDriver();
7287 ArgStringList CmdArgs;
7288
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007289 if (!D.SysRoot.empty())
7290 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7291
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007292 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007293 if (Args.hasArg(options::OPT_static)) {
7294 CmdArgs.push_back("-Bstatic");
7295 } else {
7296 if (Args.hasArg(options::OPT_rdynamic))
7297 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007298 if (Args.hasArg(options::OPT_shared)) {
7299 CmdArgs.push_back("-Bshareable");
7300 } else {
7301 CmdArgs.push_back("-dynamic-linker");
7302 CmdArgs.push_back("/libexec/ld.elf_so");
7303 }
7304 }
7305
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007306 // Many NetBSD architectures support more than one ABI.
7307 // Determine the correct emulation for ld.
7308 switch (getToolChain().getArch()) {
7309 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007310 CmdArgs.push_back("-m");
7311 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007312 break;
7313 case llvm::Triple::arm:
7314 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007315 CmdArgs.push_back("-m");
7316 switch (getToolChain().getTriple().getEnvironment()) {
7317 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007318 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007319 CmdArgs.push_back("armelf_nbsd_eabi");
7320 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007321 case llvm::Triple::EABIHF:
7322 case llvm::Triple::GNUEABIHF:
7323 CmdArgs.push_back("armelf_nbsd_eabihf");
7324 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007325 default:
7326 CmdArgs.push_back("armelf_nbsd");
7327 break;
7328 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007329 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007330 case llvm::Triple::armeb:
7331 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007332 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007333 CmdArgs.push_back("-m");
7334 switch (getToolChain().getTriple().getEnvironment()) {
7335 case llvm::Triple::EABI:
7336 case llvm::Triple::GNUEABI:
7337 CmdArgs.push_back("armelfb_nbsd_eabi");
7338 break;
7339 case llvm::Triple::EABIHF:
7340 case llvm::Triple::GNUEABIHF:
7341 CmdArgs.push_back("armelfb_nbsd_eabihf");
7342 break;
7343 default:
7344 CmdArgs.push_back("armelfb_nbsd");
7345 break;
7346 }
7347 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007348 case llvm::Triple::mips64:
7349 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007350 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007351 CmdArgs.push_back("-m");
7352 if (getToolChain().getArch() == llvm::Triple::mips64)
7353 CmdArgs.push_back("elf32btsmip");
7354 else
7355 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007356 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007357 CmdArgs.push_back("-m");
7358 if (getToolChain().getArch() == llvm::Triple::mips64)
7359 CmdArgs.push_back("elf64btsmip");
7360 else
7361 CmdArgs.push_back("elf64ltsmip");
7362 }
7363 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007364 case llvm::Triple::ppc:
7365 CmdArgs.push_back("-m");
7366 CmdArgs.push_back("elf32ppc_nbsd");
7367 break;
7368
7369 case llvm::Triple::ppc64:
7370 case llvm::Triple::ppc64le:
7371 CmdArgs.push_back("-m");
7372 CmdArgs.push_back("elf64ppc");
7373 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007374
7375 case llvm::Triple::sparc:
7376 CmdArgs.push_back("-m");
7377 CmdArgs.push_back("elf32_sparc");
7378 break;
7379
7380 case llvm::Triple::sparcv9:
7381 CmdArgs.push_back("-m");
7382 CmdArgs.push_back("elf64_sparc");
7383 break;
7384
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007385 default:
7386 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007387 }
7388
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007389 if (Output.isFilename()) {
7390 CmdArgs.push_back("-o");
7391 CmdArgs.push_back(Output.getFilename());
7392 } else {
7393 assert(Output.isNothing() && "Invalid output.");
7394 }
7395
7396 if (!Args.hasArg(options::OPT_nostdlib) &&
7397 !Args.hasArg(options::OPT_nostartfiles)) {
7398 if (!Args.hasArg(options::OPT_shared)) {
7399 CmdArgs.push_back(Args.MakeArgString(
7400 getToolChain().GetFilePath("crt0.o")));
7401 CmdArgs.push_back(Args.MakeArgString(
7402 getToolChain().GetFilePath("crti.o")));
7403 CmdArgs.push_back(Args.MakeArgString(
7404 getToolChain().GetFilePath("crtbegin.o")));
7405 } else {
7406 CmdArgs.push_back(Args.MakeArgString(
7407 getToolChain().GetFilePath("crti.o")));
7408 CmdArgs.push_back(Args.MakeArgString(
7409 getToolChain().GetFilePath("crtbeginS.o")));
7410 }
7411 }
7412
7413 Args.AddAllArgs(CmdArgs, options::OPT_L);
7414 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7415 Args.AddAllArgs(CmdArgs, options::OPT_e);
7416 Args.AddAllArgs(CmdArgs, options::OPT_s);
7417 Args.AddAllArgs(CmdArgs, options::OPT_t);
7418 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7419 Args.AddAllArgs(CmdArgs, options::OPT_r);
7420
7421 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7422
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007423 unsigned Major, Minor, Micro;
7424 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7425 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007426 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007427 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007428 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007429 case llvm::Triple::arm:
7430 case llvm::Triple::armeb:
7431 case llvm::Triple::thumb:
7432 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007433 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007434 case llvm::Triple::ppc64:
7435 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007436 case llvm::Triple::x86:
7437 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007438 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007439 break;
7440 default:
7441 break;
7442 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007443 }
7444
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007445 if (!Args.hasArg(options::OPT_nostdlib) &&
7446 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007447 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007448 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7449 CmdArgs.push_back("-lm");
7450 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007451 if (Args.hasArg(options::OPT_pthread))
7452 CmdArgs.push_back("-lpthread");
7453 CmdArgs.push_back("-lc");
7454
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007455 if (useLibgcc) {
7456 if (Args.hasArg(options::OPT_static)) {
7457 // libgcc_eh depends on libc, so resolve as much as possible,
7458 // pull in any new requirements from libc and then get the rest
7459 // of libgcc.
7460 CmdArgs.push_back("-lgcc_eh");
7461 CmdArgs.push_back("-lc");
7462 CmdArgs.push_back("-lgcc");
7463 } else {
7464 CmdArgs.push_back("-lgcc");
7465 CmdArgs.push_back("--as-needed");
7466 CmdArgs.push_back("-lgcc_s");
7467 CmdArgs.push_back("--no-as-needed");
7468 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007469 }
7470 }
7471
7472 if (!Args.hasArg(options::OPT_nostdlib) &&
7473 !Args.hasArg(options::OPT_nostartfiles)) {
7474 if (!Args.hasArg(options::OPT_shared))
7475 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7476 "crtend.o")));
7477 else
7478 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7479 "crtendS.o")));
7480 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7481 "crtn.o")));
7482 }
7483
Alexey Samsonov7811d192014-02-20 13:57:37 +00007484 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007485
Logan Chieneb9162f2014-06-26 14:23:45 +00007486 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007487 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007488}
7489
Thomas Schwinge4e555262013-03-28 19:04:25 +00007490void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7491 const InputInfo &Output,
7492 const InputInfoList &Inputs,
7493 const ArgList &Args,
7494 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007495 claimNoWarnArgs(Args);
7496
Rafael Espindola92b00932010-08-10 00:25:48 +00007497 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007498 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007499
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007500 switch (getToolChain().getArch()) {
7501 default:
7502 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007503 // Add --32/--64 to make sure we get the format we want.
7504 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007505 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007506 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007507 break;
7508 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007509 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7510 CmdArgs.push_back("--x32");
7511 else
7512 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007513 break;
7514 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007515 CmdArgs.push_back("-a32");
7516 CmdArgs.push_back("-mppc");
7517 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007518 break;
7519 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007520 CmdArgs.push_back("-a64");
7521 CmdArgs.push_back("-mppc64");
7522 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007523 break;
7524 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007525 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007526 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007527 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007528 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007529 break;
7530 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007531 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007532 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007533 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007534 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007535 break;
7536 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007537 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007538 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007539 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007540 break;
7541 case llvm::Triple::arm:
7542 case llvm::Triple::armeb:
7543 case llvm::Triple::thumb:
7544 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007545 const llvm::Triple &Triple = getToolChain().getTriple();
7546 switch (Triple.getSubArch()) {
7547 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007548 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007549 break;
7550 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007551 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007552 break;
7553 default:
7554 break;
7555 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007556
Tim Northover9c7e0352013-12-12 11:55:52 +00007557 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007558 getToolChain().getDriver(), Args,
7559 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007560 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007561
7562 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007563
7564 // FIXME: remove krait check when GNU tools support krait cpu
7565 // for now replace it with -march=armv7-a to avoid a lower
7566 // march from being picked in the absence of a cpu flag.
7567 Arg *A;
7568 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin4045f662015-05-08 15:44:36 +00007569 StringRef(A->getValue()) == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007570 CmdArgs.push_back("-march=armv7-a");
7571 else
7572 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007573 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007574 break;
7575 }
7576 case llvm::Triple::mips:
7577 case llvm::Triple::mipsel:
7578 case llvm::Triple::mips64:
7579 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007580 StringRef CPUName;
7581 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007582 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007583 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007584
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007585 CmdArgs.push_back("-march");
7586 CmdArgs.push_back(CPUName.data());
7587
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007588 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007589 CmdArgs.push_back(ABIName.data());
7590
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007591 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7592 // or -mshared (not implemented) is in effect.
7593 bool IsPicOrPie = false;
7594 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7595 options::OPT_fpic, options::OPT_fno_pic,
7596 options::OPT_fPIE, options::OPT_fno_PIE,
7597 options::OPT_fpie, options::OPT_fno_pie)) {
7598 if (A->getOption().matches(options::OPT_fPIC) ||
7599 A->getOption().matches(options::OPT_fpic) ||
7600 A->getOption().matches(options::OPT_fPIE) ||
7601 A->getOption().matches(options::OPT_fpie))
7602 IsPicOrPie = true;
7603 }
7604 if (!IsPicOrPie)
7605 CmdArgs.push_back("-mno-shared");
7606
Daniel Sanders379d44b2014-07-16 11:52:23 +00007607 // LLVM doesn't support -mplt yet and acts as if it is always given.
7608 // However, -mplt has no effect with the N64 ABI.
7609 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007610
7611 if (getToolChain().getArch() == llvm::Triple::mips ||
7612 getToolChain().getArch() == llvm::Triple::mips64)
7613 CmdArgs.push_back("-EB");
7614 else
7615 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007616
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007617 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7618 if (StringRef(A->getValue()) == "2008")
7619 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7620 }
7621
Daniel Sanders379d44b2014-07-16 11:52:23 +00007622 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7623 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7624 options::OPT_mfp64)) {
7625 A->claim();
7626 A->render(Args, CmdArgs);
7627 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7628 ABIName))
7629 CmdArgs.push_back("-mfpxx");
7630
7631 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7632 // -mno-mips16 is actually -no-mips16.
7633 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7634 options::OPT_mno_mips16)) {
7635 if (A->getOption().matches(options::OPT_mips16)) {
7636 A->claim();
7637 A->render(Args, CmdArgs);
7638 } else {
7639 A->claim();
7640 CmdArgs.push_back("-no-mips16");
7641 }
7642 }
7643
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007644 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7645 options::OPT_mno_micromips);
7646 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7647 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7648
Simon Atanasyanbd986632013-11-26 11:58:04 +00007649 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7650 // Do not use AddLastArg because not all versions of MIPS assembler
7651 // support -mmsa / -mno-msa options.
7652 if (A->getOption().matches(options::OPT_mmsa))
7653 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7654 }
7655
Daniel Sanders379d44b2014-07-16 11:52:23 +00007656 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7657 options::OPT_msoft_float);
7658
7659 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7660 options::OPT_mno_odd_spreg);
7661
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007662 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007663 break;
7664 }
7665 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007666 // Always pass an -march option, since our default of z10 is later
7667 // than the GNU assembler's default.
7668 StringRef CPUName = getSystemZTargetCPU(Args);
7669 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007670 break;
7671 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007672 }
7673
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007674 if (NeedsKPIC)
7675 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007676
7677 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7678 options::OPT_Xassembler);
7679
7680 CmdArgs.push_back("-o");
7681 CmdArgs.push_back(Output.getFilename());
7682
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007683 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007684 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007685
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007686 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007687 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007688
7689 // Handle the debug info splitting at object creation time if we're
7690 // creating an object.
7691 // TODO: Currently only works on linux with newer objcopy.
7692 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007693 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007694 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007695 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007696}
7697
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007698static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007699 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007700 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007701 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7702 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007703 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007704 CmdArgs.push_back("-lgcc");
7705
Logan Chien3d3373c2012-11-19 12:04:11 +00007706 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007707 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007708 CmdArgs.push_back("-lgcc");
7709 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007710 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007711 CmdArgs.push_back("--as-needed");
7712 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007713 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007714 CmdArgs.push_back("--no-as-needed");
7715 }
7716
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007717 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007718 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007719 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007720 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007721
7722 // According to Android ABI, we have to link with libdl if we are
7723 // linking with non-static libgcc.
7724 //
7725 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7726 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7727 if (isAndroid && !StaticLibgcc)
7728 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007729}
7730
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007731static std::string getLinuxDynamicLinker(const ArgList &Args,
7732 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007733 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7734 if (ToolChain.getTriple().isArch64Bit())
7735 return "/system/bin/linker64";
7736 else
7737 return "/system/bin/linker";
7738 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007739 ToolChain.getArch() == llvm::Triple::sparc ||
7740 ToolChain.getArch() == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007741 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007742 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007743 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007744 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007745 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007746 else if (ToolChain.getArch() == llvm::Triple::arm ||
7747 ToolChain.getArch() == llvm::Triple::thumb) {
7748 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7749 return "/lib/ld-linux-armhf.so.3";
7750 else
7751 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007752 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7753 ToolChain.getArch() == llvm::Triple::thumbeb) {
7754 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7755 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7756 else
7757 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007758 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007759 ToolChain.getArch() == llvm::Triple::mipsel ||
7760 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007761 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007762 StringRef CPUName;
7763 StringRef ABIName;
7764 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7765 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7766
7767 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7768 .Case("o32", "/lib")
7769 .Case("n32", "/lib32")
7770 .Case("n64", "/lib64")
7771 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007772 StringRef LibName;
7773 if (mips::isUCLibc(Args))
7774 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7775 else
7776 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007777
7778 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007779 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7780 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007781 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7782 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7783 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007784 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007785 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7786 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7787 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007788 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007789 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7790 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007791 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7792 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007793 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7794 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7795 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007796 else
7797 return "/lib64/ld-linux-x86-64.so.2";
7798}
7799
Renato Golinc4b49242014-02-13 10:01:16 +00007800static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007801 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007802 // Make use of compiler-rt if --rtlib option is used
7803 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7804
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007805 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007806 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007807 switch (TC.getTriple().getOS()) {
7808 default: llvm_unreachable("unsupported OS");
7809 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007810 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007811 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007812 break;
7813 }
Renato Golinc4b49242014-02-13 10:01:16 +00007814 break;
7815 case ToolChain::RLT_Libgcc:
7816 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7817 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007818 }
7819}
7820
Rafael Espindola1e085772014-08-15 17:14:35 +00007821static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7822 switch (T.getArch()) {
7823 case llvm::Triple::x86:
7824 return "elf_i386";
7825 case llvm::Triple::aarch64:
7826 return "aarch64linux";
7827 case llvm::Triple::aarch64_be:
7828 return "aarch64_be_linux";
7829 case llvm::Triple::arm:
7830 case llvm::Triple::thumb:
7831 return "armelf_linux_eabi";
7832 case llvm::Triple::armeb:
7833 case llvm::Triple::thumbeb:
7834 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7835 case llvm::Triple::ppc:
7836 return "elf32ppclinux";
7837 case llvm::Triple::ppc64:
7838 return "elf64ppc";
7839 case llvm::Triple::ppc64le:
7840 return "elf64lppc";
7841 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007842 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007843 return "elf32_sparc";
7844 case llvm::Triple::sparcv9:
7845 return "elf64_sparc";
7846 case llvm::Triple::mips:
7847 return "elf32btsmip";
7848 case llvm::Triple::mipsel:
7849 return "elf32ltsmip";
7850 case llvm::Triple::mips64:
7851 if (mips::hasMipsAbiArg(Args, "n32"))
7852 return "elf32btsmipn32";
7853 return "elf64btsmip";
7854 case llvm::Triple::mips64el:
7855 if (mips::hasMipsAbiArg(Args, "n32"))
7856 return "elf32ltsmipn32";
7857 return "elf64ltsmip";
7858 case llvm::Triple::systemz:
7859 return "elf64_s390";
7860 case llvm::Triple::x86_64:
7861 if (T.getEnvironment() == llvm::Triple::GNUX32)
7862 return "elf32_x86_64";
7863 return "elf_x86_64";
7864 default:
7865 llvm_unreachable("Unexpected arch");
7866 }
7867}
7868
Thomas Schwinge4e555262013-03-28 19:04:25 +00007869void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7870 const InputInfo &Output,
7871 const InputInfoList &Inputs,
7872 const ArgList &Args,
7873 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007874 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007875 static_cast<const toolchains::Linux&>(getToolChain());
7876 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007877 const bool isAndroid =
7878 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007879 const bool IsPIE =
7880 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007881 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007882 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007883
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007884 ArgStringList CmdArgs;
7885
Rafael Espindolad1002f62010-11-15 18:28:16 +00007886 // Silence warning for "clang -g foo.o -o foo"
7887 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007888 // and "clang -emit-llvm foo.o -o foo"
7889 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007890 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007891 // handled somewhere else.
7892 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007893
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007894 if (!D.SysRoot.empty())
7895 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007896
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007897 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007898 CmdArgs.push_back("-pie");
7899
Rafael Espindola1c76c592010-11-07 22:57:16 +00007900 if (Args.hasArg(options::OPT_rdynamic))
7901 CmdArgs.push_back("-export-dynamic");
7902
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007903 if (Args.hasArg(options::OPT_s))
7904 CmdArgs.push_back("-s");
7905
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007906 if (ToolChain.getArch() == llvm::Triple::armeb ||
7907 ToolChain.getArch() == llvm::Triple::thumbeb)
7908 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7909
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007910 for (const auto &Opt : ToolChain.ExtraOpts)
7911 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007912
7913 if (!Args.hasArg(options::OPT_static)) {
7914 CmdArgs.push_back("--eh-frame-hdr");
7915 }
7916
7917 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007918 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007919
7920 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007921 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007922 ToolChain.getArch() == llvm::Triple::armeb ||
7923 ToolChain.getArch() == llvm::Triple::thumb ||
7924 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007925 CmdArgs.push_back("-Bstatic");
7926 else
7927 CmdArgs.push_back("-static");
7928 } else if (Args.hasArg(options::OPT_shared)) {
7929 CmdArgs.push_back("-shared");
7930 }
7931
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007932 if (ToolChain.getArch() == llvm::Triple::arm ||
7933 ToolChain.getArch() == llvm::Triple::armeb ||
7934 ToolChain.getArch() == llvm::Triple::thumb ||
7935 ToolChain.getArch() == llvm::Triple::thumbeb ||
7936 (!Args.hasArg(options::OPT_static) &&
7937 !Args.hasArg(options::OPT_shared))) {
7938 CmdArgs.push_back("-dynamic-linker");
7939 CmdArgs.push_back(Args.MakeArgString(
7940 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7941 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007942
7943 CmdArgs.push_back("-o");
7944 CmdArgs.push_back(Output.getFilename());
7945
Rafael Espindola81937ec2010-12-01 01:52:43 +00007946 if (!Args.hasArg(options::OPT_nostdlib) &&
7947 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007948 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007949 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007950 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007951 if (Args.hasArg(options::OPT_pg))
7952 crt1 = "gcrt1.o";
7953 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007954 crt1 = "Scrt1.o";
7955 else
7956 crt1 = "crt1.o";
7957 }
7958 if (crt1)
7959 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007960
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007961 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7962 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007963
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007964 const char *crtbegin;
7965 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007966 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007967 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007968 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007969 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007970 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007971 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007972 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007973 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007974
7975 // Add crtfastmath.o if available and fast math is enabled.
7976 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007977 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007978
7979 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007980 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007981
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007982 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007983
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007984 for (const auto &Path : Paths)
7985 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007986
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007987 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007988 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007989
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007990 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7991 CmdArgs.push_back("--no-demangle");
7992
Alexey Samsonov52550342014-09-15 19:58:40 +00007993 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007994 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007995 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007996 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007997
Hans Wennborg70850d82013-07-18 20:29:38 +00007998 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007999 !Args.hasArg(options::OPT_nostdlib) &&
8000 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008001 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8002 !Args.hasArg(options::OPT_static);
8003 if (OnlyLibstdcxxStatic)
8004 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008005 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008006 if (OnlyLibstdcxxStatic)
8007 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008008 CmdArgs.push_back("-lm");
8009 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008010 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8011 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008012
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008013 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008014 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8015 if (Args.hasArg(options::OPT_static))
8016 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008017
Alexey Samsonov52550342014-09-15 19:58:40 +00008018 if (NeedsSanitizerDeps)
8019 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8020
Richard Smith31d1de22015-05-20 22:48:44 +00008021 bool WantPthread = true;
Alexey Bataevdb390212015-05-20 04:24:19 +00008022 if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
Richard Smith31d1de22015-05-20 22:48:44 +00008023 switch (getOpenMPLibByName(A->getValue())) {
8024 case LibGOMP:
8025 CmdArgs.push_back("-lgomp");
8026
8027 // FIXME: Exclude this for platforms with libgomp that don't require
8028 // librt. Most modern Linux platforms require it, but some may not.
8029 CmdArgs.push_back("-lrt");
8030 break;
8031 case LibIOMP5:
8032 CmdArgs.push_back("-liomp5");
8033 break;
8034 case LibUnknown:
Alexey Bataev186b28a2014-03-06 05:43:53 +00008035 D.Diag(diag::err_drv_unsupported_option_argument)
Alexey Bataevdb390212015-05-20 04:24:19 +00008036 << A->getOption().getName() << A->getValue();
Richard Smith31d1de22015-05-20 22:48:44 +00008037 break;
8038 }
Alexey Bataevdb390212015-05-20 04:24:19 +00008039 } else if (Args.hasArg(options::OPT_fopenmp)) {
Richard Smith31d1de22015-05-20 22:48:44 +00008040 CmdArgs.push_back(getDefaultOpenMPLibFlag());
8041 } else {
8042 WantPthread = Args.hasArg(options::OPT_pthread) ||
8043 Args.hasArg(options::OPT_pthreads);
Chandler Carruth01538002013-01-17 13:19:29 +00008044 }
Renato Golinc4b49242014-02-13 10:01:16 +00008045 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008046
Richard Smith31d1de22015-05-20 22:48:44 +00008047 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008048 CmdArgs.push_back("-lpthread");
8049
8050 CmdArgs.push_back("-lc");
8051
8052 if (Args.hasArg(options::OPT_static))
8053 CmdArgs.push_back("--end-group");
8054 else
Renato Golinc4b49242014-02-13 10:01:16 +00008055 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008056 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008057
Rafael Espindola81937ec2010-12-01 01:52:43 +00008058 if (!Args.hasArg(options::OPT_nostartfiles)) {
8059 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008060 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008061 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008062 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008063 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008064 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008065 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008066
Rafael Espindola81937ec2010-12-01 01:52:43 +00008067 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008068 if (!isAndroid)
8069 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008070 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008071 }
8072
David Blaikiec11bf802014-09-04 16:04:28 +00008073 C.addCommand(
8074 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008075}
8076
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008077
8078// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8079// for the various SFI requirements like register masking. The assembly tool
8080// inserts the file containing the macros as an input into all the assembly
8081// jobs.
8082void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8083 const InputInfo &Output,
8084 const InputInfoList &Inputs,
8085 const ArgList &Args,
8086 const char *LinkingOutput) const {
8087 const toolchains::NaCl_TC& ToolChain =
8088 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8089 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8090 "nacl-arm-macros.s");
8091 InputInfoList NewInputs;
8092 NewInputs.push_back(NaClMacros);
8093 NewInputs.append(Inputs.begin(), Inputs.end());
8094 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8095 LinkingOutput);
8096}
8097
8098
8099// This is quite similar to gnutools::link::ConstructJob with changes that
8100// we use static by default, do not yet support sanitizers or LTO, and a few
8101// others. Eventually we can support more of that and hopefully migrate back
8102// to gnutools::link.
8103void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8104 const InputInfo &Output,
8105 const InputInfoList &Inputs,
8106 const ArgList &Args,
8107 const char *LinkingOutput) const {
8108
8109 const toolchains::NaCl_TC& ToolChain =
8110 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8111 const Driver &D = ToolChain.getDriver();
8112 const bool IsStatic =
8113 !Args.hasArg(options::OPT_dynamic) &&
8114 !Args.hasArg(options::OPT_shared);
8115
8116 ArgStringList CmdArgs;
8117
8118 // Silence warning for "clang -g foo.o -o foo"
8119 Args.ClaimAllArgs(options::OPT_g_Group);
8120 // and "clang -emit-llvm foo.o -o foo"
8121 Args.ClaimAllArgs(options::OPT_emit_llvm);
8122 // and for "clang -w foo.o -o foo". Other warning options are already
8123 // handled somewhere else.
8124 Args.ClaimAllArgs(options::OPT_w);
8125
8126 if (!D.SysRoot.empty())
8127 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8128
8129 if (Args.hasArg(options::OPT_rdynamic))
8130 CmdArgs.push_back("-export-dynamic");
8131
8132 if (Args.hasArg(options::OPT_s))
8133 CmdArgs.push_back("-s");
8134
8135 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8136 // there is --build-id, which we do want.
8137 CmdArgs.push_back("--build-id");
8138
8139 if (!IsStatic)
8140 CmdArgs.push_back("--eh-frame-hdr");
8141
8142 CmdArgs.push_back("-m");
8143 if (ToolChain.getArch() == llvm::Triple::x86)
8144 CmdArgs.push_back("elf_i386_nacl");
8145 else if (ToolChain.getArch() == llvm::Triple::arm)
8146 CmdArgs.push_back("armelf_nacl");
8147 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8148 CmdArgs.push_back("elf_x86_64_nacl");
8149 else
8150 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8151 "Native Client";
8152
8153
8154 if (IsStatic)
8155 CmdArgs.push_back("-static");
8156 else if (Args.hasArg(options::OPT_shared))
8157 CmdArgs.push_back("-shared");
8158
8159 CmdArgs.push_back("-o");
8160 CmdArgs.push_back(Output.getFilename());
8161 if (!Args.hasArg(options::OPT_nostdlib) &&
8162 !Args.hasArg(options::OPT_nostartfiles)) {
8163 if (!Args.hasArg(options::OPT_shared))
8164 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8165 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8166
8167 const char *crtbegin;
8168 if (IsStatic)
8169 crtbegin = "crtbeginT.o";
8170 else if (Args.hasArg(options::OPT_shared))
8171 crtbegin = "crtbeginS.o";
8172 else
8173 crtbegin = "crtbegin.o";
8174 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8175 }
8176
8177 Args.AddAllArgs(CmdArgs, options::OPT_L);
8178 Args.AddAllArgs(CmdArgs, options::OPT_u);
8179
8180 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8181
8182 for (const auto &Path : Paths)
8183 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8184
8185 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8186 CmdArgs.push_back("--no-demangle");
8187
8188 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8189
8190 if (D.CCCIsCXX() &&
8191 !Args.hasArg(options::OPT_nostdlib) &&
8192 !Args.hasArg(options::OPT_nodefaultlibs)) {
8193 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8194 !IsStatic;
8195 if (OnlyLibstdcxxStatic)
8196 CmdArgs.push_back("-Bstatic");
8197 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8198 if (OnlyLibstdcxxStatic)
8199 CmdArgs.push_back("-Bdynamic");
8200 CmdArgs.push_back("-lm");
8201 }
8202
8203 if (!Args.hasArg(options::OPT_nostdlib)) {
8204 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8205 // Always use groups, since it has no effect on dynamic libraries.
8206 CmdArgs.push_back("--start-group");
8207 CmdArgs.push_back("-lc");
8208 // NaCl's libc++ currently requires libpthread, so just always include it
8209 // in the group for C++.
8210 if (Args.hasArg(options::OPT_pthread) ||
8211 Args.hasArg(options::OPT_pthreads) ||
8212 D.CCCIsCXX()) {
8213 CmdArgs.push_back("-lpthread");
8214 }
8215
8216 CmdArgs.push_back("-lgcc");
8217 CmdArgs.push_back("--as-needed");
8218 if (IsStatic)
8219 CmdArgs.push_back("-lgcc_eh");
8220 else
8221 CmdArgs.push_back("-lgcc_s");
8222 CmdArgs.push_back("--no-as-needed");
8223 CmdArgs.push_back("--end-group");
8224 }
8225
8226 if (!Args.hasArg(options::OPT_nostartfiles)) {
8227 const char *crtend;
8228 if (Args.hasArg(options::OPT_shared))
8229 crtend = "crtendS.o";
8230 else
8231 crtend = "crtend.o";
8232
8233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8234 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8235 }
8236 }
8237
8238 C.addCommand(llvm::make_unique<Command>(JA, *this,
8239 ToolChain.Linker.c_str(), CmdArgs));
8240}
8241
8242
Chris Lattner3e2ee142010-07-07 16:01:42 +00008243void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008244 const InputInfo &Output,
8245 const InputInfoList &Inputs,
8246 const ArgList &Args,
8247 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008248 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008249 ArgStringList CmdArgs;
8250
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008251 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008252
8253 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008254 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008255
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008256 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008257 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008258
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008259 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008261}
8262
8263void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008264 const InputInfo &Output,
8265 const InputInfoList &Inputs,
8266 const ArgList &Args,
8267 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008268 const Driver &D = getToolChain().getDriver();
8269 ArgStringList CmdArgs;
8270
Daniel Dunbarb440f562010-08-02 02:38:21 +00008271 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008272 CmdArgs.push_back("-o");
8273 CmdArgs.push_back(Output.getFilename());
8274 } else {
8275 assert(Output.isNothing() && "Invalid output.");
8276 }
8277
8278 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008279 !Args.hasArg(options::OPT_nostartfiles)) {
8280 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8281 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8282 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8283 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8284 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008285
8286 Args.AddAllArgs(CmdArgs, options::OPT_L);
8287 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8288 Args.AddAllArgs(CmdArgs, options::OPT_e);
8289
Daniel Dunbar54423b22010-09-17 00:24:54 +00008290 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008291
Alexey Samsonov7811d192014-02-20 13:57:37 +00008292 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008293
Chris Lattner3e2ee142010-07-07 16:01:42 +00008294 if (!Args.hasArg(options::OPT_nostdlib) &&
8295 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008296 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008297 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008298 CmdArgs.push_back("-lm");
8299 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008300 }
8301
8302 if (!Args.hasArg(options::OPT_nostdlib) &&
8303 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008304 if (Args.hasArg(options::OPT_pthread))
8305 CmdArgs.push_back("-lpthread");
8306 CmdArgs.push_back("-lc");
8307 CmdArgs.push_back("-lCompilerRT-Generic");
8308 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8309 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008310 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008311 }
8312
Logan Chieneb9162f2014-06-26 14:23:45 +00008313 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008314 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008315}
8316
Daniel Dunbarcc912342009-05-02 18:28:39 +00008317/// DragonFly Tools
8318
8319// For now, DragonFly Assemble does just about the same as for
8320// FreeBSD, but this may change soon.
8321void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008322 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008323 const InputInfoList &Inputs,
8324 const ArgList &Args,
8325 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008326 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008327 ArgStringList CmdArgs;
8328
8329 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8330 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008331 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008332 CmdArgs.push_back("--32");
8333
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008334 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008335
8336 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008337 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008338
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008339 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008340 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008341
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008342 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008343 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008344}
8345
8346void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008347 const InputInfo &Output,
8348 const InputInfoList &Inputs,
8349 const ArgList &Args,
8350 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008351 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008352 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008353 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008354
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008355 if (!D.SysRoot.empty())
8356 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8357
John McCall65b8da02013-04-11 22:55:55 +00008358 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008359 if (Args.hasArg(options::OPT_static)) {
8360 CmdArgs.push_back("-Bstatic");
8361 } else {
John McCall65b8da02013-04-11 22:55:55 +00008362 if (Args.hasArg(options::OPT_rdynamic))
8363 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008364 if (Args.hasArg(options::OPT_shared))
8365 CmdArgs.push_back("-Bshareable");
8366 else {
8367 CmdArgs.push_back("-dynamic-linker");
8368 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8369 }
John McCall65b8da02013-04-11 22:55:55 +00008370 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008371 }
8372
8373 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8374 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008375 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008376 CmdArgs.push_back("-m");
8377 CmdArgs.push_back("elf_i386");
8378 }
8379
Daniel Dunbarb440f562010-08-02 02:38:21 +00008380 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008381 CmdArgs.push_back("-o");
8382 CmdArgs.push_back(Output.getFilename());
8383 } else {
8384 assert(Output.isNothing() && "Invalid output.");
8385 }
8386
8387 if (!Args.hasArg(options::OPT_nostdlib) &&
8388 !Args.hasArg(options::OPT_nostartfiles)) {
8389 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008390 if (Args.hasArg(options::OPT_pg))
8391 CmdArgs.push_back(Args.MakeArgString(
8392 getToolChain().GetFilePath("gcrt1.o")));
8393 else {
8394 if (Args.hasArg(options::OPT_pie))
8395 CmdArgs.push_back(Args.MakeArgString(
8396 getToolChain().GetFilePath("Scrt1.o")));
8397 else
8398 CmdArgs.push_back(Args.MakeArgString(
8399 getToolChain().GetFilePath("crt1.o")));
8400 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008401 }
John McCall65b8da02013-04-11 22:55:55 +00008402 CmdArgs.push_back(Args.MakeArgString(
8403 getToolChain().GetFilePath("crti.o")));
8404 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8405 CmdArgs.push_back(Args.MakeArgString(
8406 getToolChain().GetFilePath("crtbeginS.o")));
8407 else
8408 CmdArgs.push_back(Args.MakeArgString(
8409 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008410 }
8411
8412 Args.AddAllArgs(CmdArgs, options::OPT_L);
8413 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8414 Args.AddAllArgs(CmdArgs, options::OPT_e);
8415
Daniel Dunbar54423b22010-09-17 00:24:54 +00008416 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008417
8418 if (!Args.hasArg(options::OPT_nostdlib) &&
8419 !Args.hasArg(options::OPT_nodefaultlibs)) {
8420 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8421 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008422 if (UseGCC47)
8423 CmdArgs.push_back("-L/usr/lib/gcc47");
8424 else
8425 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008426
8427 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008428 if (UseGCC47) {
8429 CmdArgs.push_back("-rpath");
8430 CmdArgs.push_back("/usr/lib/gcc47");
8431 } else {
8432 CmdArgs.push_back("-rpath");
8433 CmdArgs.push_back("/usr/lib/gcc44");
8434 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008435 }
8436
Hans Wennborg70850d82013-07-18 20:29:38 +00008437 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008438 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008439 CmdArgs.push_back("-lm");
8440 }
8441
Daniel Dunbarcc912342009-05-02 18:28:39 +00008442 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008443 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008444
8445 if (!Args.hasArg(options::OPT_nolibc)) {
8446 CmdArgs.push_back("-lc");
8447 }
8448
John McCall65b8da02013-04-11 22:55:55 +00008449 if (UseGCC47) {
8450 if (Args.hasArg(options::OPT_static) ||
8451 Args.hasArg(options::OPT_static_libgcc)) {
8452 CmdArgs.push_back("-lgcc");
8453 CmdArgs.push_back("-lgcc_eh");
8454 } else {
8455 if (Args.hasArg(options::OPT_shared_libgcc)) {
8456 CmdArgs.push_back("-lgcc_pic");
8457 if (!Args.hasArg(options::OPT_shared))
8458 CmdArgs.push_back("-lgcc");
8459 } else {
8460 CmdArgs.push_back("-lgcc");
8461 CmdArgs.push_back("--as-needed");
8462 CmdArgs.push_back("-lgcc_pic");
8463 CmdArgs.push_back("--no-as-needed");
8464 }
8465 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008466 } else {
John McCall65b8da02013-04-11 22:55:55 +00008467 if (Args.hasArg(options::OPT_shared)) {
8468 CmdArgs.push_back("-lgcc_pic");
8469 } else {
8470 CmdArgs.push_back("-lgcc");
8471 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008472 }
8473 }
8474
8475 if (!Args.hasArg(options::OPT_nostdlib) &&
8476 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008477 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008478 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008479 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008480 else
8481 CmdArgs.push_back(Args.MakeArgString(
8482 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008483 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008484 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008485 }
8486
Alexey Samsonov7811d192014-02-20 13:57:37 +00008487 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008488
Logan Chieneb9162f2014-06-26 14:23:45 +00008489 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008490 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008491}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008492
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008493// Try to find Exe from a Visual Studio distribution. This first tries to find
8494// an installed copy of Visual Studio and, failing that, looks in the PATH,
8495// making sure that whatever executable that's found is not a same-named exe
8496// from clang itself to prevent clang from falling back to itself.
8497static std::string FindVisualStudioExecutable(const ToolChain &TC,
8498 const char *Exe,
8499 const char *ClangProgramPath) {
8500 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8501 std::string visualStudioBinDir;
8502 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8503 visualStudioBinDir)) {
8504 SmallString<128> FilePath(visualStudioBinDir);
8505 llvm::sys::path::append(FilePath, Exe);
8506 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8507 return FilePath.str();
8508 }
8509
8510 return Exe;
8511}
8512
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008513void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8514 const InputInfo &Output,
8515 const InputInfoList &Inputs,
8516 const ArgList &Args,
8517 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008518 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008519 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008520
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008521 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8522 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008523 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8524 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008525
8526 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008527 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008528 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008529
Zachary Turner10d75b22014-10-22 20:40:43 +00008530 if (!llvm::sys::Process::GetEnv("LIB")) {
8531 // If the VC environment hasn't been configured (perhaps because the user
8532 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008533 // the environment variable is set however, assume the user knows what
8534 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008535 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008536 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008537 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8538 SmallString<128> LibDir(VisualStudioDir);
8539 llvm::sys::path::append(LibDir, "VC", "lib");
8540 switch (MSVC.getArch()) {
8541 case llvm::Triple::x86:
8542 // x86 just puts the libraries directly in lib
8543 break;
8544 case llvm::Triple::x86_64:
8545 llvm::sys::path::append(LibDir, "amd64");
8546 break;
8547 case llvm::Triple::arm:
8548 llvm::sys::path::append(LibDir, "arm");
8549 break;
8550 default:
8551 break;
8552 }
8553 CmdArgs.push_back(
8554 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8555 }
8556
8557 std::string WindowsSdkLibPath;
8558 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8559 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8560 WindowsSdkLibPath.c_str()));
8561 }
8562
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008563 CmdArgs.push_back("-nologo");
8564
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008565 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008566 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008567
Hans Wennborge4c47f22015-03-04 23:16:21 +00008568 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8569 options::OPT__SLASH_LDd,
8570 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008571 if (DLL) {
8572 CmdArgs.push_back(Args.MakeArgString("-dll"));
8573
8574 SmallString<128> ImplibName(Output.getFilename());
8575 llvm::sys::path::replace_extension(ImplibName, "lib");
8576 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008577 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008578 }
8579
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008580 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008581 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008582 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008583 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008584 static const char *CompilerRTComponents[] = {
8585 "asan_dynamic",
8586 "asan_dynamic_runtime_thunk",
8587 };
8588 for (const auto &Component : CompilerRTComponents)
8589 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008590 // Make sure the dynamic runtime thunk is not optimized out at link time
8591 // to ensure proper SEH handling.
8592 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008593 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008594 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008595 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008596 static const char *CompilerRTComponents[] = {
8597 "asan",
8598 "asan_cxx",
8599 };
8600 for (const auto &Component : CompilerRTComponents)
8601 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008602 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008603 }
8604
Hans Wennborg2e274592013-08-13 23:38:57 +00008605 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008606
Reid Kleckner337188f2014-09-16 19:22:00 +00008607 // Add filenames, libraries, and other linker inputs.
8608 for (const auto &Input : Inputs) {
8609 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008610 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008611 continue;
8612 }
8613
8614 const Arg &A = Input.getInputArg();
8615
8616 // Render -l options differently for the MSVC linker.
8617 if (A.getOption().matches(options::OPT_l)) {
8618 StringRef Lib = A.getValue();
8619 const char *LinkLibArg;
8620 if (Lib.endswith(".lib"))
8621 LinkLibArg = Args.MakeArgString(Lib);
8622 else
8623 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8624 CmdArgs.push_back(LinkLibArg);
8625 continue;
8626 }
8627
8628 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8629 // or -L. Render it, even if MSVC doesn't understand it.
8630 A.renderAsInput(Args, CmdArgs);
8631 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008632
Zachary Turner719f58c2014-12-01 23:06:47 +00008633 // We need to special case some linker paths. In the case of lld, we need to
8634 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8635 // linker, we need to use a special search algorithm.
8636 llvm::SmallString<128> linkPath;
8637 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8638 if (Linker.equals_lower("lld"))
8639 Linker = "lld-link";
8640
8641 if (Linker.equals_lower("link")) {
8642 // If we're using the MSVC linker, it's not sufficient to just use link
8643 // from the program PATH, because other environments like GnuWin32 install
8644 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008645 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008646 C.getDriver().getClangProgramPath());
8647 } else {
8648 linkPath = Linker;
8649 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008650 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008651 }
8652
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008653 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008654 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008655}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008656
8657void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8658 const InputInfo &Output,
8659 const InputInfoList &Inputs,
8660 const ArgList &Args,
8661 const char *LinkingOutput) const {
8662 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8663}
8664
David Blaikiec11bf802014-09-04 16:04:28 +00008665std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8666 Compilation &C, const JobAction &JA, const InputInfo &Output,
8667 const InputInfoList &Inputs, const ArgList &Args,
8668 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008669 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008670 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008671 CmdArgs.push_back("/c"); // Compile only.
8672 CmdArgs.push_back("/W0"); // No warnings.
8673
8674 // The goal is to be able to invoke this tool correctly based on
8675 // any flag accepted by clang-cl.
8676
8677 // These are spelled the same way in clang and cl.exe,.
8678 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8679 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008680
8681 // Optimization level.
8682 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8683 if (A->getOption().getID() == options::OPT_O0) {
8684 CmdArgs.push_back("/Od");
8685 } else {
8686 StringRef OptLevel = A->getValue();
8687 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8688 A->render(Args, CmdArgs);
8689 else if (OptLevel == "3")
8690 CmdArgs.push_back("/Ox");
8691 }
8692 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008693
Nico Weber3f8dafb2015-03-12 19:37:10 +00008694 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008695 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8696
David Majnemerf6072342014-07-01 22:24:56 +00008697 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8698 /*default=*/false))
8699 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008700 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8701 options::OPT_fno_function_sections))
8702 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8703 ? "/Gy"
8704 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008705 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8706 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008707 CmdArgs.push_back(
8708 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008709 if (Args.hasArg(options::OPT_fsyntax_only))
8710 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008711 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8712 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008713
Nico Weber3f8dafb2015-03-12 19:37:10 +00008714 std::vector<std::string> Includes =
8715 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008716 for (const auto &Include : Includes)
8717 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008718
Hans Wennborg87cfa712013-09-19 20:32:16 +00008719 // Flags that can simply be passed through.
8720 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8721 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008722 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008723
8724 // The order of these flags is relevant, so pick the last one.
8725 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8726 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8727 A->render(Args, CmdArgs);
8728
8729
8730 // Input filename.
8731 assert(Inputs.size() == 1);
8732 const InputInfo &II = Inputs[0];
8733 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8734 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8735 if (II.isFilename())
8736 CmdArgs.push_back(II.getFilename());
8737 else
8738 II.getInputArg().renderAsInput(Args, CmdArgs);
8739
8740 // Output filename.
8741 assert(Output.getType() == types::TY_Object);
8742 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8743 Output.getFilename());
8744 CmdArgs.push_back(Fo);
8745
Hans Wennborg188382e2013-09-20 18:16:35 +00008746 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008747 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8748 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008749 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8750 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008751}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008752
8753
8754/// XCore Tools
8755// We pass assemble and link construction to the xcc tool.
8756
8757void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8758 const InputInfo &Output,
8759 const InputInfoList &Inputs,
8760 const ArgList &Args,
8761 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008762 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008763 ArgStringList CmdArgs;
8764
8765 CmdArgs.push_back("-o");
8766 CmdArgs.push_back(Output.getFilename());
8767
8768 CmdArgs.push_back("-c");
8769
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008770 if (Args.hasArg(options::OPT_v))
8771 CmdArgs.push_back("-v");
8772
Robert Lytton894d25c2014-05-02 09:33:25 +00008773 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8774 if (!A->getOption().matches(options::OPT_g0))
8775 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008776
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008777 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8778 false))
8779 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008780
8781 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8782 options::OPT_Xassembler);
8783
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008784 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008785 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008786
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008787 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008788 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008789}
8790
8791void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8792 const InputInfo &Output,
8793 const InputInfoList &Inputs,
8794 const ArgList &Args,
8795 const char *LinkingOutput) const {
8796 ArgStringList CmdArgs;
8797
8798 if (Output.isFilename()) {
8799 CmdArgs.push_back("-o");
8800 CmdArgs.push_back(Output.getFilename());
8801 } else {
8802 assert(Output.isNothing() && "Invalid output.");
8803 }
8804
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008805 if (Args.hasArg(options::OPT_v))
8806 CmdArgs.push_back("-v");
8807
David Majnemer8de68642014-12-05 08:11:58 +00008808 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008809 CmdArgs.push_back("-fexceptions");
8810
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008811 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8812
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008813 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008814 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008815}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008816
8817void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8818 const InputInfo &Output,
8819 const InputInfoList &Inputs,
8820 const ArgList &Args,
8821 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008822 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008823 const auto &TC =
8824 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8825 ArgStringList CmdArgs;
8826 const char *Exec;
8827
8828 switch (TC.getArch()) {
8829 default: llvm_unreachable("unsupported architecture");
8830 case llvm::Triple::arm:
8831 case llvm::Triple::thumb:
8832 break;
8833 case llvm::Triple::x86:
8834 CmdArgs.push_back("--32");
8835 break;
8836 case llvm::Triple::x86_64:
8837 CmdArgs.push_back("--64");
8838 break;
8839 }
8840
8841 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8842
8843 CmdArgs.push_back("-o");
8844 CmdArgs.push_back(Output.getFilename());
8845
8846 for (const auto &Input : Inputs)
8847 CmdArgs.push_back(Input.getFilename());
8848
8849 const std::string Assembler = TC.GetProgramPath("as");
8850 Exec = Args.MakeArgString(Assembler);
8851
8852 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8853}
8854
8855void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8856 const InputInfo &Output,
8857 const InputInfoList &Inputs,
8858 const ArgList &Args,
8859 const char *LinkingOutput) const {
8860 const auto &TC =
8861 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8862 const llvm::Triple &T = TC.getTriple();
8863 const Driver &D = TC.getDriver();
8864 SmallString<128> EntryPoint;
8865 ArgStringList CmdArgs;
8866 const char *Exec;
8867
8868 // Silence warning for "clang -g foo.o -o foo"
8869 Args.ClaimAllArgs(options::OPT_g_Group);
8870 // and "clang -emit-llvm foo.o -o foo"
8871 Args.ClaimAllArgs(options::OPT_emit_llvm);
8872 // and for "clang -w foo.o -o foo"
8873 Args.ClaimAllArgs(options::OPT_w);
8874 // Other warning options are already handled somewhere else.
8875
8876 if (!D.SysRoot.empty())
8877 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8878
8879 if (Args.hasArg(options::OPT_pie))
8880 CmdArgs.push_back("-pie");
8881 if (Args.hasArg(options::OPT_rdynamic))
8882 CmdArgs.push_back("-export-dynamic");
8883 if (Args.hasArg(options::OPT_s))
8884 CmdArgs.push_back("--strip-all");
8885
8886 CmdArgs.push_back("-m");
8887 switch (TC.getArch()) {
8888 default: llvm_unreachable("unsupported architecture");
8889 case llvm::Triple::arm:
8890 case llvm::Triple::thumb:
8891 // FIXME: this is incorrect for WinCE
8892 CmdArgs.push_back("thumb2pe");
8893 break;
8894 case llvm::Triple::x86:
8895 CmdArgs.push_back("i386pe");
8896 EntryPoint.append("_");
8897 break;
8898 case llvm::Triple::x86_64:
8899 CmdArgs.push_back("i386pep");
8900 break;
8901 }
8902
8903 if (Args.hasArg(options::OPT_shared)) {
8904 switch (T.getArch()) {
8905 default: llvm_unreachable("unsupported architecture");
8906 case llvm::Triple::arm:
8907 case llvm::Triple::thumb:
8908 case llvm::Triple::x86_64:
8909 EntryPoint.append("_DllMainCRTStartup");
8910 break;
8911 case llvm::Triple::x86:
8912 EntryPoint.append("_DllMainCRTStartup@12");
8913 break;
8914 }
8915
8916 CmdArgs.push_back("-shared");
8917 CmdArgs.push_back("-Bdynamic");
8918
8919 CmdArgs.push_back("--enable-auto-image-base");
8920
8921 CmdArgs.push_back("--entry");
8922 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8923 } else {
8924 EntryPoint.append("mainCRTStartup");
8925
8926 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8927 : "-Bdynamic");
8928
8929 if (!Args.hasArg(options::OPT_nostdlib) &&
8930 !Args.hasArg(options::OPT_nostartfiles)) {
8931 CmdArgs.push_back("--entry");
8932 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8933 }
8934
8935 // FIXME: handle subsystem
8936 }
8937
8938 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008939 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008940
8941 CmdArgs.push_back("-o");
8942 CmdArgs.push_back(Output.getFilename());
8943
8944 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8945 SmallString<261> ImpLib(Output.getFilename());
8946 llvm::sys::path::replace_extension(ImpLib, ".lib");
8947
8948 CmdArgs.push_back("--out-implib");
8949 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8950 }
8951
8952 if (!Args.hasArg(options::OPT_nostdlib) &&
8953 !Args.hasArg(options::OPT_nostartfiles)) {
8954 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8955 const char *CRTBegin;
8956
8957 CRTBegin =
8958 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8959 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8960 }
8961
8962 Args.AddAllArgs(CmdArgs, options::OPT_L);
8963
8964 const auto &Paths = TC.getFilePaths();
8965 for (const auto &Path : Paths)
8966 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8967
8968 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8969
8970 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8971 !Args.hasArg(options::OPT_nodefaultlibs)) {
8972 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8973 !Args.hasArg(options::OPT_static);
8974 if (StaticCXX)
8975 CmdArgs.push_back("-Bstatic");
8976 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8977 if (StaticCXX)
8978 CmdArgs.push_back("-Bdynamic");
8979 }
8980
8981 if (!Args.hasArg(options::OPT_nostdlib)) {
8982 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8983 // TODO handle /MT[d] /MD[d]
8984 CmdArgs.push_back("-lmsvcrt");
8985 AddRunTimeLibs(TC, D, CmdArgs, Args);
8986 }
8987 }
8988
8989 const std::string Linker = TC.GetProgramPath("ld");
8990 Exec = Args.MakeArgString(Linker);
8991
8992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8993}