blob: aee35c69badbd6ae6cc63d166b149e2c2f089d5b [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
David Majnemerdcecd932015-05-23 19:23:55 +0000500 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000501 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000502 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000503 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000504 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000505 }
506}
507
Robert Lytton0e076492013-08-13 09:43:10 +0000508static bool isNoCommonDefault(const llvm::Triple &Triple) {
509 switch (Triple.getArch()) {
510 default:
511 return false;
512
513 case llvm::Triple::xcore:
514 return true;
515 }
516}
517
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000518// Handle -mhwdiv=.
519static void getARMHWDivFeatures(const Driver &D, const Arg *A,
520 const ArgList &Args,
521 std::vector<const char *> &Features) {
522 StringRef HWDiv = A->getValue();
523 if (HWDiv == "arm") {
524 Features.push_back("+hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else if (HWDiv == "thumb") {
527 Features.push_back("-hwdiv-arm");
528 Features.push_back("+hwdiv");
529 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
530 Features.push_back("+hwdiv-arm");
531 Features.push_back("+hwdiv");
532 } else if (HWDiv == "none") {
533 Features.push_back("-hwdiv-arm");
534 Features.push_back("-hwdiv");
535 } else
536 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
537}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000538
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539// Handle -mfpu=.
540//
541// FIXME: Centralize feature selection, defaulting shouldn't be also in the
542// frontend target.
543static void getARMFPUFeatures(const Driver &D, const Arg *A,
544 const ArgList &Args,
545 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000546 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000547
Renato Golin0600e1e2015-05-08 21:04:50 +0000548 // FIXME: Why does "none" disable more than "invalid"?
549 if (FPU == "none") {
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000550 Features.push_back("-vfp2");
551 Features.push_back("-vfp3");
552 Features.push_back("-vfp4");
553 Features.push_back("-fp-armv8");
554 Features.push_back("-crypto");
555 Features.push_back("-neon");
Renato Golin0600e1e2015-05-08 21:04:50 +0000556 return;
557 }
558
559 // FIXME: Make sure we differentiate sp-only.
560 if (FPU.find("-sp-") != StringRef::npos) {
561 Features.push_back("+fp-only-sp");
562 }
563
564 // All other FPU types, valid or invalid.
565 switch(llvm::ARMTargetParser::parseFPU(FPU)) {
Renato Golincb3b0c62015-05-12 10:34:10 +0000566 case llvm::ARM::FK_INVALID:
567 case llvm::ARM::FK_SOFTVFP:
Renato Golin0600e1e2015-05-08 21:04:50 +0000568 Features.push_back("-vfp2");
569 Features.push_back("-vfp3");
570 Features.push_back("-neon");
571 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000572 case llvm::ARM::FK_VFP:
573 case llvm::ARM::FK_VFPV2:
Renato Golin0600e1e2015-05-08 21:04:50 +0000574 Features.push_back("+vfp2");
575 Features.push_back("-neon");
576 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000577 case llvm::ARM::FK_VFPV3_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000578 Features.push_back("+d16");
579 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000580 case llvm::ARM::FK_VFPV3:
Renato Golin0600e1e2015-05-08 21:04:50 +0000581 Features.push_back("+vfp3");
582 Features.push_back("-neon");
583 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000584 case llvm::ARM::FK_VFPV4_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000585 Features.push_back("+d16");
586 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000587 case llvm::ARM::FK_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000588 Features.push_back("+vfp4");
589 Features.push_back("-neon");
590 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000591 case llvm::ARM::FK_FPV5_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000592 Features.push_back("+d16");
593 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000594 case llvm::ARM::FK_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000595 Features.push_back("+fp-armv8");
596 Features.push_back("-neon");
597 Features.push_back("-crypto");
598 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000599 case llvm::ARM::FK_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000600 Features.push_back("+fp-armv8");
601 Features.push_back("+neon");
602 Features.push_back("-crypto");
603 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000604 case llvm::ARM::FK_CRYPTO_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000605 Features.push_back("+fp-armv8");
606 Features.push_back("+neon");
607 Features.push_back("+crypto");
608 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000609 case llvm::ARM::FK_NEON:
Renato Golin0600e1e2015-05-08 21:04:50 +0000610 Features.push_back("+neon");
611 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000612 case llvm::ARM::FK_NEON_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000613 Features.push_back("+neon");
614 Features.push_back("+vfp4");
615 break;
616 default:
Chad Rosiercfbfc582012-04-04 20:51:35 +0000617 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Renato Golin0600e1e2015-05-08 21:04:50 +0000618 }
Chad Rosiercfbfc582012-04-04 20:51:35 +0000619}
620
John Brawn94fd9632015-05-21 12:19:49 +0000621static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000622 llvm::StringRef Arch = Triple.getArchName();
623 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000624}
625
John Brawn94fd9632015-05-21 12:19:49 +0000626static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000627 llvm::StringRef Arch = Triple.getArchName();
628 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
629 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000630}
631
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000632// Select the float ABI as determined by -msoft-float, -mhard-float, and
633// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000634StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000635 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000636 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000637 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
638 options::OPT_mhard_float,
639 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000640 if (A->getOption().matches(options::OPT_msoft_float))
641 FloatABI = "soft";
642 else if (A->getOption().matches(options::OPT_mhard_float))
643 FloatABI = "hard";
644 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000645 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000646 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000647 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000648 << A->getAsString(Args);
649 FloatABI = "soft";
650 }
651 }
652 }
653
654 // If unspecified, choose the default based on the platform.
655 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000656 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000657 case llvm::Triple::Darwin:
658 case llvm::Triple::MacOSX:
659 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000660 // Darwin defaults to "softfp" for v6 and v7.
661 //
John Brawn94fd9632015-05-21 12:19:49 +0000662 if (getARMSubArchVersionNumber(Triple) == 6 ||
663 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 FloatABI = "softfp";
665 else
666 FloatABI = "soft";
667 break;
668 }
669
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000670 // FIXME: this is invalid for WindowsCE
671 case llvm::Triple::Win32:
672 FloatABI = "hard";
673 break;
674
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000675 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000676 switch(Triple.getEnvironment()) {
677 case llvm::Triple::GNUEABIHF:
678 FloatABI = "hard";
679 break;
680 default:
681 // FreeBSD defaults to soft float
682 FloatABI = "soft";
683 break;
684 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000685 break;
686
Daniel Dunbar78485922009-09-10 23:00:09 +0000687 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000688 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000689 case llvm::Triple::GNUEABIHF:
690 FloatABI = "hard";
691 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000692 case llvm::Triple::GNUEABI:
693 FloatABI = "softfp";
694 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000695 case llvm::Triple::EABIHF:
696 FloatABI = "hard";
697 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000698 case llvm::Triple::EABI:
699 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
700 FloatABI = "softfp";
701 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000702 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000703 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000704 FloatABI = "softfp";
705 else
706 FloatABI = "soft";
707 break;
708 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000709 default:
710 // Assume "soft", but warn the user we are guessing.
711 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000712 if (Triple.getOS() != llvm::Triple::UnknownOS ||
713 !Triple.isOSBinFormatMachO())
714 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000715 break;
716 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000717 }
718 }
719
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000720 return FloatABI;
721}
722
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000723static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
724 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000725 std::vector<const char *> &Features,
726 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000727 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
728 if (!ForAS) {
729 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
730 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
731 // stripped out by the ARM target. We should probably pass this a new
732 // -target-option, which is handled by the -cc1/-cc1as invocation.
733 //
734 // FIXME2: For consistency, it would be ideal if we set up the target
735 // machine state the same when using the frontend or the assembler. We don't
736 // currently do that for the assembler, we pass the options directly to the
737 // backend and never even instantiate the frontend TargetInfo. If we did,
738 // and used its handleTargetFeatures hook, then we could ensure the
739 // assembler and the frontend behave the same.
740
741 // Use software floating point operations?
742 if (FloatABI == "soft")
743 Features.push_back("+soft-float");
744
745 // Use software floating point argument passing?
746 if (FloatABI != "hard")
747 Features.push_back("+soft-float-abi");
748 }
749
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000750 // Honor -mfpu=.
751 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000752 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000753 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
754 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755
John Brawna8f82342015-05-29 13:10:44 +0000756 // Check if -march is valid by checking if it can be canonicalised and parsed.
757 // getARMArch is used here instead of just checking the -march value in order
758 // to handle -march=native correctly.
John Brawn94fd9632015-05-21 12:19:49 +0000759 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
760 StringRef Arch = arm::getARMArch(Args, Triple);
John Brawna8f82342015-05-29 13:10:44 +0000761 Arch = llvm::ARMTargetParser::getCanonicalArchName(Arch);
762 if (llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_INVALID)
John Brawna95c1a82015-05-08 12:52:18 +0000763 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000764 }
765
766 // We do a similar thing with -mcpu, but here things are complicated because
767 // the only function we have to check if a cpu is valid is
768 // getLLVMArchSuffixForARM which also needs an architecture.
769 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
770 StringRef CPU = arm::getARMTargetCPU(Args, Triple);
771 StringRef Arch = arm::getARMArch(Args, Triple);
772 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
773 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
774 }
John Brawna95c1a82015-05-08 12:52:18 +0000775
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000776 // Setting -msoft-float effectively disables NEON because of the GCC
777 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000778 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000779 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000780 // Also need to explicitly disable features which imply NEON.
781 Features.push_back("-crypto");
782 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000783
Eric Christopher269c2a22015-04-04 03:34:43 +0000784 // En/disable crc code generation.
785 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000786 if (A->getOption().matches(options::OPT_mcrc))
787 Features.push_back("+crc");
788 else
789 Features.push_back("-crc");
790 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000791
792 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
793 Features.insert(Features.begin(), "+v8.1a");
794 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000795}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000796
797void Clang::AddARMTargetArgs(const ArgList &Args,
798 ArgStringList &CmdArgs,
799 bool KernelOrKext) const {
800 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000801 // Get the effective triple, which takes into account the deployment target.
802 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
803 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000804
805 // Select the ABI to use.
806 //
807 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000808 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000809 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000810 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000811 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000812 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000813 // The backend is hardwired to assume AAPCS for M-class processors, ensure
814 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000815 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000816 Triple.getOS() == llvm::Triple::UnknownOS ||
John Brawn94fd9632015-05-21 12:19:49 +0000817 isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000818 ABIName = "aapcs";
819 } else {
820 ABIName = "apcs-gnu";
821 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000822 } else if (Triple.isOSWindows()) {
823 // FIXME: this is invalid for WindowsCE
824 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000825 } else {
826 // Select the default based on the platform.
827 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000828 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000829 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000830 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000831 ABIName = "aapcs-linux";
832 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000833 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000834 case llvm::Triple::EABI:
835 ABIName = "aapcs";
836 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000837 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000838 if (Triple.getOS() == llvm::Triple::NetBSD)
839 ABIName = "apcs-gnu";
840 else
841 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000842 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000843 }
844 }
845 CmdArgs.push_back("-target-abi");
846 CmdArgs.push_back(ABIName);
847
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000848 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000849 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000850 if (FloatABI == "soft") {
851 // Floating point operations and argument passing are soft.
852 //
853 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000854 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000855 CmdArgs.push_back("-mfloat-abi");
856 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000857 } else if (FloatABI == "softfp") {
858 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000859 CmdArgs.push_back("-mfloat-abi");
860 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000861 } else {
862 // Floating point operations and argument passing are hard.
863 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000864 CmdArgs.push_back("-mfloat-abi");
865 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000866 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000867
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000868 // Kernel code has more strict alignment requirements.
869 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000870 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000871 CmdArgs.push_back("-backend-option");
872 CmdArgs.push_back("-arm-long-calls");
873 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000874
Daniel Dunbar12100e22011-03-22 16:48:17 +0000875 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000876 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000877
878 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000879 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000880 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000881 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000882
Bob Wilson0874e532014-07-29 00:23:18 +0000883 // -mkernel implies -mstrict-align; don't add the redundant option.
884 if (!KernelOrKext) {
885 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
886 options::OPT_munaligned_access)) {
887 CmdArgs.push_back("-backend-option");
888 if (A->getOption().matches(options::OPT_mno_unaligned_access))
889 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000890 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000891 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000892 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000893 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000894 }
Bob Wilson0874e532014-07-29 00:23:18 +0000895 }
896 }
897
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000898 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000899 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
900 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000901 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000902 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000903 CmdArgs.push_back("-arm-global-merge=false");
904 else
905 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000906 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000907
Bob Wilson9c8af452013-04-11 18:53:25 +0000908 if (!Args.hasFlag(options::OPT_mimplicit_float,
909 options::OPT_mno_implicit_float,
910 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000911 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000912
Logan Chien749763e2014-04-03 13:12:44 +0000913 // llvm does not support reserving registers in general. There is support
914 // for reserving r9 on ARM though (defined as a platform-specific register
915 // in ARM EABI).
916 if (Args.hasArg(options::OPT_ffixed_r9)) {
917 CmdArgs.push_back("-backend-option");
918 CmdArgs.push_back("-arm-reserve-r9");
919 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000920}
921
Tim Northover573cbee2014-05-24 12:52:07 +0000922/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
923/// targeting.
924static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000925 Arg *A;
926 std::string CPU;
927 // If we have -mtune or -mcpu, use that.
928 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
929 CPU = A->getValue();
930 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000931 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000932 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000933 }
934
Kevin Qin110db6f2014-07-18 07:03:22 +0000935 // Handle CPU name is 'native'.
936 if (CPU == "native")
937 return llvm::sys::getHostCPUName();
938 else if (CPU.size())
939 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000940
James Molloy9b1586b2014-04-17 12:51:17 +0000941 // Make sure we pick "cyclone" if -arch is used.
942 // FIXME: Should this be picked by checking the target triple instead?
943 if (Args.getLastArg(options::OPT_arch))
944 return "cyclone";
945
946 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000947}
948
Tim Northover573cbee2014-05-24 12:52:07 +0000949void Clang::AddAArch64TargetArgs(const ArgList &Args,
950 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000951 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
952 llvm::Triple Triple(TripleStr);
953
954 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
955 Args.hasArg(options::OPT_mkernel) ||
956 Args.hasArg(options::OPT_fapple_kext))
957 CmdArgs.push_back("-disable-red-zone");
958
959 if (!Args.hasFlag(options::OPT_mimplicit_float,
960 options::OPT_mno_implicit_float, true))
961 CmdArgs.push_back("-no-implicit-float");
962
Craig Topper92fc2df2014-05-17 16:56:41 +0000963 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000964 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
965 ABIName = A->getValue();
966 else if (Triple.isOSDarwin())
967 ABIName = "darwinpcs";
968 else
969 ABIName = "aapcs";
970
971 CmdArgs.push_back("-target-abi");
972 CmdArgs.push_back(ABIName);
973
Bob Wilson0874e532014-07-29 00:23:18 +0000974 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
975 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000976 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000977 if (A->getOption().matches(options::OPT_mno_unaligned_access))
978 CmdArgs.push_back("-aarch64-strict-align");
979 else
980 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000981 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000982
Bradley Smith9ff64332014-10-13 10:16:06 +0000983 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
984 options::OPT_mno_fix_cortex_a53_835769)) {
985 CmdArgs.push_back("-backend-option");
986 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
987 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
988 else
989 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000990 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
991 // Enabled A53 errata (835769) workaround by default on android
992 CmdArgs.push_back("-backend-option");
993 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000994 }
995
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000996 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000997 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
998 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000999 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001000 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001001 CmdArgs.push_back("-aarch64-global-merge=false");
1002 else
1003 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001004 }
Renato Golinb625f482015-01-25 23:17:48 +00001005
1006 if (Args.hasArg(options::OPT_ffixed_x18)) {
1007 CmdArgs.push_back("-backend-option");
1008 CmdArgs.push_back("-aarch64-reserve-x18");
1009 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001010}
1011
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001012// Get CPU and ABI names. They are not independent
1013// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001014void mips::getMipsCPUAndABI(const ArgList &Args,
1015 const llvm::Triple &Triple,
1016 StringRef &CPUName,
1017 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001018 const char *DefMips32CPU = "mips32r2";
1019 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001020
Daniel Sanders2bf13662014-07-10 14:40:57 +00001021 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1022 // default for mips64(el)?-img-linux-gnu.
1023 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1024 Triple.getEnvironment() == llvm::Triple::GNU) {
1025 DefMips32CPU = "mips32r6";
1026 DefMips64CPU = "mips64r6";
1027 }
1028
Brad Smithba26f582015-01-06 02:53:17 +00001029 // MIPS3 is the default for mips64*-unknown-openbsd.
1030 if (Triple.getOS() == llvm::Triple::OpenBSD)
1031 DefMips64CPU = "mips3";
1032
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001033 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001034 options::OPT_mcpu_EQ))
1035 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001036
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001037 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001038 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001039 // Convert a GNU style Mips ABI name to the name
1040 // accepted by LLVM Mips backend.
1041 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1042 .Case("32", "o32")
1043 .Case("64", "n64")
1044 .Default(ABIName);
1045 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001046
1047 // Setup default CPU and ABI names.
1048 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001049 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001050 default:
1051 llvm_unreachable("Unexpected triple arch name");
1052 case llvm::Triple::mips:
1053 case llvm::Triple::mipsel:
1054 CPUName = DefMips32CPU;
1055 break;
1056 case llvm::Triple::mips64:
1057 case llvm::Triple::mips64el:
1058 CPUName = DefMips64CPU;
1059 break;
1060 }
1061 }
1062
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001063 if (ABIName.empty()) {
1064 // Deduce ABI name from the target triple.
1065 if (Triple.getArch() == llvm::Triple::mips ||
1066 Triple.getArch() == llvm::Triple::mipsel)
1067 ABIName = "o32";
1068 else
1069 ABIName = "n64";
1070 }
1071
1072 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001073 // Deduce CPU name from ABI name.
1074 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001075 .Cases("o32", "eabi", DefMips32CPU)
1076 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001077 .Default("");
1078 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001079
1080 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001081}
1082
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001083// Convert ABI name to the GNU tools acceptable variant.
1084static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1085 return llvm::StringSwitch<llvm::StringRef>(ABI)
1086 .Case("o32", "32")
1087 .Case("n64", "64")
1088 .Default(ABI);
1089}
1090
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001091// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1092// and -mfloat-abi=.
1093static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001094 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001095 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001096 options::OPT_mhard_float,
1097 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001098 if (A->getOption().matches(options::OPT_msoft_float))
1099 FloatABI = "soft";
1100 else if (A->getOption().matches(options::OPT_mhard_float))
1101 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001102 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001103 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001104 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001105 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001106 FloatABI = "hard";
1107 }
1108 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001109 }
1110
1111 // If unspecified, choose the default based on the platform.
1112 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001113 // Assume "hard", because it's a default value used by gcc.
1114 // When we start to recognize specific target MIPS processors,
1115 // we will be able to select the default more correctly.
1116 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 }
1118
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001119 return FloatABI;
1120}
1121
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001122static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001123 std::vector<const char *> &Features,
1124 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001125 StringRef FeatureName) {
1126 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001128 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001131 }
1132}
1133
Daniel Sanders379d44b2014-07-16 11:52:23 +00001134static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1135 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001136 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001137 StringRef CPUName;
1138 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001139 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001140 ABIName = getGnuCompatibleMipsABIName(ABIName);
1141
Daniel Sandersfeb61302014-08-08 15:47:17 +00001142 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1143 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001144
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001145 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001146 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001147 // FIXME: Note, this is a hack. We need to pass the selected float
1148 // mode to the MipsTargetInfoBase to define appropriate macros there.
1149 // Now it is the only method.
1150 Features.push_back("+soft-float");
1151 }
1152
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001153 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001154 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001155 if (Val == "2008") {
1156 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1157 Features.push_back("+nan2008");
1158 else {
1159 Features.push_back("-nan2008");
1160 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1161 }
1162 } else if (Val == "legacy") {
1163 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1164 Features.push_back("-nan2008");
1165 else {
1166 Features.push_back("+nan2008");
1167 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1168 }
1169 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001170 D.Diag(diag::err_drv_unsupported_option_argument)
1171 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001172 }
1173
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001174 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1175 options::OPT_mdouble_float, "single-float");
1176 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1177 "mips16");
1178 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1179 options::OPT_mno_micromips, "micromips");
1180 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1181 "dsp");
1182 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1183 "dspr2");
1184 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1185 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001186
1187 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1188 // pass -mfpxx
1189 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1190 options::OPT_mfp64)) {
1191 if (A->getOption().matches(options::OPT_mfp32))
1192 Features.push_back(Args.MakeArgString("-fp64"));
1193 else if (A->getOption().matches(options::OPT_mfpxx)) {
1194 Features.push_back(Args.MakeArgString("+fpxx"));
1195 Features.push_back(Args.MakeArgString("+nooddspreg"));
1196 } else
1197 Features.push_back(Args.MakeArgString("+fp64"));
1198 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001199 Features.push_back(Args.MakeArgString("+fpxx"));
1200 Features.push_back(Args.MakeArgString("+nooddspreg"));
1201 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001202
Daniel Sanders28e5d392014-07-10 10:39:51 +00001203 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1204 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001205}
1206
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001207void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001208 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001209 const Driver &D = getToolChain().getDriver();
1210 StringRef CPUName;
1211 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001212 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001213 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001214
1215 CmdArgs.push_back("-target-abi");
1216 CmdArgs.push_back(ABIName.data());
1217
1218 StringRef FloatABI = getMipsFloatABI(D, Args);
1219
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001220 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001222 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001223 CmdArgs.push_back("-mfloat-abi");
1224 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001225 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001226 else {
1227 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001228 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001229 CmdArgs.push_back("-mfloat-abi");
1230 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001231 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001232
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001233 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1234 if (A->getOption().matches(options::OPT_mxgot)) {
1235 CmdArgs.push_back("-mllvm");
1236 CmdArgs.push_back("-mxgot");
1237 }
1238 }
1239
Simon Atanasyanc580b322013-05-11 06:33:44 +00001240 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1241 options::OPT_mno_ldc1_sdc1)) {
1242 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1243 CmdArgs.push_back("-mllvm");
1244 CmdArgs.push_back("-mno-ldc1-sdc1");
1245 }
1246 }
1247
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001248 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1249 options::OPT_mno_check_zero_division)) {
1250 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1251 CmdArgs.push_back("-mllvm");
1252 CmdArgs.push_back("-mno-check-zero-division");
1253 }
1254 }
1255
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001256 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001257 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001258 CmdArgs.push_back("-mllvm");
1259 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1260 A->claim();
1261 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001262}
1263
Hal Finkel8eb59282012-06-11 22:35:19 +00001264/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1265static std::string getPPCTargetCPU(const ArgList &Args) {
1266 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001267 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001268
1269 if (CPUName == "native") {
1270 std::string CPU = llvm::sys::getHostCPUName();
1271 if (!CPU.empty() && CPU != "generic")
1272 return CPU;
1273 else
1274 return "";
1275 }
1276
1277 return llvm::StringSwitch<const char *>(CPUName)
1278 .Case("common", "generic")
1279 .Case("440", "440")
1280 .Case("440fp", "440")
1281 .Case("450", "450")
1282 .Case("601", "601")
1283 .Case("602", "602")
1284 .Case("603", "603")
1285 .Case("603e", "603e")
1286 .Case("603ev", "603ev")
1287 .Case("604", "604")
1288 .Case("604e", "604e")
1289 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001290 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001291 .Case("G3", "g3")
1292 .Case("7400", "7400")
1293 .Case("G4", "g4")
1294 .Case("7450", "7450")
1295 .Case("G4+", "g4+")
1296 .Case("750", "750")
1297 .Case("970", "970")
1298 .Case("G5", "g5")
1299 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001300 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001301 .Case("e500mc", "e500mc")
1302 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001303 .Case("power3", "pwr3")
1304 .Case("power4", "pwr4")
1305 .Case("power5", "pwr5")
1306 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001307 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001308 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001309 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001310 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001311 .Case("pwr3", "pwr3")
1312 .Case("pwr4", "pwr4")
1313 .Case("pwr5", "pwr5")
1314 .Case("pwr5x", "pwr5x")
1315 .Case("pwr6", "pwr6")
1316 .Case("pwr6x", "pwr6x")
1317 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001318 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001319 .Case("powerpc", "ppc")
1320 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001321 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001322 .Default("");
1323 }
1324
1325 return "";
1326}
1327
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001328static void getPPCTargetFeatures(const ArgList &Args,
1329 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001330 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1331 ie = Args.filtered_end();
1332 it != ie; ++it) {
1333 StringRef Name = (*it)->getOption().getName();
1334 (*it)->claim();
1335
1336 // Skip over "-m".
1337 assert(Name.startswith("m") && "Invalid feature name.");
1338 Name = Name.substr(1);
1339
1340 bool IsNegative = Name.startswith("no-");
1341 if (IsNegative)
1342 Name = Name.substr(3);
1343
1344 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1345 // pass the correct option to the backend while calling the frontend
1346 // option the same.
1347 // TODO: Change the LLVM backend option maybe?
1348 if (Name == "mfcrf")
1349 Name = "mfocrf";
1350
1351 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1352 }
1353
1354 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001355 AddTargetFeature(Args, Features, options::OPT_faltivec,
1356 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001357}
1358
Ulrich Weigand8afad612014-07-28 13:17:52 +00001359void Clang::AddPPCTargetArgs(const ArgList &Args,
1360 ArgStringList &CmdArgs) const {
1361 // Select the ABI to use.
1362 const char *ABIName = nullptr;
1363 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1364 ABIName = A->getValue();
1365 } else if (getToolChain().getTriple().isOSLinux())
1366 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001367 case llvm::Triple::ppc64: {
1368 // When targeting a processor that supports QPX, or if QPX is
1369 // specifically enabled, default to using the ABI that supports QPX (so
1370 // long as it is not specifically disabled).
1371 bool HasQPX = false;
1372 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1373 HasQPX = A->getValue() == StringRef("a2q");
1374 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1375 if (HasQPX) {
1376 ABIName = "elfv1-qpx";
1377 break;
1378 }
1379
Ulrich Weigand8afad612014-07-28 13:17:52 +00001380 ABIName = "elfv1";
1381 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001382 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383 case llvm::Triple::ppc64le:
1384 ABIName = "elfv2";
1385 break;
1386 default:
1387 break;
1388 }
1389
1390 if (ABIName) {
1391 CmdArgs.push_back("-target-abi");
1392 CmdArgs.push_back(ABIName);
1393 }
1394}
1395
1396bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1397 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1398 return A && (A->getValue() == StringRef(Value));
1399}
1400
Tom Stellard6674c702013-04-01 20:56:53 +00001401/// Get the (LLVM) name of the R600 gpu we are targeting.
1402static std::string getR600TargetGPU(const ArgList &Args) {
1403 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001404 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001405 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001406 .Cases("rv630", "rv635", "r600")
1407 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001408 .Case("rv740", "rv770")
1409 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001410 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001411 .Case("hemlock", "cypress")
1412 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001413 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001414 }
1415 return "";
1416}
1417
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001418static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001419 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001420 bool SoftFloatABI = true;
1421 if (Arg *A =
1422 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1423 if (A->getOption().matches(options::OPT_mhard_float))
1424 SoftFloatABI = false;
1425 }
1426 if (SoftFloatABI)
1427 Features.push_back("+soft-float");
1428}
1429
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430void Clang::AddSparcTargetArgs(const ArgList &Args,
1431 ArgStringList &CmdArgs) const {
1432 const Driver &D = getToolChain().getDriver();
1433
Brad Smith10cd0f42014-07-11 20:12:08 +00001434 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001435 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001436 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1437 options::OPT_mhard_float)) {
1438 if (A->getOption().matches(options::OPT_msoft_float))
1439 FloatABI = "soft";
1440 else if (A->getOption().matches(options::OPT_mhard_float))
1441 FloatABI = "hard";
1442 }
1443
1444 // If unspecified, choose the default based on the platform.
1445 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001446 // Assume "soft", but warn the user we are guessing.
1447 FloatABI = "soft";
1448 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001449 }
1450
1451 if (FloatABI == "soft") {
1452 // Floating point operations and argument passing are soft.
1453 //
1454 // FIXME: This changes CPP defines, we need -target-soft-float.
1455 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001456 } else {
1457 assert(FloatABI == "hard" && "Invalid float abi!");
1458 CmdArgs.push_back("-mhard-float");
1459 }
1460}
1461
Richard Sandiford4652d892013-07-19 16:51:51 +00001462static const char *getSystemZTargetCPU(const ArgList &Args) {
1463 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1464 return A->getValue();
1465 return "z10";
1466}
1467
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001468static void getSystemZTargetFeatures(const ArgList &Args,
1469 std::vector<const char *> &Features) {
1470 // -m(no-)htm overrides use of the transactional-execution facility.
1471 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1472 options::OPT_mno_htm)) {
1473 if (A->getOption().matches(options::OPT_mhtm))
1474 Features.push_back("+transactional-execution");
1475 else
1476 Features.push_back("-transactional-execution");
1477 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001478 // -m(no-)vx overrides use of the vector facility.
1479 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1480 options::OPT_mno_vx)) {
1481 if (A->getOption().matches(options::OPT_mvx))
1482 Features.push_back("+vector");
1483 else
1484 Features.push_back("-vector");
1485 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001486}
1487
Chandler Carruth953fb082013-01-13 11:46:33 +00001488static const char *getX86TargetCPU(const ArgList &Args,
1489 const llvm::Triple &Triple) {
1490 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001491 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001492 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001493 return "core-avx2";
1494
Chandler Carruth953fb082013-01-13 11:46:33 +00001495 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001496 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001497
1498 // FIXME: Reject attempts to use -march=native unless the target matches
1499 // the host.
1500 //
1501 // FIXME: We should also incorporate the detected target features for use
1502 // with -native.
1503 std::string CPU = llvm::sys::getHostCPUName();
1504 if (!CPU.empty() && CPU != "generic")
1505 return Args.MakeArgString(CPU);
1506 }
1507
1508 // Select the default CPU if none was given (or detection failed).
1509
1510 if (Triple.getArch() != llvm::Triple::x86_64 &&
1511 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001512 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001513
1514 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1515
1516 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001517 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001518 if (Triple.getArchName() == "x86_64h")
1519 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001520 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001521 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001522
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001523 // Set up default CPU name for PS4 compilers.
1524 if (Triple.isPS4CPU())
1525 return "btver2";
1526
Alexey Bataev286d1b92014-01-31 04:07:13 +00001527 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001528 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001529 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001530
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001531 // Everything else goes to x86-64 in 64-bit mode.
1532 if (Is64Bit)
1533 return "x86-64";
1534
1535 switch (Triple.getOS()) {
1536 case llvm::Triple::FreeBSD:
1537 case llvm::Triple::NetBSD:
1538 case llvm::Triple::OpenBSD:
1539 return "i486";
1540 case llvm::Triple::Haiku:
1541 return "i586";
1542 case llvm::Triple::Bitrig:
1543 return "i686";
1544 default:
1545 // Fallback to p4.
1546 return "pentium4";
1547 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001548}
1549
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001550static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1551 switch(T.getArch()) {
1552 default:
1553 return "";
1554
Amara Emerson703da2e2013-10-31 09:32:33 +00001555 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001556 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001557 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001558
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001559 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001560 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001561 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001562 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001563 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001564
1565 case llvm::Triple::mips:
1566 case llvm::Triple::mipsel:
1567 case llvm::Triple::mips64:
1568 case llvm::Triple::mips64el: {
1569 StringRef CPUName;
1570 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001571 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001572 return CPUName;
1573 }
1574
1575 case llvm::Triple::ppc:
1576 case llvm::Triple::ppc64:
1577 case llvm::Triple::ppc64le: {
1578 std::string TargetCPUName = getPPCTargetCPU(Args);
1579 // LLVM may default to generating code for the native CPU,
1580 // but, like gcc, we default to a more generic option for
1581 // each architecture. (except on Darwin)
1582 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1583 if (T.getArch() == llvm::Triple::ppc64)
1584 TargetCPUName = "ppc64";
1585 else if (T.getArch() == llvm::Triple::ppc64le)
1586 TargetCPUName = "ppc64le";
1587 else
1588 TargetCPUName = "ppc";
1589 }
1590 return TargetCPUName;
1591 }
1592
1593 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001594 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001595 case llvm::Triple::sparcv9:
1596 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001597 return A->getValue();
1598 return "";
1599
1600 case llvm::Triple::x86:
1601 case llvm::Triple::x86_64:
1602 return getX86TargetCPU(Args, T);
1603
1604 case llvm::Triple::hexagon:
1605 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1606
1607 case llvm::Triple::systemz:
1608 return getSystemZTargetCPU(Args);
1609
1610 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001611 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001612 return getR600TargetGPU(Args);
1613 }
1614}
1615
Alp Tokerce365ca2013-12-02 12:43:03 +00001616static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1617 ArgStringList &CmdArgs) {
1618 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1619 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1620 // forward.
1621 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001622 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001623 CmdArgs.push_back(Args.MakeArgString(Plugin));
1624
1625 // Try to pass driver level flags relevant to LTO code generation down to
1626 // the plugin.
1627
1628 // Handle flags for selecting CPU variants.
1629 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1630 if (!CPU.empty())
1631 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1632}
1633
Eric Christopherc54920a2015-03-23 19:26:05 +00001634static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001635 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001636 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001637 // If -march=native, autodetect the feature list.
1638 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1639 if (StringRef(A->getValue()) == "native") {
1640 llvm::StringMap<bool> HostFeatures;
1641 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1642 for (auto &F : HostFeatures)
1643 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1644 F.first()));
1645 }
1646 }
1647
Jim Grosbach82eee262013-11-16 00:53:35 +00001648 if (Triple.getArchName() == "x86_64h") {
1649 // x86_64h implies quite a few of the more modern subtarget features
1650 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1651 Features.push_back("-rdrnd");
1652 Features.push_back("-aes");
1653 Features.push_back("-pclmul");
1654 Features.push_back("-rtm");
1655 Features.push_back("-hle");
1656 Features.push_back("-fsgsbase");
1657 }
1658
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001659 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001660 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001661 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001662 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001663 Features.push_back("+sse4.2");
1664 Features.push_back("+popcnt");
1665 } else
1666 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 }
1668
Eric Christopherc54920a2015-03-23 19:26:05 +00001669 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001670 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1671 StringRef Arch = A->getValue();
1672 bool ArchUsed = false;
1673 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001674 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001675 if (Arch == "AVX" || Arch == "AVX2") {
1676 ArchUsed = true;
1677 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1678 }
1679 }
1680 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001681 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001682 if (Arch == "IA32") {
1683 ArchUsed = true;
1684 } else if (Arch == "SSE" || Arch == "SSE2") {
1685 ArchUsed = true;
1686 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1687 }
1688 }
1689 if (!ArchUsed)
1690 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1691 }
1692
Jim Grosbach82eee262013-11-16 00:53:35 +00001693 // Now add any that the user explicitly requested on the command line,
1694 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001695 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1696 ie = Args.filtered_end();
1697 it != ie; ++it) {
1698 StringRef Name = (*it)->getOption().getName();
1699 (*it)->claim();
1700
1701 // Skip over "-m".
1702 assert(Name.startswith("m") && "Invalid feature name.");
1703 Name = Name.substr(1);
1704
1705 bool IsNegative = Name.startswith("no-");
1706 if (IsNegative)
1707 Name = Name.substr(3);
1708
1709 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1710 }
1711}
1712
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001713void Clang::AddX86TargetArgs(const ArgList &Args,
1714 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001715 if (!Args.hasFlag(options::OPT_mred_zone,
1716 options::OPT_mno_red_zone,
1717 true) ||
1718 Args.hasArg(options::OPT_mkernel) ||
1719 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001720 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001721
Bob Wilson2616e2e2013-02-10 16:01:41 +00001722 // Default to avoid implicit floating-point for kernel/kext code, but allow
1723 // that to be overridden with -mno-soft-float.
1724 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1725 Args.hasArg(options::OPT_fapple_kext));
1726 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1727 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001728 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001729 options::OPT_mno_implicit_float)) {
1730 const Option &O = A->getOption();
1731 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1732 O.matches(options::OPT_msoft_float));
1733 }
1734 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001735 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001736
1737 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1738 StringRef Value = A->getValue();
1739 if (Value == "intel" || Value == "att") {
1740 CmdArgs.push_back("-mllvm");
1741 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1742 } else {
1743 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1744 << A->getOption().getName() << Value;
1745 }
1746 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001747}
1748
Tony Linthicum76329bf2011-12-12 21:14:55 +00001749void Clang::AddHexagonTargetArgs(const ArgList &Args,
1750 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001751 CmdArgs.push_back("-mqdsp6-compat");
1752 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001753
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001754 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1755 std::string SmallDataThreshold="-hexagon-small-data-threshold=";
1756 SmallDataThreshold += v;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001757 CmdArgs.push_back ("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001758 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001759 }
1760
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001761 if (!Args.hasArg(options::OPT_fno_short_enums))
1762 CmdArgs.push_back("-fshort-enums");
1763 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1764 CmdArgs.push_back ("-mllvm");
1765 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1766 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001767 CmdArgs.push_back ("-mllvm");
1768 CmdArgs.push_back ("-machine-sink-split=0");
1769}
1770
Kevin Qin110db6f2014-07-18 07:03:22 +00001771// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001772static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001773 std::vector<const char *> &Features) {
1774 SmallVector<StringRef, 8> Split;
1775 text.split(Split, StringRef("+"), -1, false);
1776
1777 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1778 const char *result = llvm::StringSwitch<const char *>(Split[I])
1779 .Case("fp", "+fp-armv8")
1780 .Case("simd", "+neon")
1781 .Case("crc", "+crc")
1782 .Case("crypto", "+crypto")
1783 .Case("nofp", "-fp-armv8")
1784 .Case("nosimd", "-neon")
1785 .Case("nocrc", "-crc")
1786 .Case("nocrypto", "-crypto")
1787 .Default(nullptr);
1788 if (result)
1789 Features.push_back(result);
1790 else if (Split[I] == "neon" || Split[I] == "noneon")
1791 D.Diag(diag::err_drv_no_neon_modifier);
1792 else
1793 return false;
1794 }
1795 return true;
1796}
1797
1798// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1799// decode CPU and feature.
1800static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1801 std::vector<const char *> &Features) {
1802 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1803 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001804 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001805 Features.push_back("+neon");
1806 Features.push_back("+crc");
1807 Features.push_back("+crypto");
1808 } else if (CPU == "generic") {
1809 Features.push_back("+neon");
1810 } else {
1811 return false;
1812 }
1813
1814 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1815 return false;
1816
1817 return true;
1818}
1819
1820static bool
1821getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1822 const ArgList &Args,
1823 std::vector<const char *> &Features) {
1824 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001825
1826 if (Split.first == "armv8-a" ||
1827 Split.first == "armv8a") {
1828 // ok, no additional features.
1829 } else if (
1830 Split.first == "armv8.1-a" ||
1831 Split.first == "armv8.1a" ) {
1832 Features.push_back("+v8.1a");
1833 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001834 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001835 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001836
1837 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1838 return false;
1839
1840 return true;
1841}
1842
1843static bool
1844getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1845 const ArgList &Args,
1846 std::vector<const char *> &Features) {
1847 StringRef CPU;
1848 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1849 return false;
1850
1851 return true;
1852}
1853
1854static bool
1855getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1856 const ArgList &Args,
1857 std::vector<const char *> &Features) {
1858 // Handle CPU name is 'native'.
1859 if (Mtune == "native")
1860 Mtune = llvm::sys::getHostCPUName();
1861 if (Mtune == "cyclone") {
1862 Features.push_back("+zcm");
1863 Features.push_back("+zcz");
1864 }
1865 return true;
1866}
1867
1868static bool
1869getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1870 const ArgList &Args,
1871 std::vector<const char *> &Features) {
1872 StringRef CPU;
1873 std::vector<const char *> DecodedFeature;
1874 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1875 return false;
1876
1877 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1878}
1879
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001880static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1881 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001882 Arg *A;
1883 bool success = true;
1884 // Enable NEON by default.
1885 Features.push_back("+neon");
1886 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1887 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1888 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1889 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001890 else if (Args.hasArg(options::OPT_arch))
1891 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1892 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001893
1894 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1895 success =
1896 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1897 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1898 success =
1899 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001900 else if (Args.hasArg(options::OPT_arch))
1901 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1902 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001903
1904 if (!success)
1905 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001906
1907 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1908 Features.push_back("-fp-armv8");
1909 Features.push_back("-crypto");
1910 Features.push_back("-neon");
1911 }
Bradley Smith418c5932014-05-02 15:17:51 +00001912
1913 // En/disable crc
1914 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1915 options::OPT_mnocrc)) {
1916 if (A->getOption().matches(options::OPT_mcrc))
1917 Features.push_back("+crc");
1918 else
1919 Features.push_back("-crc");
1920 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001921}
1922
1923static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001924 const ArgList &Args, ArgStringList &CmdArgs,
1925 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001926 std::vector<const char *> Features;
1927 switch (Triple.getArch()) {
1928 default:
1929 break;
1930 case llvm::Triple::mips:
1931 case llvm::Triple::mipsel:
1932 case llvm::Triple::mips64:
1933 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001934 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001935 break;
1936
1937 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001938 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001939 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001940 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001941 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001942 break;
1943
1944 case llvm::Triple::ppc:
1945 case llvm::Triple::ppc64:
1946 case llvm::Triple::ppc64le:
1947 getPPCTargetFeatures(Args, Features);
1948 break;
1949 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001950 case llvm::Triple::sparcel:
Brad Smithf436e9e2014-08-19 21:50:15 +00001951 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001952 getSparcTargetFeatures(Args, Features);
1953 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001954 case llvm::Triple::systemz:
1955 getSystemZTargetFeatures(Args, Features);
1956 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001957 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001958 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001959 getAArch64TargetFeatures(D, Args, Features);
1960 break;
1961 case llvm::Triple::x86:
1962 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001963 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001964 break;
1965 }
Rafael Espindola43964802013-08-21 17:34:32 +00001966
1967 // Find the last of each feature.
1968 llvm::StringMap<unsigned> LastOpt;
1969 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1970 const char *Name = Features[I];
1971 assert(Name[0] == '-' || Name[0] == '+');
1972 LastOpt[Name + 1] = I;
1973 }
1974
1975 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1976 // If this feature was overridden, ignore it.
1977 const char *Name = Features[I];
1978 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1979 assert(LastI != LastOpt.end());
1980 unsigned Last = LastI->second;
1981 if (Last != I)
1982 continue;
1983
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001984 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001985 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001986 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001987}
1988
David Majnemerae394812014-12-09 00:12:30 +00001989static bool
1990shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1991 const llvm::Triple &Triple) {
1992 // We use the zero-cost exception tables for Objective-C if the non-fragile
1993 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1994 // later.
1995 if (runtime.isNonFragile())
1996 return true;
1997
1998 if (!Triple.isMacOSX())
1999 return false;
2000
2001 return (!Triple.isMacOSXVersionLT(10,5) &&
2002 (Triple.getArch() == llvm::Triple::x86_64 ||
2003 Triple.getArch() == llvm::Triple::arm));
2004}
2005
Nico Webere8e53112014-05-11 01:04:02 +00002006// exceptionSettings() exists to share the logic between -cc1 and linker
2007// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002008static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002009 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002010 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002011 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002012 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002013
David Majnemer8de68642014-12-05 08:11:58 +00002014 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002015}
2016
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002017/// Adds exception related arguments to the driver command arguments. There's a
2018/// master flag, -fexceptions and also language specific flags to enable/disable
2019/// C++ and Objective-C exceptions. This makes it possible to for example
2020/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002021static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002022 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002023 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002024 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002025 const Driver &D = TC.getDriver();
2026 const llvm::Triple &Triple = TC.getTriple();
2027
Chad Rosier4fab82c2012-03-26 22:04:46 +00002028 if (KernelOrKext) {
2029 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2030 // arguments now to avoid warnings about unused arguments.
2031 Args.ClaimAllArgs(options::OPT_fexceptions);
2032 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2033 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2034 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2035 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2036 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002037 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002038 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002039
David Majnemer8de68642014-12-05 08:11:58 +00002040 // Gather the exception settings from the command line arguments.
2041 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002042
David Majnemerae394812014-12-09 00:12:30 +00002043 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2044 // is not necessarily sensible, but follows GCC.
2045 if (types::isObjC(InputType) &&
2046 Args.hasFlag(options::OPT_fobjc_exceptions,
2047 options::OPT_fno_objc_exceptions,
2048 true)) {
2049 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002050
David Majnemerae394812014-12-09 00:12:30 +00002051 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002052 }
2053
2054 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002055 bool CXXExceptionsEnabled =
2056 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002057 Arg *ExceptionArg = Args.getLastArg(
2058 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2059 options::OPT_fexceptions, options::OPT_fno_exceptions);
2060 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002061 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002062 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2063 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002064
2065 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002066 if (Triple.isPS4CPU()) {
2067 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2068 assert(ExceptionArg &&
2069 "On the PS4 exceptions should only be enabled if passing "
2070 "an argument");
2071 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2072 const Arg *RTTIArg = TC.getRTTIArg();
2073 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2074 D.Diag(diag::err_drv_argument_not_allowed_with)
2075 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2076 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2077 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2078 } else
2079 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2080
Anders Carlssone96ab552011-02-28 02:27:16 +00002081 CmdArgs.push_back("-fcxx-exceptions");
2082
David Majnemer8de68642014-12-05 08:11:58 +00002083 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002084 }
2085 }
2086
David Majnemer8de68642014-12-05 08:11:58 +00002087 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002088 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002089}
2090
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002091static bool ShouldDisableAutolink(const ArgList &Args,
2092 const ToolChain &TC) {
2093 bool Default = true;
2094 if (TC.getTriple().isOSDarwin()) {
2095 // The native darwin assembler doesn't support the linker_option directives,
2096 // so we disable them if we think the .s file will be passed to it.
2097 Default = TC.useIntegratedAs();
2098 }
2099 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2100 Default);
2101}
2102
Ted Kremenek62093662013-03-12 17:02:12 +00002103static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2104 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002105 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2106 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002107 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002108 return !UseDwarfDirectory;
2109}
2110
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002111/// \brief Check whether the given input tree contains any compilation actions.
2112static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002113 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002114 return true;
2115
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002116 for (const auto &Act : *A)
2117 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002118 return true;
2119
2120 return false;
2121}
2122
2123/// \brief Check if -relax-all should be passed to the internal assembler.
2124/// This is done by default when compiling non-assembler source with -O0.
2125static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2126 bool RelaxDefault = true;
2127
2128 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2129 RelaxDefault = A->getOption().matches(options::OPT_O0);
2130
2131 if (RelaxDefault) {
2132 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002133 for (const auto &Act : C.getActions()) {
2134 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002135 RelaxDefault = true;
2136 break;
2137 }
2138 }
2139 }
2140
2141 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2142 RelaxDefault);
2143}
2144
David Blaikie9260ed62013-07-25 21:19:01 +00002145static void CollectArgsForIntegratedAssembler(Compilation &C,
2146 const ArgList &Args,
2147 ArgStringList &CmdArgs,
2148 const Driver &D) {
2149 if (UseRelaxAll(C, Args))
2150 CmdArgs.push_back("-mrelax-all");
2151
David Peixottodfb66142013-11-14 22:52:58 +00002152 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002153 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002154 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2155 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2156 // arg after parsing the '-I' arg.
2157 bool TakeNextArg = false;
2158
David Blaikie9260ed62013-07-25 21:19:01 +00002159 // When using an integrated assembler, translate -Wa, and -Xassembler
2160 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002161 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002162 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2163 options::OPT_Xassembler),
2164 ie = Args.filtered_end(); it != ie; ++it) {
2165 const Arg *A = *it;
2166 A->claim();
2167
2168 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2169 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002170 if (TakeNextArg) {
2171 CmdArgs.push_back(Value.data());
2172 TakeNextArg = false;
2173 continue;
2174 }
David Blaikie9260ed62013-07-25 21:19:01 +00002175
2176 if (Value == "-force_cpusubtype_ALL") {
2177 // Do nothing, this is the default and we don't support anything else.
2178 } else if (Value == "-L") {
2179 CmdArgs.push_back("-msave-temp-labels");
2180 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002181 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002182 } else if (Value == "--noexecstack") {
2183 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002184 } else if (Value == "-compress-debug-sections" ||
2185 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002186 CompressDebugSections = true;
2187 } else if (Value == "-nocompress-debug-sections" ||
2188 Value == "--nocompress-debug-sections") {
2189 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002190 } else if (Value.startswith("-I")) {
2191 CmdArgs.push_back(Value.data());
2192 // We need to consume the next argument if the current arg is a plain
2193 // -I. The next arg will be the include directory.
2194 if (Value == "-I")
2195 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002196 } else if (Value.startswith("-gdwarf-")) {
2197 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002198 } else {
2199 D.Diag(diag::err_drv_unsupported_option_argument)
2200 << A->getOption().getName() << Value;
2201 }
2202 }
2203 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002204 if (CompressDebugSections) {
2205 if (llvm::zlib::isAvailable())
2206 CmdArgs.push_back("-compress-debug-sections");
2207 else
2208 D.Diag(diag::warn_debug_compression_unavailable);
2209 }
David Blaikie9260ed62013-07-25 21:19:01 +00002210}
2211
Renato Goline807c122014-01-31 11:47:28 +00002212// Until ARM libraries are build separately, we have them all in one library
2213static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002214 // FIXME: handle 64-bit
2215 if (TC.getTriple().isOSWindows() &&
2216 !TC.getTriple().isWindowsItaniumEnvironment())
2217 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002218 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002219 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002220 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002221}
2222
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002223static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2224 // The runtimes are located in the OS-specific resource directory.
2225 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002226 const llvm::Triple &Triple = TC.getTriple();
2227 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002228 StringRef OSLibName =
2229 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002230 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002231 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002232}
2233
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002234static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002235 bool Shared = false) {
2236 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2237 ? "-android"
2238 : "";
2239
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002240 bool IsOSWindows = TC.getTriple().isOSWindows();
2241 StringRef Arch = getArchNameForCompilerRTLib(TC);
2242 const char *Prefix = IsOSWindows ? "" : "lib";
2243 const char *Suffix =
2244 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2245
2246 SmallString<128> Path = getCompilerRTLibDir(TC);
2247 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2248 Arch + Env + Suffix);
2249
2250 return Path;
2251}
2252
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002253// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002254// FIXME: Make sure we can also emit shared objects if they're requested
2255// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002256static void addClangRT(const ToolChain &TC, const ArgList &Args,
2257 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002258 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002259
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002260 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002261 // FIXME: why do we link against gcc when we are using compiler-rt?
2262 CmdArgs.push_back("-lgcc_s");
2263 if (TC.getDriver().CCCIsCXX())
2264 CmdArgs.push_back("-lgcc_eh");
2265 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002266}
2267
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002268static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2269 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002270 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2271 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002272 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002273 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002274 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002275 Args.hasArg(options::OPT_fcreate_profile) ||
2276 Args.hasArg(options::OPT_coverage)))
2277 return;
2278
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002279 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002280}
2281
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002282namespace {
2283enum OpenMPRuntimeKind {
2284 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2285 /// without knowing what runtime to target.
2286 OMPRT_Unknown,
2287
2288 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2289 /// the default for Clang.
2290 OMPRT_OMP,
2291
2292 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2293 /// this runtime but can swallow the pragmas, and find and link against the
2294 /// runtime library itself.
2295 OMPRT_GOMP,
2296
Chandler Carruthc6625c62015-05-28 21:10:31 +00002297 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002298 /// OpenMP runtime. We support this mode for users with existing dependencies
2299 /// on this runtime library name.
2300 OMPRT_IOMP5
2301};
2302}
2303
2304/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002305static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2306 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002307 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2308
2309 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2310 if (A)
2311 RuntimeName = A->getValue();
2312
2313 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
2314 .Case("libomp", OMPRT_OMP)
2315 .Case("libgomp", OMPRT_GOMP)
2316 .Case("libiomp5", OMPRT_IOMP5)
2317 .Default(OMPRT_Unknown);
2318
2319 if (RT == OMPRT_Unknown) {
2320 if (A)
2321 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
2322 << A->getOption().getName() << A->getValue();
2323 else
2324 // FIXME: We could use a nicer diagnostic here.
2325 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2326 }
2327
2328 return RT;
2329}
2330
Alexey Samsonov52550342014-09-15 19:58:40 +00002331static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2332 ArgStringList &CmdArgs, StringRef Sanitizer,
2333 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002334 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002335 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002336 if (!IsShared)
2337 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002338 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002339 if (!IsShared)
2340 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002341}
2342
Alexey Samsonov52550342014-09-15 19:58:40 +00002343// Tries to use a file with the list of dynamic symbols that need to be exported
2344// from the runtime library. Returns true if the file was found.
2345static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2346 ArgStringList &CmdArgs,
2347 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002348 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2349 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2350 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002351 return true;
2352 }
2353 return false;
2354}
2355
2356static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2357 ArgStringList &CmdArgs) {
2358 // Force linking against the system libraries sanitizers depends on
2359 // (see PR15823 why this is necessary).
2360 CmdArgs.push_back("--no-as-needed");
2361 CmdArgs.push_back("-lpthread");
2362 CmdArgs.push_back("-lrt");
2363 CmdArgs.push_back("-lm");
2364 // There's no libdl on FreeBSD.
2365 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2366 CmdArgs.push_back("-ldl");
2367}
2368
2369static void
2370collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2371 SmallVectorImpl<StringRef> &SharedRuntimes,
2372 SmallVectorImpl<StringRef> &StaticRuntimes,
2373 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2374 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2375 // Collect shared runtimes.
2376 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2377 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002378 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002379
Alexey Samsonov52550342014-09-15 19:58:40 +00002380 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002381 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002382 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2383 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002384 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002385 }
2386 if (SanArgs.needsAsanRt()) {
2387 if (SanArgs.needsSharedAsanRt()) {
2388 HelperStaticRuntimes.push_back("asan-preinit");
2389 } else {
2390 StaticRuntimes.push_back("asan");
2391 if (SanArgs.linkCXXRuntimes())
2392 StaticRuntimes.push_back("asan_cxx");
2393 }
2394 }
2395 if (SanArgs.needsDfsanRt())
2396 StaticRuntimes.push_back("dfsan");
2397 if (SanArgs.needsLsanRt())
2398 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002399 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002400 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002401 if (SanArgs.linkCXXRuntimes())
2402 StaticRuntimes.push_back("msan_cxx");
2403 }
2404 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002405 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002406 if (SanArgs.linkCXXRuntimes())
2407 StaticRuntimes.push_back("tsan_cxx");
2408 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002409 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002410 StaticRuntimes.push_back("ubsan_standalone");
2411 if (SanArgs.linkCXXRuntimes())
2412 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002413 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002414}
2415
Alexey Samsonov52550342014-09-15 19:58:40 +00002416// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2417// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2418static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002419 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002420 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2421 HelperStaticRuntimes;
2422 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2423 HelperStaticRuntimes);
2424 for (auto RT : SharedRuntimes)
2425 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2426 for (auto RT : HelperStaticRuntimes)
2427 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2428 bool AddExportDynamic = false;
2429 for (auto RT : StaticRuntimes) {
2430 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2431 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2432 }
2433 // If there is a static runtime with no dynamic list, force all the symbols
2434 // to be dynamic to be sure we export sanitizer interface functions.
2435 if (AddExportDynamic)
2436 CmdArgs.push_back("-export-dynamic");
2437 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002438}
2439
Reid Kleckner86ea7702015-02-04 23:45:07 +00002440static bool areOptimizationsEnabled(const ArgList &Args) {
2441 // Find the last -O arg and see if it is non-zero.
2442 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2443 return !A->getOption().matches(options::OPT_O0);
2444 // Defaults to -O0.
2445 return false;
2446}
2447
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002448static bool shouldUseFramePointerForTarget(const ArgList &Args,
2449 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002450 // XCore never wants frame pointers, regardless of OS.
2451 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002452 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002453 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002454
2455 if (Triple.isOSLinux()) {
2456 switch (Triple.getArch()) {
2457 // Don't use a frame pointer on linux if optimizing for certain targets.
2458 case llvm::Triple::mips64:
2459 case llvm::Triple::mips64el:
2460 case llvm::Triple::mips:
2461 case llvm::Triple::mipsel:
2462 case llvm::Triple::systemz:
2463 case llvm::Triple::x86:
2464 case llvm::Triple::x86_64:
2465 return !areOptimizationsEnabled(Args);
2466 default:
2467 return true;
2468 }
2469 }
2470
2471 if (Triple.isOSWindows()) {
2472 switch (Triple.getArch()) {
2473 case llvm::Triple::x86:
2474 return !areOptimizationsEnabled(Args);
2475 default:
2476 // All other supported Windows ISAs use xdata unwind information, so frame
2477 // pointers are not generally useful.
2478 return false;
2479 }
2480 }
2481
2482 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002483}
2484
Rafael Espindola224dd632011-12-14 21:02:23 +00002485static bool shouldUseFramePointer(const ArgList &Args,
2486 const llvm::Triple &Triple) {
2487 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2488 options::OPT_fomit_frame_pointer))
2489 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2490
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002491 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002492}
2493
Eric Christopherb7d97e92013-04-03 01:58:53 +00002494static bool shouldUseLeafFramePointer(const ArgList &Args,
2495 const llvm::Triple &Triple) {
2496 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2497 options::OPT_momit_leaf_frame_pointer))
2498 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2499
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002500 if (Triple.isPS4CPU())
2501 return false;
2502
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002503 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002504}
2505
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002506/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002507static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002508 SmallString<128> cwd;
2509 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002510 CmdArgs.push_back("-fdebug-compilation-dir");
2511 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002512 }
2513}
2514
Eric Christopherd3804002013-02-22 20:12:52 +00002515static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002516 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002517 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2518 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2519 SmallString<128> T(FinalOutput->getValue());
2520 llvm::sys::path::replace_extension(T, "dwo");
2521 return Args.MakeArgString(T);
2522 } else {
2523 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002524 SmallString<128> T(
2525 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002526 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002527 llvm::sys::path::replace_extension(F, "dwo");
2528 T += F;
2529 return Args.MakeArgString(F);
2530 }
2531}
2532
2533static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2534 const Tool &T, const JobAction &JA,
2535 const ArgList &Args, const InputInfo &Output,
2536 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002537 ArgStringList ExtractArgs;
2538 ExtractArgs.push_back("--extract-dwo");
2539
2540 ArgStringList StripArgs;
2541 StripArgs.push_back("--strip-dwo");
2542
2543 // Grabbing the output of the earlier compile step.
2544 StripArgs.push_back(Output.getFilename());
2545 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002546 ExtractArgs.push_back(OutFile);
2547
2548 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002549 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002550
2551 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002552 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002553
2554 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002555 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002556}
2557
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002558/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002559/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2560static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002561 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002562 if (A->getOption().matches(options::OPT_O4) ||
2563 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002564 return true;
2565
2566 if (A->getOption().matches(options::OPT_O0))
2567 return false;
2568
2569 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2570
Rafael Espindola91780de2013-08-26 14:05:41 +00002571 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002572 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002573 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002574 return true;
2575
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002576 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002577 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002578 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002579
2580 unsigned OptLevel = 0;
2581 if (S.getAsInteger(10, OptLevel))
2582 return false;
2583
2584 return OptLevel > 1;
2585 }
2586
2587 return false;
2588}
2589
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002590/// Add -x lang to \p CmdArgs for \p Input.
2591static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2592 ArgStringList &CmdArgs) {
2593 // When using -verify-pch, we don't want to provide the type
2594 // 'precompiled-header' if it was inferred from the file extension
2595 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2596 return;
2597
2598 CmdArgs.push_back("-x");
2599 if (Args.hasArg(options::OPT_rewrite_objc))
2600 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2601 else
2602 CmdArgs.push_back(types::getTypeName(Input.getType()));
2603}
2604
David Majnemerc371ff02015-03-22 08:39:22 +00002605static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002606 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002607 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002608
2609 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002610 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002611
2612 unsigned Build = 0, Factor = 1;
2613 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2614 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002615 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002616}
2617
Rafael Espindola577637a2015-01-03 00:06:04 +00002618// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002619// options that build systems might add but are unused when assembling or only
2620// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002621static void claimNoWarnArgs(const ArgList &Args) {
2622 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002623 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002624 Args.ClaimAllArgs(options::OPT_flto);
2625 Args.ClaimAllArgs(options::OPT_fno_lto);
2626}
2627
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002628static void appendUserToPath(SmallVectorImpl<char> &Result) {
2629#ifdef LLVM_ON_UNIX
2630 const char *Username = getenv("LOGNAME");
2631#else
2632 const char *Username = getenv("USERNAME");
2633#endif
2634 if (Username) {
2635 // Validate that LoginName can be used in a path, and get its length.
2636 size_t Len = 0;
2637 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002638 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002639 Username = nullptr;
2640 break;
2641 }
2642 }
2643
2644 if (Username && Len > 0) {
2645 Result.append(Username, Username + Len);
2646 return;
2647 }
2648 }
2649
2650 // Fallback to user id.
2651#ifdef LLVM_ON_UNIX
2652 std::string UID = llvm::utostr(getuid());
2653#else
2654 // FIXME: Windows seems to have an 'SID' that might work.
2655 std::string UID = "9999";
2656#endif
2657 Result.append(UID.begin(), UID.end());
2658}
2659
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002660void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002661 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002662 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002663 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002664 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002665 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2666 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002667 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002668 ArgStringList CmdArgs;
2669
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002670 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002671 bool IsWindowsCygnus =
2672 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002673 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2674
Daniel Dunbare521a892009-03-31 20:53:55 +00002675 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002676 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002677
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002678 // Invoke ourselves in -cc1 mode.
2679 //
2680 // FIXME: Implement custom jobs for internal actions.
2681 CmdArgs.push_back("-cc1");
2682
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002683 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002684 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002685 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002686 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002687
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002688 const llvm::Triple TT(TripleStr);
2689 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2690 TT.getArch() == llvm::Triple::thumb)) {
2691 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2692 unsigned Version;
2693 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2694 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002695 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2696 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002697 }
2698
Tim Northover336f1892014-03-29 13:16:12 +00002699 // Push all default warning arguments that are specific to
2700 // the given target. These come before user provided warning options
2701 // are provided.
2702 getToolChain().addClangWarningOptions(CmdArgs);
2703
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002704 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002705 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002706
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002707 if (isa<AnalyzeJobAction>(JA)) {
2708 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2709 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002710 } else if (isa<MigrateJobAction>(JA)) {
2711 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002712 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002713 if (Output.getType() == types::TY_Dependencies)
2714 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002715 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002716 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002717 if (Args.hasArg(options::OPT_rewrite_objc) &&
2718 !Args.hasArg(options::OPT_g_Group))
2719 CmdArgs.push_back("-P");
2720 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002721 } else if (isa<AssembleJobAction>(JA)) {
2722 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002723
David Blaikie9260ed62013-07-25 21:19:01 +00002724 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002725
2726 // Also ignore explicit -force_cpusubtype_ALL option.
2727 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002728 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002729 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002730 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002731
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002732 if (JA.getType() == types::TY_Nothing)
2733 CmdArgs.push_back("-fsyntax-only");
2734 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002735 CmdArgs.push_back("-emit-pch");
2736 else
2737 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002738 } else if (isa<VerifyPCHJobAction>(JA)) {
2739 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002740 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002741 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2742 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002743
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002744 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002745 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002746 } else if (JA.getType() == types::TY_LLVM_IR ||
2747 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002748 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002749 } else if (JA.getType() == types::TY_LLVM_BC ||
2750 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002751 CmdArgs.push_back("-emit-llvm-bc");
2752 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002753 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002754 } else if (JA.getType() == types::TY_AST) {
2755 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002756 } else if (JA.getType() == types::TY_ModuleFile) {
2757 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002758 } else if (JA.getType() == types::TY_RewrittenObjC) {
2759 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002760 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002761 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2762 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002763 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002764 } else {
2765 assert(JA.getType() == types::TY_PP_Asm &&
2766 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002767 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002768
2769 // Preserve use-list order by default when emitting bitcode, so that
2770 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2771 // same result as running passes here. For LTO, we don't need to preserve
2772 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002773 if (JA.getType() == types::TY_LLVM_BC)
2774 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002775 }
2776
Justin Bognera88f0122014-06-20 22:59:50 +00002777 // We normally speed up the clang process a bit by skipping destructors at
2778 // exit, but when we're generating diagnostics we can rely on some of the
2779 // cleanup.
2780 if (!C.isForDiagnostics())
2781 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002782
John McCallbb79b5f2010-02-13 03:50:24 +00002783 // Disable the verification pass in -asserts builds.
2784#ifdef NDEBUG
2785 CmdArgs.push_back("-disable-llvm-verifier");
2786#endif
2787
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002788 // Set the main file name, so that debug info works even with
2789 // -save-temps.
2790 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002791 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002792
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002793 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002794 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002795 if (Args.hasArg(options::OPT_static))
2796 CmdArgs.push_back("-static-define");
2797
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002798 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002799 // Enable region store model by default.
2800 CmdArgs.push_back("-analyzer-store=region");
2801
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002802 // Treat blocks as analysis entry points.
2803 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2804
Ted Kremenek49c79792011-03-24 00:28:47 +00002805 CmdArgs.push_back("-analyzer-eagerly-assume");
2806
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002807 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002808 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002809 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002810
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002811 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002812 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002813
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002814 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002815 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002816
2817 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002818
Artem Belevichba558952015-05-06 18:20:23 +00002819 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002820 CmdArgs.push_back("-analyzer-checker=cplusplus");
2821
Nico Webere8e53112014-05-11 01:04:02 +00002822 // Enable the following experimental checkers for testing.
2823 CmdArgs.push_back(
2824 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002825 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2826 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2827 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2828 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2829 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002830 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002831
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002832 // Set the output format. The default is plist, for (lame) historical
2833 // reasons.
2834 CmdArgs.push_back("-analyzer-output");
2835 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002836 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002837 else
2838 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002839
Ted Kremenekfe449a22010-03-22 22:32:05 +00002840 // Disable the presentation of standard compiler warnings when
2841 // using --analyze. We only want to show static analyzer diagnostics
2842 // or frontend errors.
2843 CmdArgs.push_back("-w");
2844
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002845 // Add -Xanalyzer arguments when running as analyzer.
2846 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002847 }
2848
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002849 CheckCodeGenerationOptions(D, Args);
2850
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002851 bool PIE = getToolChain().isPIEDefault();
2852 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002853 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002854
Alexey Bataev40e75222014-01-28 06:30:35 +00002855 // Android-specific defaults for PIC/PIE
2856 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002857 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00002858 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002859 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002860 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002861 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002862 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002863 case llvm::Triple::mips:
2864 case llvm::Triple::mipsel:
2865 case llvm::Triple::mips64:
2866 case llvm::Triple::mips64el:
2867 PIC = true; // "-fpic"
2868 break;
2869
2870 case llvm::Triple::x86:
2871 case llvm::Triple::x86_64:
2872 PIC = true; // "-fPIC"
2873 IsPICLevelTwo = true;
2874 break;
2875
2876 default:
2877 break;
2878 }
2879 }
2880
Brad Smith5b05db82014-06-24 19:51:29 +00002881 // OpenBSD-specific defaults for PIE
2882 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002883 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00002884 case llvm::Triple::mips64:
2885 case llvm::Triple::mips64el:
2886 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002887 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002888 case llvm::Triple::x86:
2889 case llvm::Triple::x86_64:
2890 IsPICLevelTwo = false; // "-fpie"
2891 break;
2892
2893 case llvm::Triple::ppc:
2894 case llvm::Triple::sparcv9:
2895 IsPICLevelTwo = true; // "-fPIE"
2896 break;
2897
2898 default:
2899 break;
2900 }
2901 }
2902
Alexey Samsonov090301e2013-04-09 12:28:19 +00002903 // For the PIC and PIE flag options, this logic is different from the
2904 // legacy logic in very old versions of GCC, as that logic was just
2905 // a bug no one had ever fixed. This logic is both more rational and
2906 // consistent with GCC's new logic now that the bugs are fixed. The last
2907 // argument relating to either PIC or PIE wins, and no other argument is
2908 // used. If the last argument is any flavor of the '-fno-...' arguments,
2909 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2910 // at the same level.
2911 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2912 options::OPT_fpic, options::OPT_fno_pic,
2913 options::OPT_fPIE, options::OPT_fno_PIE,
2914 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002915 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2916 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002917 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002918 if (LastPICArg) {
2919 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002920 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2921 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2922 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2923 PIC = PIE || O.matches(options::OPT_fPIC) ||
2924 O.matches(options::OPT_fpic);
2925 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2926 O.matches(options::OPT_fPIC);
2927 } else {
2928 PIE = PIC = false;
2929 }
2930 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002931 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002932
Nick Lewycky609dd662013-10-11 03:33:53 +00002933 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002934 // specified while enabling PIC enabled level 1 PIC, just force it back to
2935 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2936 // informal testing).
2937 if (PIC && getToolChain().getTriple().isOSDarwin())
2938 IsPICLevelTwo |= getToolChain().isPICDefault();
2939
Chandler Carruthc0c04552012-04-08 16:40:35 +00002940 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2941 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002942 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002943 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002944 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002945 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002946 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002947
Chandler Carruth76a943b2012-11-19 03:52:03 +00002948 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2949 // This is a very special mode. It trumps the other modes, almost no one
2950 // uses it, and it isn't even valid on any OS but Darwin.
2951 if (!getToolChain().getTriple().isOSDarwin())
2952 D.Diag(diag::err_drv_unsupported_opt_for_target)
2953 << A->getSpelling() << getToolChain().getTriple().str();
2954
2955 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2956
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002957 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002958 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002959
Chandler Carruth76a943b2012-11-19 03:52:03 +00002960 // Only a forced PIC mode can cause the actual compile to have PIC defines
2961 // etc., no flags are sufficient. This behavior was selected to closely
2962 // match that of llvm-gcc and Apple GCC before that.
2963 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2964 CmdArgs.push_back("-pic-level");
2965 CmdArgs.push_back("2");
2966 }
2967 } else {
2968 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2969 // handled in Clang's IRGen by the -pie-level flag.
2970 CmdArgs.push_back("-mrelocation-model");
2971 CmdArgs.push_back(PIC ? "pic" : "static");
2972
2973 if (PIC) {
2974 CmdArgs.push_back("-pic-level");
2975 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2976 if (PIE) {
2977 CmdArgs.push_back("-pie-level");
2978 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2979 }
2980 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002981 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002982
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002983 CmdArgs.push_back("-mthread-model");
2984 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2985 CmdArgs.push_back(A->getValue());
2986 else
2987 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2988
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002989 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2990
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002991 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2992 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002993 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002994
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002995 // LLVM Code Generator Options.
2996
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002997 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2998 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2999 for (arg_iterator
3000 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
3001 options::OPT_frewrite_map_file_EQ),
3002 MFE = Args.filtered_end();
3003 MFI != MFE; ++MFI) {
3004 CmdArgs.push_back("-frewrite-map-file");
3005 CmdArgs.push_back((*MFI)->getValue());
3006 (*MFI)->claim();
3007 }
3008 }
3009
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003010 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3011 StringRef v = A->getValue();
3012 CmdArgs.push_back("-mllvm");
3013 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3014 A->claim();
3015 }
3016
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003017 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3018 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003019 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003020 }
3021
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003022 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3023 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003024 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003025 D.Diag(diag::err_drv_unsupported_opt_for_target)
3026 << A->getSpelling() << getToolChain().getTriple().str();
3027 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3028 CmdArgs.push_back("-fpcc-struct-return");
3029 } else {
3030 assert(A->getOption().matches(options::OPT_freg_struct_return));
3031 CmdArgs.push_back("-freg-struct-return");
3032 }
3033 }
3034
Roman Divacky65b88cd2011-03-01 17:40:53 +00003035 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3036 CmdArgs.push_back("-mrtd");
3037
Rafael Espindola224dd632011-12-14 21:02:23 +00003038 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003039 CmdArgs.push_back("-mdisable-fp-elim");
3040 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3041 options::OPT_fno_zero_initialized_in_bss))
3042 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003043
3044 bool OFastEnabled = isOptimizationLevelFast(Args);
3045 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3046 // enabled. This alias option is being used to simplify the hasFlag logic.
3047 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
3048 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003049 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3050 // doesn't do any TBAA.
3051 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003052 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003053 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003054 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003055 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3056 options::OPT_fno_struct_path_tbaa))
3057 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003058 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3059 false))
3060 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003061 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3062 options::OPT_fno_optimize_sibling_calls))
3063 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003064
Eric Christopher006208c2013-04-04 06:29:47 +00003065 // Handle segmented stacks.
3066 if (Args.hasArg(options::OPT_fsplit_stack))
3067 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003068
3069 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3070 // This alias option is being used to simplify the getLastArg logic.
3071 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3072 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003073
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003074 // Handle various floating point optimization flags, mapping them to the
3075 // appropriate LLVM code generation flags. The pattern for all of these is to
3076 // default off the codegen optimizations, and if any flag enables them and no
3077 // flag disables them after the flag enabling them, enable the codegen
3078 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003079 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003080 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003081 options::OPT_ffinite_math_only,
3082 options::OPT_fno_finite_math_only,
3083 options::OPT_fhonor_infinities,
3084 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003085 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3086 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003087 A->getOption().getID() != options::OPT_fhonor_infinities)
3088 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003089 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003090 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003091 options::OPT_ffinite_math_only,
3092 options::OPT_fno_finite_math_only,
3093 options::OPT_fhonor_nans,
3094 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003095 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3096 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003097 A->getOption().getID() != options::OPT_fhonor_nans)
3098 CmdArgs.push_back("-menable-no-nans");
3099
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003100 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3101 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003102 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003103 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003104 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003105 options::OPT_fno_math_errno)) {
3106 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3107 // However, turning *off* -ffast_math merely restores the toolchain default
3108 // (which may be false).
3109 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3110 A->getOption().getID() == options::OPT_ffast_math ||
3111 A->getOption().getID() == options::OPT_Ofast)
3112 MathErrno = false;
3113 else if (A->getOption().getID() == options::OPT_fmath_errno)
3114 MathErrno = true;
3115 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003116 if (MathErrno)
3117 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003118
3119 // There are several flags which require disabling very specific
3120 // optimizations. Any of these being disabled forces us to turn off the
3121 // entire set of LLVM optimizations, so collect them through all the flag
3122 // madness.
3123 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003124 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003125 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003126 options::OPT_funsafe_math_optimizations,
3127 options::OPT_fno_unsafe_math_optimizations,
3128 options::OPT_fassociative_math,
3129 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003130 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3131 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003132 A->getOption().getID() != options::OPT_fno_associative_math)
3133 AssociativeMath = true;
3134 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003135 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003136 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003137 options::OPT_funsafe_math_optimizations,
3138 options::OPT_fno_unsafe_math_optimizations,
3139 options::OPT_freciprocal_math,
3140 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003141 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3142 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003143 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3144 ReciprocalMath = true;
3145 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003146 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003147 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003148 options::OPT_funsafe_math_optimizations,
3149 options::OPT_fno_unsafe_math_optimizations,
3150 options::OPT_fsigned_zeros,
3151 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003152 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3153 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003154 A->getOption().getID() != options::OPT_fsigned_zeros)
3155 SignedZeros = false;
3156 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003157 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003158 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003159 options::OPT_funsafe_math_optimizations,
3160 options::OPT_fno_unsafe_math_optimizations,
3161 options::OPT_ftrapping_math,
3162 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003163 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3164 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003165 A->getOption().getID() != options::OPT_ftrapping_math)
3166 TrappingMath = false;
3167 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3168 !TrappingMath)
3169 CmdArgs.push_back("-menable-unsafe-fp-math");
3170
Sanjay Patel76c9e092015-01-23 16:40:50 +00003171 if (!SignedZeros)
3172 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003173
Sanjay Patel359b1052015-04-09 15:03:23 +00003174 if (ReciprocalMath)
3175 CmdArgs.push_back("-freciprocal-math");
3176
Lang Hamesaa53b932012-07-06 00:59:19 +00003177 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003178 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003179 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003180 options::OPT_ffp_contract)) {
3181 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003182 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003183 if (Val == "fast" || Val == "on" || Val == "off") {
3184 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3185 } else {
3186 D.Diag(diag::err_drv_unsupported_option_argument)
3187 << A->getOption().getName() << Val;
3188 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003189 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3190 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003191 // If fast-math is set then set the fp-contract mode to fast.
3192 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3193 }
3194 }
3195
Bob Wilson6a039162012-07-19 03:52:53 +00003196 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3197 // and if we find them, tell the frontend to provide the appropriate
3198 // preprocessor macros. This is distinct from enabling any optimizations as
3199 // these options induce language changes which must survive serialization
3200 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003201 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3202 options::OPT_fno_fast_math))
3203 if (!A->getOption().matches(options::OPT_fno_fast_math))
3204 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003205 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3206 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003207 if (A->getOption().matches(options::OPT_ffinite_math_only))
3208 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003209
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003210 // Decide whether to use verbose asm. Verbose assembly is the default on
3211 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003212 bool IsIntegratedAssemblerDefault =
3213 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003214 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003215 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003216 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003217 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003218
Rafael Espindolab8a12932015-05-22 20:44:03 +00003219 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3220 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003221 CmdArgs.push_back("-no-integrated-as");
3222
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003223 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3224 CmdArgs.push_back("-mdebug-pass");
3225 CmdArgs.push_back("Structure");
3226 }
3227 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3228 CmdArgs.push_back("-mdebug-pass");
3229 CmdArgs.push_back("Arguments");
3230 }
3231
John McCall8517abc2010-02-19 02:45:38 +00003232 // Enable -mconstructor-aliases except on darwin, where we have to
3233 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003234 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003235 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003236
John McCall7ef5cb32011-03-18 02:56:14 +00003237 // Darwin's kernel doesn't support guard variables; just die if we
3238 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003239 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003240 CmdArgs.push_back("-fforbid-guard-variables");
3241
Douglas Gregordbe39272011-02-01 15:15:22 +00003242 if (Args.hasArg(options::OPT_mms_bitfields)) {
3243 CmdArgs.push_back("-mms-bitfields");
3244 }
John McCall8517abc2010-02-19 02:45:38 +00003245
Daniel Dunbar306945d2009-09-16 06:17:29 +00003246 // This is a coarse approximation of what llvm-gcc actually does, both
3247 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3248 // complicated ways.
3249 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003250 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3251 options::OPT_fno_asynchronous_unwind_tables,
3252 (getToolChain().IsUnwindTablesDefault() ||
3253 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3254 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003255 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3256 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003257 CmdArgs.push_back("-munwind-tables");
3258
Chandler Carruth05fb5852012-11-21 23:40:23 +00003259 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003260
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003261 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3262 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003263 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003264 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003265
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003266 // FIXME: Handle -mtune=.
3267 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003268
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003269 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003270 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003271 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003272 }
3273
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003274 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003275 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003276 if (!CPU.empty()) {
3277 CmdArgs.push_back("-target-cpu");
3278 CmdArgs.push_back(Args.MakeArgString(CPU));
3279 }
3280
Rafael Espindolaeb265472013-08-21 21:59:03 +00003281 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3282 CmdArgs.push_back("-mfpmath");
3283 CmdArgs.push_back(A->getValue());
3284 }
3285
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003286 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003287 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003288
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003289 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003290 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003291 default:
3292 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003293
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003294 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003295 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003296 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003297 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003298 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003299 break;
3300
Tim Northover573cbee2014-05-24 12:52:07 +00003301 case llvm::Triple::aarch64:
3302 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003303 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003304 break;
3305
Eric Christopher0b26a612010-03-02 02:41:08 +00003306 case llvm::Triple::mips:
3307 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003308 case llvm::Triple::mips64:
3309 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003310 AddMIPSTargetArgs(Args, CmdArgs);
3311 break;
3312
Ulrich Weigand8afad612014-07-28 13:17:52 +00003313 case llvm::Triple::ppc:
3314 case llvm::Triple::ppc64:
3315 case llvm::Triple::ppc64le:
3316 AddPPCTargetArgs(Args, CmdArgs);
3317 break;
3318
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003319 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003320 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003321 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003322 AddSparcTargetArgs(Args, CmdArgs);
3323 break;
3324
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003325 case llvm::Triple::x86:
3326 case llvm::Triple::x86_64:
3327 AddX86TargetArgs(Args, CmdArgs);
3328 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003329
3330 case llvm::Triple::hexagon:
3331 AddHexagonTargetArgs(Args, CmdArgs);
3332 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003333 }
3334
Hans Wennborg75958c42013-08-08 00:17:41 +00003335 // Add clang-cl arguments.
3336 if (getToolChain().getDriver().IsCLMode())
3337 AddClangCLArgs(Args, CmdArgs);
3338
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003339 // Pass the linker version in use.
3340 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3341 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003342 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003343 }
3344
Eric Christopherb7d97e92013-04-03 01:58:53 +00003345 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003346 CmdArgs.push_back("-momit-leaf-frame-pointer");
3347
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003348 // Explicitly error on some things we know we don't support and can't just
3349 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003350 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003351 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3352 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003353 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003354 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003355 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003356 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3357 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003358 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003359 << Unsupported->getOption().getName();
3360 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003361 }
3362
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003363 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003364 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003365 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003366 CmdArgs.push_back("-header-include-file");
3367 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3368 D.CCPrintHeadersFilename : "-");
3369 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003370 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003371 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003372
Chad Rosierbe10f982011-08-02 17:58:04 +00003373 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003374 CmdArgs.push_back("-diagnostic-log-file");
3375 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3376 D.CCLogDiagnosticsFilename : "-");
3377 }
3378
Manman Ren17bdb0f2013-11-20 20:22:14 +00003379 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3380 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003381 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003382 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003383 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3384 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003385 // FIXME: we should support specifying dwarf version with
3386 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003387 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003388 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003389 const llvm::Triple &Triple = getToolChain().getTriple();
3390 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003391 Triple.getOS() == llvm::Triple::FreeBSD ||
3392 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003393 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003394 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003395 CmdArgs.push_back("-gdwarf-2");
3396 else if (A->getOption().matches(options::OPT_gdwarf_3))
3397 CmdArgs.push_back("-gdwarf-3");
3398 else if (A->getOption().matches(options::OPT_gdwarf_4))
3399 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003400 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003401 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003402 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003403 const llvm::Triple &Triple = getToolChain().getTriple();
3404 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003405 Triple.getOS() == llvm::Triple::FreeBSD ||
3406 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003407 CmdArgs.push_back("-gdwarf-2");
3408 else
3409 CmdArgs.push_back("-g");
3410 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003411 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003412
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003413 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3414 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003415 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3416 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003417 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003418
Eric Christopher138c32b2013-09-13 22:37:55 +00003419 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003420 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3421 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003422 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003423 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003424 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003425 CmdArgs.push_back("-g");
3426 CmdArgs.push_back("-backend-option");
3427 CmdArgs.push_back("-split-dwarf=Enable");
3428 }
3429
Eric Christopher138c32b2013-09-13 22:37:55 +00003430 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3431 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3432 CmdArgs.push_back("-backend-option");
3433 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3434 }
Eric Christophereec89c22013-06-18 00:03:50 +00003435
Eric Christopher0d403d22014-02-14 01:27:03 +00003436 // -gdwarf-aranges turns on the emission of the aranges section in the
3437 // backend.
3438 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3439 CmdArgs.push_back("-backend-option");
3440 CmdArgs.push_back("-generate-arange-section");
3441 }
3442
David Blaikief36d9ba2014-01-27 18:52:43 +00003443 if (Args.hasFlag(options::OPT_fdebug_types_section,
3444 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003445 CmdArgs.push_back("-backend-option");
3446 CmdArgs.push_back("-generate-type-units");
3447 }
Eric Christophereec89c22013-06-18 00:03:50 +00003448
Ed Schouten6e576152015-03-26 17:50:28 +00003449 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3450 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3451
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003452 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003453 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003454 CmdArgs.push_back("-ffunction-sections");
3455 }
3456
3457 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003458 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003459 CmdArgs.push_back("-fdata-sections");
3460 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003461
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003462 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003463 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003464 CmdArgs.push_back("-fno-unique-section-names");
3465
Chris Lattner3c77a352010-06-22 00:03:40 +00003466 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3467
Justin Bognera71e6812015-04-30 23:49:42 +00003468 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3469 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003470 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3471 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3472 D.Diag(diag::err_drv_argument_not_allowed_with)
3473 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3474
Justin Bognera71e6812015-04-30 23:49:42 +00003475 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3476 A->render(Args, CmdArgs);
3477 else
3478 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003479
3480 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3481 A->render(Args, CmdArgs);
3482 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3483 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3484
Nick Lewycky207bce32011-04-21 23:44:07 +00003485 if (Args.hasArg(options::OPT_ftest_coverage) ||
3486 Args.hasArg(options::OPT_coverage))
3487 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003488 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3489 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003490 Args.hasArg(options::OPT_coverage))
3491 CmdArgs.push_back("-femit-coverage-data");
3492
Alex Lorenzee024992014-08-04 18:41:51 +00003493 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003494 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3495 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003496 D.Diag(diag::err_drv_argument_only_allowed_with)
3497 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3498
3499 if (Args.hasArg(options::OPT_fcoverage_mapping))
3500 CmdArgs.push_back("-fcoverage-mapping");
3501
Nick Lewycky480cb992011-05-04 20:46:58 +00003502 if (C.getArgs().hasArg(options::OPT_c) ||
3503 C.getArgs().hasArg(options::OPT_S)) {
3504 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003505 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003506 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003507 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003508 CoverageFilename = FinalOutput->getValue();
3509 } else {
3510 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3511 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003512 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003513 SmallString<128> Pwd;
3514 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003515 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003516 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003517 }
3518 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003519 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003520 }
3521 }
3522
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003523 // Pass options for controlling the default header search paths.
3524 if (Args.hasArg(options::OPT_nostdinc)) {
3525 CmdArgs.push_back("-nostdsysteminc");
3526 CmdArgs.push_back("-nobuiltininc");
3527 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003528 if (Args.hasArg(options::OPT_nostdlibinc))
3529 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003530 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3531 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3532 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003533
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003534 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003535 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003536 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003537
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003538 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3539
Ted Kremenekf7639e12012-03-06 20:06:33 +00003540 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003541 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003542 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003543 options::OPT_ccc_arcmt_modify,
3544 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003545 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003546 switch (A->getOption().getID()) {
3547 default:
3548 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003549 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003550 CmdArgs.push_back("-arcmt-check");
3551 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003552 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003553 CmdArgs.push_back("-arcmt-modify");
3554 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003555 case options::OPT_ccc_arcmt_migrate:
3556 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003557 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003558 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003559
3560 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3561 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003562 break;
John McCalld70fb982011-06-15 23:25:17 +00003563 }
3564 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003565 } else {
3566 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3567 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3568 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003569 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003570
Ted Kremenekf7639e12012-03-06 20:06:33 +00003571 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3572 if (ARCMTEnabled) {
3573 D.Diag(diag::err_drv_argument_not_allowed_with)
3574 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3575 }
3576 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003577 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003578
3579 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003580 options::OPT_objcmt_migrate_subscripting,
3581 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003582 // None specified, means enable them all.
3583 CmdArgs.push_back("-objcmt-migrate-literals");
3584 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003585 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003586 } else {
3587 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3588 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003589 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003590 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003591 } else {
3592 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3593 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3594 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3595 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3596 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3597 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003598 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003599 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3600 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3601 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3602 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3603 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3604 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3605 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003606 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003607 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003608 }
3609
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003610 // Add preprocessing options like -I, -D, etc. if we are using the
3611 // preprocessor.
3612 //
3613 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003614 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003615 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003616
Rafael Espindolaa7431922011-07-21 23:40:37 +00003617 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3618 // that "The compiler can only warn and ignore the option if not recognized".
3619 // When building with ccache, it will pass -D options to clang even on
3620 // preprocessed inputs and configure concludes that -fPIC is not supported.
3621 Args.ClaimAllArgs(options::OPT_D);
3622
Alp Toker7874bdc2013-11-15 20:40:58 +00003623 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003624 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3625 if (A->getOption().matches(options::OPT_O4)) {
3626 CmdArgs.push_back("-O3");
3627 D.Diag(diag::warn_O4_is_O3);
3628 } else {
3629 A->render(Args, CmdArgs);
3630 }
3631 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003632
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003633 // Warn about ignored options to clang.
3634 for (arg_iterator it = Args.filtered_begin(
3635 options::OPT_clang_ignored_gcc_optimization_f_Group),
3636 ie = Args.filtered_end(); it != ie; ++it) {
3637 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3638 }
3639
Rafael Espindola577637a2015-01-03 00:06:04 +00003640 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003641
Richard Smith3be1cb22014-08-07 00:24:21 +00003642 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003643 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003644 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3645 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003646 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003647 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003648
3649 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003650 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003651 //
3652 // If a std is supplied, only add -trigraphs if it follows the
3653 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003654 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003655 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3656 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003657 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003658 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003659 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003660 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003661 else
3662 Std->render(Args, CmdArgs);
3663
Nico Weber00721502014-12-23 22:32:37 +00003664 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003665 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003666 options::OPT_ftrigraphs,
3667 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003668 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003669 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003670 } else {
3671 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003672 //
3673 // FIXME: Clang doesn't correctly handle -std= when the input language
3674 // doesn't match. For the time being just ignore this for C++ inputs;
3675 // eventually we want to do all the standard defaulting here instead of
3676 // splitting it between the driver and clang -cc1.
3677 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003678 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3679 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003680 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003681 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003682
Nico Weber00721502014-12-23 22:32:37 +00003683 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3684 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003685 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003686
Richard Smith282b4492013-09-04 22:50:31 +00003687 // GCC's behavior for -Wwrite-strings is a bit strange:
3688 // * In C, this "warning flag" changes the types of string literals from
3689 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3690 // for the discarded qualifier.
3691 // * In C++, this is just a normal warning flag.
3692 //
3693 // Implementing this warning correctly in C is hard, so we follow GCC's
3694 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3695 // a non-const char* in C, rather than using this crude hack.
3696 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003697 // FIXME: This should behave just like a warning flag, and thus should also
3698 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3699 Arg *WriteStrings =
3700 Args.getLastArg(options::OPT_Wwrite_strings,
3701 options::OPT_Wno_write_strings, options::OPT_w);
3702 if (WriteStrings &&
3703 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003704 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003705 }
3706
Chandler Carruth61fbf622011-04-23 09:27:53 +00003707 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003708 // during C++ compilation, which it is by default. GCC keeps this define even
3709 // in the presence of '-w', match this behavior bug-for-bug.
3710 if (types::isCXX(InputType) &&
3711 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3712 true)) {
3713 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003714 }
3715
Chandler Carruthe0391482010-05-22 02:21:53 +00003716 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3717 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3718 if (Asm->getOption().matches(options::OPT_fasm))
3719 CmdArgs.push_back("-fgnu-keywords");
3720 else
3721 CmdArgs.push_back("-fno-gnu-keywords");
3722 }
3723
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003724 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3725 CmdArgs.push_back("-fno-dwarf-directory-asm");
3726
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003727 if (ShouldDisableAutolink(Args, getToolChain()))
3728 CmdArgs.push_back("-fno-autolink");
3729
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003730 // Add in -fdebug-compilation-dir if necessary.
3731 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003732
Richard Smith9a568822011-11-21 19:36:32 +00003733 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3734 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003735 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003736 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003737 }
3738
Richard Smith79c927b2013-11-06 19:31:51 +00003739 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3740 CmdArgs.push_back("-foperator-arrow-depth");
3741 CmdArgs.push_back(A->getValue());
3742 }
3743
Richard Smith9a568822011-11-21 19:36:32 +00003744 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3745 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003746 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003747 }
3748
Richard Smitha3d3bd22013-05-08 02:12:03 +00003749 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3750 CmdArgs.push_back("-fconstexpr-steps");
3751 CmdArgs.push_back(A->getValue());
3752 }
3753
Richard Smithb3a14522013-02-22 01:59:51 +00003754 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3755 CmdArgs.push_back("-fbracket-depth");
3756 CmdArgs.push_back(A->getValue());
3757 }
3758
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003759 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3760 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003761 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003762 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003763 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3764 } else
3765 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003766 }
3767
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003768
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003769 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003770 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003771
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003772 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3773 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003774 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003775 }
David Chisnall5778fce2009-08-31 16:41:57 +00003776
Chris Lattnere23003d2010-01-09 21:54:33 +00003777 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3778 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003779 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003780 }
3781
Chris Lattnerb35583d2010-04-07 20:49:23 +00003782 CmdArgs.push_back("-ferror-limit");
3783 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003784 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003785 else
3786 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003787
Chandler Carrutha77a7272010-05-06 04:55:18 +00003788 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3789 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003790 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003791 }
3792
3793 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3794 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003795 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003796 }
3797
Richard Smithf6f003a2011-12-16 19:06:07 +00003798 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3799 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003800 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003801 }
3802
Nick Lewycky24653262014-12-16 21:39:02 +00003803 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3804 CmdArgs.push_back("-fspell-checking-limit");
3805 CmdArgs.push_back(A->getValue());
3806 }
3807
Daniel Dunbar2c978472009-11-04 06:24:47 +00003808 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003809 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003810 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003811 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003812 } else {
3813 // If -fmessage-length=N was not specified, determine whether this is a
3814 // terminal and, if so, implicitly define -fmessage-length appropriately.
3815 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003816 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003817 }
3818
John McCallb4a99d32013-02-19 01:57:35 +00003819 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3820 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3821 options::OPT_fvisibility_ms_compat)) {
3822 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3823 CmdArgs.push_back("-fvisibility");
3824 CmdArgs.push_back(A->getValue());
3825 } else {
3826 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3827 CmdArgs.push_back("-fvisibility");
3828 CmdArgs.push_back("hidden");
3829 CmdArgs.push_back("-ftype-visibility");
3830 CmdArgs.push_back("default");
3831 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003832 }
3833
Douglas Gregor08329632010-06-15 17:05:35 +00003834 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003835
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003836 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3837
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003838 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003839 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3840 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003841 CmdArgs.push_back("-ffreestanding");
3842
Daniel Dunbare357d562009-12-03 18:42:11 +00003843 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003844 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003845 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003846 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3847 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003848 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003849 // AltiVec language extensions aren't relevant for assembling.
3850 if (!isa<PreprocessJobAction>(JA) ||
3851 Output.getType() != types::TY_PP_Asm)
3852 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003853 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3854 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003855
Alexey Bataevdb390212015-05-20 04:24:19 +00003856 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003857 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3858 options::OPT_fno_openmp, false))
3859 switch (getOpenMPRuntime(getToolChain(), Args)) {
3860 case OMPRT_OMP:
3861 case OMPRT_IOMP5:
3862 // Clang can generate useful OpenMP code for these two runtime libraries.
3863 CmdArgs.push_back("-fopenmp");
3864 break;
3865 default:
3866 // By default, if Clang doesn't know how to generate useful OpenMP code
3867 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3868 // down to the actual compilation.
3869 // FIXME: It would be better to have a mode which *only* omits IR
3870 // generation based on the OpenMP support so that we get consistent
3871 // semantic analysis, etc.
3872 break;
3873 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003874
Peter Collingbourne32701642013-11-01 18:16:25 +00003875 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3876 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003877
Eric Christopher459d2712013-02-19 06:16:53 +00003878 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003879 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3880 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3881 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3882 Arch == llvm::Triple::ppc64le))
3883 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3884 << "ppc/ppc64/ppc64le";
3885 }
Chad Rosier864dfe12012-03-13 23:45:51 +00003886
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003887 if (getToolChain().SupportsProfiling())
3888 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003889
3890 // -flax-vector-conversions is default.
3891 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3892 options::OPT_fno_lax_vector_conversions))
3893 CmdArgs.push_back("-fno-lax-vector-conversions");
3894
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003895 if (Args.getLastArg(options::OPT_fapple_kext))
3896 CmdArgs.push_back("-fapple-kext");
3897
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003898 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003899 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003900 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003901 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3902 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003903
3904 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3905 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003906 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003907 }
3908
Bob Wilson14adb362012-02-03 06:27:22 +00003909 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003910
Chandler Carruth6e501032011-03-27 00:04:55 +00003911 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3912 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3913 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3914 options::OPT_fno_wrapv)) {
3915 if (A->getOption().matches(options::OPT_fwrapv))
3916 CmdArgs.push_back("-fwrapv");
3917 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3918 options::OPT_fno_strict_overflow)) {
3919 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3920 CmdArgs.push_back("-fwrapv");
3921 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003922
3923 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3924 options::OPT_fno_reroll_loops))
3925 if (A->getOption().matches(options::OPT_freroll_loops))
3926 CmdArgs.push_back("-freroll-loops");
3927
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003928 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003929 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3930 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003931
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003932 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3933
Mahesha S6a682be42012-10-27 07:47:56 +00003934
Daniel Dunbar4930e332009-11-17 08:07:36 +00003935 // -stack-protector=0 is default.
3936 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003937 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3938 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003939 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003940 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003941 if (A->getOption().matches(options::OPT_fstack_protector)) {
3942 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3943 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3944 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003945 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003946 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003947 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003948 } else {
3949 StackProtectorLevel =
3950 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3951 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003952 if (StackProtectorLevel) {
3953 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003954 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003955 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003956
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003957 // --param ssp-buffer-size=
3958 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3959 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003960 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003961 if (Str.startswith("ssp-buffer-size=")) {
3962 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003963 CmdArgs.push_back("-stack-protector-buffer-size");
3964 // FIXME: Verify the argument is a valid integer.
3965 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003966 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003967 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003968 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003969 }
3970
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003971 // Translate -mstackrealign
3972 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3973 false)) {
3974 CmdArgs.push_back("-backend-option");
3975 CmdArgs.push_back("-force-align-stack");
3976 }
3977 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3978 false)) {
3979 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3980 }
3981
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003982 if (Args.hasArg(options::OPT_mstack_alignment)) {
3983 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3984 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003985 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003986
Hans Wennborg77dc2362015-01-20 19:45:50 +00003987 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3988 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3989
3990 if (!Size.empty())
3991 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3992 else
3993 CmdArgs.push_back("-mstack-probe-size=0");
3994 }
3995
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003996 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
3997 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003998 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3999
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004000 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4001 options::OPT_mno_restrict_it)) {
4002 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4003 CmdArgs.push_back("-backend-option");
4004 CmdArgs.push_back("-arm-restrict-it");
4005 } else {
4006 CmdArgs.push_back("-backend-option");
4007 CmdArgs.push_back("-arm-no-restrict-it");
4008 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004009 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4010 TT.getArch() == llvm::Triple::thumb)) {
4011 // Windows on ARM expects restricted IT blocks
4012 CmdArgs.push_back("-backend-option");
4013 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004014 }
4015
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004016 if (TT.getArch() == llvm::Triple::arm ||
4017 TT.getArch() == llvm::Triple::thumb) {
4018 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
4019 options::OPT_mno_long_calls)) {
4020 if (A->getOption().matches(options::OPT_mlong_calls)) {
4021 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00004022 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004023 }
4024 }
4025 }
4026
Daniel Dunbard18049a2009-04-07 21:16:11 +00004027 // Forward -f options with positive and negative forms; we translate
4028 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004029 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4030 StringRef fname = A->getValue();
4031 if (!llvm::sys::fs::exists(fname))
4032 D.Diag(diag::err_drv_no_such_file) << fname;
4033 else
4034 A->render(Args, CmdArgs);
4035 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004036
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004037 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004038 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004039 CmdArgs.push_back("-fapple-kext");
4040 if (!Args.hasArg(options::OPT_fbuiltin))
4041 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004042 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004043 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004044 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004045 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004046 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004047
Nuno Lopes13c88c72009-12-16 16:59:22 +00004048 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4049 options::OPT_fno_assume_sane_operator_new))
4050 CmdArgs.push_back("-fno-assume-sane-operator-new");
4051
Daniel Dunbar4930e332009-11-17 08:07:36 +00004052 // -fblocks=0 is default.
4053 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004054 getToolChain().IsBlocksDefault()) ||
4055 (Args.hasArg(options::OPT_fgnu_runtime) &&
4056 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4057 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004058 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004059
4060 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
4061 !getToolChain().hasBlocksRuntime())
4062 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004063 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004064
Richard Smithffb65082014-09-30 23:10:19 +00004065 // -fmodules enables modules (off by default).
4066 // Users can pass -fno-cxx-modules to turn off modules support for
4067 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004068 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004069 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
4070 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4071 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004072 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004073 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004074 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004075 HaveModules = true;
4076 }
4077 }
4078
Daniel Jasper07e6c402013-08-05 20:26:17 +00004079 // -fmodule-maps enables module map processing (off by default) for header
4080 // checking. It is implied by -fmodules.
4081 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4082 false)) {
4083 CmdArgs.push_back("-fmodule-maps");
4084 }
4085
Daniel Jasperac42b752013-10-21 06:34:34 +00004086 // -fmodules-decluse checks that modules used are declared so (off by
4087 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004088 if (Args.hasFlag(options::OPT_fmodules_decluse,
4089 options::OPT_fno_modules_decluse,
4090 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004091 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004092 }
4093
Daniel Jasper962b38e2014-04-11 11:47:45 +00004094 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4095 // all #included headers are part of modules.
4096 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4097 options::OPT_fno_modules_strict_decluse,
4098 false)) {
4099 CmdArgs.push_back("-fmodules-strict-decluse");
4100 }
4101
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004102 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4103 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4104 options::OPT_fno_implicit_modules)) {
4105 CmdArgs.push_back("-fno-implicit-modules");
4106 }
4107
Daniel Jasperac42b752013-10-21 06:34:34 +00004108 // -fmodule-name specifies the module that is currently being built (or
4109 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004110 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004111
Richard Smith9887d792014-10-17 01:42:53 +00004112 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004113 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004114 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004115
Richard Smithe842a472014-10-22 02:05:46 +00004116 // -fmodule-file can be used to specify files containing precompiled modules.
4117 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4118
4119 // -fmodule-cache-path specifies where our implicitly-built module files
4120 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004121 SmallString<128> ModuleCachePath;
4122 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4123 ModuleCachePath = A->getValue();
4124 if (HaveModules) {
4125 if (C.isForDiagnostics()) {
4126 // When generating crash reports, we want to emit the modules along with
4127 // the reproduction sources, so we ignore any provided module path.
4128 ModuleCachePath = Output.getFilename();
4129 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4130 llvm::sys::path::append(ModuleCachePath, "modules");
4131 } else if (ModuleCachePath.empty()) {
4132 // No module path was provided: use the default.
4133 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4134 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004135 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4136 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004137 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4138 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004139 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004140 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4141 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4142 }
4143
4144 // When building modules and generating crashdumps, we need to dump a module
4145 // dependency VFS alongside the output.
4146 if (HaveModules && C.isForDiagnostics()) {
4147 SmallString<128> VFSDir(Output.getFilename());
4148 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004149 // Add the cache directory as a temp so the crash diagnostics pick it up.
4150 C.addTempFile(Args.MakeArgString(VFSDir));
4151
Justin Bognera88f0122014-06-20 22:59:50 +00004152 llvm::sys::path::append(VFSDir, "vfs");
4153 CmdArgs.push_back("-module-dependency-dir");
4154 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004155 }
4156
Richard Smith9887d792014-10-17 01:42:53 +00004157 if (HaveModules)
4158 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004159
Douglas Gregor35b04d62013-02-07 19:01:24 +00004160 // Pass through all -fmodules-ignore-macro arguments.
4161 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004162 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4163 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004164
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004165 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4166
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004167 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4168 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4169 D.Diag(diag::err_drv_argument_not_allowed_with)
4170 << A->getAsString(Args) << "-fbuild-session-timestamp";
4171
4172 llvm::sys::fs::file_status Status;
4173 if (llvm::sys::fs::status(A->getValue(), Status))
4174 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004175 CmdArgs.push_back(Args.MakeArgString(
4176 "-fbuild-session-timestamp=" +
4177 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004178 }
4179
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004180 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004181 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4182 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004183 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4184
4185 Args.AddLastArg(CmdArgs,
4186 options::OPT_fmodules_validate_once_per_build_session);
4187 }
4188
Ben Langmuirdcf73862014-03-12 00:06:17 +00004189 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4190
John McCalldfea9982010-04-09 19:12:06 +00004191 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004192 if (Args.hasFlag(options::OPT_fno_access_control,
4193 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004194 false))
John McCall3155f572010-04-09 19:03:51 +00004195 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004196
Anders Carlssond470fef2010-11-21 00:09:52 +00004197 // -felide-constructors is the default.
4198 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4199 options::OPT_felide_constructors,
4200 false))
4201 CmdArgs.push_back("-fno-elide-constructors");
4202
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004203 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004204
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004205 if (KernelOrKext || (types::isCXX(InputType) &&
4206 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4207 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004208 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004209
Tony Linthicum76329bf2011-12-12 21:14:55 +00004210 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004211 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004212 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004213 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004214 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004215 CmdArgs.push_back("-fshort-enums");
4216
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004217 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004218 if (Arg *A = Args.getLastArg(
4219 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4220 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4221 if (A->getOption().matches(options::OPT_funsigned_char) ||
4222 A->getOption().matches(options::OPT_fno_signed_char)) {
4223 CmdArgs.push_back("-fno-signed-char");
4224 }
4225 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004226 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004227 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004228
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004229 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004230 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4231 options::OPT_fno_use_cxa_atexit,
4232 !IsWindowsCygnus && !IsWindowsGNU &&
4233 getToolChain().getArch() != llvm::Triple::hexagon &&
4234 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004235 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004236 CmdArgs.push_back("-fno-use-cxa-atexit");
4237
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004238 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004239 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004240 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004241 CmdArgs.push_back("-fms-extensions");
4242
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004243 // -fno-use-line-directives is default.
4244 if (Args.hasFlag(options::OPT_fuse_line_directives,
4245 options::OPT_fno_use_line_directives, false))
4246 CmdArgs.push_back("-fuse-line-directives");
4247
Francois Pichet1b4f1632011-09-17 04:32:15 +00004248 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004249 if (Args.hasFlag(options::OPT_fms_compatibility,
4250 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004251 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4252 options::OPT_fno_ms_extensions,
4253 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004254 CmdArgs.push_back("-fms-compatibility");
4255
David Majnemerc371ff02015-03-22 08:39:22 +00004256 // -fms-compatibility-version=18.00 is default.
4257 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004258 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004259 IsWindowsMSVC) ||
4260 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004261 Args.hasArg(options::OPT_fms_compatibility_version)) {
4262 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4263 const Arg *MSCompatibilityVersion =
4264 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004265
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004266 if (MSCVersion && MSCompatibilityVersion)
4267 D.Diag(diag::err_drv_argument_not_allowed_with)
4268 << MSCVersion->getAsString(Args)
4269 << MSCompatibilityVersion->getAsString(Args);
4270
David Majnemerc371ff02015-03-22 08:39:22 +00004271 if (MSCompatibilityVersion) {
4272 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4273 D.Diag(diag::err_drv_invalid_value)
4274 << MSCompatibilityVersion->getAsString(Args)
4275 << MSCompatibilityVersion->getValue();
4276 } else if (MSCVersion) {
4277 unsigned Version = 0;
4278 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4279 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4280 << MSCVersion->getValue();
4281 MSVT = getMSCompatibilityVersion(Version);
4282 } else {
4283 MSVT = VersionTuple(18);
4284 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004285
David Majnemerc371ff02015-03-22 08:39:22 +00004286 CmdArgs.push_back(
4287 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004288 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004289
David Majnemer8db91762015-05-18 04:49:30 +00004290 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4291 if (ImplyVCPPCXXVer) {
4292 if (IsMSVC2015Compatible)
4293 CmdArgs.push_back("-std=c++14");
4294 else
4295 CmdArgs.push_back("-std=c++11");
4296 }
4297
Eric Christopher5ecce122013-02-18 00:38:31 +00004298 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004299 if (Args.hasFlag(options::OPT_fborland_extensions,
4300 options::OPT_fno_borland_extensions, false))
4301 CmdArgs.push_back("-fborland-extensions");
4302
David Majnemerc371ff02015-03-22 08:39:22 +00004303 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4304 // than 19.
4305 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4306 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004307 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004308 CmdArgs.push_back("-fno-threadsafe-statics");
4309
Francois Pichet02744872011-09-01 16:38:08 +00004310 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4311 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004312 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004313 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004314 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004315
Chandler Carruthe03aa552010-04-17 20:17:31 +00004316 // -fgnu-keywords default varies depending on language; only pass if
4317 // specified.
4318 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004319 options::OPT_fno_gnu_keywords))
4320 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004321
Rafael Espindola922a6242011-06-02 17:30:53 +00004322 if (Args.hasFlag(options::OPT_fgnu89_inline,
4323 options::OPT_fno_gnu89_inline,
4324 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004325 CmdArgs.push_back("-fgnu89-inline");
4326
Chad Rosier9c76d242012-03-15 22:31:42 +00004327 if (Args.hasArg(options::OPT_fno_inline))
4328 CmdArgs.push_back("-fno-inline");
4329
Chad Rosier64d6be92012-03-06 21:17:19 +00004330 if (Args.hasArg(options::OPT_fno_inline_functions))
4331 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004332
John McCall5fb5df92012-06-20 06:18:46 +00004333 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004334
John McCall5fb5df92012-06-20 06:18:46 +00004335 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004336 // legacy is the default. Except for deployment taget of 10.5,
4337 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4338 // gets ignored silently.
4339 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004340 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4341 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004342 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004343 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004344 if (getToolChain().UseObjCMixedDispatch())
4345 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4346 else
4347 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4348 }
4349 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004350
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004351 // When ObjectiveC legacy runtime is in effect on MacOSX,
4352 // turn on the option to do Array/Dictionary subscripting
4353 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004354 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004355 getToolChain().getTriple().isMacOSX() &&
4356 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4357 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004358 objcRuntime.isNeXTFamily())
4359 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4360
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004361 // -fencode-extended-block-signature=1 is default.
4362 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4363 CmdArgs.push_back("-fencode-extended-block-signature");
4364 }
4365
John McCall24fc0de2011-07-06 00:26:06 +00004366 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4367 // NOTE: This logic is duplicated in ToolChains.cpp.
4368 bool ARC = isObjCAutoRefCount(Args);
4369 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004370 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004371
John McCall24fc0de2011-07-06 00:26:06 +00004372 CmdArgs.push_back("-fobjc-arc");
4373
Chandler Carruth491db322011-11-04 07:34:47 +00004374 // FIXME: It seems like this entire block, and several around it should be
4375 // wrapped in isObjC, but for now we just use it here as this is where it
4376 // was being used previously.
4377 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4378 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4379 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4380 else
4381 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4382 }
4383
John McCall24fc0de2011-07-06 00:26:06 +00004384 // Allow the user to enable full exceptions code emission.
4385 // We define off for Objective-CC, on for Objective-C++.
4386 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4387 options::OPT_fno_objc_arc_exceptions,
4388 /*default*/ types::isCXX(InputType)))
4389 CmdArgs.push_back("-fobjc-arc-exceptions");
4390 }
4391
4392 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4393 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004394 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004395 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004396
John McCall24fc0de2011-07-06 00:26:06 +00004397 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4398 // takes precedence.
4399 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4400 if (!GCArg)
4401 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4402 if (GCArg) {
4403 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004404 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004405 << GCArg->getAsString(Args);
4406 } else if (getToolChain().SupportsObjCGC()) {
4407 GCArg->render(Args, CmdArgs);
4408 } else {
4409 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004410 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004411 << GCArg->getAsString(Args);
4412 }
4413 }
4414
Bob Wilsonb111ec92015-03-02 19:01:14 +00004415 if (Args.hasFlag(options::OPT_fapplication_extension,
4416 options::OPT_fno_application_extension, false))
4417 CmdArgs.push_back("-fapplication-extension");
4418
Reid Klecknerc542d372014-06-27 17:02:02 +00004419 // Handle GCC-style exception args.
4420 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004421 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004422 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004423
4424 if (getToolChain().UseSjLjExceptions())
4425 CmdArgs.push_back("-fsjlj-exceptions");
4426
4427 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004428 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4429 options::OPT_fno_assume_sane_operator_new))
4430 CmdArgs.push_back("-fno-assume-sane-operator-new");
4431
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004432 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4433 // most platforms.
4434 if (Args.hasFlag(options::OPT_fsized_deallocation,
4435 options::OPT_fno_sized_deallocation, false))
4436 CmdArgs.push_back("-fsized-deallocation");
4437
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004438 // -fconstant-cfstrings is default, and may be subject to argument translation
4439 // on Darwin.
4440 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4441 options::OPT_fno_constant_cfstrings) ||
4442 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4443 options::OPT_mno_constant_cfstrings))
4444 CmdArgs.push_back("-fno-constant-cfstrings");
4445
John Thompsoned4e2952009-11-05 20:14:16 +00004446 // -fshort-wchar default varies depending on platform; only
4447 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004448 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4449 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004450 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004451
Hans Wennborg28c96312013-07-31 23:39:13 +00004452 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004453 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004454 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004455 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004456 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004457
Daniel Dunbar096ed292011-10-05 21:04:55 +00004458 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4459 // -fno-pack-struct doesn't apply to -fpack-struct=.
4460 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004461 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004462 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004463 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004464 } else if (Args.hasFlag(options::OPT_fpack_struct,
4465 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004466 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004467 }
4468
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004469 // Handle -fmax-type-align=N and -fno-type-align
4470 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4471 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4472 if (!SkipMaxTypeAlign) {
4473 std::string MaxTypeAlignStr = "-fmax-type-align=";
4474 MaxTypeAlignStr += A->getValue();
4475 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4476 }
4477 } else if (getToolChain().getTriple().isOSDarwin()) {
4478 if (!SkipMaxTypeAlign) {
4479 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4480 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4481 }
4482 }
4483
Robert Lytton0e076492013-08-13 09:43:10 +00004484 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004485 if (!Args.hasArg(options::OPT_fcommon))
4486 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004487 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004488 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004489
Daniel Dunbard18049a2009-04-07 21:16:11 +00004490 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004491 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004492 CmdArgs.push_back("-fno-common");
4493
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004494 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004495 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004496 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004497 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004498 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004499 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4500
Daniel Dunbar6358d682010-10-15 22:30:42 +00004501 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4502 if (!Args.hasFlag(options::OPT_ffor_scope,
4503 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004504 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004505 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4506
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004507 // -finput_charset=UTF-8 is default. Reject others
4508 if (Arg *inputCharset = Args.getLastArg(
4509 options::OPT_finput_charset_EQ)) {
4510 StringRef value = inputCharset->getValue();
4511 if (value != "UTF-8")
4512 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4513 }
4514
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004515 // -fexec_charset=UTF-8 is default. Reject others
4516 if (Arg *execCharset = Args.getLastArg(
4517 options::OPT_fexec_charset_EQ)) {
4518 StringRef value = execCharset->getValue();
4519 if (value != "UTF-8")
4520 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4521 }
4522
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004523 // -fcaret-diagnostics is default.
4524 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4525 options::OPT_fno_caret_diagnostics, true))
4526 CmdArgs.push_back("-fno-caret-diagnostics");
4527
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004528 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004529 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004530 options::OPT_fno_diagnostics_fixit_info))
4531 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004532
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004533 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004534 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004535 options::OPT_fno_diagnostics_show_option))
4536 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004537
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004538 if (const Arg *A =
4539 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4540 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004541 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004542 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004543
Douglas Gregor643c9222011-05-21 17:07:29 +00004544 if (const Arg *A =
4545 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4546 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004547 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004548 }
4549
Chandler Carruthb6766f02011-03-27 01:50:55 +00004550 if (Arg *A = Args.getLastArg(
4551 options::OPT_fdiagnostics_show_note_include_stack,
4552 options::OPT_fno_diagnostics_show_note_include_stack)) {
4553 if (A->getOption().matches(
4554 options::OPT_fdiagnostics_show_note_include_stack))
4555 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4556 else
4557 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4558 }
4559
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004560 // Color diagnostics are the default, unless the terminal doesn't support
4561 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004562 // Support both clang's -f[no-]color-diagnostics and gcc's
4563 // -f[no-]diagnostics-colors[=never|always|auto].
4564 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004565 for (const auto &Arg : Args) {
4566 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004567 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4568 !O.matches(options::OPT_fdiagnostics_color) &&
4569 !O.matches(options::OPT_fno_color_diagnostics) &&
4570 !O.matches(options::OPT_fno_diagnostics_color) &&
4571 !O.matches(options::OPT_fdiagnostics_color_EQ))
4572 continue;
4573
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004574 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004575 if (O.matches(options::OPT_fcolor_diagnostics) ||
4576 O.matches(options::OPT_fdiagnostics_color)) {
4577 ShowColors = Colors_On;
4578 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4579 O.matches(options::OPT_fno_diagnostics_color)) {
4580 ShowColors = Colors_Off;
4581 } else {
4582 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004583 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004584 if (value == "always")
4585 ShowColors = Colors_On;
4586 else if (value == "never")
4587 ShowColors = Colors_Off;
4588 else if (value == "auto")
4589 ShowColors = Colors_Auto;
4590 else
4591 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4592 << ("-fdiagnostics-color=" + value).str();
4593 }
4594 }
4595 if (ShowColors == Colors_On ||
4596 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004597 CmdArgs.push_back("-fcolor-diagnostics");
4598
Nico Rieck7857d462013-09-11 00:38:02 +00004599 if (Args.hasArg(options::OPT_fansi_escape_codes))
4600 CmdArgs.push_back("-fansi-escape-codes");
4601
Daniel Dunbardb097022009-06-08 21:13:54 +00004602 if (!Args.hasFlag(options::OPT_fshow_source_location,
4603 options::OPT_fno_show_source_location))
4604 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004605
Douglas Gregor643c9222011-05-21 17:07:29 +00004606 if (!Args.hasFlag(options::OPT_fshow_column,
4607 options::OPT_fno_show_column,
4608 true))
4609 CmdArgs.push_back("-fno-show-column");
4610
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004611 if (!Args.hasFlag(options::OPT_fspell_checking,
4612 options::OPT_fno_spell_checking))
4613 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004614
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004615
Chad Rosierc8e56e82012-12-05 21:08:21 +00004616 // -fno-asm-blocks is default.
4617 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4618 false))
4619 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004620
Steven Wucb0d13f2015-01-16 23:05:28 +00004621 // -fgnu-inline-asm is default.
4622 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4623 options::OPT_fno_gnu_inline_asm, true))
4624 CmdArgs.push_back("-fno-gnu-inline-asm");
4625
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004626 // Enable vectorization per default according to the optimization level
4627 // selected. For optimization levels that want vectorization we use the alias
4628 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004629 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004630 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004631 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004632 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004633 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004634 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004635
Chad Rosier136d67d2014-04-28 19:30:57 +00004636 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004637 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4638 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004639 options::OPT_fslp_vectorize;
4640 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004641 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004642 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004643
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004644 // -fno-slp-vectorize-aggressive is default.
4645 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004646 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004647 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004648
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004649 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4650 A->render(Args, CmdArgs);
4651
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004652 // -fdollars-in-identifiers default varies depending on platform and
4653 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004654 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004655 options::OPT_fno_dollars_in_identifiers)) {
4656 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004657 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004658 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004659 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004660 }
4661
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004662 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4663 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004664 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004665 options::OPT_fno_unit_at_a_time)) {
4666 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004667 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004668 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004669
Eli Friedman055c9702011-11-02 01:53:16 +00004670 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4671 options::OPT_fno_apple_pragma_pack, false))
4672 CmdArgs.push_back("-fapple-pragma-pack");
4673
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004674 // le32-specific flags:
4675 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4676 // by default.
4677 if (getToolChain().getArch() == llvm::Triple::le32) {
4678 CmdArgs.push_back("-fno-math-builtin");
4679 }
4680
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004681 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004682 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004683 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004684#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004685 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004686 (getToolChain().getArch() == llvm::Triple::arm ||
4687 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004688 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4689 CmdArgs.push_back("-fno-builtin-strcat");
4690 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4691 CmdArgs.push_back("-fno-builtin-strcpy");
4692 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004693#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004694
Justin Bognera88f0122014-06-20 22:59:50 +00004695 // Enable rewrite includes if the user's asked for it or if we're generating
4696 // diagnostics.
4697 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4698 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004699 if (Args.hasFlag(options::OPT_frewrite_includes,
4700 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004701 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004702 CmdArgs.push_back("-frewrite-includes");
4703
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004704 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004705 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004706 options::OPT_traditional_cpp)) {
4707 if (isa<PreprocessJobAction>(JA))
4708 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004709 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004710 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004711 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004712
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004713 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004714 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004715
4716 // Handle serialized diagnostics.
4717 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4718 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004719 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004720 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004721
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004722 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4723 CmdArgs.push_back("-fretain-comments-from-system-headers");
4724
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004725 // Forward -fcomment-block-commands to -cc1.
4726 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004727 // Forward -fparse-all-comments to -cc1.
4728 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004729
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004730 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4731 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004732 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004733 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004734 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4735 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004736 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004737
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004738 // We translate this by hand to the -cc1 argument, since nightly test uses
4739 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004740 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004741 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004742 OptDisabled = true;
4743 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004744 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004745 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004746
Bob Wilson23a55f12014-12-21 07:00:00 +00004747 // With -save-temps, we want to save the unoptimized bitcode output from the
4748 // CompileJobAction, so disable optimizations if they are not already
4749 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004750 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004751 isa<CompileJobAction>(JA))
4752 CmdArgs.push_back("-disable-llvm-optzns");
4753
Daniel Dunbard67a3222009-03-30 06:36:42 +00004754 if (Output.getType() == types::TY_Dependencies) {
4755 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004756 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004757 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004758 CmdArgs.push_back(Output.getFilename());
4759 } else {
4760 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004761 }
4762
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004763 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004764 addDashXForInput(Args, II, CmdArgs);
4765
Daniel Dunbarb440f562010-08-02 02:38:21 +00004766 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004767 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004768 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004769 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004770 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004771
Chris Lattnere9d7d782009-11-03 19:50:27 +00004772 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4773
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004774 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004775
4776 // Optionally embed the -cc1 level arguments into the debug info, for build
4777 // analysis.
4778 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004779 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004780 for (const auto &Arg : Args)
4781 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004782
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004783 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004784 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004785 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004786 SmallString<128> EscapedArg;
4787 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004788 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004789 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004790 }
4791 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004792 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004793 }
4794
Eric Christopherd3804002013-02-22 20:12:52 +00004795 // Add the split debug info name to the command lines here so we
4796 // can propagate it to the backend.
4797 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004798 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004799 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4800 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004801 const char *SplitDwarfOut;
4802 if (SplitDwarf) {
4803 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004804 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004805 CmdArgs.push_back(SplitDwarfOut);
4806 }
4807
4808 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004809 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004810 Output.getType() == types::TY_Object &&
4811 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004812 auto CLCommand =
4813 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4814 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4815 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004816 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004817 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004818 }
4819
Daniel Dunbar17731772009-03-23 19:03:36 +00004820
Eric Christopherf1545832013-02-22 23:50:16 +00004821 // Handle the debug info splitting at object creation time if we're
4822 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004823 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004824 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004825 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004826
Roman Divacky178e01602011-02-10 16:52:03 +00004827 if (Arg *A = Args.getLastArg(options::OPT_pg))
4828 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004829 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004830 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004831
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004832 // Claim some arguments which clang supports automatically.
4833
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004834 // -fpch-preprocess is used with gcc to add a special marker in the output to
4835 // include the PCH file. Clang's PTH solution is completely transparent, so we
4836 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004837 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004838
Daniel Dunbar17731772009-03-23 19:03:36 +00004839 // Claim some arguments which clang doesn't support, but we don't
4840 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004841 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4842 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004843
Rafael Espindolab0092d72013-09-04 19:37:35 +00004844 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004845 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004846}
4847
John McCall5fb5df92012-06-20 06:18:46 +00004848/// Add options related to the Objective-C runtime/ABI.
4849///
4850/// Returns true if the runtime is non-fragile.
4851ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4852 ArgStringList &cmdArgs,
4853 RewriteKind rewriteKind) const {
4854 // Look for the controlling runtime option.
4855 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4856 options::OPT_fgnu_runtime,
4857 options::OPT_fobjc_runtime_EQ);
4858
4859 // Just forward -fobjc-runtime= to the frontend. This supercedes
4860 // options about fragility.
4861 if (runtimeArg &&
4862 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4863 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004864 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004865 if (runtime.tryParse(value)) {
4866 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4867 << value;
4868 }
4869
4870 runtimeArg->render(args, cmdArgs);
4871 return runtime;
4872 }
4873
4874 // Otherwise, we'll need the ABI "version". Version numbers are
4875 // slightly confusing for historical reasons:
4876 // 1 - Traditional "fragile" ABI
4877 // 2 - Non-fragile ABI, version 1
4878 // 3 - Non-fragile ABI, version 2
4879 unsigned objcABIVersion = 1;
4880 // If -fobjc-abi-version= is present, use that to set the version.
4881 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004882 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004883 if (value == "1")
4884 objcABIVersion = 1;
4885 else if (value == "2")
4886 objcABIVersion = 2;
4887 else if (value == "3")
4888 objcABIVersion = 3;
4889 else
4890 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4891 << value;
4892 } else {
4893 // Otherwise, determine if we are using the non-fragile ABI.
4894 bool nonFragileABIIsDefault =
4895 (rewriteKind == RK_NonFragile ||
4896 (rewriteKind == RK_None &&
4897 getToolChain().IsObjCNonFragileABIDefault()));
4898 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4899 options::OPT_fno_objc_nonfragile_abi,
4900 nonFragileABIIsDefault)) {
4901 // Determine the non-fragile ABI version to use.
4902#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4903 unsigned nonFragileABIVersion = 1;
4904#else
4905 unsigned nonFragileABIVersion = 2;
4906#endif
4907
4908 if (Arg *abiArg = args.getLastArg(
4909 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004910 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004911 if (value == "1")
4912 nonFragileABIVersion = 1;
4913 else if (value == "2")
4914 nonFragileABIVersion = 2;
4915 else
4916 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4917 << value;
4918 }
4919
4920 objcABIVersion = 1 + nonFragileABIVersion;
4921 } else {
4922 objcABIVersion = 1;
4923 }
4924 }
4925
4926 // We don't actually care about the ABI version other than whether
4927 // it's non-fragile.
4928 bool isNonFragile = objcABIVersion != 1;
4929
4930 // If we have no runtime argument, ask the toolchain for its default runtime.
4931 // However, the rewriter only really supports the Mac runtime, so assume that.
4932 ObjCRuntime runtime;
4933 if (!runtimeArg) {
4934 switch (rewriteKind) {
4935 case RK_None:
4936 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4937 break;
4938 case RK_Fragile:
4939 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4940 break;
4941 case RK_NonFragile:
4942 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4943 break;
4944 }
4945
4946 // -fnext-runtime
4947 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4948 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004949 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004950 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4951
4952 // Otherwise, build for a generic macosx port.
4953 } else {
4954 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4955 }
4956
4957 // -fgnu-runtime
4958 } else {
4959 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004960 // Legacy behaviour is to target the gnustep runtime if we are i
4961 // non-fragile mode or the GCC runtime in fragile mode.
4962 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004963 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004964 else
4965 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004966 }
4967
4968 cmdArgs.push_back(args.MakeArgString(
4969 "-fobjc-runtime=" + runtime.getAsString()));
4970 return runtime;
4971}
4972
Reid Klecknerc542d372014-06-27 17:02:02 +00004973static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4974 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4975 I += HaveDash;
4976 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004977}
Reid Klecknerc542d372014-06-27 17:02:02 +00004978
4979struct EHFlags {
4980 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4981 bool Synch;
4982 bool Asynch;
4983 bool NoExceptC;
4984};
4985
4986/// /EH controls whether to run destructor cleanups when exceptions are
4987/// thrown. There are three modifiers:
4988/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4989/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4990/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4991/// - c: Assume that extern "C" functions are implicitly noexcept. This
4992/// modifier is an optimization, so we ignore it for now.
4993/// The default is /EHs-c-, meaning cleanups are disabled.
4994static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4995 EHFlags EH;
4996 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4997 for (auto EHVal : EHArgs) {
4998 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4999 switch (EHVal[I]) {
5000 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
5001 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
5002 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
5003 default: break;
5004 }
5005 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5006 break;
5007 }
5008 }
5009 return EH;
5010}
5011
Hans Wennborg75958c42013-08-08 00:17:41 +00005012void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5013 unsigned RTOptionID = options::OPT__SLASH_MT;
5014
Hans Wennborgf1a74252013-09-10 20:18:04 +00005015 if (Args.hasArg(options::OPT__SLASH_LDd))
5016 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5017 // but defining _DEBUG is sticky.
5018 RTOptionID = options::OPT__SLASH_MTd;
5019
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005020 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005021 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005022
Hans Wennborg75958c42013-08-08 00:17:41 +00005023 switch(RTOptionID) {
5024 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00005025 if (Args.hasArg(options::OPT__SLASH_LDd))
5026 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00005027 CmdArgs.push_back("-D_MT");
5028 CmdArgs.push_back("-D_DLL");
5029 CmdArgs.push_back("--dependent-lib=msvcrt");
5030 break;
5031 case options::OPT__SLASH_MDd:
5032 CmdArgs.push_back("-D_DEBUG");
5033 CmdArgs.push_back("-D_MT");
5034 CmdArgs.push_back("-D_DLL");
5035 CmdArgs.push_back("--dependent-lib=msvcrtd");
5036 break;
5037 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00005038 if (Args.hasArg(options::OPT__SLASH_LDd))
5039 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00005040 CmdArgs.push_back("-D_MT");
5041 CmdArgs.push_back("--dependent-lib=libcmt");
5042 break;
5043 case options::OPT__SLASH_MTd:
5044 CmdArgs.push_back("-D_DEBUG");
5045 CmdArgs.push_back("-D_MT");
5046 CmdArgs.push_back("--dependent-lib=libcmtd");
5047 break;
5048 default:
5049 llvm_unreachable("Unexpected option ID.");
5050 }
5051
Reid Kleckner6beca0e2013-08-08 19:33:10 +00005052 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5053 // users want. The /Za flag to cl.exe turns this off, but it's not
5054 // implemented in clang.
5055 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00005056
Hans Wennborg8858a032014-07-21 23:42:07 +00005057 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5058 // would produce interleaved output, so ignore /showIncludes in such cases.
5059 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5060 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5061 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005062
David Majnemerf6072342014-07-01 22:24:56 +00005063 // This controls whether or not we emit RTTI data for polymorphic types.
5064 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5065 /*default=*/false))
5066 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005067
Reid Klecknerc542d372014-06-27 17:02:02 +00005068 const Driver &D = getToolChain().getDriver();
5069 EHFlags EH = parseClangCLEHFlags(D, Args);
5070 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005071 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005072 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005073 CmdArgs.push_back("-fexceptions");
5074 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005075
Hans Wennborge50cec32014-06-13 20:59:54 +00005076 // /EP should expand to -E -P.
5077 if (Args.hasArg(options::OPT__SLASH_EP)) {
5078 CmdArgs.push_back("-E");
5079 CmdArgs.push_back("-P");
5080 }
5081
David Majnemera5b195a2015-02-14 01:35:12 +00005082 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005083 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5084 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005085 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5086 else
5087 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5088
5089 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5090 VolatileOptionID = A->getOption().getID();
5091
5092 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5093 CmdArgs.push_back("-fms-volatile");
5094
David Majnemer86c318f2014-02-11 21:05:00 +00005095 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5096 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5097 if (MostGeneralArg && BestCaseArg)
5098 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5099 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5100
5101 if (MostGeneralArg) {
5102 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5103 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5104 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5105
5106 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5107 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5108 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5109 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5110 << FirstConflict->getAsString(Args)
5111 << SecondConflict->getAsString(Args);
5112
5113 if (SingleArg)
5114 CmdArgs.push_back("-fms-memptr-rep=single");
5115 else if (MultipleArg)
5116 CmdArgs.push_back("-fms-memptr-rep=multiple");
5117 else
5118 CmdArgs.push_back("-fms-memptr-rep=virtual");
5119 }
5120
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005121 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5122 A->render(Args, CmdArgs);
5123
Hans Wennborg81f74482013-09-10 01:07:07 +00005124 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5125 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005126 if (Args.hasArg(options::OPT__SLASH_fallback))
5127 CmdArgs.push_back("msvc-fallback");
5128 else
5129 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005130 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005131}
5132
Hans Wennborg1da044a2014-06-26 19:59:02 +00005133visualstudio::Compile *Clang::getCLFallback() const {
5134 if (!CLFallback)
5135 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5136 return CLFallback.get();
5137}
5138
Daniel Sanders7f933f42015-01-30 17:35:23 +00005139void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5140 ArgStringList &CmdArgs) const {
5141 StringRef CPUName;
5142 StringRef ABIName;
5143 const llvm::Triple &Triple = getToolChain().getTriple();
5144 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5145
5146 CmdArgs.push_back("-target-abi");
5147 CmdArgs.push_back(ABIName.data());
5148}
5149
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005150void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005151 const InputInfo &Output,
5152 const InputInfoList &Inputs,
5153 const ArgList &Args,
5154 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005155 ArgStringList CmdArgs;
5156
5157 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5158 const InputInfo &Input = Inputs[0];
5159
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005160 // Don't warn about "clang -w -c foo.s"
5161 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005162 // and "clang -emit-llvm -c foo.s"
5163 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005164
Rafael Espindola577637a2015-01-03 00:06:04 +00005165 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005166
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005167 // Invoke ourselves in -cc1as mode.
5168 //
5169 // FIXME: Implement custom jobs for internal actions.
5170 CmdArgs.push_back("-cc1as");
5171
5172 // Add the "effective" target triple.
5173 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005174 std::string TripleStr =
5175 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005176 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5177
5178 // Set the output mode, we currently only expect to be used as a real
5179 // assembler.
5180 CmdArgs.push_back("-filetype");
5181 CmdArgs.push_back("obj");
5182
Eric Christopher45f2e712012-12-18 00:31:10 +00005183 // Set the main file name, so that debug info works even with
5184 // -save-temps or preprocessed assembly.
5185 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005186 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005187
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005188 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005189 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005190 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005191 if (!CPU.empty()) {
5192 CmdArgs.push_back("-target-cpu");
5193 CmdArgs.push_back(Args.MakeArgString(CPU));
5194 }
5195
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005196 // Add the target features
5197 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005198 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005199
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005200 // Ignore explicit -force_cpusubtype_ALL option.
5201 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005202
Eric Christopherfc3ee562012-01-10 00:38:01 +00005203 // Determine the original source input.
5204 const Action *SourceAction = &JA;
5205 while (SourceAction->getKind() != Action::InputClass) {
5206 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5207 SourceAction = SourceAction->getInputs()[0];
5208 }
5209
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005210 // Forward -g and handle debug info related flags, assuming we are dealing
5211 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005212 if (SourceAction->getType() == types::TY_Asm ||
5213 SourceAction->getType() == types::TY_PP_Asm) {
5214 Args.ClaimAllArgs(options::OPT_g_Group);
5215 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5216 if (!A->getOption().matches(options::OPT_g0))
5217 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005218
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005219 if (Args.hasArg(options::OPT_gdwarf_2))
5220 CmdArgs.push_back("-gdwarf-2");
5221 if (Args.hasArg(options::OPT_gdwarf_3))
5222 CmdArgs.push_back("-gdwarf-3");
5223 if (Args.hasArg(options::OPT_gdwarf_4))
5224 CmdArgs.push_back("-gdwarf-4");
5225
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005226 // Add the -fdebug-compilation-dir flag if needed.
5227 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005228
5229 // Set the AT_producer to the clang version when using the integrated
5230 // assembler on assembly source files.
5231 CmdArgs.push_back("-dwarf-debug-producer");
5232 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005233 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005234
5235 // Optionally embed the -cc1as level arguments into the debug info, for build
5236 // analysis.
5237 if (getToolChain().UseDwarfDebugFlags()) {
5238 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005239 for (const auto &Arg : Args)
5240 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005241
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005242 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005243 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5244 Flags += Exec;
5245 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005246 SmallString<128> EscapedArg;
5247 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005248 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005249 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005250 }
5251 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005252 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005253 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005254
5255 // FIXME: Add -static support, once we have it.
5256
Daniel Sanders7f933f42015-01-30 17:35:23 +00005257 // Add target specific flags.
5258 switch(getToolChain().getArch()) {
5259 default:
5260 break;
5261
5262 case llvm::Triple::mips:
5263 case llvm::Triple::mipsel:
5264 case llvm::Triple::mips64:
5265 case llvm::Triple::mips64el:
5266 AddMIPSTargetArgs(Args, CmdArgs);
5267 break;
5268 }
5269
David Blaikie372d9502014-01-17 03:17:40 +00005270 // Consume all the warning flags. Usually this would be handled more
5271 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5272 // doesn't handle that so rather than warning about unused flags that are
5273 // actually used, we'll lie by omission instead.
5274 // FIXME: Stop lying and consume only the appropriate driver flags
5275 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5276 ie = Args.filtered_end();
5277 it != ie; ++it)
5278 (*it)->claim();
5279
David Blaikie9260ed62013-07-25 21:19:01 +00005280 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5281 getToolChain().getDriver());
5282
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005283 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005284
5285 assert(Output.isFilename() && "Unexpected lipo output.");
5286 CmdArgs.push_back("-o");
5287 CmdArgs.push_back(Output.getFilename());
5288
Daniel Dunbarb440f562010-08-02 02:38:21 +00005289 assert(Input.isFilename() && "Invalid input.");
5290 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005291
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005292 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005293 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005294
5295 // Handle the debug info splitting at object creation time if we're
5296 // creating an object.
5297 // TODO: Currently only works on linux with newer objcopy.
5298 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005299 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005300 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005301 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005302}
5303
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005304void GnuTool::anchor() {}
5305
Daniel Dunbara3246a02009-03-18 08:07:30 +00005306void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005307 const InputInfo &Output,
5308 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005309 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005310 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005311 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005312 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005313
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005314 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005315 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005316 // Don't forward any -g arguments to assembly steps.
5317 if (isa<AssembleJobAction>(JA) &&
5318 A->getOption().matches(options::OPT_g_Group))
5319 continue;
5320
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005321 // Don't forward any -W arguments to assembly and link steps.
5322 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5323 A->getOption().matches(options::OPT_W_Group))
5324 continue;
5325
Daniel Dunbar2da02722009-03-19 07:55:12 +00005326 // It is unfortunate that we have to claim here, as this means
5327 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005328 // platforms using a generic gcc, even if we are just using gcc
5329 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005330 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005331 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005332 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005333 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005334
Daniel Dunbar4e295052010-01-25 22:35:08 +00005335 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005336
5337 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005338 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005339 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005340 CmdArgs.push_back(
5341 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005342 }
5343
Daniel Dunbar5716d872009-05-02 21:41:52 +00005344 // Try to force gcc to match the tool chain we want, if we recognize
5345 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005346 //
5347 // FIXME: The triple class should directly provide the information we want
5348 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005349 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005350 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005351 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005352 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5353 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005354 CmdArgs.push_back("-m64");
5355
Daniel Dunbarb440f562010-08-02 02:38:21 +00005356 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005357 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005358 CmdArgs.push_back(Output.getFilename());
5359 } else {
5360 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005361 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005362 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005363
Tony Linthicum76329bf2011-12-12 21:14:55 +00005364 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5365 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005366
5367 // Only pass -x if gcc will understand it; otherwise hope gcc
5368 // understands the suffix correctly. The main use case this would go
5369 // wrong in is for linker inputs if they happened to have an odd
5370 // suffix; really the only way to get this to happen is a command
5371 // like '-x foobar a.c' which will treat a.c like a linker input.
5372 //
5373 // FIXME: For the linker case specifically, can we safely convert
5374 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005375 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005376 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005377 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5378 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005379 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005380 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005381 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005382 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005383 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005384 else if (II.getType() == types::TY_ModuleFile)
5385 D.Diag(diag::err_drv_no_module_support)
5386 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005387
Daniel Dunbara3246a02009-03-18 08:07:30 +00005388 if (types::canTypeBeUserSpecified(II.getType())) {
5389 CmdArgs.push_back("-x");
5390 CmdArgs.push_back(types::getTypeName(II.getType()));
5391 }
5392
Daniel Dunbarb440f562010-08-02 02:38:21 +00005393 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005394 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005395 else {
5396 const Arg &A = II.getInputArg();
5397
5398 // Reverse translate some rewritten options.
5399 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5400 CmdArgs.push_back("-lstdc++");
5401 continue;
5402 }
5403
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005404 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005405 A.render(Args, CmdArgs);
5406 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005407 }
5408
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005409 const std::string customGCCName = D.getCCCGenericGCCName();
5410 const char *GCCName;
5411 if (!customGCCName.empty())
5412 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005413 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005414 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005415 } else
5416 GCCName = "gcc";
5417
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005418 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005419 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005421}
5422
Daniel Dunbar4e295052010-01-25 22:35:08 +00005423void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5424 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005425 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005426}
5427
Daniel Dunbar4e295052010-01-25 22:35:08 +00005428void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5429 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005430 const Driver &D = getToolChain().getDriver();
5431
Eric Christophercc7ff502015-01-29 00:56:17 +00005432 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005433 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005434 case types::TY_LLVM_IR:
5435 case types::TY_LTO_IR:
5436 case types::TY_LLVM_BC:
5437 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005438 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005439 break;
5440 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005441 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005442 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005443 case types::TY_Nothing:
5444 CmdArgs.push_back("-fsyntax-only");
5445 break;
5446 default:
5447 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005448 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005449}
5450
Daniel Dunbar4e295052010-01-25 22:35:08 +00005451void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5452 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005453 // The types are (hopefully) good enough.
5454}
5455
Tony Linthicum76329bf2011-12-12 21:14:55 +00005456// Hexagon tools start.
5457void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5458 ArgStringList &CmdArgs) const {
5459
5460}
5461void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5462 const InputInfo &Output,
5463 const InputInfoList &Inputs,
5464 const ArgList &Args,
5465 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005466 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005467
5468 const Driver &D = getToolChain().getDriver();
5469 ArgStringList CmdArgs;
5470
5471 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005472 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005473 CmdArgs.push_back(Args.MakeArgString(MarchString));
5474
5475 RenderExtraToolArgs(JA, CmdArgs);
5476
5477 if (Output.isFilename()) {
5478 CmdArgs.push_back("-o");
5479 CmdArgs.push_back(Output.getFilename());
5480 } else {
5481 assert(Output.isNothing() && "Unexpected output");
5482 CmdArgs.push_back("-fsyntax-only");
5483 }
5484
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005485 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
5486 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005487
Matthew Curtise5df3812012-12-07 17:23:04 +00005488 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5489 options::OPT_Xassembler);
5490
Tony Linthicum76329bf2011-12-12 21:14:55 +00005491 // Only pass -x if gcc will understand it; otherwise hope gcc
5492 // understands the suffix correctly. The main use case this would go
5493 // wrong in is for linker inputs if they happened to have an odd
5494 // suffix; really the only way to get this to happen is a command
5495 // like '-x foobar a.c' which will treat a.c like a linker input.
5496 //
5497 // FIXME: For the linker case specifically, can we safely convert
5498 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005499 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005500 // Don't try to pass LLVM or AST inputs to a generic gcc.
5501 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5502 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5503 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5504 << getToolChain().getTripleString();
5505 else if (II.getType() == types::TY_AST)
5506 D.Diag(clang::diag::err_drv_no_ast_support)
5507 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005508 else if (II.getType() == types::TY_ModuleFile)
5509 D.Diag(diag::err_drv_no_module_support)
5510 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005511
5512 if (II.isFilename())
5513 CmdArgs.push_back(II.getFilename());
5514 else
5515 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5516 II.getInputArg().render(Args, CmdArgs);
5517 }
5518
5519 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005520 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005521 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005522}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005523
Tony Linthicum76329bf2011-12-12 21:14:55 +00005524void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5525 ArgStringList &CmdArgs) const {
5526 // The types are (hopefully) good enough.
5527}
5528
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005529static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5530 const toolchains::Hexagon_TC& ToolChain,
5531 const InputInfo &Output,
5532 const InputInfoList &Inputs,
5533 const ArgList &Args,
5534 ArgStringList &CmdArgs,
5535 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005536
Matthew Curtise689b052012-12-06 15:46:07 +00005537 const Driver &D = ToolChain.getDriver();
5538
Tony Linthicum76329bf2011-12-12 21:14:55 +00005539
Matthew Curtise689b052012-12-06 15:46:07 +00005540 //----------------------------------------------------------------------------
5541 //
5542 //----------------------------------------------------------------------------
5543 bool hasStaticArg = Args.hasArg(options::OPT_static);
5544 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005545 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005546 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5547 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5548 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005549 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005550 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005551
Matthew Curtise689b052012-12-06 15:46:07 +00005552 //----------------------------------------------------------------------------
5553 // Silence warnings for various options
5554 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005555
Matthew Curtise689b052012-12-06 15:46:07 +00005556 Args.ClaimAllArgs(options::OPT_g_Group);
5557 Args.ClaimAllArgs(options::OPT_emit_llvm);
5558 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5559 // handled somewhere else.
5560 Args.ClaimAllArgs(options::OPT_static_libgcc);
5561
5562 //----------------------------------------------------------------------------
5563 //
5564 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005565 for (const auto &Opt : ToolChain.ExtraOpts)
5566 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005567
Matthew Curtisf10a5952012-12-06 14:16:43 +00005568 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5569 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005570
Matthew Curtise689b052012-12-06 15:46:07 +00005571 if (buildingLib) {
5572 CmdArgs.push_back("-shared");
5573 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5574 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005575 }
5576
Matthew Curtise689b052012-12-06 15:46:07 +00005577 if (hasStaticArg)
5578 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005579
Matthew Curtise8f80a12012-12-06 17:49:03 +00005580 if (buildPIE && !buildingLib)
5581 CmdArgs.push_back("-pie");
5582
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005583 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
5584 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5585 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005586 }
5587
Matthew Curtise689b052012-12-06 15:46:07 +00005588 //----------------------------------------------------------------------------
5589 //
5590 //----------------------------------------------------------------------------
5591 CmdArgs.push_back("-o");
5592 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005593
Matthew Curtise689b052012-12-06 15:46:07 +00005594 const std::string MarchSuffix = "/" + MarchString;
5595 const std::string G0Suffix = "/G0";
5596 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005597 const std::string RootDir =
5598 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005599 const std::string StartFilesDir = RootDir
5600 + "hexagon/lib"
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005601 + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005602
5603 //----------------------------------------------------------------------------
5604 // moslib
5605 //----------------------------------------------------------------------------
5606 std::vector<std::string> oslibs;
5607 bool hasStandalone= false;
5608
5609 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5610 ie = Args.filtered_end(); it != ie; ++it) {
5611 (*it)->claim();
Benjamin Kramer3204b152015-05-29 19:42:19 +00005612 oslibs.emplace_back((*it)->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005613 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005614 }
Matthew Curtise689b052012-12-06 15:46:07 +00005615 if (oslibs.empty()) {
5616 oslibs.push_back("standalone");
5617 hasStandalone = true;
5618 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005619
Matthew Curtise689b052012-12-06 15:46:07 +00005620 //----------------------------------------------------------------------------
5621 // Start Files
5622 //----------------------------------------------------------------------------
5623 if (incStdLib && incStartFiles) {
5624
5625 if (!buildingLib) {
5626 if (hasStandalone) {
5627 CmdArgs.push_back(
5628 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5629 }
5630 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5631 }
5632 std::string initObj = useShared ? "/initS.o" : "/init.o";
5633 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5634 }
5635
5636 //----------------------------------------------------------------------------
5637 // Library Search Paths
5638 //----------------------------------------------------------------------------
5639 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005640 for (const auto &LibPath : LibPaths)
5641 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005642
5643 //----------------------------------------------------------------------------
5644 //
5645 //----------------------------------------------------------------------------
5646 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5647 Args.AddAllArgs(CmdArgs, options::OPT_e);
5648 Args.AddAllArgs(CmdArgs, options::OPT_s);
5649 Args.AddAllArgs(CmdArgs, options::OPT_t);
5650 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5651
5652 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5653
5654 //----------------------------------------------------------------------------
5655 // Libraries
5656 //----------------------------------------------------------------------------
5657 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005658 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005659 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5660 CmdArgs.push_back("-lm");
5661 }
5662
5663 CmdArgs.push_back("--start-group");
5664
5665 if (!buildingLib) {
5666 for(std::vector<std::string>::iterator i = oslibs.begin(),
5667 e = oslibs.end(); i != e; ++i)
5668 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5669 CmdArgs.push_back("-lc");
5670 }
5671 CmdArgs.push_back("-lgcc");
5672
5673 CmdArgs.push_back("--end-group");
5674 }
5675
5676 //----------------------------------------------------------------------------
5677 // End files
5678 //----------------------------------------------------------------------------
5679 if (incStdLib && incStartFiles) {
5680 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5681 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5682 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005683}
5684
5685void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5686 const InputInfo &Output,
5687 const InputInfoList &Inputs,
5688 const ArgList &Args,
5689 const char *LinkingOutput) const {
5690
5691 const toolchains::Hexagon_TC& ToolChain =
5692 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5693
5694 ArgStringList CmdArgs;
5695 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5696 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005697
5698 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005699 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5700 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005701}
5702// Hexagon tools end.
5703
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005704const StringRef arm::getARMArch(const ArgList &Args,
5705 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005706 StringRef MArch;
5707 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5708 // Otherwise, if we have -march= choose the base CPU for that arch.
5709 MArch = A->getValue();
5710 } else {
5711 // Otherwise, use the Arch from the triple.
5712 MArch = Triple.getArchName();
5713 }
John Brawn94fd9632015-05-21 12:19:49 +00005714
5715 // Handle -march=native.
5716 if (MArch == "native") {
5717 std::string CPU = llvm::sys::getHostCPUName();
5718 if (CPU != "generic") {
5719 // Translate the native cpu into the architecture suffix for that CPU.
5720 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5721 // If there is no valid architecture suffix for this CPU we don't know how
5722 // to handle it, so return no architecture.
5723 if (strcmp(Suffix,"") == 0)
5724 MArch = "";
5725 else
5726 MArch = std::string("arm") + Suffix;
5727 }
5728 }
5729
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005730 return MArch;
5731}
5732/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5733const char *arm::getARMCPUForMArch(const ArgList &Args,
5734 const llvm::Triple &Triple) {
5735 StringRef MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005736 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5737 // here means an -march=native that we can't handle, so instead return no CPU.
5738 if (MArch.empty())
5739 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005740
John Brawna95c1a82015-05-08 12:52:18 +00005741 // We need to return an empty string here on invalid MArch values as the
5742 // various places that call this function can't cope with a null result.
5743 const char *result = Triple.getARMCPUForArch(MArch);
5744 if (result)
5745 return result;
5746 else
5747 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005748}
5749
5750/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005751StringRef arm::getARMTargetCPU(const ArgList &Args,
5752 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005753 // FIXME: Warn on inconsistent use of -mcpu and -march.
5754 // If we have -mcpu=, use that.
5755 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin4045f662015-05-08 15:44:36 +00005756 StringRef MCPU = A->getValue();
Bernard Ogden31561762013-12-12 13:27:11 +00005757 // Handle -mcpu=native.
5758 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005759 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005760 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005761 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005762 }
5763
5764 return getARMCPUForMArch(Args, Triple);
5765}
5766
5767/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005768/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005769// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005770const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005771 if (CPU == "generic") {
Renato Golin3c007252015-05-28 15:05:53 +00005772 unsigned ArchKind = llvm::ARMTargetParser::parseArch(
5773 llvm::ARMTargetParser::getCanonicalArchName(Arch));
5774 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005775 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005776 }
5777
Renato Golin3c007252015-05-28 15:05:53 +00005778 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5779 if (ArchKind == llvm::ARM::AK_INVALID)
5780 return "";
5781 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005782}
5783
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005784void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
5785 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005786 if (Args.hasArg(options::OPT_r))
5787 return;
5788
John Brawn94fd9632015-05-21 12:19:49 +00005789 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5790 // to generate BE-8 executables.
5791 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5792 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005793}
5794
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005795mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5796 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5797 .Case("mips1", NanLegacy)
5798 .Case("mips2", NanLegacy)
5799 .Case("mips3", NanLegacy)
5800 .Case("mips4", NanLegacy)
5801 .Case("mips5", NanLegacy)
5802 .Case("mips32", NanLegacy)
5803 .Case("mips32r2", NanLegacy)
5804 .Case("mips32r3", NanLegacy | Nan2008)
5805 .Case("mips32r5", NanLegacy | Nan2008)
5806 .Case("mips32r6", Nan2008)
5807 .Case("mips64", NanLegacy)
5808 .Case("mips64r2", NanLegacy)
5809 .Case("mips64r3", NanLegacy | Nan2008)
5810 .Case("mips64r5", NanLegacy | Nan2008)
5811 .Case("mips64r6", Nan2008)
5812 .Default(NanLegacy);
5813}
5814
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005815bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5816 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5817 return A && (A->getValue() == StringRef(Value));
5818}
5819
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005820bool mips::isUCLibc(const ArgList &Args) {
5821 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005822 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005823}
5824
Daniel Sanders2bf13662014-07-10 14:40:57 +00005825bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005826 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5827 return llvm::StringSwitch<bool>(NaNArg->getValue())
5828 .Case("2008", true)
5829 .Case("legacy", false)
5830 .Default(false);
5831
5832 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005833 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5834 .Cases("mips32r6", "mips64r6", true)
5835 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005836
5837 return false;
5838}
5839
Daniel Sanders379d44b2014-07-16 11:52:23 +00005840bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5841 StringRef ABIName) {
5842 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005843 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005844 return false;
5845
5846 if (ABIName != "32")
5847 return false;
5848
5849 return llvm::StringSwitch<bool>(CPUName)
5850 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005851 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5852 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005853 .Default(false);
5854}
5855
Tim Northover157d9112014-01-16 08:48:16 +00005856llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005857 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5858 // archs which Darwin doesn't use.
5859
5860 // The matching this routine does is fairly pointless, since it is neither the
5861 // complete architecture list, nor a reasonable subset. The problem is that
5862 // historically the driver driver accepts this and also ties its -march=
5863 // handling to the architecture name, so we need to be careful before removing
5864 // support for it.
5865
5866 // This code must be kept in sync with Clang's Darwin specific argument
5867 // translation.
5868
5869 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5870 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5871 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5872 .Case("ppc64", llvm::Triple::ppc64)
5873 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5874 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5875 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005876 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005877 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005878 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005879 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005880 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005881 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005882 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005883 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005884 .Case("nvptx", llvm::Triple::nvptx)
5885 .Case("nvptx64", llvm::Triple::nvptx64)
5886 .Case("amdil", llvm::Triple::amdil)
5887 .Case("spir", llvm::Triple::spir)
5888 .Default(llvm::Triple::UnknownArch);
5889}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005890
Tim Northover157d9112014-01-16 08:48:16 +00005891void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005892 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00005893 T.setArch(Arch);
5894
5895 if (Str == "x86_64h")
5896 T.setArchName(Str);
5897 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5898 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005899 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005900 }
5901}
5902
Bob Wilsondecc03e2012-11-23 06:14:39 +00005903const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005904 const InputInfo &Input) {
5905 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005906}
5907
Bob Wilsondecc03e2012-11-23 06:14:39 +00005908const char *Clang::getBaseInputStem(const ArgList &Args,
5909 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005910 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005911
Chris Lattner906bb902011-01-16 08:14:11 +00005912 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005913 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005914
5915 return Str;
5916}
5917
Bob Wilsondecc03e2012-11-23 06:14:39 +00005918const char *Clang::getDependencyFileName(const ArgList &Args,
5919 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005920 // FIXME: Think about this more.
5921 std::string Res;
5922
5923 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005924 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005925 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005926 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005927 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005928 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005929 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005930}
5931
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005932void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5933 const InputInfo &Output,
5934 const InputInfoList &Inputs,
5935 const ArgList &Args,
5936 const char *LinkingOutput) const {
5937 const ToolChain &ToolChain = getToolChain();
5938 const Driver &D = ToolChain.getDriver();
5939 ArgStringList CmdArgs;
5940
5941 // Silence warning for "clang -g foo.o -o foo"
5942 Args.ClaimAllArgs(options::OPT_g_Group);
5943 // and "clang -emit-llvm foo.o -o foo"
5944 Args.ClaimAllArgs(options::OPT_emit_llvm);
5945 // and for "clang -w foo.o -o foo". Other warning options are already
5946 // handled somewhere else.
5947 Args.ClaimAllArgs(options::OPT_w);
5948
5949 if (!D.SysRoot.empty())
5950 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5951
5952 // CloudABI only supports static linkage.
5953 CmdArgs.push_back("-Bstatic");
5954 CmdArgs.push_back("--eh-frame-hdr");
5955 CmdArgs.push_back("--gc-sections");
5956
5957 if (Output.isFilename()) {
5958 CmdArgs.push_back("-o");
5959 CmdArgs.push_back(Output.getFilename());
5960 } else {
5961 assert(Output.isNothing() && "Invalid output.");
5962 }
5963
5964 if (!Args.hasArg(options::OPT_nostdlib) &&
5965 !Args.hasArg(options::OPT_nostartfiles)) {
5966 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5967 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5968 }
5969
5970 Args.AddAllArgs(CmdArgs, options::OPT_L);
5971 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5972 for (const auto &Path : Paths)
5973 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5974 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5975 Args.AddAllArgs(CmdArgs, options::OPT_e);
5976 Args.AddAllArgs(CmdArgs, options::OPT_s);
5977 Args.AddAllArgs(CmdArgs, options::OPT_t);
5978 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5979 Args.AddAllArgs(CmdArgs, options::OPT_r);
5980
5981 if (D.IsUsingLTO(ToolChain, Args))
5982 AddGoldPlugin(ToolChain, Args, CmdArgs);
5983
5984 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5985
5986 if (!Args.hasArg(options::OPT_nostdlib) &&
5987 !Args.hasArg(options::OPT_nodefaultlibs)) {
5988 if (D.CCCIsCXX())
5989 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5990 CmdArgs.push_back("-lc");
5991 CmdArgs.push_back("-lcompiler_rt");
5992 }
5993
5994 if (!Args.hasArg(options::OPT_nostdlib) &&
5995 !Args.hasArg(options::OPT_nostartfiles))
5996 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5997
5998 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5999 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
6000}
6001
Daniel Dunbarbe220842009-03-20 16:06:39 +00006002void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006003 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006004 const InputInfoList &Inputs,
6005 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00006006 const char *LinkingOutput) const {
6007 ArgStringList CmdArgs;
6008
6009 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6010 const InputInfo &Input = Inputs[0];
6011
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006012 // Determine the original source input.
6013 const Action *SourceAction = &JA;
6014 while (SourceAction->getKind() != Action::InputClass) {
6015 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6016 SourceAction = SourceAction->getInputs()[0];
6017 }
6018
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006019 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006020 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006021 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6022 // FIXME: at run-time detect assembler capabilities or rely on version
6023 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006024 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006025 const llvm::Triple &T(getToolChain().getTriple());
6026 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006027 CmdArgs.push_back("-Q");
6028 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006029
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006030 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006031 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006032 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006033 if (Args.hasArg(options::OPT_gstabs))
6034 CmdArgs.push_back("--gstabs");
6035 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006036 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006037 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006038
Daniel Dunbarbe220842009-03-20 16:06:39 +00006039 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006040 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006041
Daniel Dunbar6d484762010-07-22 01:47:22 +00006042 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006043 if (getToolChain().getArch() == llvm::Triple::x86 ||
6044 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006045 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6046 CmdArgs.push_back("-force_cpusubtype_ALL");
6047
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006048 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006049 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006050 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006051 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006052 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006053 CmdArgs.push_back("-static");
6054
Daniel Dunbarbe220842009-03-20 16:06:39 +00006055 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6056 options::OPT_Xassembler);
6057
6058 assert(Output.isFilename() && "Unexpected lipo output.");
6059 CmdArgs.push_back("-o");
6060 CmdArgs.push_back(Output.getFilename());
6061
Daniel Dunbarb440f562010-08-02 02:38:21 +00006062 assert(Input.isFilename() && "Invalid input.");
6063 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006064
6065 // asm_final spec is empty.
6066
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006067 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006068 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006069 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006070}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006071
Tim Northover157d9112014-01-16 08:48:16 +00006072void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006073
Tim Northover157d9112014-01-16 08:48:16 +00006074void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6075 ArgStringList &CmdArgs) const {
6076 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006077
Daniel Dunbarc1964212009-03-26 16:23:12 +00006078 // Derived from darwin_arch spec.
6079 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006080 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006081
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006082 // FIXME: Is this needed anymore?
6083 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006084 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006085}
6086
Bill Wendling3b2000f2012-10-02 18:02:50 +00006087bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
6088 // We only need to generate a temp path for LTO if we aren't compiling object
6089 // files. When compiling source files, we run 'dsymutil' after linking. We
6090 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006091 for (const auto &Input : Inputs)
6092 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006093 return true;
6094
6095 return false;
6096}
6097
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006098void darwin::Link::AddLinkArgs(Compilation &C,
6099 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006100 ArgStringList &CmdArgs,
6101 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006102 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006103 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006104
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006105 unsigned Version[3] = { 0, 0, 0 };
6106 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6107 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006108 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006109 Version[1], Version[2], HadExtra) ||
6110 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006111 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006112 << A->getAsString(Args);
6113 }
6114
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006115 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006116 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006117 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6118 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006119
Bob Wilson3d27dad2013-08-02 22:25:34 +00006120 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6121 CmdArgs.push_back("-export_dynamic");
6122
Bob Wilsonb111ec92015-03-02 19:01:14 +00006123 // If we are using App Extension restrictions, pass a flag to the linker
6124 // telling it that the compiled code has been audited.
6125 if (Args.hasFlag(options::OPT_fapplication_extension,
6126 options::OPT_fno_application_extension, false))
6127 CmdArgs.push_back("-application_extension");
6128
Bill Wendling313b6bf2012-11-16 23:03:00 +00006129 // If we are using LTO, then automatically create a temporary file path for
6130 // the linker to use, so that it's lifetime will extend past a possible
6131 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006132 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6133 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006134 const char *TmpPath = C.getArgs().MakeArgString(
6135 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6136 C.addTempFile(TmpPath);
6137 CmdArgs.push_back("-object_path_lto");
6138 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006139 }
6140
Daniel Dunbarc1964212009-03-26 16:23:12 +00006141 // Derived from the "link" spec.
6142 Args.AddAllArgs(CmdArgs, options::OPT_static);
6143 if (!Args.hasArg(options::OPT_static))
6144 CmdArgs.push_back("-dynamic");
6145 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6146 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6147 // here. How do we wish to handle such things?
6148 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006149
Daniel Dunbarc1964212009-03-26 16:23:12 +00006150 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006151 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006152 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006153 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006154
6155 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6156 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6157 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6158
6159 Arg *A;
6160 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6161 (A = Args.getLastArg(options::OPT_current__version)) ||
6162 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006163 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006164 << A->getAsString(Args) << "-dynamiclib";
6165
6166 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6167 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6168 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6169 } else {
6170 CmdArgs.push_back("-dylib");
6171
6172 Arg *A;
6173 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6174 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6175 (A = Args.getLastArg(options::OPT_client__name)) ||
6176 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6177 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6178 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006179 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006180 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006181
Daniel Dunbarc1964212009-03-26 16:23:12 +00006182 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6183 "-dylib_compatibility_version");
6184 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6185 "-dylib_current_version");
6186
Tim Northover157d9112014-01-16 08:48:16 +00006187 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006188
6189 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6190 "-dylib_install_name");
6191 }
6192
6193 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6194 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6195 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006196 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006197 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006198 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6199 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6200 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6201 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6202 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6203 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006204 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006205 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6206 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6207 Args.AddAllArgs(CmdArgs, options::OPT_init);
6208
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006209 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006210 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006211
Daniel Dunbarc1964212009-03-26 16:23:12 +00006212 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6213 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6214 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6215 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6216 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006217
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006218 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6219 options::OPT_fno_pie,
6220 options::OPT_fno_PIE)) {
6221 if (A->getOption().matches(options::OPT_fpie) ||
6222 A->getOption().matches(options::OPT_fPIE))
6223 CmdArgs.push_back("-pie");
6224 else
6225 CmdArgs.push_back("-no_pie");
6226 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006227
6228 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6229 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6230 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6231 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6232 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6233 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6234 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6235 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6236 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6237 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6238 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6239 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6240 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6241 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6242 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6243 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006244
Daniel Dunbar84384642011-05-02 21:03:47 +00006245 // Give --sysroot= preference, over the Apple specific behavior to also use
6246 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006247 StringRef sysroot = C.getSysRoot();
6248 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006249 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006250 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006251 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6252 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006253 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006254 }
6255
Daniel Dunbarc1964212009-03-26 16:23:12 +00006256 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6257 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6258 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6259 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6260 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006261 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006262 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6263 Args.AddAllArgs(CmdArgs, options::OPT_y);
6264 Args.AddLastArg(CmdArgs, options::OPT_w);
6265 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6266 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6267 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6268 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6269 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6270 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6271 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6272 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6273 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6274 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6275 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6276 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6277}
6278
6279void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006280 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006281 const InputInfoList &Inputs,
6282 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006283 const char *LinkingOutput) const {
6284 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006285
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006286 // If the number of arguments surpasses the system limits, we will encode the
6287 // input files in a separate file, shortening the command line. To this end,
6288 // build a list of input file names that can be passed via a file with the
6289 // -filelist linker option.
6290 llvm::opt::ArgStringList InputFileList;
6291
Daniel Dunbarc1964212009-03-26 16:23:12 +00006292 // The logic here is derived from gcc's behavior; most of which
6293 // comes from specs (starting with link_command). Consult gcc for
6294 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006295 ArgStringList CmdArgs;
6296
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006297 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6298 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6299 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006300 for (const auto &Arg : Args)
6301 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006302 const char *Exec =
6303 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6304 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006306 return;
6307 }
6308
Daniel Dunbarc1964212009-03-26 16:23:12 +00006309 // I'm not sure why this particular decomposition exists in gcc, but
6310 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006311 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006312
Daniel Dunbarc1964212009-03-26 16:23:12 +00006313 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6314 Args.AddAllArgs(CmdArgs, options::OPT_s);
6315 Args.AddAllArgs(CmdArgs, options::OPT_t);
6316 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6317 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006318 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006319 Args.AddAllArgs(CmdArgs, options::OPT_r);
6320
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006321 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6322 // members of static archive libraries which implement Objective-C classes or
6323 // categories.
6324 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6325 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006326
Daniel Dunbarc1964212009-03-26 16:23:12 +00006327 CmdArgs.push_back("-o");
6328 CmdArgs.push_back(Output.getFilename());
6329
Chad Rosier06fd3c62012-05-16 23:45:12 +00006330 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006331 !Args.hasArg(options::OPT_nostartfiles))
6332 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006333
6334 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006335
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006336 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6337 options::OPT_fno_openmp, false)) {
6338 switch (getOpenMPRuntime(getToolChain(), Args)) {
6339 case OMPRT_OMP:
6340 CmdArgs.push_back("-lomp");
6341 break;
6342 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006343 CmdArgs.push_back("-lgomp");
6344 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006345 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006346 CmdArgs.push_back("-liomp5");
6347 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006348 case OMPRT_Unknown:
6349 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006350 break;
6351 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006352 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006353
Douglas Gregor9295df02012-05-15 21:00:27 +00006354 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006355 // Build the input file for -filelist (list of linker input files) in case we
6356 // need it later
6357 for (const auto &II : Inputs) {
6358 if (!II.isFilename()) {
6359 // This is a linker input argument.
6360 // We cannot mix input arguments and file names in a -filelist input, thus
6361 // we prematurely stop our list (remaining files shall be passed as
6362 // arguments).
6363 if (InputFileList.size() > 0)
6364 break;
6365
6366 continue;
6367 }
6368
6369 InputFileList.push_back(II.getFilename());
6370 }
6371
Bob Wilson16d93952012-05-15 18:57:39 +00006372 if (isObjCRuntimeLinked(Args) &&
6373 !Args.hasArg(options::OPT_nostdlib) &&
6374 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006375 // We use arclite library for both ARC and subscripting support.
6376 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6377
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006378 CmdArgs.push_back("-framework");
6379 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006380 // Link libobj.
6381 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006382 }
John McCall31168b02011-06-15 23:02:42 +00006383
Daniel Dunbarc1964212009-03-26 16:23:12 +00006384 if (LinkingOutput) {
6385 CmdArgs.push_back("-arch_multiple");
6386 CmdArgs.push_back("-final_output");
6387 CmdArgs.push_back(LinkingOutput);
6388 }
6389
Daniel Dunbarc1964212009-03-26 16:23:12 +00006390 if (Args.hasArg(options::OPT_fnested_functions))
6391 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006392
Justin Bognerc7701242015-05-12 05:44:36 +00006393 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6394 // paths are different enough from other toolchains that this needs a fair
6395 // amount of refactoring done first.
6396 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6397
Daniel Dunbarc1964212009-03-26 16:23:12 +00006398 if (!Args.hasArg(options::OPT_nostdlib) &&
6399 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006400 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006401 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006402
Daniel Dunbarc1964212009-03-26 16:23:12 +00006403 // link_ssp spec is empty.
6404
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006405 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006406 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006407 }
6408
Chad Rosier06fd3c62012-05-16 23:45:12 +00006409 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006410 !Args.hasArg(options::OPT_nostartfiles)) {
6411 // endfile_spec is empty.
6412 }
6413
6414 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6415 Args.AddAllArgs(CmdArgs, options::OPT_F);
6416
Steven Wu3ffb61b2015-02-06 18:08:29 +00006417 // -iframework should be forwarded as -F.
6418 for (auto it = Args.filtered_begin(options::OPT_iframework),
6419 ie = Args.filtered_end(); it != ie; ++it)
6420 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6421 (*it)->getValue()));
6422
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006423 if (!Args.hasArg(options::OPT_nostdlib) &&
6424 !Args.hasArg(options::OPT_nodefaultlibs)) {
6425 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6426 if (A->getValue() == StringRef("Accelerate")) {
6427 CmdArgs.push_back("-framework");
6428 CmdArgs.push_back("Accelerate");
6429 }
6430 }
6431 }
6432
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006433 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006434 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006435 std::unique_ptr<Command> Cmd =
6436 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6437 Cmd->setInputFileList(std::move(InputFileList));
6438 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006439}
6440
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006441void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006442 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006443 const InputInfoList &Inputs,
6444 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006445 const char *LinkingOutput) const {
6446 ArgStringList CmdArgs;
6447
6448 CmdArgs.push_back("-create");
6449 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006450
6451 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006452 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006453
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006454 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006455 assert(II.isFilename() && "Unexpected lipo input.");
6456 CmdArgs.push_back(II.getFilename());
6457 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006458
6459 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006460 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006461}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006462
Daniel Dunbar88299622010-06-04 18:28:36 +00006463void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006464 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006465 const InputInfoList &Inputs,
6466 const ArgList &Args,
6467 const char *LinkingOutput) const {
6468 ArgStringList CmdArgs;
6469
Daniel Dunbareb86b042011-05-09 17:23:16 +00006470 CmdArgs.push_back("-o");
6471 CmdArgs.push_back(Output.getFilename());
6472
Daniel Dunbar88299622010-06-04 18:28:36 +00006473 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6474 const InputInfo &Input = Inputs[0];
6475 assert(Input.isFilename() && "Unexpected dsymutil input.");
6476 CmdArgs.push_back(Input.getFilename());
6477
Daniel Dunbar88299622010-06-04 18:28:36 +00006478 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006479 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006480 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006481}
6482
Eric Christopher551ef452011-08-23 17:56:55 +00006483void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006484 const InputInfo &Output,
6485 const InputInfoList &Inputs,
6486 const ArgList &Args,
6487 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006488 ArgStringList CmdArgs;
6489 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006490 CmdArgs.push_back("--debug-info");
6491 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006492 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006493
6494 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6495 const InputInfo &Input = Inputs[0];
6496 assert(Input.isFilename() && "Unexpected verify input");
6497
6498 // Grabbing the output of the earlier dsymutil run.
6499 CmdArgs.push_back(Input.getFilename());
6500
6501 const char *Exec =
6502 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006503 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006504}
6505
David Chisnallf571cde2012-02-15 13:39:01 +00006506void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6507 const InputInfo &Output,
6508 const InputInfoList &Inputs,
6509 const ArgList &Args,
6510 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006511 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006512 ArgStringList CmdArgs;
6513
6514 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6515 options::OPT_Xassembler);
6516
6517 CmdArgs.push_back("-o");
6518 CmdArgs.push_back(Output.getFilename());
6519
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006520 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006521 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006522
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006523 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006524 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006525}
6526
David Chisnallf571cde2012-02-15 13:39:01 +00006527void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6528 const InputInfo &Output,
6529 const InputInfoList &Inputs,
6530 const ArgList &Args,
6531 const char *LinkingOutput) const {
6532 // FIXME: Find a real GCC, don't hard-code versions here
6533 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6534 const llvm::Triple &T = getToolChain().getTriple();
6535 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006536 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006537 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006538 case llvm::Triple::x86:
6539 GCCLibPath +=
6540 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6541 break;
6542 case llvm::Triple::x86_64:
6543 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6544 GCCLibPath += "/4.5.2/amd64/";
6545 LibPath += "amd64/";
6546 break;
6547 default:
6548 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006549 }
6550
6551 ArgStringList CmdArgs;
6552
David Chisnall272a0712012-02-29 15:06:12 +00006553 // Demangle C++ names in errors
6554 CmdArgs.push_back("-C");
6555
David Chisnallf571cde2012-02-15 13:39:01 +00006556 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6557 (!Args.hasArg(options::OPT_shared))) {
6558 CmdArgs.push_back("-e");
6559 CmdArgs.push_back("_start");
6560 }
6561
6562 if (Args.hasArg(options::OPT_static)) {
6563 CmdArgs.push_back("-Bstatic");
6564 CmdArgs.push_back("-dn");
6565 } else {
6566 CmdArgs.push_back("-Bdynamic");
6567 if (Args.hasArg(options::OPT_shared)) {
6568 CmdArgs.push_back("-shared");
6569 } else {
6570 CmdArgs.push_back("--dynamic-linker");
6571 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6572 }
6573 }
6574
6575 if (Output.isFilename()) {
6576 CmdArgs.push_back("-o");
6577 CmdArgs.push_back(Output.getFilename());
6578 } else {
6579 assert(Output.isNothing() && "Invalid output.");
6580 }
6581
6582 if (!Args.hasArg(options::OPT_nostdlib) &&
6583 !Args.hasArg(options::OPT_nostartfiles)) {
6584 if (!Args.hasArg(options::OPT_shared)) {
6585 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6586 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006587 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006588 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6589 } else {
6590 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006591 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6592 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006593 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006594 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006595 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006596 }
6597
6598 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6599
6600 Args.AddAllArgs(CmdArgs, options::OPT_L);
6601 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6602 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006603 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006604
6605 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6606
6607 if (!Args.hasArg(options::OPT_nostdlib) &&
6608 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006609 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006610 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006611 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006612 if (!Args.hasArg(options::OPT_shared)) {
6613 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006614 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006615 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006616 }
David Chisnallf571cde2012-02-15 13:39:01 +00006617 }
6618
6619 if (!Args.hasArg(options::OPT_nostdlib) &&
6620 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006621 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006622 }
David Chisnall96de9932012-02-16 16:00:47 +00006623 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006624
Alexey Samsonov7811d192014-02-20 13:57:37 +00006625 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006626
6627 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006628 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006629 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006630}
6631
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006632void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006633 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006634 const InputInfoList &Inputs,
6635 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006636 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006637 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006638 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006639 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006640
Rafael Espindolacc126272014-02-28 01:55:21 +00006641 switch (getToolChain().getArch()) {
6642 case llvm::Triple::x86:
6643 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6644 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006645 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006646 break;
6647
6648 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006649 CmdArgs.push_back("-mppc");
6650 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006651 break;
6652
6653 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006654 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006655 CmdArgs.push_back("-32");
6656 NeedsKPIC = true;
6657 break;
6658
6659 case llvm::Triple::sparcv9:
6660 CmdArgs.push_back("-64");
6661 CmdArgs.push_back("-Av9a");
6662 NeedsKPIC = true;
6663 break;
6664
6665 case llvm::Triple::mips64:
6666 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006667 StringRef CPUName;
6668 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006669 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006670
6671 CmdArgs.push_back("-mabi");
6672 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6673
6674 if (getToolChain().getArch() == llvm::Triple::mips64)
6675 CmdArgs.push_back("-EB");
6676 else
6677 CmdArgs.push_back("-EL");
6678
Rafael Espindolacc126272014-02-28 01:55:21 +00006679 NeedsKPIC = true;
6680 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006681 }
6682
Rafael Espindolacc126272014-02-28 01:55:21 +00006683 default:
6684 break;
6685 }
6686
6687 if (NeedsKPIC)
6688 addAssemblerKPIC(Args, CmdArgs);
6689
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006690 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6691 options::OPT_Xassembler);
6692
6693 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006694 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006695
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006696 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006697 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006698
6699 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006700 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006702}
6703
6704void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006705 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006706 const InputInfoList &Inputs,
6707 const ArgList &Args,
6708 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006709 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006710 ArgStringList CmdArgs;
6711
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006712 // Silence warning for "clang -g foo.o -o foo"
6713 Args.ClaimAllArgs(options::OPT_g_Group);
6714 // and "clang -emit-llvm foo.o -o foo"
6715 Args.ClaimAllArgs(options::OPT_emit_llvm);
6716 // and for "clang -w foo.o -o foo". Other warning options are already
6717 // handled somewhere else.
6718 Args.ClaimAllArgs(options::OPT_w);
6719
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006720 if (getToolChain().getArch() == llvm::Triple::mips64)
6721 CmdArgs.push_back("-EB");
6722 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6723 CmdArgs.push_back("-EL");
6724
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006725 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006726 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006727 CmdArgs.push_back("-e");
6728 CmdArgs.push_back("__start");
6729 }
6730
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006731 if (Args.hasArg(options::OPT_static)) {
6732 CmdArgs.push_back("-Bstatic");
6733 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006734 if (Args.hasArg(options::OPT_rdynamic))
6735 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006736 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006737 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006738 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006739 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006740 } else {
6741 CmdArgs.push_back("-dynamic-linker");
6742 CmdArgs.push_back("/usr/libexec/ld.so");
6743 }
6744 }
6745
Rafael Espindola044f7832013-06-05 04:28:55 +00006746 if (Args.hasArg(options::OPT_nopie))
6747 CmdArgs.push_back("-nopie");
6748
Daniel Dunbarb440f562010-08-02 02:38:21 +00006749 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006750 CmdArgs.push_back("-o");
6751 CmdArgs.push_back(Output.getFilename());
6752 } else {
6753 assert(Output.isNothing() && "Invalid output.");
6754 }
6755
6756 if (!Args.hasArg(options::OPT_nostdlib) &&
6757 !Args.hasArg(options::OPT_nostartfiles)) {
6758 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006759 if (Args.hasArg(options::OPT_pg))
6760 CmdArgs.push_back(Args.MakeArgString(
6761 getToolChain().GetFilePath("gcrt0.o")));
6762 else
6763 CmdArgs.push_back(Args.MakeArgString(
6764 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006765 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006766 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006767 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006768 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006769 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006770 }
6771 }
6772
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006773 std::string Triple = getToolChain().getTripleString();
6774 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006775 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006776 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006777 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006778
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006779 Args.AddAllArgs(CmdArgs, options::OPT_L);
6780 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6781 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006782 Args.AddAllArgs(CmdArgs, options::OPT_s);
6783 Args.AddAllArgs(CmdArgs, options::OPT_t);
6784 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6785 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006786
Daniel Dunbar54423b22010-09-17 00:24:54 +00006787 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006788
6789 if (!Args.hasArg(options::OPT_nostdlib) &&
6790 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006791 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006792 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006793 if (Args.hasArg(options::OPT_pg))
6794 CmdArgs.push_back("-lm_p");
6795 else
6796 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006797 }
6798
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006799 // FIXME: For some reason GCC passes -lgcc before adding
6800 // the default system libraries. Just mimic this for now.
6801 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006802
Eric Christopher17674ec2012-09-13 06:32:34 +00006803 if (Args.hasArg(options::OPT_pthread)) {
6804 if (!Args.hasArg(options::OPT_shared) &&
6805 Args.hasArg(options::OPT_pg))
6806 CmdArgs.push_back("-lpthread_p");
6807 else
6808 CmdArgs.push_back("-lpthread");
6809 }
6810
Chandler Carruth45661652011-12-17 22:32:42 +00006811 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006812 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006813 CmdArgs.push_back("-lc_p");
6814 else
6815 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006816 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006817
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006818 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006819 }
6820
6821 if (!Args.hasArg(options::OPT_nostdlib) &&
6822 !Args.hasArg(options::OPT_nostartfiles)) {
6823 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006824 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006825 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006826 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006827 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006828 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006829 }
6830
6831 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006832 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006833 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006834}
Ed Schoutene33194b2009-04-02 19:13:12 +00006835
Eli Friedman9fa28852012-08-08 23:57:20 +00006836void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6837 const InputInfo &Output,
6838 const InputInfoList &Inputs,
6839 const ArgList &Args,
6840 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006841 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006842 ArgStringList CmdArgs;
6843
6844 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6845 options::OPT_Xassembler);
6846
6847 CmdArgs.push_back("-o");
6848 CmdArgs.push_back(Output.getFilename());
6849
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006850 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006851 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006852
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006853 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006855}
6856
6857void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6858 const InputInfo &Output,
6859 const InputInfoList &Inputs,
6860 const ArgList &Args,
6861 const char *LinkingOutput) const {
6862 const Driver &D = getToolChain().getDriver();
6863 ArgStringList CmdArgs;
6864
6865 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6866 (!Args.hasArg(options::OPT_shared))) {
6867 CmdArgs.push_back("-e");
6868 CmdArgs.push_back("__start");
6869 }
6870
6871 if (Args.hasArg(options::OPT_static)) {
6872 CmdArgs.push_back("-Bstatic");
6873 } else {
6874 if (Args.hasArg(options::OPT_rdynamic))
6875 CmdArgs.push_back("-export-dynamic");
6876 CmdArgs.push_back("--eh-frame-hdr");
6877 CmdArgs.push_back("-Bdynamic");
6878 if (Args.hasArg(options::OPT_shared)) {
6879 CmdArgs.push_back("-shared");
6880 } else {
6881 CmdArgs.push_back("-dynamic-linker");
6882 CmdArgs.push_back("/usr/libexec/ld.so");
6883 }
6884 }
6885
6886 if (Output.isFilename()) {
6887 CmdArgs.push_back("-o");
6888 CmdArgs.push_back(Output.getFilename());
6889 } else {
6890 assert(Output.isNothing() && "Invalid output.");
6891 }
6892
6893 if (!Args.hasArg(options::OPT_nostdlib) &&
6894 !Args.hasArg(options::OPT_nostartfiles)) {
6895 if (!Args.hasArg(options::OPT_shared)) {
6896 if (Args.hasArg(options::OPT_pg))
6897 CmdArgs.push_back(Args.MakeArgString(
6898 getToolChain().GetFilePath("gcrt0.o")));
6899 else
6900 CmdArgs.push_back(Args.MakeArgString(
6901 getToolChain().GetFilePath("crt0.o")));
6902 CmdArgs.push_back(Args.MakeArgString(
6903 getToolChain().GetFilePath("crtbegin.o")));
6904 } else {
6905 CmdArgs.push_back(Args.MakeArgString(
6906 getToolChain().GetFilePath("crtbeginS.o")));
6907 }
6908 }
6909
6910 Args.AddAllArgs(CmdArgs, options::OPT_L);
6911 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6912 Args.AddAllArgs(CmdArgs, options::OPT_e);
6913
6914 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6915
6916 if (!Args.hasArg(options::OPT_nostdlib) &&
6917 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006918 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006919 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6920 if (Args.hasArg(options::OPT_pg))
6921 CmdArgs.push_back("-lm_p");
6922 else
6923 CmdArgs.push_back("-lm");
6924 }
6925
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006926 if (Args.hasArg(options::OPT_pthread)) {
6927 if (!Args.hasArg(options::OPT_shared) &&
6928 Args.hasArg(options::OPT_pg))
6929 CmdArgs.push_back("-lpthread_p");
6930 else
6931 CmdArgs.push_back("-lpthread");
6932 }
6933
Eli Friedman9fa28852012-08-08 23:57:20 +00006934 if (!Args.hasArg(options::OPT_shared)) {
6935 if (Args.hasArg(options::OPT_pg))
6936 CmdArgs.push_back("-lc_p");
6937 else
6938 CmdArgs.push_back("-lc");
6939 }
6940
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006941 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006942 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006943 case llvm::Triple::arm:
6944 MyArch = "arm";
6945 break;
6946 case llvm::Triple::x86:
6947 MyArch = "i386";
6948 break;
6949 case llvm::Triple::x86_64:
6950 MyArch = "amd64";
6951 break;
6952 default:
6953 llvm_unreachable("Unsupported architecture");
6954 }
6955 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006956 }
6957
6958 if (!Args.hasArg(options::OPT_nostdlib) &&
6959 !Args.hasArg(options::OPT_nostartfiles)) {
6960 if (!Args.hasArg(options::OPT_shared))
6961 CmdArgs.push_back(Args.MakeArgString(
6962 getToolChain().GetFilePath("crtend.o")));
6963 else
6964 CmdArgs.push_back(Args.MakeArgString(
6965 getToolChain().GetFilePath("crtendS.o")));
6966 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006967
6968 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006969 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006970 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006971}
6972
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006973void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006974 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006975 const InputInfoList &Inputs,
6976 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006977 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006978 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006979 ArgStringList CmdArgs;
6980
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006981 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6982 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006983 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006984 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006985 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006986 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006987 else if (getToolChain().getArch() == llvm::Triple::mips ||
6988 getToolChain().getArch() == llvm::Triple::mipsel ||
6989 getToolChain().getArch() == llvm::Triple::mips64 ||
6990 getToolChain().getArch() == llvm::Triple::mips64el) {
6991 StringRef CPUName;
6992 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006993 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006994
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006995 CmdArgs.push_back("-march");
6996 CmdArgs.push_back(CPUName.data());
6997
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006998 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006999 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007000
7001 if (getToolChain().getArch() == llvm::Triple::mips ||
7002 getToolChain().getArch() == llvm::Triple::mips64)
7003 CmdArgs.push_back("-EB");
7004 else
7005 CmdArgs.push_back("-EL");
7006
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007007 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007008 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007009 getToolChain().getArch() == llvm::Triple::armeb ||
7010 getToolChain().getArch() == llvm::Triple::thumb ||
7011 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007012 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007013 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007014 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7015
7016 if (FloatABI == "hard") {
7017 CmdArgs.push_back("-mfpu=vfp");
7018 } else {
7019 CmdArgs.push_back("-mfpu=softvfp");
7020 }
7021
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007022 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007023 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007024 case llvm::Triple::GNUEABI:
7025 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007026 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007027 break;
7028
7029 default:
7030 CmdArgs.push_back("-matpcs");
7031 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007032 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007033 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007034 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007035 if (getToolChain().getArch() == llvm::Triple::sparc)
7036 CmdArgs.push_back("-Av8plusa");
7037 else
7038 CmdArgs.push_back("-Av9a");
7039
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007040 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007041 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007042
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007043 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7044 options::OPT_Xassembler);
7045
7046 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007047 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007049 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007050 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007051
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007052 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007053 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007054}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007055
7056void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007057 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007058 const InputInfoList &Inputs,
7059 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00007060 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007061 const toolchains::FreeBSD &ToolChain =
7062 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007063 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007064 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007065 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007066 !Args.hasArg(options::OPT_shared) &&
7067 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007068 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007069
7070 // Silence warning for "clang -g foo.o -o foo"
7071 Args.ClaimAllArgs(options::OPT_g_Group);
7072 // and "clang -emit-llvm foo.o -o foo"
7073 Args.ClaimAllArgs(options::OPT_emit_llvm);
7074 // and for "clang -w foo.o -o foo". Other warning options are already
7075 // handled somewhere else.
7076 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007077
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007078 if (!D.SysRoot.empty())
7079 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7080
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007081 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007082 CmdArgs.push_back("-pie");
7083
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007084 if (Args.hasArg(options::OPT_static)) {
7085 CmdArgs.push_back("-Bstatic");
7086 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007087 if (Args.hasArg(options::OPT_rdynamic))
7088 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007089 CmdArgs.push_back("--eh-frame-hdr");
7090 if (Args.hasArg(options::OPT_shared)) {
7091 CmdArgs.push_back("-Bshareable");
7092 } else {
7093 CmdArgs.push_back("-dynamic-linker");
7094 CmdArgs.push_back("/libexec/ld-elf.so.1");
7095 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007096 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007097 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7098 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7099 CmdArgs.push_back("--hash-style=both");
7100 }
7101 }
7102 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007103 }
7104
7105 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7106 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007107 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007108 CmdArgs.push_back("-m");
7109 CmdArgs.push_back("elf_i386_fbsd");
7110 }
7111
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007112 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007113 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007114 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007115 }
7116
Daniel Dunbarb440f562010-08-02 02:38:21 +00007117 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007118 CmdArgs.push_back("-o");
7119 CmdArgs.push_back(Output.getFilename());
7120 } else {
7121 assert(Output.isNothing() && "Invalid output.");
7122 }
7123
7124 if (!Args.hasArg(options::OPT_nostdlib) &&
7125 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007126 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007127 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007128 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007129 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007130 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007131 crt1 = "Scrt1.o";
7132 else
7133 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007134 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007135 if (crt1)
7136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7137
7138 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7139
Craig Topper92fc2df2014-05-17 16:56:41 +00007140 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007141 if (Args.hasArg(options::OPT_static))
7142 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007143 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007144 crtbegin = "crtbeginS.o";
7145 else
7146 crtbegin = "crtbegin.o";
7147
7148 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007149 }
7150
7151 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007152 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007153 for (const auto &Path : Paths)
7154 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007155 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7156 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007157 Args.AddAllArgs(CmdArgs, options::OPT_s);
7158 Args.AddAllArgs(CmdArgs, options::OPT_t);
7159 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7160 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007161
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007162 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007163 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007164
Alexey Samsonov52550342014-09-15 19:58:40 +00007165 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007166 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007167
7168 if (!Args.hasArg(options::OPT_nostdlib) &&
7169 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007170 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007171 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007172 if (Args.hasArg(options::OPT_pg))
7173 CmdArgs.push_back("-lm_p");
7174 else
7175 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007176 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007177 if (NeedsSanitizerDeps)
7178 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007179 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7180 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007181 if (Args.hasArg(options::OPT_pg))
7182 CmdArgs.push_back("-lgcc_p");
7183 else
7184 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007185 if (Args.hasArg(options::OPT_static)) {
7186 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007187 } else if (Args.hasArg(options::OPT_pg)) {
7188 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007189 } else {
7190 CmdArgs.push_back("--as-needed");
7191 CmdArgs.push_back("-lgcc_s");
7192 CmdArgs.push_back("--no-as-needed");
7193 }
7194
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007195 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007196 if (Args.hasArg(options::OPT_pg))
7197 CmdArgs.push_back("-lpthread_p");
7198 else
7199 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007200 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007201
Roman Divacky66f22762011-02-10 16:59:40 +00007202 if (Args.hasArg(options::OPT_pg)) {
7203 if (Args.hasArg(options::OPT_shared))
7204 CmdArgs.push_back("-lc");
7205 else
7206 CmdArgs.push_back("-lc_p");
7207 CmdArgs.push_back("-lgcc_p");
7208 } else {
7209 CmdArgs.push_back("-lc");
7210 CmdArgs.push_back("-lgcc");
7211 }
7212
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007213 if (Args.hasArg(options::OPT_static)) {
7214 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007215 } else if (Args.hasArg(options::OPT_pg)) {
7216 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007217 } else {
7218 CmdArgs.push_back("--as-needed");
7219 CmdArgs.push_back("-lgcc_s");
7220 CmdArgs.push_back("--no-as-needed");
7221 }
7222 }
7223
7224 if (!Args.hasArg(options::OPT_nostdlib) &&
7225 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007226 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007227 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007228 else
7229 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007231 }
7232
Alexey Samsonov7811d192014-02-20 13:57:37 +00007233 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007234
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007235 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007236 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007237 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007238}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007239
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007240void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7241 const InputInfo &Output,
7242 const InputInfoList &Inputs,
7243 const ArgList &Args,
7244 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007245 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007246 ArgStringList CmdArgs;
7247
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007248 // GNU as needs different flags for creating the correct output format
7249 // on architectures with different ABIs or optional feature sets.
7250 switch (getToolChain().getArch()) {
7251 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007252 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007253 break;
7254 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007255 case llvm::Triple::armeb:
7256 case llvm::Triple::thumb:
7257 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007258 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007259 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007260 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007261 }
7262
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007263 case llvm::Triple::mips:
7264 case llvm::Triple::mipsel:
7265 case llvm::Triple::mips64:
7266 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007267 StringRef CPUName;
7268 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007269 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007270
7271 CmdArgs.push_back("-march");
7272 CmdArgs.push_back(CPUName.data());
7273
7274 CmdArgs.push_back("-mabi");
7275 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7276
7277 if (getToolChain().getArch() == llvm::Triple::mips ||
7278 getToolChain().getArch() == llvm::Triple::mips64)
7279 CmdArgs.push_back("-EB");
7280 else
7281 CmdArgs.push_back("-EL");
7282
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007283 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007284 break;
7285 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007286
7287 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007288 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007289 CmdArgs.push_back("-32");
7290 addAssemblerKPIC(Args, CmdArgs);
7291 break;
7292
7293 case llvm::Triple::sparcv9:
7294 CmdArgs.push_back("-64");
7295 CmdArgs.push_back("-Av9");
7296 addAssemblerKPIC(Args, CmdArgs);
7297 break;
7298
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007299 default:
7300 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007301 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007302
7303 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7304 options::OPT_Xassembler);
7305
7306 CmdArgs.push_back("-o");
7307 CmdArgs.push_back(Output.getFilename());
7308
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007309 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007310 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007311
David Chisnallddbd68f2011-09-27 22:03:18 +00007312 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007314}
7315
7316void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7317 const InputInfo &Output,
7318 const InputInfoList &Inputs,
7319 const ArgList &Args,
7320 const char *LinkingOutput) const {
7321 const Driver &D = getToolChain().getDriver();
7322 ArgStringList CmdArgs;
7323
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007324 if (!D.SysRoot.empty())
7325 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7326
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007327 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007328 if (Args.hasArg(options::OPT_static)) {
7329 CmdArgs.push_back("-Bstatic");
7330 } else {
7331 if (Args.hasArg(options::OPT_rdynamic))
7332 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007333 if (Args.hasArg(options::OPT_shared)) {
7334 CmdArgs.push_back("-Bshareable");
7335 } else {
7336 CmdArgs.push_back("-dynamic-linker");
7337 CmdArgs.push_back("/libexec/ld.elf_so");
7338 }
7339 }
7340
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007341 // Many NetBSD architectures support more than one ABI.
7342 // Determine the correct emulation for ld.
7343 switch (getToolChain().getArch()) {
7344 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007345 CmdArgs.push_back("-m");
7346 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007347 break;
7348 case llvm::Triple::arm:
7349 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007350 CmdArgs.push_back("-m");
7351 switch (getToolChain().getTriple().getEnvironment()) {
7352 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007353 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007354 CmdArgs.push_back("armelf_nbsd_eabi");
7355 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007356 case llvm::Triple::EABIHF:
7357 case llvm::Triple::GNUEABIHF:
7358 CmdArgs.push_back("armelf_nbsd_eabihf");
7359 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007360 default:
7361 CmdArgs.push_back("armelf_nbsd");
7362 break;
7363 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007364 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007365 case llvm::Triple::armeb:
7366 case llvm::Triple::thumbeb:
John Brawn94fd9632015-05-21 12:19:49 +00007367 arm::appendEBLinkFlags(Args, CmdArgs,
7368 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007369 CmdArgs.push_back("-m");
7370 switch (getToolChain().getTriple().getEnvironment()) {
7371 case llvm::Triple::EABI:
7372 case llvm::Triple::GNUEABI:
7373 CmdArgs.push_back("armelfb_nbsd_eabi");
7374 break;
7375 case llvm::Triple::EABIHF:
7376 case llvm::Triple::GNUEABIHF:
7377 CmdArgs.push_back("armelfb_nbsd_eabihf");
7378 break;
7379 default:
7380 CmdArgs.push_back("armelfb_nbsd");
7381 break;
7382 }
7383 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007384 case llvm::Triple::mips64:
7385 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007386 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007387 CmdArgs.push_back("-m");
7388 if (getToolChain().getArch() == llvm::Triple::mips64)
7389 CmdArgs.push_back("elf32btsmip");
7390 else
7391 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007392 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007393 CmdArgs.push_back("-m");
7394 if (getToolChain().getArch() == llvm::Triple::mips64)
7395 CmdArgs.push_back("elf64btsmip");
7396 else
7397 CmdArgs.push_back("elf64ltsmip");
7398 }
7399 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007400 case llvm::Triple::ppc:
7401 CmdArgs.push_back("-m");
7402 CmdArgs.push_back("elf32ppc_nbsd");
7403 break;
7404
7405 case llvm::Triple::ppc64:
7406 case llvm::Triple::ppc64le:
7407 CmdArgs.push_back("-m");
7408 CmdArgs.push_back("elf64ppc");
7409 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007410
7411 case llvm::Triple::sparc:
7412 CmdArgs.push_back("-m");
7413 CmdArgs.push_back("elf32_sparc");
7414 break;
7415
7416 case llvm::Triple::sparcv9:
7417 CmdArgs.push_back("-m");
7418 CmdArgs.push_back("elf64_sparc");
7419 break;
7420
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007421 default:
7422 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007423 }
7424
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007425 if (Output.isFilename()) {
7426 CmdArgs.push_back("-o");
7427 CmdArgs.push_back(Output.getFilename());
7428 } else {
7429 assert(Output.isNothing() && "Invalid output.");
7430 }
7431
7432 if (!Args.hasArg(options::OPT_nostdlib) &&
7433 !Args.hasArg(options::OPT_nostartfiles)) {
7434 if (!Args.hasArg(options::OPT_shared)) {
7435 CmdArgs.push_back(Args.MakeArgString(
7436 getToolChain().GetFilePath("crt0.o")));
7437 CmdArgs.push_back(Args.MakeArgString(
7438 getToolChain().GetFilePath("crti.o")));
7439 CmdArgs.push_back(Args.MakeArgString(
7440 getToolChain().GetFilePath("crtbegin.o")));
7441 } else {
7442 CmdArgs.push_back(Args.MakeArgString(
7443 getToolChain().GetFilePath("crti.o")));
7444 CmdArgs.push_back(Args.MakeArgString(
7445 getToolChain().GetFilePath("crtbeginS.o")));
7446 }
7447 }
7448
7449 Args.AddAllArgs(CmdArgs, options::OPT_L);
7450 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7451 Args.AddAllArgs(CmdArgs, options::OPT_e);
7452 Args.AddAllArgs(CmdArgs, options::OPT_s);
7453 Args.AddAllArgs(CmdArgs, options::OPT_t);
7454 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7455 Args.AddAllArgs(CmdArgs, options::OPT_r);
7456
7457 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7458
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007459 unsigned Major, Minor, Micro;
7460 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7461 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007462 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007463 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007464 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007465 case llvm::Triple::arm:
7466 case llvm::Triple::armeb:
7467 case llvm::Triple::thumb:
7468 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007469 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007470 case llvm::Triple::ppc64:
7471 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007472 case llvm::Triple::x86:
7473 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007474 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007475 break;
7476 default:
7477 break;
7478 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007479 }
7480
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007481 if (!Args.hasArg(options::OPT_nostdlib) &&
7482 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007483 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007484 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7485 CmdArgs.push_back("-lm");
7486 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007487 if (Args.hasArg(options::OPT_pthread))
7488 CmdArgs.push_back("-lpthread");
7489 CmdArgs.push_back("-lc");
7490
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007491 if (useLibgcc) {
7492 if (Args.hasArg(options::OPT_static)) {
7493 // libgcc_eh depends on libc, so resolve as much as possible,
7494 // pull in any new requirements from libc and then get the rest
7495 // of libgcc.
7496 CmdArgs.push_back("-lgcc_eh");
7497 CmdArgs.push_back("-lc");
7498 CmdArgs.push_back("-lgcc");
7499 } else {
7500 CmdArgs.push_back("-lgcc");
7501 CmdArgs.push_back("--as-needed");
7502 CmdArgs.push_back("-lgcc_s");
7503 CmdArgs.push_back("--no-as-needed");
7504 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007505 }
7506 }
7507
7508 if (!Args.hasArg(options::OPT_nostdlib) &&
7509 !Args.hasArg(options::OPT_nostartfiles)) {
7510 if (!Args.hasArg(options::OPT_shared))
7511 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7512 "crtend.o")));
7513 else
7514 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7515 "crtendS.o")));
7516 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7517 "crtn.o")));
7518 }
7519
Alexey Samsonov7811d192014-02-20 13:57:37 +00007520 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007521
Logan Chieneb9162f2014-06-26 14:23:45 +00007522 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007523 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007524}
7525
Thomas Schwinge4e555262013-03-28 19:04:25 +00007526void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7527 const InputInfo &Output,
7528 const InputInfoList &Inputs,
7529 const ArgList &Args,
7530 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007531 claimNoWarnArgs(Args);
7532
Rafael Espindola92b00932010-08-10 00:25:48 +00007533 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007534 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007535
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007536 switch (getToolChain().getArch()) {
7537 default:
7538 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007539 // Add --32/--64 to make sure we get the format we want.
7540 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007541 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007542 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007543 break;
7544 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007545 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7546 CmdArgs.push_back("--x32");
7547 else
7548 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007549 break;
7550 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007551 CmdArgs.push_back("-a32");
7552 CmdArgs.push_back("-mppc");
7553 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007554 break;
7555 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007556 CmdArgs.push_back("-a64");
7557 CmdArgs.push_back("-mppc64");
7558 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007559 break;
7560 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007561 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007562 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007563 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007564 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007565 break;
7566 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007567 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007568 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007569 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007570 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007571 break;
7572 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007573 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007574 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007575 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007576 break;
7577 case llvm::Triple::arm:
7578 case llvm::Triple::armeb:
7579 case llvm::Triple::thumb:
7580 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007581 const llvm::Triple &Triple = getToolChain().getTriple();
7582 switch (Triple.getSubArch()) {
7583 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007584 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007585 break;
7586 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007587 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007588 break;
7589 default:
7590 break;
7591 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007592
Tim Northover9c7e0352013-12-12 11:55:52 +00007593 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007594 getToolChain().getDriver(), Args,
7595 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007596 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007597
7598 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007599
7600 // FIXME: remove krait check when GNU tools support krait cpu
7601 // for now replace it with -march=armv7-a to avoid a lower
7602 // march from being picked in the absence of a cpu flag.
7603 Arg *A;
7604 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin4045f662015-05-08 15:44:36 +00007605 StringRef(A->getValue()) == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007606 CmdArgs.push_back("-march=armv7-a");
7607 else
7608 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007609 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007610 break;
7611 }
7612 case llvm::Triple::mips:
7613 case llvm::Triple::mipsel:
7614 case llvm::Triple::mips64:
7615 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007616 StringRef CPUName;
7617 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007618 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007619 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007620
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007621 CmdArgs.push_back("-march");
7622 CmdArgs.push_back(CPUName.data());
7623
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007624 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007625 CmdArgs.push_back(ABIName.data());
7626
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007627 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7628 // or -mshared (not implemented) is in effect.
7629 bool IsPicOrPie = false;
7630 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7631 options::OPT_fpic, options::OPT_fno_pic,
7632 options::OPT_fPIE, options::OPT_fno_PIE,
7633 options::OPT_fpie, options::OPT_fno_pie)) {
7634 if (A->getOption().matches(options::OPT_fPIC) ||
7635 A->getOption().matches(options::OPT_fpic) ||
7636 A->getOption().matches(options::OPT_fPIE) ||
7637 A->getOption().matches(options::OPT_fpie))
7638 IsPicOrPie = true;
7639 }
7640 if (!IsPicOrPie)
7641 CmdArgs.push_back("-mno-shared");
7642
Daniel Sanders379d44b2014-07-16 11:52:23 +00007643 // LLVM doesn't support -mplt yet and acts as if it is always given.
7644 // However, -mplt has no effect with the N64 ABI.
7645 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007646
7647 if (getToolChain().getArch() == llvm::Triple::mips ||
7648 getToolChain().getArch() == llvm::Triple::mips64)
7649 CmdArgs.push_back("-EB");
7650 else
7651 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007652
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007653 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7654 if (StringRef(A->getValue()) == "2008")
7655 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7656 }
7657
Daniel Sanders379d44b2014-07-16 11:52:23 +00007658 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7659 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7660 options::OPT_mfp64)) {
7661 A->claim();
7662 A->render(Args, CmdArgs);
7663 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7664 ABIName))
7665 CmdArgs.push_back("-mfpxx");
7666
7667 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7668 // -mno-mips16 is actually -no-mips16.
7669 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7670 options::OPT_mno_mips16)) {
7671 if (A->getOption().matches(options::OPT_mips16)) {
7672 A->claim();
7673 A->render(Args, CmdArgs);
7674 } else {
7675 A->claim();
7676 CmdArgs.push_back("-no-mips16");
7677 }
7678 }
7679
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007680 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7681 options::OPT_mno_micromips);
7682 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7683 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7684
Simon Atanasyanbd986632013-11-26 11:58:04 +00007685 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7686 // Do not use AddLastArg because not all versions of MIPS assembler
7687 // support -mmsa / -mno-msa options.
7688 if (A->getOption().matches(options::OPT_mmsa))
7689 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7690 }
7691
Daniel Sanders379d44b2014-07-16 11:52:23 +00007692 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7693 options::OPT_msoft_float);
7694
7695 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7696 options::OPT_mno_odd_spreg);
7697
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007698 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007699 break;
7700 }
7701 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007702 // Always pass an -march option, since our default of z10 is later
7703 // than the GNU assembler's default.
7704 StringRef CPUName = getSystemZTargetCPU(Args);
7705 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007706 break;
7707 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007708 }
7709
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007710 if (NeedsKPIC)
7711 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007712
7713 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7714 options::OPT_Xassembler);
7715
7716 CmdArgs.push_back("-o");
7717 CmdArgs.push_back(Output.getFilename());
7718
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007719 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007720 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007721
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007722 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007723 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007724
7725 // Handle the debug info splitting at object creation time if we're
7726 // creating an object.
7727 // TODO: Currently only works on linux with newer objcopy.
7728 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007729 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007730 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007731 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007732}
7733
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007734static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007735 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007736 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007737 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7738 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007739 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007740 CmdArgs.push_back("-lgcc");
7741
Logan Chien3d3373c2012-11-19 12:04:11 +00007742 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007743 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007744 CmdArgs.push_back("-lgcc");
7745 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007746 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007747 CmdArgs.push_back("--as-needed");
7748 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007749 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007750 CmdArgs.push_back("--no-as-needed");
7751 }
7752
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007753 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007754 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007755 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007756 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007757
7758 // According to Android ABI, we have to link with libdl if we are
7759 // linking with non-static libgcc.
7760 //
7761 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7762 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7763 if (isAndroid && !StaticLibgcc)
7764 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007765}
7766
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007767static std::string getLinuxDynamicLinker(const ArgList &Args,
7768 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007769 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7770
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007771 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7772 if (ToolChain.getTriple().isArch64Bit())
7773 return "/system/bin/linker64";
7774 else
7775 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007776 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7777 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007778 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007779 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007780 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007781 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007782 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007783 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007784 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7785 return "/lib/ld-linux-armhf.so.3";
7786 else
7787 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007788 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7789 // TODO: check which dynamic linker name.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007790 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007791 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007792 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007793 return "/lib/ld-linux.so.3";
7794 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7795 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007796 StringRef CPUName;
7797 StringRef ABIName;
7798 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7799 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7800
7801 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7802 .Case("o32", "/lib")
7803 .Case("n32", "/lib32")
7804 .Case("n64", "/lib64")
7805 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007806 StringRef LibName;
7807 if (mips::isUCLibc(Args))
7808 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7809 else
7810 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007811
7812 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007813 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007814 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007815 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007816 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7817 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007818 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007819 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007820 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7821 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007822 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007823 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007824 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007825 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007826 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007827 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007828 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7829 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007830 else
7831 return "/lib64/ld-linux-x86-64.so.2";
7832}
7833
Renato Golinc4b49242014-02-13 10:01:16 +00007834static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007835 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007836 // Make use of compiler-rt if --rtlib option is used
7837 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7838
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007839 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007840 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007841 switch (TC.getTriple().getOS()) {
7842 default: llvm_unreachable("unsupported OS");
7843 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007844 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007845 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007846 break;
7847 }
Renato Golinc4b49242014-02-13 10:01:16 +00007848 break;
7849 case ToolChain::RLT_Libgcc:
7850 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7851 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007852 }
7853}
7854
Rafael Espindola1e085772014-08-15 17:14:35 +00007855static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7856 switch (T.getArch()) {
7857 case llvm::Triple::x86:
7858 return "elf_i386";
7859 case llvm::Triple::aarch64:
7860 return "aarch64linux";
7861 case llvm::Triple::aarch64_be:
7862 return "aarch64_be_linux";
7863 case llvm::Triple::arm:
7864 case llvm::Triple::thumb:
7865 return "armelf_linux_eabi";
7866 case llvm::Triple::armeb:
7867 case llvm::Triple::thumbeb:
7868 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7869 case llvm::Triple::ppc:
7870 return "elf32ppclinux";
7871 case llvm::Triple::ppc64:
7872 return "elf64ppc";
7873 case llvm::Triple::ppc64le:
7874 return "elf64lppc";
7875 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007876 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007877 return "elf32_sparc";
7878 case llvm::Triple::sparcv9:
7879 return "elf64_sparc";
7880 case llvm::Triple::mips:
7881 return "elf32btsmip";
7882 case llvm::Triple::mipsel:
7883 return "elf32ltsmip";
7884 case llvm::Triple::mips64:
7885 if (mips::hasMipsAbiArg(Args, "n32"))
7886 return "elf32btsmipn32";
7887 return "elf64btsmip";
7888 case llvm::Triple::mips64el:
7889 if (mips::hasMipsAbiArg(Args, "n32"))
7890 return "elf32ltsmipn32";
7891 return "elf64ltsmip";
7892 case llvm::Triple::systemz:
7893 return "elf64_s390";
7894 case llvm::Triple::x86_64:
7895 if (T.getEnvironment() == llvm::Triple::GNUX32)
7896 return "elf32_x86_64";
7897 return "elf_x86_64";
7898 default:
7899 llvm_unreachable("Unexpected arch");
7900 }
7901}
7902
Thomas Schwinge4e555262013-03-28 19:04:25 +00007903void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7904 const InputInfo &Output,
7905 const InputInfoList &Inputs,
7906 const ArgList &Args,
7907 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007908 const toolchains::Linux &ToolChain =
7909 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007910 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007911 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007912 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007913 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007914 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007915 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
7916 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007917
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007918 ArgStringList CmdArgs;
7919
Rafael Espindolad1002f62010-11-15 18:28:16 +00007920 // Silence warning for "clang -g foo.o -o foo"
7921 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007922 // and "clang -emit-llvm foo.o -o foo"
7923 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007924 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007925 // handled somewhere else.
7926 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007927
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007928 if (!D.SysRoot.empty())
7929 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007930
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007931 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007932 CmdArgs.push_back("-pie");
7933
Rafael Espindola1c76c592010-11-07 22:57:16 +00007934 if (Args.hasArg(options::OPT_rdynamic))
7935 CmdArgs.push_back("-export-dynamic");
7936
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007937 if (Args.hasArg(options::OPT_s))
7938 CmdArgs.push_back("-s");
7939
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007940 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
7941 arm::appendEBLinkFlags(
7942 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007943 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007944
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007945 for (const auto &Opt : ToolChain.ExtraOpts)
7946 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007947
7948 if (!Args.hasArg(options::OPT_static)) {
7949 CmdArgs.push_back("--eh-frame-hdr");
7950 }
7951
7952 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007953 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007954
7955 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007956 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7957 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007958 CmdArgs.push_back("-Bstatic");
7959 else
7960 CmdArgs.push_back("-static");
7961 } else if (Args.hasArg(options::OPT_shared)) {
7962 CmdArgs.push_back("-shared");
7963 }
7964
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007965 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7966 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007967 (!Args.hasArg(options::OPT_static) &&
7968 !Args.hasArg(options::OPT_shared))) {
7969 CmdArgs.push_back("-dynamic-linker");
7970 CmdArgs.push_back(Args.MakeArgString(
7971 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7972 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007973
7974 CmdArgs.push_back("-o");
7975 CmdArgs.push_back(Output.getFilename());
7976
Rafael Espindola81937ec2010-12-01 01:52:43 +00007977 if (!Args.hasArg(options::OPT_nostdlib) &&
7978 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007979 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007980 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007981 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007982 if (Args.hasArg(options::OPT_pg))
7983 crt1 = "gcrt1.o";
7984 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007985 crt1 = "Scrt1.o";
7986 else
7987 crt1 = "crt1.o";
7988 }
7989 if (crt1)
7990 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007991
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007992 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7993 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007994
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007995 const char *crtbegin;
7996 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007997 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007998 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007999 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008000 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008001 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008002 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008003 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008004 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008005
8006 // Add crtfastmath.o if available and fast math is enabled.
8007 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008008 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008009
8010 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008011 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008012
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008013 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008014
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008015 for (const auto &Path : Paths)
8016 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008017
Peter Collingbournea4ccff32015-02-20 20:30:56 +00008018 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008019 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008020
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008021 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8022 CmdArgs.push_back("--no-demangle");
8023
Alexey Samsonov52550342014-09-15 19:58:40 +00008024 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008025 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008026 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008027 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008028
Hans Wennborg70850d82013-07-18 20:29:38 +00008029 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008030 !Args.hasArg(options::OPT_nostdlib) &&
8031 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008032 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8033 !Args.hasArg(options::OPT_static);
8034 if (OnlyLibstdcxxStatic)
8035 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008036 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008037 if (OnlyLibstdcxxStatic)
8038 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008039 CmdArgs.push_back("-lm");
8040 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008041 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8042 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008043
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008044 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008045 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8046 if (Args.hasArg(options::OPT_static))
8047 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008048
Alexey Samsonov52550342014-09-15 19:58:40 +00008049 if (NeedsSanitizerDeps)
8050 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8051
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008052 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8053 Args.hasArg(options::OPT_pthreads);
8054
8055 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8056 options::OPT_fno_openmp, false)) {
8057 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8058 // FIXME: Does this really make sense for all GNU toolchains?
8059 WantPthread = true;
8060
8061 // Also link the particular OpenMP runtimes.
8062 switch (getOpenMPRuntime(ToolChain, Args)) {
8063 case OMPRT_OMP:
8064 CmdArgs.push_back("-lomp");
8065 break;
8066 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008067 CmdArgs.push_back("-lgomp");
8068
8069 // FIXME: Exclude this for platforms with libgomp that don't require
8070 // librt. Most modern Linux platforms require it, but some may not.
8071 CmdArgs.push_back("-lrt");
8072 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008073 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008074 CmdArgs.push_back("-liomp5");
8075 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008076 case OMPRT_Unknown:
8077 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008078 break;
8079 }
Chandler Carruth01538002013-01-17 13:19:29 +00008080 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008081
Renato Golinc4b49242014-02-13 10:01:16 +00008082 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008083
Richard Smith31d1de22015-05-20 22:48:44 +00008084 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008085 CmdArgs.push_back("-lpthread");
8086
8087 CmdArgs.push_back("-lc");
8088
8089 if (Args.hasArg(options::OPT_static))
8090 CmdArgs.push_back("--end-group");
8091 else
Renato Golinc4b49242014-02-13 10:01:16 +00008092 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008093 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008094
Rafael Espindola81937ec2010-12-01 01:52:43 +00008095 if (!Args.hasArg(options::OPT_nostartfiles)) {
8096 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008097 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008098 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008099 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008100 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008101 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008102 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008103
Rafael Espindola81937ec2010-12-01 01:52:43 +00008104 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008105 if (!isAndroid)
8106 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008107 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008108 }
8109
David Blaikiec11bf802014-09-04 16:04:28 +00008110 C.addCommand(
8111 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008112}
8113
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008114
8115// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8116// for the various SFI requirements like register masking. The assembly tool
8117// inserts the file containing the macros as an input into all the assembly
8118// jobs.
8119void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8120 const InputInfo &Output,
8121 const InputInfoList &Inputs,
8122 const ArgList &Args,
8123 const char *LinkingOutput) const {
8124 const toolchains::NaCl_TC& ToolChain =
8125 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8126 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8127 "nacl-arm-macros.s");
8128 InputInfoList NewInputs;
8129 NewInputs.push_back(NaClMacros);
8130 NewInputs.append(Inputs.begin(), Inputs.end());
8131 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8132 LinkingOutput);
8133}
8134
8135
8136// This is quite similar to gnutools::link::ConstructJob with changes that
8137// we use static by default, do not yet support sanitizers or LTO, and a few
8138// others. Eventually we can support more of that and hopefully migrate back
8139// to gnutools::link.
8140void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 const InputInfo &Output,
8142 const InputInfoList &Inputs,
8143 const ArgList &Args,
8144 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008145
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008146 const toolchains::NaCl_TC &ToolChain =
8147 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008148 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008149 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008150 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008151 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008152
8153 ArgStringList CmdArgs;
8154
8155 // Silence warning for "clang -g foo.o -o foo"
8156 Args.ClaimAllArgs(options::OPT_g_Group);
8157 // and "clang -emit-llvm foo.o -o foo"
8158 Args.ClaimAllArgs(options::OPT_emit_llvm);
8159 // and for "clang -w foo.o -o foo". Other warning options are already
8160 // handled somewhere else.
8161 Args.ClaimAllArgs(options::OPT_w);
8162
8163 if (!D.SysRoot.empty())
8164 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8165
8166 if (Args.hasArg(options::OPT_rdynamic))
8167 CmdArgs.push_back("-export-dynamic");
8168
8169 if (Args.hasArg(options::OPT_s))
8170 CmdArgs.push_back("-s");
8171
8172 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8173 // there is --build-id, which we do want.
8174 CmdArgs.push_back("--build-id");
8175
8176 if (!IsStatic)
8177 CmdArgs.push_back("--eh-frame-hdr");
8178
8179 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008180 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008181 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008182 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008183 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008184 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008185 CmdArgs.push_back("elf_x86_64_nacl");
8186 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008187 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8188 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008189
8190 if (IsStatic)
8191 CmdArgs.push_back("-static");
8192 else if (Args.hasArg(options::OPT_shared))
8193 CmdArgs.push_back("-shared");
8194
8195 CmdArgs.push_back("-o");
8196 CmdArgs.push_back(Output.getFilename());
8197 if (!Args.hasArg(options::OPT_nostdlib) &&
8198 !Args.hasArg(options::OPT_nostartfiles)) {
8199 if (!Args.hasArg(options::OPT_shared))
8200 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8201 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8202
8203 const char *crtbegin;
8204 if (IsStatic)
8205 crtbegin = "crtbeginT.o";
8206 else if (Args.hasArg(options::OPT_shared))
8207 crtbegin = "crtbeginS.o";
8208 else
8209 crtbegin = "crtbegin.o";
8210 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8211 }
8212
8213 Args.AddAllArgs(CmdArgs, options::OPT_L);
8214 Args.AddAllArgs(CmdArgs, options::OPT_u);
8215
8216 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8217
8218 for (const auto &Path : Paths)
8219 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8220
8221 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8222 CmdArgs.push_back("--no-demangle");
8223
8224 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8225
8226 if (D.CCCIsCXX() &&
8227 !Args.hasArg(options::OPT_nostdlib) &&
8228 !Args.hasArg(options::OPT_nodefaultlibs)) {
8229 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8230 !IsStatic;
8231 if (OnlyLibstdcxxStatic)
8232 CmdArgs.push_back("-Bstatic");
8233 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8234 if (OnlyLibstdcxxStatic)
8235 CmdArgs.push_back("-Bdynamic");
8236 CmdArgs.push_back("-lm");
8237 }
8238
8239 if (!Args.hasArg(options::OPT_nostdlib)) {
8240 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8241 // Always use groups, since it has no effect on dynamic libraries.
8242 CmdArgs.push_back("--start-group");
8243 CmdArgs.push_back("-lc");
8244 // NaCl's libc++ currently requires libpthread, so just always include it
8245 // in the group for C++.
8246 if (Args.hasArg(options::OPT_pthread) ||
8247 Args.hasArg(options::OPT_pthreads) ||
8248 D.CCCIsCXX()) {
8249 CmdArgs.push_back("-lpthread");
8250 }
8251
8252 CmdArgs.push_back("-lgcc");
8253 CmdArgs.push_back("--as-needed");
8254 if (IsStatic)
8255 CmdArgs.push_back("-lgcc_eh");
8256 else
8257 CmdArgs.push_back("-lgcc_s");
8258 CmdArgs.push_back("--no-as-needed");
8259 CmdArgs.push_back("--end-group");
8260 }
8261
8262 if (!Args.hasArg(options::OPT_nostartfiles)) {
8263 const char *crtend;
8264 if (Args.hasArg(options::OPT_shared))
8265 crtend = "crtendS.o";
8266 else
8267 crtend = "crtend.o";
8268
8269 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8270 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8271 }
8272 }
8273
8274 C.addCommand(llvm::make_unique<Command>(JA, *this,
8275 ToolChain.Linker.c_str(), CmdArgs));
8276}
8277
8278
Chris Lattner3e2ee142010-07-07 16:01:42 +00008279void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008280 const InputInfo &Output,
8281 const InputInfoList &Inputs,
8282 const ArgList &Args,
8283 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008284 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008285 ArgStringList CmdArgs;
8286
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008287 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008288
8289 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008290 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008291
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008292 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008293 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008294
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008295 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008296 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008297}
8298
8299void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008300 const InputInfo &Output,
8301 const InputInfoList &Inputs,
8302 const ArgList &Args,
8303 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008304 const Driver &D = getToolChain().getDriver();
8305 ArgStringList CmdArgs;
8306
Daniel Dunbarb440f562010-08-02 02:38:21 +00008307 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008308 CmdArgs.push_back("-o");
8309 CmdArgs.push_back(Output.getFilename());
8310 } else {
8311 assert(Output.isNothing() && "Invalid output.");
8312 }
8313
8314 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008315 !Args.hasArg(options::OPT_nostartfiles)) {
8316 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8317 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8318 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8319 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8320 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008321
8322 Args.AddAllArgs(CmdArgs, options::OPT_L);
8323 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8324 Args.AddAllArgs(CmdArgs, options::OPT_e);
8325
Daniel Dunbar54423b22010-09-17 00:24:54 +00008326 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008327
Alexey Samsonov7811d192014-02-20 13:57:37 +00008328 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008329
Chris Lattner3e2ee142010-07-07 16:01:42 +00008330 if (!Args.hasArg(options::OPT_nostdlib) &&
8331 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008332 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008333 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008334 CmdArgs.push_back("-lm");
8335 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008336 }
8337
8338 if (!Args.hasArg(options::OPT_nostdlib) &&
8339 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008340 if (Args.hasArg(options::OPT_pthread))
8341 CmdArgs.push_back("-lpthread");
8342 CmdArgs.push_back("-lc");
8343 CmdArgs.push_back("-lCompilerRT-Generic");
8344 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8345 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008346 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008347 }
8348
Logan Chieneb9162f2014-06-26 14:23:45 +00008349 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008350 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008351}
8352
Daniel Dunbarcc912342009-05-02 18:28:39 +00008353/// DragonFly Tools
8354
8355// For now, DragonFly Assemble does just about the same as for
8356// FreeBSD, but this may change soon.
8357void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008358 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008359 const InputInfoList &Inputs,
8360 const ArgList &Args,
8361 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008362 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008363 ArgStringList CmdArgs;
8364
8365 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8366 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008367 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008368 CmdArgs.push_back("--32");
8369
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008370 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008371
8372 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008373 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008374
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008375 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008376 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008377
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008378 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008379 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008380}
8381
8382void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008383 const InputInfo &Output,
8384 const InputInfoList &Inputs,
8385 const ArgList &Args,
8386 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008387 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008388 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008389 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008390
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008391 if (!D.SysRoot.empty())
8392 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8393
John McCall65b8da02013-04-11 22:55:55 +00008394 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008395 if (Args.hasArg(options::OPT_static)) {
8396 CmdArgs.push_back("-Bstatic");
8397 } else {
John McCall65b8da02013-04-11 22:55:55 +00008398 if (Args.hasArg(options::OPT_rdynamic))
8399 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008400 if (Args.hasArg(options::OPT_shared))
8401 CmdArgs.push_back("-Bshareable");
8402 else {
8403 CmdArgs.push_back("-dynamic-linker");
8404 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8405 }
John McCall65b8da02013-04-11 22:55:55 +00008406 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008407 }
8408
8409 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8410 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008411 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008412 CmdArgs.push_back("-m");
8413 CmdArgs.push_back("elf_i386");
8414 }
8415
Daniel Dunbarb440f562010-08-02 02:38:21 +00008416 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008417 CmdArgs.push_back("-o");
8418 CmdArgs.push_back(Output.getFilename());
8419 } else {
8420 assert(Output.isNothing() && "Invalid output.");
8421 }
8422
8423 if (!Args.hasArg(options::OPT_nostdlib) &&
8424 !Args.hasArg(options::OPT_nostartfiles)) {
8425 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008426 if (Args.hasArg(options::OPT_pg))
8427 CmdArgs.push_back(Args.MakeArgString(
8428 getToolChain().GetFilePath("gcrt1.o")));
8429 else {
8430 if (Args.hasArg(options::OPT_pie))
8431 CmdArgs.push_back(Args.MakeArgString(
8432 getToolChain().GetFilePath("Scrt1.o")));
8433 else
8434 CmdArgs.push_back(Args.MakeArgString(
8435 getToolChain().GetFilePath("crt1.o")));
8436 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008437 }
John McCall65b8da02013-04-11 22:55:55 +00008438 CmdArgs.push_back(Args.MakeArgString(
8439 getToolChain().GetFilePath("crti.o")));
8440 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8441 CmdArgs.push_back(Args.MakeArgString(
8442 getToolChain().GetFilePath("crtbeginS.o")));
8443 else
8444 CmdArgs.push_back(Args.MakeArgString(
8445 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008446 }
8447
8448 Args.AddAllArgs(CmdArgs, options::OPT_L);
8449 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8450 Args.AddAllArgs(CmdArgs, options::OPT_e);
8451
Daniel Dunbar54423b22010-09-17 00:24:54 +00008452 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008453
8454 if (!Args.hasArg(options::OPT_nostdlib) &&
8455 !Args.hasArg(options::OPT_nodefaultlibs)) {
8456 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8457 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008458 if (UseGCC47)
8459 CmdArgs.push_back("-L/usr/lib/gcc47");
8460 else
8461 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008462
8463 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008464 if (UseGCC47) {
8465 CmdArgs.push_back("-rpath");
8466 CmdArgs.push_back("/usr/lib/gcc47");
8467 } else {
8468 CmdArgs.push_back("-rpath");
8469 CmdArgs.push_back("/usr/lib/gcc44");
8470 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008471 }
8472
Hans Wennborg70850d82013-07-18 20:29:38 +00008473 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008474 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008475 CmdArgs.push_back("-lm");
8476 }
8477
Daniel Dunbarcc912342009-05-02 18:28:39 +00008478 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008479 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008480
8481 if (!Args.hasArg(options::OPT_nolibc)) {
8482 CmdArgs.push_back("-lc");
8483 }
8484
John McCall65b8da02013-04-11 22:55:55 +00008485 if (UseGCC47) {
8486 if (Args.hasArg(options::OPT_static) ||
8487 Args.hasArg(options::OPT_static_libgcc)) {
8488 CmdArgs.push_back("-lgcc");
8489 CmdArgs.push_back("-lgcc_eh");
8490 } else {
8491 if (Args.hasArg(options::OPT_shared_libgcc)) {
8492 CmdArgs.push_back("-lgcc_pic");
8493 if (!Args.hasArg(options::OPT_shared))
8494 CmdArgs.push_back("-lgcc");
8495 } else {
8496 CmdArgs.push_back("-lgcc");
8497 CmdArgs.push_back("--as-needed");
8498 CmdArgs.push_back("-lgcc_pic");
8499 CmdArgs.push_back("--no-as-needed");
8500 }
8501 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008502 } else {
John McCall65b8da02013-04-11 22:55:55 +00008503 if (Args.hasArg(options::OPT_shared)) {
8504 CmdArgs.push_back("-lgcc_pic");
8505 } else {
8506 CmdArgs.push_back("-lgcc");
8507 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008508 }
8509 }
8510
8511 if (!Args.hasArg(options::OPT_nostdlib) &&
8512 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008513 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008514 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008515 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008516 else
8517 CmdArgs.push_back(Args.MakeArgString(
8518 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008519 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008520 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008521 }
8522
Alexey Samsonov7811d192014-02-20 13:57:37 +00008523 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008524
Logan Chieneb9162f2014-06-26 14:23:45 +00008525 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008526 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008527}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008528
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008529// Try to find Exe from a Visual Studio distribution. This first tries to find
8530// an installed copy of Visual Studio and, failing that, looks in the PATH,
8531// making sure that whatever executable that's found is not a same-named exe
8532// from clang itself to prevent clang from falling back to itself.
8533static std::string FindVisualStudioExecutable(const ToolChain &TC,
8534 const char *Exe,
8535 const char *ClangProgramPath) {
8536 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8537 std::string visualStudioBinDir;
8538 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8539 visualStudioBinDir)) {
8540 SmallString<128> FilePath(visualStudioBinDir);
8541 llvm::sys::path::append(FilePath, Exe);
8542 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8543 return FilePath.str();
8544 }
8545
8546 return Exe;
8547}
8548
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008549void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8550 const InputInfo &Output,
8551 const InputInfoList &Inputs,
8552 const ArgList &Args,
8553 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008554 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008555 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008556
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008557 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8558 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008559 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8560 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008561
8562 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008563 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008564 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008565
Zachary Turner10d75b22014-10-22 20:40:43 +00008566 if (!llvm::sys::Process::GetEnv("LIB")) {
8567 // If the VC environment hasn't been configured (perhaps because the user
8568 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008569 // the environment variable is set however, assume the user knows what
8570 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008571 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008572 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008573 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8574 SmallString<128> LibDir(VisualStudioDir);
8575 llvm::sys::path::append(LibDir, "VC", "lib");
8576 switch (MSVC.getArch()) {
8577 case llvm::Triple::x86:
8578 // x86 just puts the libraries directly in lib
8579 break;
8580 case llvm::Triple::x86_64:
8581 llvm::sys::path::append(LibDir, "amd64");
8582 break;
8583 case llvm::Triple::arm:
8584 llvm::sys::path::append(LibDir, "arm");
8585 break;
8586 default:
8587 break;
8588 }
8589 CmdArgs.push_back(
8590 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8591 }
8592
8593 std::string WindowsSdkLibPath;
8594 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8595 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8596 WindowsSdkLibPath.c_str()));
8597 }
8598
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008599 CmdArgs.push_back("-nologo");
8600
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008601 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008602 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008603
Hans Wennborge4c47f22015-03-04 23:16:21 +00008604 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8605 options::OPT__SLASH_LDd,
8606 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008607 if (DLL) {
8608 CmdArgs.push_back(Args.MakeArgString("-dll"));
8609
8610 SmallString<128> ImplibName(Output.getFilename());
8611 llvm::sys::path::replace_extension(ImplibName, "lib");
8612 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008613 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008614 }
8615
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008616 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008617 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008618 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008619 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008620 static const char *CompilerRTComponents[] = {
8621 "asan_dynamic",
8622 "asan_dynamic_runtime_thunk",
8623 };
8624 for (const auto &Component : CompilerRTComponents)
8625 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008626 // Make sure the dynamic runtime thunk is not optimized out at link time
8627 // to ensure proper SEH handling.
8628 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008629 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008630 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008631 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008632 static const char *CompilerRTComponents[] = {
8633 "asan",
8634 "asan_cxx",
8635 };
8636 for (const auto &Component : CompilerRTComponents)
8637 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008638 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008639 }
8640
Hans Wennborg2e274592013-08-13 23:38:57 +00008641 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008642
Reid Kleckner337188f2014-09-16 19:22:00 +00008643 // Add filenames, libraries, and other linker inputs.
8644 for (const auto &Input : Inputs) {
8645 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008646 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008647 continue;
8648 }
8649
8650 const Arg &A = Input.getInputArg();
8651
8652 // Render -l options differently for the MSVC linker.
8653 if (A.getOption().matches(options::OPT_l)) {
8654 StringRef Lib = A.getValue();
8655 const char *LinkLibArg;
8656 if (Lib.endswith(".lib"))
8657 LinkLibArg = Args.MakeArgString(Lib);
8658 else
8659 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8660 CmdArgs.push_back(LinkLibArg);
8661 continue;
8662 }
8663
8664 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8665 // or -L. Render it, even if MSVC doesn't understand it.
8666 A.renderAsInput(Args, CmdArgs);
8667 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008668
Zachary Turner719f58c2014-12-01 23:06:47 +00008669 // We need to special case some linker paths. In the case of lld, we need to
8670 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8671 // linker, we need to use a special search algorithm.
8672 llvm::SmallString<128> linkPath;
8673 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8674 if (Linker.equals_lower("lld"))
8675 Linker = "lld-link";
8676
8677 if (Linker.equals_lower("link")) {
8678 // If we're using the MSVC linker, it's not sufficient to just use link
8679 // from the program PATH, because other environments like GnuWin32 install
8680 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008681 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008682 C.getDriver().getClangProgramPath());
8683 } else {
8684 linkPath = Linker;
8685 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008686 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008687 }
8688
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008689 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008691}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008692
8693void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8694 const InputInfo &Output,
8695 const InputInfoList &Inputs,
8696 const ArgList &Args,
8697 const char *LinkingOutput) const {
8698 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8699}
8700
David Blaikiec11bf802014-09-04 16:04:28 +00008701std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8702 Compilation &C, const JobAction &JA, const InputInfo &Output,
8703 const InputInfoList &Inputs, const ArgList &Args,
8704 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008705 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008706 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008707 CmdArgs.push_back("/c"); // Compile only.
8708 CmdArgs.push_back("/W0"); // No warnings.
8709
8710 // The goal is to be able to invoke this tool correctly based on
8711 // any flag accepted by clang-cl.
8712
8713 // These are spelled the same way in clang and cl.exe,.
8714 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8715 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008716
8717 // Optimization level.
8718 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8719 if (A->getOption().getID() == options::OPT_O0) {
8720 CmdArgs.push_back("/Od");
8721 } else {
8722 StringRef OptLevel = A->getValue();
8723 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8724 A->render(Args, CmdArgs);
8725 else if (OptLevel == "3")
8726 CmdArgs.push_back("/Ox");
8727 }
8728 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008729
Nico Weber3f8dafb2015-03-12 19:37:10 +00008730 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008731 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8732
David Majnemerf6072342014-07-01 22:24:56 +00008733 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8734 /*default=*/false))
8735 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008736 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8737 options::OPT_fno_function_sections))
8738 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8739 ? "/Gy"
8740 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008741 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8742 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008743 CmdArgs.push_back(
8744 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008745 if (Args.hasArg(options::OPT_fsyntax_only))
8746 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008747 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8748 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008749
Nico Weber3f8dafb2015-03-12 19:37:10 +00008750 std::vector<std::string> Includes =
8751 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008752 for (const auto &Include : Includes)
8753 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008754
Hans Wennborg87cfa712013-09-19 20:32:16 +00008755 // Flags that can simply be passed through.
8756 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8757 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008758 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008759
8760 // The order of these flags is relevant, so pick the last one.
8761 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8762 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8763 A->render(Args, CmdArgs);
8764
8765
8766 // Input filename.
8767 assert(Inputs.size() == 1);
8768 const InputInfo &II = Inputs[0];
8769 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8770 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8771 if (II.isFilename())
8772 CmdArgs.push_back(II.getFilename());
8773 else
8774 II.getInputArg().renderAsInput(Args, CmdArgs);
8775
8776 // Output filename.
8777 assert(Output.getType() == types::TY_Object);
8778 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8779 Output.getFilename());
8780 CmdArgs.push_back(Fo);
8781
Hans Wennborg188382e2013-09-20 18:16:35 +00008782 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008783 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8784 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008785 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8786 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008787}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008788
8789
8790/// XCore Tools
8791// We pass assemble and link construction to the xcc tool.
8792
8793void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8794 const InputInfo &Output,
8795 const InputInfoList &Inputs,
8796 const ArgList &Args,
8797 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008798 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008799 ArgStringList CmdArgs;
8800
8801 CmdArgs.push_back("-o");
8802 CmdArgs.push_back(Output.getFilename());
8803
8804 CmdArgs.push_back("-c");
8805
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008806 if (Args.hasArg(options::OPT_v))
8807 CmdArgs.push_back("-v");
8808
Robert Lytton894d25c2014-05-02 09:33:25 +00008809 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8810 if (!A->getOption().matches(options::OPT_g0))
8811 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008812
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008813 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8814 false))
8815 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008816
8817 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8818 options::OPT_Xassembler);
8819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008820 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008821 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008822
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008825}
8826
8827void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8828 const InputInfo &Output,
8829 const InputInfoList &Inputs,
8830 const ArgList &Args,
8831 const char *LinkingOutput) const {
8832 ArgStringList CmdArgs;
8833
8834 if (Output.isFilename()) {
8835 CmdArgs.push_back("-o");
8836 CmdArgs.push_back(Output.getFilename());
8837 } else {
8838 assert(Output.isNothing() && "Invalid output.");
8839 }
8840
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008841 if (Args.hasArg(options::OPT_v))
8842 CmdArgs.push_back("-v");
8843
David Majnemer8de68642014-12-05 08:11:58 +00008844 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008845 CmdArgs.push_back("-fexceptions");
8846
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008847 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8848
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008849 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008850 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008851}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008852
8853void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8854 const InputInfo &Output,
8855 const InputInfoList &Inputs,
8856 const ArgList &Args,
8857 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008858 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008859 const auto &TC =
8860 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8861 ArgStringList CmdArgs;
8862 const char *Exec;
8863
8864 switch (TC.getArch()) {
8865 default: llvm_unreachable("unsupported architecture");
8866 case llvm::Triple::arm:
8867 case llvm::Triple::thumb:
8868 break;
8869 case llvm::Triple::x86:
8870 CmdArgs.push_back("--32");
8871 break;
8872 case llvm::Triple::x86_64:
8873 CmdArgs.push_back("--64");
8874 break;
8875 }
8876
8877 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8878
8879 CmdArgs.push_back("-o");
8880 CmdArgs.push_back(Output.getFilename());
8881
8882 for (const auto &Input : Inputs)
8883 CmdArgs.push_back(Input.getFilename());
8884
8885 const std::string Assembler = TC.GetProgramPath("as");
8886 Exec = Args.MakeArgString(Assembler);
8887
8888 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8889}
8890
8891void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8892 const InputInfo &Output,
8893 const InputInfoList &Inputs,
8894 const ArgList &Args,
8895 const char *LinkingOutput) const {
8896 const auto &TC =
8897 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8898 const llvm::Triple &T = TC.getTriple();
8899 const Driver &D = TC.getDriver();
8900 SmallString<128> EntryPoint;
8901 ArgStringList CmdArgs;
8902 const char *Exec;
8903
8904 // Silence warning for "clang -g foo.o -o foo"
8905 Args.ClaimAllArgs(options::OPT_g_Group);
8906 // and "clang -emit-llvm foo.o -o foo"
8907 Args.ClaimAllArgs(options::OPT_emit_llvm);
8908 // and for "clang -w foo.o -o foo"
8909 Args.ClaimAllArgs(options::OPT_w);
8910 // Other warning options are already handled somewhere else.
8911
8912 if (!D.SysRoot.empty())
8913 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8914
8915 if (Args.hasArg(options::OPT_pie))
8916 CmdArgs.push_back("-pie");
8917 if (Args.hasArg(options::OPT_rdynamic))
8918 CmdArgs.push_back("-export-dynamic");
8919 if (Args.hasArg(options::OPT_s))
8920 CmdArgs.push_back("--strip-all");
8921
8922 CmdArgs.push_back("-m");
8923 switch (TC.getArch()) {
8924 default: llvm_unreachable("unsupported architecture");
8925 case llvm::Triple::arm:
8926 case llvm::Triple::thumb:
8927 // FIXME: this is incorrect for WinCE
8928 CmdArgs.push_back("thumb2pe");
8929 break;
8930 case llvm::Triple::x86:
8931 CmdArgs.push_back("i386pe");
8932 EntryPoint.append("_");
8933 break;
8934 case llvm::Triple::x86_64:
8935 CmdArgs.push_back("i386pep");
8936 break;
8937 }
8938
8939 if (Args.hasArg(options::OPT_shared)) {
8940 switch (T.getArch()) {
8941 default: llvm_unreachable("unsupported architecture");
8942 case llvm::Triple::arm:
8943 case llvm::Triple::thumb:
8944 case llvm::Triple::x86_64:
8945 EntryPoint.append("_DllMainCRTStartup");
8946 break;
8947 case llvm::Triple::x86:
8948 EntryPoint.append("_DllMainCRTStartup@12");
8949 break;
8950 }
8951
8952 CmdArgs.push_back("-shared");
8953 CmdArgs.push_back("-Bdynamic");
8954
8955 CmdArgs.push_back("--enable-auto-image-base");
8956
8957 CmdArgs.push_back("--entry");
8958 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8959 } else {
8960 EntryPoint.append("mainCRTStartup");
8961
8962 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8963 : "-Bdynamic");
8964
8965 if (!Args.hasArg(options::OPT_nostdlib) &&
8966 !Args.hasArg(options::OPT_nostartfiles)) {
8967 CmdArgs.push_back("--entry");
8968 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8969 }
8970
8971 // FIXME: handle subsystem
8972 }
8973
8974 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008975 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008976
8977 CmdArgs.push_back("-o");
8978 CmdArgs.push_back(Output.getFilename());
8979
8980 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8981 SmallString<261> ImpLib(Output.getFilename());
8982 llvm::sys::path::replace_extension(ImpLib, ".lib");
8983
8984 CmdArgs.push_back("--out-implib");
8985 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8986 }
8987
8988 if (!Args.hasArg(options::OPT_nostdlib) &&
8989 !Args.hasArg(options::OPT_nostartfiles)) {
8990 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8991 const char *CRTBegin;
8992
8993 CRTBegin =
8994 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8995 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8996 }
8997
8998 Args.AddAllArgs(CmdArgs, options::OPT_L);
8999
9000 const auto &Paths = TC.getFilePaths();
9001 for (const auto &Path : Paths)
9002 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9003
9004 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9005
9006 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9007 !Args.hasArg(options::OPT_nodefaultlibs)) {
9008 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9009 !Args.hasArg(options::OPT_static);
9010 if (StaticCXX)
9011 CmdArgs.push_back("-Bstatic");
9012 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9013 if (StaticCXX)
9014 CmdArgs.push_back("-Bdynamic");
9015 }
9016
9017 if (!Args.hasArg(options::OPT_nostdlib)) {
9018 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9019 // TODO handle /MT[d] /MD[d]
9020 CmdArgs.push_back("-lmsvcrt");
9021 AddRunTimeLibs(TC, D, CmdArgs, Args);
9022 }
9023 }
9024
9025 const std::string Linker = TC.GetProgramPath("ld");
9026 Exec = Args.MakeArgString(Linker);
9027
9028 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9029}