blob: 186f08e2116524c8a415fceffeeef1f31c35f954 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
87 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
88 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000090 << A->getAsString(Args) << "-static";
91}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
98 for ( ; *Arg; ++Arg) {
99 switch (*Arg) {
100 default: break;
101 case ' ':
102 case '\\':
103 Res.push_back('\\');
104 break;
105 }
106 Res.push_back(*Arg);
107 }
108}
109
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000110// Quote target names for inclusion in GNU Make dependency files.
111// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112static void QuoteTarget(StringRef Target,
113 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Bill Wendlingc0938f32012-03-12 22:10:06 +0000139static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000140 ArgStringList &CmdArgs,
141 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000142 const char *EnvVar) {
143 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 bool CombinedArg = false;
145
Bill Wendling281ca292012-03-12 21:22:35 +0000146 if (!DirList)
147 return; // Nothing to do.
148
Chad Rosier616e8a52012-10-30 21:42:09 +0000149 StringRef Name(ArgName);
150 if (Name.equals("-I") || Name.equals("-L"))
151 CombinedArg = true;
152
Bill Wendling281ca292012-03-12 21:22:35 +0000153 StringRef Dirs(DirList);
154 if (Dirs.empty()) // Empty string should not add '.'.
155 return;
156
157 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000158 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000159 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000160 if (CombinedArg) {
161 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
162 } else {
163 CmdArgs.push_back(ArgName);
164 CmdArgs.push_back(".");
165 }
Bill Wendling281ca292012-03-12 21:22:35 +0000166 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000167 if (CombinedArg) {
168 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
169 } else {
170 CmdArgs.push_back(ArgName);
171 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
172 }
Bill Wendling281ca292012-03-12 21:22:35 +0000173 }
Nico Weber89355782012-03-19 15:00:03 +0000174 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000175 }
176
177 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000178 if (CombinedArg) {
179 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
180 } else {
181 CmdArgs.push_back(ArgName);
182 CmdArgs.push_back(".");
183 }
Bill Wendling281ca292012-03-12 21:22:35 +0000184 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000185 if (CombinedArg) {
186 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
187 } else {
188 CmdArgs.push_back(ArgName);
189 CmdArgs.push_back(Args.MakeArgString(Dirs));
190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191 }
192}
193
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194static void AddLinkerInputs(const ToolChain &TC,
195 const InputInfoList &Inputs, const ArgList &Args,
196 ArgStringList &CmdArgs) {
197 const Driver &D = TC.getDriver();
198
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000199 // Add extra linker input arguments which are not treated as inputs
200 // (constructed via -Xarch_).
201 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
202
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000203 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000204 if (!TC.HasNativeLLVMSupport()) {
205 // Don't try to pass LLVM inputs unless we have native support.
206 if (II.getType() == types::TY_LLVM_IR ||
207 II.getType() == types::TY_LTO_IR ||
208 II.getType() == types::TY_LLVM_BC ||
209 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000210 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 << TC.getTripleString();
212 }
213
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000214 // Add filenames immediately.
215 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000216 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000217 continue;
218 }
219
220 // Otherwise, this is a linker input argument.
221 const Arg &A = II.getInputArg();
222
223 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000224 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000225 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000226 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000227 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000228 else if (A.getOption().matches(options::OPT_z)) {
229 // Pass -z prefix for gcc linker compatibility.
230 A.claim();
231 A.render(Args, CmdArgs);
232 } else {
233 A.renderAsInput(Args, CmdArgs);
234 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000235 }
Bill Wendling281ca292012-03-12 21:22:35 +0000236
237 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000238 // and only supported on native toolchains.
239 if (!TC.isCrossCompiling())
240 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000241}
242
John McCall31168b02011-06-15 23:02:42 +0000243/// \brief Determine whether Objective-C automated reference counting is
244/// enabled.
245static bool isObjCAutoRefCount(const ArgList &Args) {
246 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
247}
248
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249/// \brief Determine whether we are linking the ObjC runtime.
250static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000251 if (isObjCAutoRefCount(Args)) {
252 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000253 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000254 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000255 return Args.hasArg(options::OPT_fobjc_link_runtime);
256}
257
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000258static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000259 // Don't forward inputs from the original command line. They are added from
260 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000261 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000262 !O.hasFlag(options::DriverOption) &&
263 !O.hasFlag(options::LinkerInput);
264}
265
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000266void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000268 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000269 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000270 ArgStringList &CmdArgs,
271 const InputInfo &Output,
272 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000274
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000275 CheckPreprocessingOptions(D, Args);
276
277 Args.AddLastArg(CmdArgs, options::OPT_C);
278 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000279
280 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000281 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 (A = Args.getLastArg(options::OPT_MD)) ||
283 (A = Args.getLastArg(options::OPT_MMD))) {
284 // Determine the output location.
285 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000286 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000287 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000288 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000289 } else if (Output.getType() == types::TY_Dependencies) {
290 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000291 } else if (A->getOption().matches(options::OPT_M) ||
292 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 DepFile = "-";
294 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000295 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000296 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 }
298 CmdArgs.push_back("-dependency-file");
299 CmdArgs.push_back(DepFile);
300
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000301 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
303 const char *DepTarget;
304
305 // If user provided -o, that is the dependency target, except
306 // when we are only generating a dependency file.
307 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
308 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000309 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 } else {
311 // Otherwise derive from the base input.
312 //
313 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000315 llvm::sys::path::replace_extension(P, "o");
316 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 }
318
319 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 QuoteTarget(DepTarget, Quoted);
322 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000325 if (A->getOption().matches(options::OPT_M) ||
326 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000328 if ((isa<PrecompileJobAction>(JA) &&
329 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
330 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000331 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332 }
333
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000334 if (Args.hasArg(options::OPT_MG)) {
335 if (!A || A->getOption().matches(options::OPT_MD) ||
336 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000337 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000338 CmdArgs.push_back("-MG");
339 }
340
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000342 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000343
344 // Convert all -MQ <target> args to -MT <quoted target>
345 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
346 options::OPT_MQ),
347 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 const Arg *A = *it;
349 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350
Daniel Dunbara442fd52010-06-11 22:00:13 +0000351 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000353 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000354 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back(Args.MakeArgString(Quoted));
356
357 // -MT flag - no change
358 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000359 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000360 }
361 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 // Add -i* options, and automatically translate to
364 // -include-pch/-include-pth for transparent PCH support. It's
365 // wonky, but we include looking for .gch so we can support seamless
366 // replacement into a build system already set up to be generating
367 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000368 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000369 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
370 ie = Args.filtered_end(); it != ie; ++it) {
371 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372
373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
428 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000429 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
430 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
432 // Add -Wp, and -Xassembler if using the preprocessor.
433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000470 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000471 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000472 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000473
474 // Add system include arguments.
475 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000476}
477
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478// FIXME: Move to target hook.
479static bool isSignedCharDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return true;
483
Tim Northover9bb857a2013-01-31 12:13:10 +0000484 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000485 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000487 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000488 case llvm::Triple::thumb:
489 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000490 if (Triple.isOSDarwin() || Triple.isOSWindows())
491 return true;
492 return false;
493
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 case llvm::Triple::ppc:
495 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000496 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000497 return true;
498 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000499
Bill Schmidt778d3872013-07-26 01:36:11 +0000500 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000501 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000502 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000503 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000504 }
505}
506
Robert Lytton0e076492013-08-13 09:43:10 +0000507static bool isNoCommonDefault(const llvm::Triple &Triple) {
508 switch (Triple.getArch()) {
509 default:
510 return false;
511
512 case llvm::Triple::xcore:
513 return true;
514 }
515}
516
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000517// Handle -mhwdiv=.
518static void getARMHWDivFeatures(const Driver &D, const Arg *A,
519 const ArgList &Args,
520 std::vector<const char *> &Features) {
521 StringRef HWDiv = A->getValue();
522 if (HWDiv == "arm") {
523 Features.push_back("+hwdiv-arm");
524 Features.push_back("-hwdiv");
525 } else if (HWDiv == "thumb") {
526 Features.push_back("-hwdiv-arm");
527 Features.push_back("+hwdiv");
528 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
529 Features.push_back("+hwdiv-arm");
530 Features.push_back("+hwdiv");
531 } else if (HWDiv == "none") {
532 Features.push_back("-hwdiv-arm");
533 Features.push_back("-hwdiv");
534 } else
535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
539//
540// FIXME: Centralize feature selection, defaulting shouldn't be also in the
541// frontend target.
542static void getARMFPUFeatures(const Driver &D, const Arg *A,
543 const ArgList &Args,
544 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000545 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000546
Renato Golin0600e1e2015-05-08 21:04:50 +0000547 // FIXME: Why does "none" disable more than "invalid"?
548 if (FPU == "none") {
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000549 Features.push_back("-vfp2");
550 Features.push_back("-vfp3");
551 Features.push_back("-vfp4");
552 Features.push_back("-fp-armv8");
553 Features.push_back("-crypto");
554 Features.push_back("-neon");
Renato Golin0600e1e2015-05-08 21:04:50 +0000555 return;
556 }
557
558 // FIXME: Make sure we differentiate sp-only.
559 if (FPU.find("-sp-") != StringRef::npos) {
560 Features.push_back("+fp-only-sp");
561 }
562
563 // All other FPU types, valid or invalid.
564 switch(llvm::ARMTargetParser::parseFPU(FPU)) {
565 case llvm::ARM::INVALID_FPU:
566 case llvm::ARM::SOFTVFP:
567 Features.push_back("-vfp2");
568 Features.push_back("-vfp3");
569 Features.push_back("-neon");
570 break;
571 case llvm::ARM::VFP:
572 case llvm::ARM::VFPV2:
573 Features.push_back("+vfp2");
574 Features.push_back("-neon");
575 break;
576 case llvm::ARM::VFPV3_D16:
577 Features.push_back("+d16");
578 // fall-through
579 case llvm::ARM::VFPV3:
580 Features.push_back("+vfp3");
581 Features.push_back("-neon");
582 break;
583 case llvm::ARM::VFPV4_D16:
584 Features.push_back("+d16");
585 // fall-through
586 case llvm::ARM::VFPV4:
587 Features.push_back("+vfp4");
588 Features.push_back("-neon");
589 break;
590 case llvm::ARM::FPV5_D16:
591 Features.push_back("+d16");
592 // fall-through
593 case llvm::ARM::FP_ARMV8:
594 Features.push_back("+fp-armv8");
595 Features.push_back("-neon");
596 Features.push_back("-crypto");
597 break;
598 case llvm::ARM::NEON_FP_ARMV8:
599 Features.push_back("+fp-armv8");
600 Features.push_back("+neon");
601 Features.push_back("-crypto");
602 break;
603 case llvm::ARM::CRYPTO_NEON_FP_ARMV8:
604 Features.push_back("+fp-armv8");
605 Features.push_back("+neon");
606 Features.push_back("+crypto");
607 break;
608 case llvm::ARM::NEON:
609 Features.push_back("+neon");
610 break;
611 case llvm::ARM::NEON_VFPV4:
612 Features.push_back("+neon");
613 Features.push_back("+vfp4");
614 break;
615 default:
Chad Rosiercfbfc582012-04-04 20:51:35 +0000616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Renato Golin0600e1e2015-05-08 21:04:50 +0000617 }
Chad Rosiercfbfc582012-04-04 20:51:35 +0000618}
619
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000620// Select the float ABI as determined by -msoft-float, -mhard-float, and
621// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000622StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000623 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000624 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000625 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
626 options::OPT_mhard_float,
627 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 if (A->getOption().matches(options::OPT_msoft_float))
629 FloatABI = "soft";
630 else if (A->getOption().matches(options::OPT_mhard_float))
631 FloatABI = "hard";
632 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000633 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000635 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000636 << A->getAsString(Args);
637 FloatABI = "soft";
638 }
639 }
640 }
641
642 // If unspecified, choose the default based on the platform.
643 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000644 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000645 case llvm::Triple::Darwin:
646 case llvm::Triple::MacOSX:
647 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000648 // Darwin defaults to "softfp" for v6 and v7.
649 //
650 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000651 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000652 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000653 if (StringRef(ArchName).startswith("v6") ||
654 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000655 FloatABI = "softfp";
656 else
657 FloatABI = "soft";
658 break;
659 }
660
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000661 // FIXME: this is invalid for WindowsCE
662 case llvm::Triple::Win32:
663 FloatABI = "hard";
664 break;
665
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000666 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000667 switch(Triple.getEnvironment()) {
668 case llvm::Triple::GNUEABIHF:
669 FloatABI = "hard";
670 break;
671 default:
672 // FreeBSD defaults to soft float
673 FloatABI = "soft";
674 break;
675 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000676 break;
677
Daniel Dunbar78485922009-09-10 23:00:09 +0000678 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000679 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000680 case llvm::Triple::GNUEABIHF:
681 FloatABI = "hard";
682 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000683 case llvm::Triple::GNUEABI:
684 FloatABI = "softfp";
685 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000686 case llvm::Triple::EABIHF:
687 FloatABI = "hard";
688 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000689 case llvm::Triple::EABI:
690 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
691 FloatABI = "softfp";
692 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000693 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000694 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000695 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000696 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000697 FloatABI = "softfp";
698 else
699 FloatABI = "soft";
700 break;
701 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000702 default:
703 // Assume "soft", but warn the user we are guessing.
704 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000705 if (Triple.getOS() != llvm::Triple::UnknownOS ||
706 !Triple.isOSBinFormatMachO())
707 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000708 break;
709 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000710 }
711 }
712
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000713 return FloatABI;
714}
715
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000716static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
717 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000718 std::vector<const char *> &Features,
719 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000720 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
721 if (!ForAS) {
722 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
723 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
724 // stripped out by the ARM target. We should probably pass this a new
725 // -target-option, which is handled by the -cc1/-cc1as invocation.
726 //
727 // FIXME2: For consistency, it would be ideal if we set up the target
728 // machine state the same when using the frontend or the assembler. We don't
729 // currently do that for the assembler, we pass the options directly to the
730 // backend and never even instantiate the frontend TargetInfo. If we did,
731 // and used its handleTargetFeatures hook, then we could ensure the
732 // assembler and the frontend behave the same.
733
734 // Use software floating point operations?
735 if (FloatABI == "soft")
736 Features.push_back("+soft-float");
737
738 // Use software floating point argument passing?
739 if (FloatABI != "hard")
740 Features.push_back("+soft-float-abi");
741 }
742
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000743 // Honor -mfpu=.
744 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000745 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000746 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
747 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000748
John Brawna95c1a82015-05-08 12:52:18 +0000749 // -march is handled in getARMCPUForMarch by translating it into a CPU name,
750 // but it needs to return an empty string on invalid arguments. We therefore
751 // check and give an error here if the -march is invalid.
752 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
753 if (!Triple.getARMCPUForArch(A->getValue()))
754 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
755
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 // Setting -msoft-float effectively disables NEON because of the GCC
757 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000758 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000759 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000760 // Also need to explicitly disable features which imply NEON.
761 Features.push_back("-crypto");
762 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000763
Eric Christopher269c2a22015-04-04 03:34:43 +0000764 // En/disable crc code generation.
765 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000766 if (A->getOption().matches(options::OPT_mcrc))
767 Features.push_back("+crc");
768 else
769 Features.push_back("-crc");
770 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000771}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000772
773void Clang::AddARMTargetArgs(const ArgList &Args,
774 ArgStringList &CmdArgs,
775 bool KernelOrKext) const {
776 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000777 // Get the effective triple, which takes into account the deployment target.
778 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
779 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000780 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000781
782 // Select the ABI to use.
783 //
784 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000785 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000786 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000787 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000788 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000789 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000790 // The backend is hardwired to assume AAPCS for M-class processors, ensure
791 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000792 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000793 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000794 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000795 ABIName = "aapcs";
796 } else {
797 ABIName = "apcs-gnu";
798 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000799 } else if (Triple.isOSWindows()) {
800 // FIXME: this is invalid for WindowsCE
801 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000802 } else {
803 // Select the default based on the platform.
804 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000805 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000806 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000807 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 ABIName = "aapcs-linux";
809 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000810 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000811 case llvm::Triple::EABI:
812 ABIName = "aapcs";
813 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000814 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000815 if (Triple.getOS() == llvm::Triple::NetBSD)
816 ABIName = "apcs-gnu";
817 else
818 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000819 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000820 }
821 }
822 CmdArgs.push_back("-target-abi");
823 CmdArgs.push_back(ABIName);
824
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000825 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000826 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000827 if (FloatABI == "soft") {
828 // Floating point operations and argument passing are soft.
829 //
830 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000831 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000832 CmdArgs.push_back("-mfloat-abi");
833 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000834 } else if (FloatABI == "softfp") {
835 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000836 CmdArgs.push_back("-mfloat-abi");
837 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000838 } else {
839 // Floating point operations and argument passing are hard.
840 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000841 CmdArgs.push_back("-mfloat-abi");
842 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000843 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000844
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000845 // Kernel code has more strict alignment requirements.
846 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000847 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000848 CmdArgs.push_back("-backend-option");
849 CmdArgs.push_back("-arm-long-calls");
850 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000851
Daniel Dunbar12100e22011-03-22 16:48:17 +0000852 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000853 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000854
855 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000856 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000857 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000858 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000859
Bob Wilson0874e532014-07-29 00:23:18 +0000860 // -mkernel implies -mstrict-align; don't add the redundant option.
861 if (!KernelOrKext) {
862 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
863 options::OPT_munaligned_access)) {
864 CmdArgs.push_back("-backend-option");
865 if (A->getOption().matches(options::OPT_mno_unaligned_access))
866 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000867 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000868 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000869 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000870 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000871 }
Bob Wilson0874e532014-07-29 00:23:18 +0000872 }
873 }
874
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000875 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000876 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
877 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000878 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000879 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000880 CmdArgs.push_back("-arm-global-merge=false");
881 else
882 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000883 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000884
Bob Wilson9c8af452013-04-11 18:53:25 +0000885 if (!Args.hasFlag(options::OPT_mimplicit_float,
886 options::OPT_mno_implicit_float,
887 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000888 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000889
Logan Chien749763e2014-04-03 13:12:44 +0000890 // llvm does not support reserving registers in general. There is support
891 // for reserving r9 on ARM though (defined as a platform-specific register
892 // in ARM EABI).
893 if (Args.hasArg(options::OPT_ffixed_r9)) {
894 CmdArgs.push_back("-backend-option");
895 CmdArgs.push_back("-arm-reserve-r9");
896 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000897}
898
Tim Northover573cbee2014-05-24 12:52:07 +0000899/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
900/// targeting.
901static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000902 Arg *A;
903 std::string CPU;
904 // If we have -mtune or -mcpu, use that.
905 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
906 CPU = A->getValue();
907 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000908 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000909 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000910 }
911
Kevin Qin110db6f2014-07-18 07:03:22 +0000912 // Handle CPU name is 'native'.
913 if (CPU == "native")
914 return llvm::sys::getHostCPUName();
915 else if (CPU.size())
916 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000917
James Molloy9b1586b2014-04-17 12:51:17 +0000918 // Make sure we pick "cyclone" if -arch is used.
919 // FIXME: Should this be picked by checking the target triple instead?
920 if (Args.getLastArg(options::OPT_arch))
921 return "cyclone";
922
923 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000924}
925
Tim Northover573cbee2014-05-24 12:52:07 +0000926void Clang::AddAArch64TargetArgs(const ArgList &Args,
927 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000928 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
929 llvm::Triple Triple(TripleStr);
930
931 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
932 Args.hasArg(options::OPT_mkernel) ||
933 Args.hasArg(options::OPT_fapple_kext))
934 CmdArgs.push_back("-disable-red-zone");
935
936 if (!Args.hasFlag(options::OPT_mimplicit_float,
937 options::OPT_mno_implicit_float, true))
938 CmdArgs.push_back("-no-implicit-float");
939
Craig Topper92fc2df2014-05-17 16:56:41 +0000940 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000941 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
942 ABIName = A->getValue();
943 else if (Triple.isOSDarwin())
944 ABIName = "darwinpcs";
945 else
946 ABIName = "aapcs";
947
948 CmdArgs.push_back("-target-abi");
949 CmdArgs.push_back(ABIName);
950
Bob Wilson0874e532014-07-29 00:23:18 +0000951 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
952 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000953 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000954 if (A->getOption().matches(options::OPT_mno_unaligned_access))
955 CmdArgs.push_back("-aarch64-strict-align");
956 else
957 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000958 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000959
Bradley Smith9ff64332014-10-13 10:16:06 +0000960 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
961 options::OPT_mno_fix_cortex_a53_835769)) {
962 CmdArgs.push_back("-backend-option");
963 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
964 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
965 else
966 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000967 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
968 // Enabled A53 errata (835769) workaround by default on android
969 CmdArgs.push_back("-backend-option");
970 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000971 }
972
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000973 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000974 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
975 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000976 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000977 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000978 CmdArgs.push_back("-aarch64-global-merge=false");
979 else
980 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000981 }
Renato Golinb625f482015-01-25 23:17:48 +0000982
983 if (Args.hasArg(options::OPT_ffixed_x18)) {
984 CmdArgs.push_back("-backend-option");
985 CmdArgs.push_back("-aarch64-reserve-x18");
986 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000987}
988
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000989// Get CPU and ABI names. They are not independent
990// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000991void mips::getMipsCPUAndABI(const ArgList &Args,
992 const llvm::Triple &Triple,
993 StringRef &CPUName,
994 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000995 const char *DefMips32CPU = "mips32r2";
996 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000997
Daniel Sanders2bf13662014-07-10 14:40:57 +0000998 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
999 // default for mips64(el)?-img-linux-gnu.
1000 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1001 Triple.getEnvironment() == llvm::Triple::GNU) {
1002 DefMips32CPU = "mips32r6";
1003 DefMips64CPU = "mips64r6";
1004 }
1005
Brad Smithba26f582015-01-06 02:53:17 +00001006 // MIPS3 is the default for mips64*-unknown-openbsd.
1007 if (Triple.getOS() == llvm::Triple::OpenBSD)
1008 DefMips64CPU = "mips3";
1009
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001010 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001011 options::OPT_mcpu_EQ))
1012 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001013
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001014 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001015 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001016 // Convert a GNU style Mips ABI name to the name
1017 // accepted by LLVM Mips backend.
1018 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1019 .Case("32", "o32")
1020 .Case("64", "n64")
1021 .Default(ABIName);
1022 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001023
1024 // Setup default CPU and ABI names.
1025 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001026 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001027 default:
1028 llvm_unreachable("Unexpected triple arch name");
1029 case llvm::Triple::mips:
1030 case llvm::Triple::mipsel:
1031 CPUName = DefMips32CPU;
1032 break;
1033 case llvm::Triple::mips64:
1034 case llvm::Triple::mips64el:
1035 CPUName = DefMips64CPU;
1036 break;
1037 }
1038 }
1039
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001040 if (ABIName.empty()) {
1041 // Deduce ABI name from the target triple.
1042 if (Triple.getArch() == llvm::Triple::mips ||
1043 Triple.getArch() == llvm::Triple::mipsel)
1044 ABIName = "o32";
1045 else
1046 ABIName = "n64";
1047 }
1048
1049 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001050 // Deduce CPU name from ABI name.
1051 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001052 .Cases("o32", "eabi", DefMips32CPU)
1053 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001054 .Default("");
1055 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001056
1057 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001058}
1059
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001060// Convert ABI name to the GNU tools acceptable variant.
1061static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1062 return llvm::StringSwitch<llvm::StringRef>(ABI)
1063 .Case("o32", "32")
1064 .Case("n64", "64")
1065 .Default(ABI);
1066}
1067
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001068// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1069// and -mfloat-abi=.
1070static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001071 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001072 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001073 options::OPT_mhard_float,
1074 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001075 if (A->getOption().matches(options::OPT_msoft_float))
1076 FloatABI = "soft";
1077 else if (A->getOption().matches(options::OPT_mhard_float))
1078 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001079 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001080 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001081 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001082 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001083 FloatABI = "hard";
1084 }
1085 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001086 }
1087
1088 // If unspecified, choose the default based on the platform.
1089 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001090 // Assume "hard", because it's a default value used by gcc.
1091 // When we start to recognize specific target MIPS processors,
1092 // we will be able to select the default more correctly.
1093 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001094 }
1095
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001096 return FloatABI;
1097}
1098
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001099static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001100 std::vector<const char *> &Features,
1101 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001102 StringRef FeatureName) {
1103 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001104 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001105 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001106 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001107 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001108 }
1109}
1110
Daniel Sanders379d44b2014-07-16 11:52:23 +00001111static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1112 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001113 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001114 StringRef CPUName;
1115 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001116 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001117 ABIName = getGnuCompatibleMipsABIName(ABIName);
1118
Daniel Sandersfeb61302014-08-08 15:47:17 +00001119 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1120 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001121
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001122 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001123 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001124 // FIXME: Note, this is a hack. We need to pass the selected float
1125 // mode to the MipsTargetInfoBase to define appropriate macros there.
1126 // Now it is the only method.
1127 Features.push_back("+soft-float");
1128 }
1129
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001130 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001131 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001132 if (Val == "2008") {
1133 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1134 Features.push_back("+nan2008");
1135 else {
1136 Features.push_back("-nan2008");
1137 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1138 }
1139 } else if (Val == "legacy") {
1140 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1141 Features.push_back("-nan2008");
1142 else {
1143 Features.push_back("+nan2008");
1144 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1145 }
1146 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001147 D.Diag(diag::err_drv_unsupported_option_argument)
1148 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001149 }
1150
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001151 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1152 options::OPT_mdouble_float, "single-float");
1153 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1154 "mips16");
1155 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1156 options::OPT_mno_micromips, "micromips");
1157 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1158 "dsp");
1159 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1160 "dspr2");
1161 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1162 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001163
1164 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1165 // pass -mfpxx
1166 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1167 options::OPT_mfp64)) {
1168 if (A->getOption().matches(options::OPT_mfp32))
1169 Features.push_back(Args.MakeArgString("-fp64"));
1170 else if (A->getOption().matches(options::OPT_mfpxx)) {
1171 Features.push_back(Args.MakeArgString("+fpxx"));
1172 Features.push_back(Args.MakeArgString("+nooddspreg"));
1173 } else
1174 Features.push_back(Args.MakeArgString("+fp64"));
1175 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001176 Features.push_back(Args.MakeArgString("+fpxx"));
1177 Features.push_back(Args.MakeArgString("+nooddspreg"));
1178 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001179
Daniel Sanders28e5d392014-07-10 10:39:51 +00001180 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1181 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001182}
1183
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001184void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001185 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001186 const Driver &D = getToolChain().getDriver();
1187 StringRef CPUName;
1188 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001189 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001190 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001191
1192 CmdArgs.push_back("-target-abi");
1193 CmdArgs.push_back(ABIName.data());
1194
1195 StringRef FloatABI = getMipsFloatABI(D, Args);
1196
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001197 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001199 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 CmdArgs.push_back("-mfloat-abi");
1201 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001202 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001203 else {
1204 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001205 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001206 CmdArgs.push_back("-mfloat-abi");
1207 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001208 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001209
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001210 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1211 if (A->getOption().matches(options::OPT_mxgot)) {
1212 CmdArgs.push_back("-mllvm");
1213 CmdArgs.push_back("-mxgot");
1214 }
1215 }
1216
Simon Atanasyanc580b322013-05-11 06:33:44 +00001217 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1218 options::OPT_mno_ldc1_sdc1)) {
1219 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1220 CmdArgs.push_back("-mllvm");
1221 CmdArgs.push_back("-mno-ldc1-sdc1");
1222 }
1223 }
1224
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001225 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1226 options::OPT_mno_check_zero_division)) {
1227 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1228 CmdArgs.push_back("-mllvm");
1229 CmdArgs.push_back("-mno-check-zero-division");
1230 }
1231 }
1232
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001233 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001234 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001235 CmdArgs.push_back("-mllvm");
1236 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1237 A->claim();
1238 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001239}
1240
Hal Finkel8eb59282012-06-11 22:35:19 +00001241/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1242static std::string getPPCTargetCPU(const ArgList &Args) {
1243 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001244 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001245
1246 if (CPUName == "native") {
1247 std::string CPU = llvm::sys::getHostCPUName();
1248 if (!CPU.empty() && CPU != "generic")
1249 return CPU;
1250 else
1251 return "";
1252 }
1253
1254 return llvm::StringSwitch<const char *>(CPUName)
1255 .Case("common", "generic")
1256 .Case("440", "440")
1257 .Case("440fp", "440")
1258 .Case("450", "450")
1259 .Case("601", "601")
1260 .Case("602", "602")
1261 .Case("603", "603")
1262 .Case("603e", "603e")
1263 .Case("603ev", "603ev")
1264 .Case("604", "604")
1265 .Case("604e", "604e")
1266 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001267 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001268 .Case("G3", "g3")
1269 .Case("7400", "7400")
1270 .Case("G4", "g4")
1271 .Case("7450", "7450")
1272 .Case("G4+", "g4+")
1273 .Case("750", "750")
1274 .Case("970", "970")
1275 .Case("G5", "g5")
1276 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001277 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001278 .Case("e500mc", "e500mc")
1279 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001280 .Case("power3", "pwr3")
1281 .Case("power4", "pwr4")
1282 .Case("power5", "pwr5")
1283 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001285 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001286 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001287 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001288 .Case("pwr3", "pwr3")
1289 .Case("pwr4", "pwr4")
1290 .Case("pwr5", "pwr5")
1291 .Case("pwr5x", "pwr5x")
1292 .Case("pwr6", "pwr6")
1293 .Case("pwr6x", "pwr6x")
1294 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001295 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 .Case("powerpc", "ppc")
1297 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001298 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001299 .Default("");
1300 }
1301
1302 return "";
1303}
1304
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001305static void getPPCTargetFeatures(const ArgList &Args,
1306 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001307 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1308 ie = Args.filtered_end();
1309 it != ie; ++it) {
1310 StringRef Name = (*it)->getOption().getName();
1311 (*it)->claim();
1312
1313 // Skip over "-m".
1314 assert(Name.startswith("m") && "Invalid feature name.");
1315 Name = Name.substr(1);
1316
1317 bool IsNegative = Name.startswith("no-");
1318 if (IsNegative)
1319 Name = Name.substr(3);
1320
1321 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1322 // pass the correct option to the backend while calling the frontend
1323 // option the same.
1324 // TODO: Change the LLVM backend option maybe?
1325 if (Name == "mfcrf")
1326 Name = "mfocrf";
1327
1328 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1329 }
1330
1331 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001332 AddTargetFeature(Args, Features, options::OPT_faltivec,
1333 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001334}
1335
Ulrich Weigand8afad612014-07-28 13:17:52 +00001336void Clang::AddPPCTargetArgs(const ArgList &Args,
1337 ArgStringList &CmdArgs) const {
1338 // Select the ABI to use.
1339 const char *ABIName = nullptr;
1340 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1341 ABIName = A->getValue();
1342 } else if (getToolChain().getTriple().isOSLinux())
1343 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001344 case llvm::Triple::ppc64: {
1345 // When targeting a processor that supports QPX, or if QPX is
1346 // specifically enabled, default to using the ABI that supports QPX (so
1347 // long as it is not specifically disabled).
1348 bool HasQPX = false;
1349 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1350 HasQPX = A->getValue() == StringRef("a2q");
1351 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1352 if (HasQPX) {
1353 ABIName = "elfv1-qpx";
1354 break;
1355 }
1356
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357 ABIName = "elfv1";
1358 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001359 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001360 case llvm::Triple::ppc64le:
1361 ABIName = "elfv2";
1362 break;
1363 default:
1364 break;
1365 }
1366
1367 if (ABIName) {
1368 CmdArgs.push_back("-target-abi");
1369 CmdArgs.push_back(ABIName);
1370 }
1371}
1372
1373bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1374 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1375 return A && (A->getValue() == StringRef(Value));
1376}
1377
Tom Stellard6674c702013-04-01 20:56:53 +00001378/// Get the (LLVM) name of the R600 gpu we are targeting.
1379static std::string getR600TargetGPU(const ArgList &Args) {
1380 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001381 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001382 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001383 .Cases("rv630", "rv635", "r600")
1384 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001385 .Case("rv740", "rv770")
1386 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001387 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001388 .Case("hemlock", "cypress")
1389 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001390 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001391 }
1392 return "";
1393}
1394
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001395static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001396 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001397 bool SoftFloatABI = true;
1398 if (Arg *A =
1399 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1400 if (A->getOption().matches(options::OPT_mhard_float))
1401 SoftFloatABI = false;
1402 }
1403 if (SoftFloatABI)
1404 Features.push_back("+soft-float");
1405}
1406
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001407void Clang::AddSparcTargetArgs(const ArgList &Args,
1408 ArgStringList &CmdArgs) const {
1409 const Driver &D = getToolChain().getDriver();
1410
Brad Smith10cd0f42014-07-11 20:12:08 +00001411 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001412 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001413 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1414 options::OPT_mhard_float)) {
1415 if (A->getOption().matches(options::OPT_msoft_float))
1416 FloatABI = "soft";
1417 else if (A->getOption().matches(options::OPT_mhard_float))
1418 FloatABI = "hard";
1419 }
1420
1421 // If unspecified, choose the default based on the platform.
1422 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001423 // Assume "soft", but warn the user we are guessing.
1424 FloatABI = "soft";
1425 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001426 }
1427
1428 if (FloatABI == "soft") {
1429 // Floating point operations and argument passing are soft.
1430 //
1431 // FIXME: This changes CPP defines, we need -target-soft-float.
1432 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001433 } else {
1434 assert(FloatABI == "hard" && "Invalid float abi!");
1435 CmdArgs.push_back("-mhard-float");
1436 }
1437}
1438
Richard Sandiford4652d892013-07-19 16:51:51 +00001439static const char *getSystemZTargetCPU(const ArgList &Args) {
1440 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1441 return A->getValue();
1442 return "z10";
1443}
1444
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001445static void getSystemZTargetFeatures(const ArgList &Args,
1446 std::vector<const char *> &Features) {
1447 // -m(no-)htm overrides use of the transactional-execution facility.
1448 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1449 options::OPT_mno_htm)) {
1450 if (A->getOption().matches(options::OPT_mhtm))
1451 Features.push_back("+transactional-execution");
1452 else
1453 Features.push_back("-transactional-execution");
1454 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001455 // -m(no-)vx overrides use of the vector facility.
1456 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1457 options::OPT_mno_vx)) {
1458 if (A->getOption().matches(options::OPT_mvx))
1459 Features.push_back("+vector");
1460 else
1461 Features.push_back("-vector");
1462 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001463}
1464
Chandler Carruth953fb082013-01-13 11:46:33 +00001465static const char *getX86TargetCPU(const ArgList &Args,
1466 const llvm::Triple &Triple) {
1467 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001468 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001469 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001470 return "core-avx2";
1471
Chandler Carruth953fb082013-01-13 11:46:33 +00001472 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001473 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001474
1475 // FIXME: Reject attempts to use -march=native unless the target matches
1476 // the host.
1477 //
1478 // FIXME: We should also incorporate the detected target features for use
1479 // with -native.
1480 std::string CPU = llvm::sys::getHostCPUName();
1481 if (!CPU.empty() && CPU != "generic")
1482 return Args.MakeArgString(CPU);
1483 }
1484
1485 // Select the default CPU if none was given (or detection failed).
1486
1487 if (Triple.getArch() != llvm::Triple::x86_64 &&
1488 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001489 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001490
1491 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1492
1493 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001494 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001495 if (Triple.getArchName() == "x86_64h")
1496 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001497 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001498 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001499
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001500 // Set up default CPU name for PS4 compilers.
1501 if (Triple.isPS4CPU())
1502 return "btver2";
1503
Alexey Bataev286d1b92014-01-31 04:07:13 +00001504 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001505 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001506 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001507
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001508 // Everything else goes to x86-64 in 64-bit mode.
1509 if (Is64Bit)
1510 return "x86-64";
1511
1512 switch (Triple.getOS()) {
1513 case llvm::Triple::FreeBSD:
1514 case llvm::Triple::NetBSD:
1515 case llvm::Triple::OpenBSD:
1516 return "i486";
1517 case llvm::Triple::Haiku:
1518 return "i586";
1519 case llvm::Triple::Bitrig:
1520 return "i686";
1521 default:
1522 // Fallback to p4.
1523 return "pentium4";
1524 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001525}
1526
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001527static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1528 switch(T.getArch()) {
1529 default:
1530 return "";
1531
Amara Emerson703da2e2013-10-31 09:32:33 +00001532 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001533 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001534 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001535
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001536 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001537 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001538 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001539 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001540 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001541
1542 case llvm::Triple::mips:
1543 case llvm::Triple::mipsel:
1544 case llvm::Triple::mips64:
1545 case llvm::Triple::mips64el: {
1546 StringRef CPUName;
1547 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001548 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001549 return CPUName;
1550 }
1551
1552 case llvm::Triple::ppc:
1553 case llvm::Triple::ppc64:
1554 case llvm::Triple::ppc64le: {
1555 std::string TargetCPUName = getPPCTargetCPU(Args);
1556 // LLVM may default to generating code for the native CPU,
1557 // but, like gcc, we default to a more generic option for
1558 // each architecture. (except on Darwin)
1559 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1560 if (T.getArch() == llvm::Triple::ppc64)
1561 TargetCPUName = "ppc64";
1562 else if (T.getArch() == llvm::Triple::ppc64le)
1563 TargetCPUName = "ppc64le";
1564 else
1565 TargetCPUName = "ppc";
1566 }
1567 return TargetCPUName;
1568 }
1569
1570 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001571 case llvm::Triple::sparcv9:
1572 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001573 return A->getValue();
1574 return "";
1575
1576 case llvm::Triple::x86:
1577 case llvm::Triple::x86_64:
1578 return getX86TargetCPU(Args, T);
1579
1580 case llvm::Triple::hexagon:
1581 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1582
1583 case llvm::Triple::systemz:
1584 return getSystemZTargetCPU(Args);
1585
1586 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001587 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001588 return getR600TargetGPU(Args);
1589 }
1590}
1591
Alp Tokerce365ca2013-12-02 12:43:03 +00001592static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1593 ArgStringList &CmdArgs) {
1594 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1595 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1596 // forward.
1597 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001598 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001599 CmdArgs.push_back(Args.MakeArgString(Plugin));
1600
1601 // Try to pass driver level flags relevant to LTO code generation down to
1602 // the plugin.
1603
1604 // Handle flags for selecting CPU variants.
1605 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1606 if (!CPU.empty())
1607 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1608}
1609
Eric Christopherc54920a2015-03-23 19:26:05 +00001610static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001611 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001612 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001613 // If -march=native, autodetect the feature list.
1614 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1615 if (StringRef(A->getValue()) == "native") {
1616 llvm::StringMap<bool> HostFeatures;
1617 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1618 for (auto &F : HostFeatures)
1619 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1620 F.first()));
1621 }
1622 }
1623
Jim Grosbach82eee262013-11-16 00:53:35 +00001624 if (Triple.getArchName() == "x86_64h") {
1625 // x86_64h implies quite a few of the more modern subtarget features
1626 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1627 Features.push_back("-rdrnd");
1628 Features.push_back("-aes");
1629 Features.push_back("-pclmul");
1630 Features.push_back("-rtm");
1631 Features.push_back("-hle");
1632 Features.push_back("-fsgsbase");
1633 }
1634
Eric Christopherc54920a2015-03-23 19:26:05 +00001635 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001636 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001637 if (Triple.getArch() == llvm::Triple::x86_64) {
1638 Features.push_back("+sse4.2");
1639 Features.push_back("+popcnt");
1640 } else
1641 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001642 }
1643
Eric Christopherc54920a2015-03-23 19:26:05 +00001644 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001645 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1646 StringRef Arch = A->getValue();
1647 bool ArchUsed = false;
1648 // First, look for flags that are shared in x86 and x86-64.
1649 if (Triple.getArch() == llvm::Triple::x86_64 ||
1650 Triple.getArch() == llvm::Triple::x86) {
1651 if (Arch == "AVX" || Arch == "AVX2") {
1652 ArchUsed = true;
1653 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1654 }
1655 }
1656 // Then, look for x86-specific flags.
1657 if (Triple.getArch() == llvm::Triple::x86) {
1658 if (Arch == "IA32") {
1659 ArchUsed = true;
1660 } else if (Arch == "SSE" || Arch == "SSE2") {
1661 ArchUsed = true;
1662 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1663 }
1664 }
1665 if (!ArchUsed)
1666 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1667 }
1668
Jim Grosbach82eee262013-11-16 00:53:35 +00001669 // Now add any that the user explicitly requested on the command line,
1670 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001671 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1672 ie = Args.filtered_end();
1673 it != ie; ++it) {
1674 StringRef Name = (*it)->getOption().getName();
1675 (*it)->claim();
1676
1677 // Skip over "-m".
1678 assert(Name.startswith("m") && "Invalid feature name.");
1679 Name = Name.substr(1);
1680
1681 bool IsNegative = Name.startswith("no-");
1682 if (IsNegative)
1683 Name = Name.substr(3);
1684
1685 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1686 }
1687}
1688
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001689void Clang::AddX86TargetArgs(const ArgList &Args,
1690 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001691 if (!Args.hasFlag(options::OPT_mred_zone,
1692 options::OPT_mno_red_zone,
1693 true) ||
1694 Args.hasArg(options::OPT_mkernel) ||
1695 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001696 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001697
Bob Wilson2616e2e2013-02-10 16:01:41 +00001698 // Default to avoid implicit floating-point for kernel/kext code, but allow
1699 // that to be overridden with -mno-soft-float.
1700 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1701 Args.hasArg(options::OPT_fapple_kext));
1702 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1703 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001704 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001705 options::OPT_mno_implicit_float)) {
1706 const Option &O = A->getOption();
1707 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1708 O.matches(options::OPT_msoft_float));
1709 }
1710 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001711 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001712
1713 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1714 StringRef Value = A->getValue();
1715 if (Value == "intel" || Value == "att") {
1716 CmdArgs.push_back("-mllvm");
1717 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1718 } else {
1719 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1720 << A->getOption().getName() << Value;
1721 }
1722 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001723}
1724
Matthew Curtise8f80a12012-12-06 17:49:03 +00001725static inline bool HasPICArg(const ArgList &Args) {
1726 return Args.hasArg(options::OPT_fPIC)
1727 || Args.hasArg(options::OPT_fpic);
1728}
1729
1730static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1731 return Args.getLastArg(options::OPT_G,
1732 options::OPT_G_EQ,
1733 options::OPT_msmall_data_threshold_EQ);
1734}
1735
1736static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1737 std::string value;
1738 if (HasPICArg(Args))
1739 value = "0";
1740 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1741 value = A->getValue();
1742 A->claim();
1743 }
1744 return value;
1745}
1746
Tony Linthicum76329bf2011-12-12 21:14:55 +00001747void Clang::AddHexagonTargetArgs(const ArgList &Args,
1748 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001749 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001750 CmdArgs.push_back("-mqdsp6-compat");
1751 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001752
Matthew Curtise8f80a12012-12-06 17:49:03 +00001753 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1754 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001755 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001756 CmdArgs.push_back(Args.MakeArgString(
1757 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001758 }
1759
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001760 if (!Args.hasArg(options::OPT_fno_short_enums))
1761 CmdArgs.push_back("-fshort-enums");
1762 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1763 CmdArgs.push_back ("-mllvm");
1764 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1765 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001766 CmdArgs.push_back ("-mllvm");
1767 CmdArgs.push_back ("-machine-sink-split=0");
1768}
1769
Kevin Qin110db6f2014-07-18 07:03:22 +00001770// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001771static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001772 std::vector<const char *> &Features) {
1773 SmallVector<StringRef, 8> Split;
1774 text.split(Split, StringRef("+"), -1, false);
1775
1776 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1777 const char *result = llvm::StringSwitch<const char *>(Split[I])
1778 .Case("fp", "+fp-armv8")
1779 .Case("simd", "+neon")
1780 .Case("crc", "+crc")
1781 .Case("crypto", "+crypto")
1782 .Case("nofp", "-fp-armv8")
1783 .Case("nosimd", "-neon")
1784 .Case("nocrc", "-crc")
1785 .Case("nocrypto", "-crypto")
1786 .Default(nullptr);
1787 if (result)
1788 Features.push_back(result);
1789 else if (Split[I] == "neon" || Split[I] == "noneon")
1790 D.Diag(diag::err_drv_no_neon_modifier);
1791 else
1792 return false;
1793 }
1794 return true;
1795}
1796
1797// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1798// decode CPU and feature.
1799static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1800 std::vector<const char *> &Features) {
1801 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1802 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001803 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001804 Features.push_back("+neon");
1805 Features.push_back("+crc");
1806 Features.push_back("+crypto");
1807 } else if (CPU == "generic") {
1808 Features.push_back("+neon");
1809 } else {
1810 return false;
1811 }
1812
1813 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1814 return false;
1815
1816 return true;
1817}
1818
1819static bool
1820getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1821 const ArgList &Args,
1822 std::vector<const char *> &Features) {
1823 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001824
1825 if (Split.first == "armv8-a" ||
1826 Split.first == "armv8a") {
1827 // ok, no additional features.
1828 } else if (
1829 Split.first == "armv8.1-a" ||
1830 Split.first == "armv8.1a" ) {
1831 Features.push_back("+v8.1a");
1832 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001833 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001834 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001835
1836 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1837 return false;
1838
1839 return true;
1840}
1841
1842static bool
1843getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1844 const ArgList &Args,
1845 std::vector<const char *> &Features) {
1846 StringRef CPU;
1847 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1848 return false;
1849
1850 return true;
1851}
1852
1853static bool
1854getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1855 const ArgList &Args,
1856 std::vector<const char *> &Features) {
1857 // Handle CPU name is 'native'.
1858 if (Mtune == "native")
1859 Mtune = llvm::sys::getHostCPUName();
1860 if (Mtune == "cyclone") {
1861 Features.push_back("+zcm");
1862 Features.push_back("+zcz");
1863 }
1864 return true;
1865}
1866
1867static bool
1868getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1869 const ArgList &Args,
1870 std::vector<const char *> &Features) {
1871 StringRef CPU;
1872 std::vector<const char *> DecodedFeature;
1873 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1874 return false;
1875
1876 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1877}
1878
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001879static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1880 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001881 Arg *A;
1882 bool success = true;
1883 // Enable NEON by default.
1884 Features.push_back("+neon");
1885 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1886 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1887 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1888 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001889 else if (Args.hasArg(options::OPT_arch))
1890 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1891 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001892
1893 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1894 success =
1895 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1896 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1897 success =
1898 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001899 else if (Args.hasArg(options::OPT_arch))
1900 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1901 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001902
1903 if (!success)
1904 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001905
1906 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1907 Features.push_back("-fp-armv8");
1908 Features.push_back("-crypto");
1909 Features.push_back("-neon");
1910 }
Bradley Smith418c5932014-05-02 15:17:51 +00001911
1912 // En/disable crc
1913 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1914 options::OPT_mnocrc)) {
1915 if (A->getOption().matches(options::OPT_mcrc))
1916 Features.push_back("+crc");
1917 else
1918 Features.push_back("-crc");
1919 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001920}
1921
1922static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001923 const ArgList &Args, ArgStringList &CmdArgs,
1924 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001925 std::vector<const char *> Features;
1926 switch (Triple.getArch()) {
1927 default:
1928 break;
1929 case llvm::Triple::mips:
1930 case llvm::Triple::mipsel:
1931 case llvm::Triple::mips64:
1932 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001933 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001934 break;
1935
1936 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001937 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001938 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001939 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001940 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001941 break;
1942
1943 case llvm::Triple::ppc:
1944 case llvm::Triple::ppc64:
1945 case llvm::Triple::ppc64le:
1946 getPPCTargetFeatures(Args, Features);
1947 break;
1948 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001949 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001950 getSparcTargetFeatures(Args, Features);
1951 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001952 case llvm::Triple::systemz:
1953 getSystemZTargetFeatures(Args, Features);
1954 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001955 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001956 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001957 getAArch64TargetFeatures(D, Args, Features);
1958 break;
1959 case llvm::Triple::x86:
1960 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001961 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001962 break;
1963 }
Rafael Espindola43964802013-08-21 17:34:32 +00001964
1965 // Find the last of each feature.
1966 llvm::StringMap<unsigned> LastOpt;
1967 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1968 const char *Name = Features[I];
1969 assert(Name[0] == '-' || Name[0] == '+');
1970 LastOpt[Name + 1] = I;
1971 }
1972
1973 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1974 // If this feature was overridden, ignore it.
1975 const char *Name = Features[I];
1976 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1977 assert(LastI != LastOpt.end());
1978 unsigned Last = LastI->second;
1979 if (Last != I)
1980 continue;
1981
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001982 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001983 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001984 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001985}
1986
David Majnemerae394812014-12-09 00:12:30 +00001987static bool
1988shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1989 const llvm::Triple &Triple) {
1990 // We use the zero-cost exception tables for Objective-C if the non-fragile
1991 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1992 // later.
1993 if (runtime.isNonFragile())
1994 return true;
1995
1996 if (!Triple.isMacOSX())
1997 return false;
1998
1999 return (!Triple.isMacOSXVersionLT(10,5) &&
2000 (Triple.getArch() == llvm::Triple::x86_64 ||
2001 Triple.getArch() == llvm::Triple::arm));
2002}
2003
Nico Webere8e53112014-05-11 01:04:02 +00002004// exceptionSettings() exists to share the logic between -cc1 and linker
2005// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002006static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002007 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002008 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002009 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002010 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002011
David Majnemer8de68642014-12-05 08:11:58 +00002012 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002013}
2014
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002015/// Adds exception related arguments to the driver command arguments. There's a
2016/// master flag, -fexceptions and also language specific flags to enable/disable
2017/// C++ and Objective-C exceptions. This makes it possible to for example
2018/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002019static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002020 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002021 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002022 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002023 const Driver &D = TC.getDriver();
2024 const llvm::Triple &Triple = TC.getTriple();
2025
Chad Rosier4fab82c2012-03-26 22:04:46 +00002026 if (KernelOrKext) {
2027 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2028 // arguments now to avoid warnings about unused arguments.
2029 Args.ClaimAllArgs(options::OPT_fexceptions);
2030 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2031 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2032 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2033 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2034 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002035 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002036 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002037
David Majnemer8de68642014-12-05 08:11:58 +00002038 // Gather the exception settings from the command line arguments.
2039 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002040
David Majnemerae394812014-12-09 00:12:30 +00002041 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2042 // is not necessarily sensible, but follows GCC.
2043 if (types::isObjC(InputType) &&
2044 Args.hasFlag(options::OPT_fobjc_exceptions,
2045 options::OPT_fno_objc_exceptions,
2046 true)) {
2047 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002048
David Majnemerae394812014-12-09 00:12:30 +00002049 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002050 }
2051
2052 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002053 bool CXXExceptionsEnabled =
2054 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002055 Arg *ExceptionArg = Args.getLastArg(
2056 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2057 options::OPT_fexceptions, options::OPT_fno_exceptions);
2058 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002059 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002060 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2061 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002062
2063 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002064 if (Triple.isPS4CPU()) {
2065 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2066 assert(ExceptionArg &&
2067 "On the PS4 exceptions should only be enabled if passing "
2068 "an argument");
2069 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2070 const Arg *RTTIArg = TC.getRTTIArg();
2071 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2072 D.Diag(diag::err_drv_argument_not_allowed_with)
2073 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2074 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2075 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2076 } else
2077 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2078
Anders Carlssone96ab552011-02-28 02:27:16 +00002079 CmdArgs.push_back("-fcxx-exceptions");
2080
David Majnemer8de68642014-12-05 08:11:58 +00002081 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002082 }
2083 }
2084
David Majnemer8de68642014-12-05 08:11:58 +00002085 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002086 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002087}
2088
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002089static bool ShouldDisableAutolink(const ArgList &Args,
2090 const ToolChain &TC) {
2091 bool Default = true;
2092 if (TC.getTriple().isOSDarwin()) {
2093 // The native darwin assembler doesn't support the linker_option directives,
2094 // so we disable them if we think the .s file will be passed to it.
2095 Default = TC.useIntegratedAs();
2096 }
2097 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2098 Default);
2099}
2100
Ted Kremenek62093662013-03-12 17:02:12 +00002101static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2102 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002103 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2104 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002105 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002106 return !UseDwarfDirectory;
2107}
2108
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002109/// \brief Check whether the given input tree contains any compilation actions.
2110static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002111 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002112 return true;
2113
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002114 for (const auto &Act : *A)
2115 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002116 return true;
2117
2118 return false;
2119}
2120
2121/// \brief Check if -relax-all should be passed to the internal assembler.
2122/// This is done by default when compiling non-assembler source with -O0.
2123static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2124 bool RelaxDefault = true;
2125
2126 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2127 RelaxDefault = A->getOption().matches(options::OPT_O0);
2128
2129 if (RelaxDefault) {
2130 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002131 for (const auto &Act : C.getActions()) {
2132 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002133 RelaxDefault = true;
2134 break;
2135 }
2136 }
2137 }
2138
2139 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2140 RelaxDefault);
2141}
2142
David Blaikie9260ed62013-07-25 21:19:01 +00002143static void CollectArgsForIntegratedAssembler(Compilation &C,
2144 const ArgList &Args,
2145 ArgStringList &CmdArgs,
2146 const Driver &D) {
2147 if (UseRelaxAll(C, Args))
2148 CmdArgs.push_back("-mrelax-all");
2149
David Peixottodfb66142013-11-14 22:52:58 +00002150 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002151 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002152 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2153 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2154 // arg after parsing the '-I' arg.
2155 bool TakeNextArg = false;
2156
David Blaikie9260ed62013-07-25 21:19:01 +00002157 // When using an integrated assembler, translate -Wa, and -Xassembler
2158 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002159 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002160 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2161 options::OPT_Xassembler),
2162 ie = Args.filtered_end(); it != ie; ++it) {
2163 const Arg *A = *it;
2164 A->claim();
2165
2166 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2167 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002168 if (TakeNextArg) {
2169 CmdArgs.push_back(Value.data());
2170 TakeNextArg = false;
2171 continue;
2172 }
David Blaikie9260ed62013-07-25 21:19:01 +00002173
2174 if (Value == "-force_cpusubtype_ALL") {
2175 // Do nothing, this is the default and we don't support anything else.
2176 } else if (Value == "-L") {
2177 CmdArgs.push_back("-msave-temp-labels");
2178 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002179 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002180 } else if (Value == "--noexecstack") {
2181 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002182 } else if (Value == "-compress-debug-sections" ||
2183 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002184 CompressDebugSections = true;
2185 } else if (Value == "-nocompress-debug-sections" ||
2186 Value == "--nocompress-debug-sections") {
2187 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002188 } else if (Value.startswith("-I")) {
2189 CmdArgs.push_back(Value.data());
2190 // We need to consume the next argument if the current arg is a plain
2191 // -I. The next arg will be the include directory.
2192 if (Value == "-I")
2193 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002194 } else if (Value.startswith("-gdwarf-")) {
2195 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002196 } else {
2197 D.Diag(diag::err_drv_unsupported_option_argument)
2198 << A->getOption().getName() << Value;
2199 }
2200 }
2201 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002202 if (CompressDebugSections) {
2203 if (llvm::zlib::isAvailable())
2204 CmdArgs.push_back("-compress-debug-sections");
2205 else
2206 D.Diag(diag::warn_debug_compression_unavailable);
2207 }
David Blaikie9260ed62013-07-25 21:19:01 +00002208}
2209
Renato Goline807c122014-01-31 11:47:28 +00002210// Until ARM libraries are build separately, we have them all in one library
2211static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002212 // FIXME: handle 64-bit
2213 if (TC.getTriple().isOSWindows() &&
2214 !TC.getTriple().isWindowsItaniumEnvironment())
2215 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002216 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002217 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002218 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002219}
2220
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002221static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2222 // The runtimes are located in the OS-specific resource directory.
2223 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002224 const llvm::Triple &Triple = TC.getTriple();
2225 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002226 StringRef OSLibName =
2227 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002228 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002229 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002230}
2231
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002232static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002233 bool Shared = false) {
2234 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2235 ? "-android"
2236 : "";
2237
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002238 bool IsOSWindows = TC.getTriple().isOSWindows();
2239 StringRef Arch = getArchNameForCompilerRTLib(TC);
2240 const char *Prefix = IsOSWindows ? "" : "lib";
2241 const char *Suffix =
2242 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2243
2244 SmallString<128> Path = getCompilerRTLibDir(TC);
2245 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2246 Arch + Env + Suffix);
2247
2248 return Path;
2249}
2250
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002251// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002252// FIXME: Make sure we can also emit shared objects if they're requested
2253// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002254static void addClangRT(const ToolChain &TC, const ArgList &Args,
2255 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002256 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002257
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002258 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002259 // FIXME: why do we link against gcc when we are using compiler-rt?
2260 CmdArgs.push_back("-lgcc_s");
2261 if (TC.getDriver().CCCIsCXX())
2262 CmdArgs.push_back("-lgcc_eh");
2263 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002264}
2265
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002266static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2267 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002268 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2269 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002270 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002271 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002272 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002273 Args.hasArg(options::OPT_fcreate_profile) ||
2274 Args.hasArg(options::OPT_coverage)))
2275 return;
2276
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002277 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002278}
2279
Alexey Samsonov52550342014-09-15 19:58:40 +00002280static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2281 ArgStringList &CmdArgs, StringRef Sanitizer,
2282 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002283 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002284 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002285 if (!IsShared)
2286 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002287 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002288 if (!IsShared)
2289 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002290}
2291
Alexey Samsonov52550342014-09-15 19:58:40 +00002292// Tries to use a file with the list of dynamic symbols that need to be exported
2293// from the runtime library. Returns true if the file was found.
2294static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2295 ArgStringList &CmdArgs,
2296 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002297 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2298 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2299 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002300 return true;
2301 }
2302 return false;
2303}
2304
2305static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2306 ArgStringList &CmdArgs) {
2307 // Force linking against the system libraries sanitizers depends on
2308 // (see PR15823 why this is necessary).
2309 CmdArgs.push_back("--no-as-needed");
2310 CmdArgs.push_back("-lpthread");
2311 CmdArgs.push_back("-lrt");
2312 CmdArgs.push_back("-lm");
2313 // There's no libdl on FreeBSD.
2314 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2315 CmdArgs.push_back("-ldl");
2316}
2317
2318static void
2319collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2320 SmallVectorImpl<StringRef> &SharedRuntimes,
2321 SmallVectorImpl<StringRef> &StaticRuntimes,
2322 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2323 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2324 // Collect shared runtimes.
2325 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2326 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002327 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002328
Alexey Samsonov52550342014-09-15 19:58:40 +00002329 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002330 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002331 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2332 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002333 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002334 }
2335 if (SanArgs.needsAsanRt()) {
2336 if (SanArgs.needsSharedAsanRt()) {
2337 HelperStaticRuntimes.push_back("asan-preinit");
2338 } else {
2339 StaticRuntimes.push_back("asan");
2340 if (SanArgs.linkCXXRuntimes())
2341 StaticRuntimes.push_back("asan_cxx");
2342 }
2343 }
2344 if (SanArgs.needsDfsanRt())
2345 StaticRuntimes.push_back("dfsan");
2346 if (SanArgs.needsLsanRt())
2347 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002348 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002349 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002350 if (SanArgs.linkCXXRuntimes())
2351 StaticRuntimes.push_back("msan_cxx");
2352 }
2353 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002354 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002355 if (SanArgs.linkCXXRuntimes())
2356 StaticRuntimes.push_back("tsan_cxx");
2357 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002358 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002359 StaticRuntimes.push_back("ubsan_standalone");
2360 if (SanArgs.linkCXXRuntimes())
2361 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002362 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002363}
2364
Alexey Samsonov52550342014-09-15 19:58:40 +00002365// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2366// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2367static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002368 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002369 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2370 HelperStaticRuntimes;
2371 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2372 HelperStaticRuntimes);
2373 for (auto RT : SharedRuntimes)
2374 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2375 for (auto RT : HelperStaticRuntimes)
2376 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2377 bool AddExportDynamic = false;
2378 for (auto RT : StaticRuntimes) {
2379 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2380 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2381 }
2382 // If there is a static runtime with no dynamic list, force all the symbols
2383 // to be dynamic to be sure we export sanitizer interface functions.
2384 if (AddExportDynamic)
2385 CmdArgs.push_back("-export-dynamic");
2386 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002387}
2388
Reid Kleckner86ea7702015-02-04 23:45:07 +00002389static bool areOptimizationsEnabled(const ArgList &Args) {
2390 // Find the last -O arg and see if it is non-zero.
2391 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2392 return !A->getOption().matches(options::OPT_O0);
2393 // Defaults to -O0.
2394 return false;
2395}
2396
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002397static bool shouldUseFramePointerForTarget(const ArgList &Args,
2398 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002399 // XCore never wants frame pointers, regardless of OS.
2400 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002401 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002402 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002403
2404 if (Triple.isOSLinux()) {
2405 switch (Triple.getArch()) {
2406 // Don't use a frame pointer on linux if optimizing for certain targets.
2407 case llvm::Triple::mips64:
2408 case llvm::Triple::mips64el:
2409 case llvm::Triple::mips:
2410 case llvm::Triple::mipsel:
2411 case llvm::Triple::systemz:
2412 case llvm::Triple::x86:
2413 case llvm::Triple::x86_64:
2414 return !areOptimizationsEnabled(Args);
2415 default:
2416 return true;
2417 }
2418 }
2419
2420 if (Triple.isOSWindows()) {
2421 switch (Triple.getArch()) {
2422 case llvm::Triple::x86:
2423 return !areOptimizationsEnabled(Args);
2424 default:
2425 // All other supported Windows ISAs use xdata unwind information, so frame
2426 // pointers are not generally useful.
2427 return false;
2428 }
2429 }
2430
2431 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002432}
2433
Rafael Espindola224dd632011-12-14 21:02:23 +00002434static bool shouldUseFramePointer(const ArgList &Args,
2435 const llvm::Triple &Triple) {
2436 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2437 options::OPT_fomit_frame_pointer))
2438 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2439
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002440 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002441}
2442
Eric Christopherb7d97e92013-04-03 01:58:53 +00002443static bool shouldUseLeafFramePointer(const ArgList &Args,
2444 const llvm::Triple &Triple) {
2445 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2446 options::OPT_momit_leaf_frame_pointer))
2447 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2448
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002449 if (Triple.isPS4CPU())
2450 return false;
2451
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002452 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002453}
2454
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002455/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002456static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002457 SmallString<128> cwd;
2458 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002459 CmdArgs.push_back("-fdebug-compilation-dir");
2460 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002461 }
2462}
2463
Eric Christopherd3804002013-02-22 20:12:52 +00002464static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002465 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002466 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2467 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2468 SmallString<128> T(FinalOutput->getValue());
2469 llvm::sys::path::replace_extension(T, "dwo");
2470 return Args.MakeArgString(T);
2471 } else {
2472 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002473 SmallString<128> T(
2474 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002475 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002476 llvm::sys::path::replace_extension(F, "dwo");
2477 T += F;
2478 return Args.MakeArgString(F);
2479 }
2480}
2481
2482static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2483 const Tool &T, const JobAction &JA,
2484 const ArgList &Args, const InputInfo &Output,
2485 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002486 ArgStringList ExtractArgs;
2487 ExtractArgs.push_back("--extract-dwo");
2488
2489 ArgStringList StripArgs;
2490 StripArgs.push_back("--strip-dwo");
2491
2492 // Grabbing the output of the earlier compile step.
2493 StripArgs.push_back(Output.getFilename());
2494 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002495 ExtractArgs.push_back(OutFile);
2496
2497 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002498 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002499
2500 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002501 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002502
2503 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002504 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002505}
2506
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002507/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002508/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2509static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002510 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002511 if (A->getOption().matches(options::OPT_O4) ||
2512 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002513 return true;
2514
2515 if (A->getOption().matches(options::OPT_O0))
2516 return false;
2517
2518 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2519
Rafael Espindola91780de2013-08-26 14:05:41 +00002520 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002521 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002522 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002523 return true;
2524
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002525 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002526 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002527 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002528
2529 unsigned OptLevel = 0;
2530 if (S.getAsInteger(10, OptLevel))
2531 return false;
2532
2533 return OptLevel > 1;
2534 }
2535
2536 return false;
2537}
2538
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002539/// Add -x lang to \p CmdArgs for \p Input.
2540static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2541 ArgStringList &CmdArgs) {
2542 // When using -verify-pch, we don't want to provide the type
2543 // 'precompiled-header' if it was inferred from the file extension
2544 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2545 return;
2546
2547 CmdArgs.push_back("-x");
2548 if (Args.hasArg(options::OPT_rewrite_objc))
2549 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2550 else
2551 CmdArgs.push_back(types::getTypeName(Input.getType()));
2552}
2553
David Majnemerc371ff02015-03-22 08:39:22 +00002554static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002555 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002556 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002557
2558 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002559 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002560
2561 unsigned Build = 0, Factor = 1;
2562 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2563 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002564 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002565}
2566
Rafael Espindola577637a2015-01-03 00:06:04 +00002567// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002568// options that build systems might add but are unused when assembling or only
2569// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002570static void claimNoWarnArgs(const ArgList &Args) {
2571 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002572 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002573 Args.ClaimAllArgs(options::OPT_flto);
2574 Args.ClaimAllArgs(options::OPT_fno_lto);
2575}
2576
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002577static void appendUserToPath(SmallVectorImpl<char> &Result) {
2578#ifdef LLVM_ON_UNIX
2579 const char *Username = getenv("LOGNAME");
2580#else
2581 const char *Username = getenv("USERNAME");
2582#endif
2583 if (Username) {
2584 // Validate that LoginName can be used in a path, and get its length.
2585 size_t Len = 0;
2586 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002587 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002588 Username = nullptr;
2589 break;
2590 }
2591 }
2592
2593 if (Username && Len > 0) {
2594 Result.append(Username, Username + Len);
2595 return;
2596 }
2597 }
2598
2599 // Fallback to user id.
2600#ifdef LLVM_ON_UNIX
2601 std::string UID = llvm::utostr(getuid());
2602#else
2603 // FIXME: Windows seems to have an 'SID' that might work.
2604 std::string UID = "9999";
2605#endif
2606 Result.append(UID.begin(), UID.end());
2607}
2608
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002609void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002610 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002611 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002612 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002613 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002614 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2615 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002616 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002617 ArgStringList CmdArgs;
2618
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002619 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002620 bool IsWindowsCygnus =
2621 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002622 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2623
Daniel Dunbare521a892009-03-31 20:53:55 +00002624 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002625 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002626
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002627 // Invoke ourselves in -cc1 mode.
2628 //
2629 // FIXME: Implement custom jobs for internal actions.
2630 CmdArgs.push_back("-cc1");
2631
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002632 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002633 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002634 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002635 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002636
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002637 const llvm::Triple TT(TripleStr);
2638 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2639 TT.getArch() == llvm::Triple::thumb)) {
2640 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2641 unsigned Version;
2642 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2643 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002644 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2645 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002646 }
2647
Tim Northover336f1892014-03-29 13:16:12 +00002648 // Push all default warning arguments that are specific to
2649 // the given target. These come before user provided warning options
2650 // are provided.
2651 getToolChain().addClangWarningOptions(CmdArgs);
2652
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002653 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002654 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002655
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002656 if (isa<AnalyzeJobAction>(JA)) {
2657 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2658 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002659 } else if (isa<MigrateJobAction>(JA)) {
2660 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002661 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002662 if (Output.getType() == types::TY_Dependencies)
2663 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002664 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002665 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002666 if (Args.hasArg(options::OPT_rewrite_objc) &&
2667 !Args.hasArg(options::OPT_g_Group))
2668 CmdArgs.push_back("-P");
2669 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002670 } else if (isa<AssembleJobAction>(JA)) {
2671 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002672
David Blaikie9260ed62013-07-25 21:19:01 +00002673 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002674
2675 // Also ignore explicit -force_cpusubtype_ALL option.
2676 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002677 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002678 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002679 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002680
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002681 if (JA.getType() == types::TY_Nothing)
2682 CmdArgs.push_back("-fsyntax-only");
2683 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002684 CmdArgs.push_back("-emit-pch");
2685 else
2686 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002687 } else if (isa<VerifyPCHJobAction>(JA)) {
2688 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002689 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002690 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2691 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002692
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002693 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002694 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002695 } else if (JA.getType() == types::TY_LLVM_IR ||
2696 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002697 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002698 } else if (JA.getType() == types::TY_LLVM_BC ||
2699 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002700 CmdArgs.push_back("-emit-llvm-bc");
2701 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002702 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002703 } else if (JA.getType() == types::TY_AST) {
2704 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002705 } else if (JA.getType() == types::TY_ModuleFile) {
2706 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002707 } else if (JA.getType() == types::TY_RewrittenObjC) {
2708 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002709 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002710 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2711 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002712 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002713 } else {
2714 assert(JA.getType() == types::TY_PP_Asm &&
2715 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002716 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002717
2718 // Preserve use-list order by default when emitting bitcode, so that
2719 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2720 // same result as running passes here. For LTO, we don't need to preserve
2721 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002722 if (JA.getType() == types::TY_LLVM_BC)
2723 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002724 }
2725
Justin Bognera88f0122014-06-20 22:59:50 +00002726 // We normally speed up the clang process a bit by skipping destructors at
2727 // exit, but when we're generating diagnostics we can rely on some of the
2728 // cleanup.
2729 if (!C.isForDiagnostics())
2730 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002731
John McCallbb79b5f2010-02-13 03:50:24 +00002732 // Disable the verification pass in -asserts builds.
2733#ifdef NDEBUG
2734 CmdArgs.push_back("-disable-llvm-verifier");
2735#endif
2736
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002737 // Set the main file name, so that debug info works even with
2738 // -save-temps.
2739 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002740 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002741
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002742 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002743 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002744 if (Args.hasArg(options::OPT_static))
2745 CmdArgs.push_back("-static-define");
2746
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002747 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002748 // Enable region store model by default.
2749 CmdArgs.push_back("-analyzer-store=region");
2750
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002751 // Treat blocks as analysis entry points.
2752 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2753
Ted Kremenek49c79792011-03-24 00:28:47 +00002754 CmdArgs.push_back("-analyzer-eagerly-assume");
2755
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002756 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002757 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002758 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002759
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002760 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002761 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002762
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002763 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002764 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002765
2766 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002767
Artem Belevichba558952015-05-06 18:20:23 +00002768 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002769 CmdArgs.push_back("-analyzer-checker=cplusplus");
2770
Nico Webere8e53112014-05-11 01:04:02 +00002771 // Enable the following experimental checkers for testing.
2772 CmdArgs.push_back(
2773 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002774 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2776 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2777 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2778 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002779 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002780
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002781 // Set the output format. The default is plist, for (lame) historical
2782 // reasons.
2783 CmdArgs.push_back("-analyzer-output");
2784 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002785 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002786 else
2787 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002788
Ted Kremenekfe449a22010-03-22 22:32:05 +00002789 // Disable the presentation of standard compiler warnings when
2790 // using --analyze. We only want to show static analyzer diagnostics
2791 // or frontend errors.
2792 CmdArgs.push_back("-w");
2793
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002794 // Add -Xanalyzer arguments when running as analyzer.
2795 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002796 }
2797
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002798 CheckCodeGenerationOptions(D, Args);
2799
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002800 bool PIE = getToolChain().isPIEDefault();
2801 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002802 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002803
Alexey Bataev40e75222014-01-28 06:30:35 +00002804 // Android-specific defaults for PIC/PIE
2805 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2806 switch (getToolChain().getTriple().getArch()) {
2807 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002808 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002809 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002810 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002811 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002812 case llvm::Triple::mips:
2813 case llvm::Triple::mipsel:
2814 case llvm::Triple::mips64:
2815 case llvm::Triple::mips64el:
2816 PIC = true; // "-fpic"
2817 break;
2818
2819 case llvm::Triple::x86:
2820 case llvm::Triple::x86_64:
2821 PIC = true; // "-fPIC"
2822 IsPICLevelTwo = true;
2823 break;
2824
2825 default:
2826 break;
2827 }
2828 }
2829
Brad Smith5b05db82014-06-24 19:51:29 +00002830 // OpenBSD-specific defaults for PIE
2831 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2832 switch (getToolChain().getTriple().getArch()) {
2833 case llvm::Triple::mips64:
2834 case llvm::Triple::mips64el:
2835 case llvm::Triple::sparc:
2836 case llvm::Triple::x86:
2837 case llvm::Triple::x86_64:
2838 IsPICLevelTwo = false; // "-fpie"
2839 break;
2840
2841 case llvm::Triple::ppc:
2842 case llvm::Triple::sparcv9:
2843 IsPICLevelTwo = true; // "-fPIE"
2844 break;
2845
2846 default:
2847 break;
2848 }
2849 }
2850
Alexey Samsonov090301e2013-04-09 12:28:19 +00002851 // For the PIC and PIE flag options, this logic is different from the
2852 // legacy logic in very old versions of GCC, as that logic was just
2853 // a bug no one had ever fixed. This logic is both more rational and
2854 // consistent with GCC's new logic now that the bugs are fixed. The last
2855 // argument relating to either PIC or PIE wins, and no other argument is
2856 // used. If the last argument is any flavor of the '-fno-...' arguments,
2857 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2858 // at the same level.
2859 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2860 options::OPT_fpic, options::OPT_fno_pic,
2861 options::OPT_fPIE, options::OPT_fno_PIE,
2862 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002863 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2864 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002865 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002866 if (LastPICArg) {
2867 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002868 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2869 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2870 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2871 PIC = PIE || O.matches(options::OPT_fPIC) ||
2872 O.matches(options::OPT_fpic);
2873 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2874 O.matches(options::OPT_fPIC);
2875 } else {
2876 PIE = PIC = false;
2877 }
2878 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002879 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002880
Nick Lewycky609dd662013-10-11 03:33:53 +00002881 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002882 // specified while enabling PIC enabled level 1 PIC, just force it back to
2883 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2884 // informal testing).
2885 if (PIC && getToolChain().getTriple().isOSDarwin())
2886 IsPICLevelTwo |= getToolChain().isPICDefault();
2887
Chandler Carruthc0c04552012-04-08 16:40:35 +00002888 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2889 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002890 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002891 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002892 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002893 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002894 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002895
Chandler Carruth76a943b2012-11-19 03:52:03 +00002896 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2897 // This is a very special mode. It trumps the other modes, almost no one
2898 // uses it, and it isn't even valid on any OS but Darwin.
2899 if (!getToolChain().getTriple().isOSDarwin())
2900 D.Diag(diag::err_drv_unsupported_opt_for_target)
2901 << A->getSpelling() << getToolChain().getTriple().str();
2902
2903 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2904
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002905 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002906 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002907
Chandler Carruth76a943b2012-11-19 03:52:03 +00002908 // Only a forced PIC mode can cause the actual compile to have PIC defines
2909 // etc., no flags are sufficient. This behavior was selected to closely
2910 // match that of llvm-gcc and Apple GCC before that.
2911 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2912 CmdArgs.push_back("-pic-level");
2913 CmdArgs.push_back("2");
2914 }
2915 } else {
2916 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2917 // handled in Clang's IRGen by the -pie-level flag.
2918 CmdArgs.push_back("-mrelocation-model");
2919 CmdArgs.push_back(PIC ? "pic" : "static");
2920
2921 if (PIC) {
2922 CmdArgs.push_back("-pic-level");
2923 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2924 if (PIE) {
2925 CmdArgs.push_back("-pie-level");
2926 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2927 }
2928 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002929 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002930
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002931 CmdArgs.push_back("-mthread-model");
2932 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2933 CmdArgs.push_back(A->getValue());
2934 else
2935 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2936
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002937 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2938
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002939 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2940 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002941 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002942
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002943 // LLVM Code Generator Options.
2944
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002945 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2946 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2947 for (arg_iterator
2948 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2949 options::OPT_frewrite_map_file_EQ),
2950 MFE = Args.filtered_end();
2951 MFI != MFE; ++MFI) {
2952 CmdArgs.push_back("-frewrite-map-file");
2953 CmdArgs.push_back((*MFI)->getValue());
2954 (*MFI)->claim();
2955 }
2956 }
2957
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002958 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2959 StringRef v = A->getValue();
2960 CmdArgs.push_back("-mllvm");
2961 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2962 A->claim();
2963 }
2964
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002965 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2966 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002967 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002968 }
2969
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002970 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2971 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002972 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002973 D.Diag(diag::err_drv_unsupported_opt_for_target)
2974 << A->getSpelling() << getToolChain().getTriple().str();
2975 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2976 CmdArgs.push_back("-fpcc-struct-return");
2977 } else {
2978 assert(A->getOption().matches(options::OPT_freg_struct_return));
2979 CmdArgs.push_back("-freg-struct-return");
2980 }
2981 }
2982
Roman Divacky65b88cd2011-03-01 17:40:53 +00002983 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2984 CmdArgs.push_back("-mrtd");
2985
Rafael Espindola224dd632011-12-14 21:02:23 +00002986 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002987 CmdArgs.push_back("-mdisable-fp-elim");
2988 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2989 options::OPT_fno_zero_initialized_in_bss))
2990 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002991
2992 bool OFastEnabled = isOptimizationLevelFast(Args);
2993 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2994 // enabled. This alias option is being used to simplify the hasFlag logic.
2995 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2996 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002997 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2998 // doesn't do any TBAA.
2999 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003000 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003001 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003002 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003003 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3004 options::OPT_fno_struct_path_tbaa))
3005 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003006 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3007 false))
3008 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003009 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3010 options::OPT_fno_optimize_sibling_calls))
3011 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003012
Eric Christopher006208c2013-04-04 06:29:47 +00003013 // Handle segmented stacks.
3014 if (Args.hasArg(options::OPT_fsplit_stack))
3015 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003016
3017 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3018 // This alias option is being used to simplify the getLastArg logic.
3019 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3020 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003021
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003022 // Handle various floating point optimization flags, mapping them to the
3023 // appropriate LLVM code generation flags. The pattern for all of these is to
3024 // default off the codegen optimizations, and if any flag enables them and no
3025 // flag disables them after the flag enabling them, enable the codegen
3026 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003027 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003028 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003029 options::OPT_ffinite_math_only,
3030 options::OPT_fno_finite_math_only,
3031 options::OPT_fhonor_infinities,
3032 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003033 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3034 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003035 A->getOption().getID() != options::OPT_fhonor_infinities)
3036 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003037 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003038 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003039 options::OPT_ffinite_math_only,
3040 options::OPT_fno_finite_math_only,
3041 options::OPT_fhonor_nans,
3042 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003043 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3044 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003045 A->getOption().getID() != options::OPT_fhonor_nans)
3046 CmdArgs.push_back("-menable-no-nans");
3047
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003048 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3049 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003050 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003051 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003052 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003053 options::OPT_fno_math_errno)) {
3054 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3055 // However, turning *off* -ffast_math merely restores the toolchain default
3056 // (which may be false).
3057 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3058 A->getOption().getID() == options::OPT_ffast_math ||
3059 A->getOption().getID() == options::OPT_Ofast)
3060 MathErrno = false;
3061 else if (A->getOption().getID() == options::OPT_fmath_errno)
3062 MathErrno = true;
3063 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003064 if (MathErrno)
3065 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003066
3067 // There are several flags which require disabling very specific
3068 // optimizations. Any of these being disabled forces us to turn off the
3069 // entire set of LLVM optimizations, so collect them through all the flag
3070 // madness.
3071 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003072 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003073 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003074 options::OPT_funsafe_math_optimizations,
3075 options::OPT_fno_unsafe_math_optimizations,
3076 options::OPT_fassociative_math,
3077 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003078 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3079 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003080 A->getOption().getID() != options::OPT_fno_associative_math)
3081 AssociativeMath = true;
3082 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003083 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003084 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003085 options::OPT_funsafe_math_optimizations,
3086 options::OPT_fno_unsafe_math_optimizations,
3087 options::OPT_freciprocal_math,
3088 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003089 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3090 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003091 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3092 ReciprocalMath = true;
3093 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003094 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003095 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003096 options::OPT_funsafe_math_optimizations,
3097 options::OPT_fno_unsafe_math_optimizations,
3098 options::OPT_fsigned_zeros,
3099 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003100 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3101 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003102 A->getOption().getID() != options::OPT_fsigned_zeros)
3103 SignedZeros = false;
3104 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003105 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003106 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003107 options::OPT_funsafe_math_optimizations,
3108 options::OPT_fno_unsafe_math_optimizations,
3109 options::OPT_ftrapping_math,
3110 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003111 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3112 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003113 A->getOption().getID() != options::OPT_ftrapping_math)
3114 TrappingMath = false;
3115 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3116 !TrappingMath)
3117 CmdArgs.push_back("-menable-unsafe-fp-math");
3118
Sanjay Patel76c9e092015-01-23 16:40:50 +00003119 if (!SignedZeros)
3120 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003121
Sanjay Patel359b1052015-04-09 15:03:23 +00003122 if (ReciprocalMath)
3123 CmdArgs.push_back("-freciprocal-math");
3124
Lang Hamesaa53b932012-07-06 00:59:19 +00003125 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003126 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003127 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003128 options::OPT_ffp_contract)) {
3129 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003130 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003131 if (Val == "fast" || Val == "on" || Val == "off") {
3132 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3133 } else {
3134 D.Diag(diag::err_drv_unsupported_option_argument)
3135 << A->getOption().getName() << Val;
3136 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003137 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3138 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003139 // If fast-math is set then set the fp-contract mode to fast.
3140 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3141 }
3142 }
3143
Bob Wilson6a039162012-07-19 03:52:53 +00003144 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3145 // and if we find them, tell the frontend to provide the appropriate
3146 // preprocessor macros. This is distinct from enabling any optimizations as
3147 // these options induce language changes which must survive serialization
3148 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003149 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3150 options::OPT_fno_fast_math))
3151 if (!A->getOption().matches(options::OPT_fno_fast_math))
3152 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003153 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3154 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003155 if (A->getOption().matches(options::OPT_ffinite_math_only))
3156 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003157
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003158 // Decide whether to use verbose asm. Verbose assembly is the default on
3159 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003160 bool IsIntegratedAssemblerDefault =
3161 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003162 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003163 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003164 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003165 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003166
Rafael Espindola298059a2015-04-06 04:36:45 +00003167 bool UsingIntegratedAssembler =
3168 Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3169 IsIntegratedAssemblerDefault);
3170 if (!UsingIntegratedAssembler)
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003171 CmdArgs.push_back("-no-integrated-as");
3172
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003173 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3174 CmdArgs.push_back("-mdebug-pass");
3175 CmdArgs.push_back("Structure");
3176 }
3177 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3178 CmdArgs.push_back("-mdebug-pass");
3179 CmdArgs.push_back("Arguments");
3180 }
3181
John McCall8517abc2010-02-19 02:45:38 +00003182 // Enable -mconstructor-aliases except on darwin, where we have to
3183 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003184 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003185 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003186
John McCall7ef5cb32011-03-18 02:56:14 +00003187 // Darwin's kernel doesn't support guard variables; just die if we
3188 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003189 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003190 CmdArgs.push_back("-fforbid-guard-variables");
3191
Douglas Gregordbe39272011-02-01 15:15:22 +00003192 if (Args.hasArg(options::OPT_mms_bitfields)) {
3193 CmdArgs.push_back("-mms-bitfields");
3194 }
John McCall8517abc2010-02-19 02:45:38 +00003195
Daniel Dunbar306945d2009-09-16 06:17:29 +00003196 // This is a coarse approximation of what llvm-gcc actually does, both
3197 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3198 // complicated ways.
3199 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003200 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3201 options::OPT_fno_asynchronous_unwind_tables,
3202 (getToolChain().IsUnwindTablesDefault() ||
3203 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3204 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003205 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3206 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003207 CmdArgs.push_back("-munwind-tables");
3208
Chandler Carruth05fb5852012-11-21 23:40:23 +00003209 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003210
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003211 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3212 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003213 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003214 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003215
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003216 // FIXME: Handle -mtune=.
3217 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003218
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003219 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003220 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003221 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003222 }
3223
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003224 // Add the target cpu
3225 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3226 llvm::Triple ETriple(ETripleStr);
3227 std::string CPU = getCPUName(Args, ETriple);
3228 if (!CPU.empty()) {
3229 CmdArgs.push_back("-target-cpu");
3230 CmdArgs.push_back(Args.MakeArgString(CPU));
3231 }
3232
Rafael Espindolaeb265472013-08-21 21:59:03 +00003233 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3234 CmdArgs.push_back("-mfpmath");
3235 CmdArgs.push_back(A->getValue());
3236 }
3237
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003238 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003239 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003240
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003241 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003242 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003243 default:
3244 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003245
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003246 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003247 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003248 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003249 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003250 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003251 break;
3252
Tim Northover573cbee2014-05-24 12:52:07 +00003253 case llvm::Triple::aarch64:
3254 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003255 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003256 break;
3257
Eric Christopher0b26a612010-03-02 02:41:08 +00003258 case llvm::Triple::mips:
3259 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003260 case llvm::Triple::mips64:
3261 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003262 AddMIPSTargetArgs(Args, CmdArgs);
3263 break;
3264
Ulrich Weigand8afad612014-07-28 13:17:52 +00003265 case llvm::Triple::ppc:
3266 case llvm::Triple::ppc64:
3267 case llvm::Triple::ppc64le:
3268 AddPPCTargetArgs(Args, CmdArgs);
3269 break;
3270
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003271 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003272 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003273 AddSparcTargetArgs(Args, CmdArgs);
3274 break;
3275
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003276 case llvm::Triple::x86:
3277 case llvm::Triple::x86_64:
3278 AddX86TargetArgs(Args, CmdArgs);
3279 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003280
3281 case llvm::Triple::hexagon:
3282 AddHexagonTargetArgs(Args, CmdArgs);
3283 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003284 }
3285
Hans Wennborg75958c42013-08-08 00:17:41 +00003286 // Add clang-cl arguments.
3287 if (getToolChain().getDriver().IsCLMode())
3288 AddClangCLArgs(Args, CmdArgs);
3289
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003290 // Pass the linker version in use.
3291 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3292 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003293 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003294 }
3295
Eric Christopherb7d97e92013-04-03 01:58:53 +00003296 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003297 CmdArgs.push_back("-momit-leaf-frame-pointer");
3298
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003299 // Explicitly error on some things we know we don't support and can't just
3300 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003301 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003302 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3303 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003304 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003305 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003306 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003307 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3308 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003309 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003310 << Unsupported->getOption().getName();
3311 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003312 }
3313
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003314 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003315 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003316 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003317 CmdArgs.push_back("-header-include-file");
3318 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3319 D.CCPrintHeadersFilename : "-");
3320 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003321 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003322 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003323
Chad Rosierbe10f982011-08-02 17:58:04 +00003324 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003325 CmdArgs.push_back("-diagnostic-log-file");
3326 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3327 D.CCLogDiagnosticsFilename : "-");
3328 }
3329
Manman Ren17bdb0f2013-11-20 20:22:14 +00003330 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3331 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003332 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003333 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003334 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3335 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003336 // FIXME: we should support specifying dwarf version with
3337 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003338 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003339 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003340 const llvm::Triple &Triple = getToolChain().getTriple();
3341 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003342 Triple.getOS() == llvm::Triple::FreeBSD ||
3343 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003344 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003345 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003346 CmdArgs.push_back("-gdwarf-2");
3347 else if (A->getOption().matches(options::OPT_gdwarf_3))
3348 CmdArgs.push_back("-gdwarf-3");
3349 else if (A->getOption().matches(options::OPT_gdwarf_4))
3350 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003351 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003352 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003353 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003354 const llvm::Triple &Triple = getToolChain().getTriple();
3355 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003356 Triple.getOS() == llvm::Triple::FreeBSD ||
3357 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003358 CmdArgs.push_back("-gdwarf-2");
3359 else
3360 CmdArgs.push_back("-g");
3361 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003362 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003363
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003364 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3365 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003366 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3367 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003368 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003369
Eric Christopher138c32b2013-09-13 22:37:55 +00003370 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003371 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3372 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003373 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003374 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003375 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003376 CmdArgs.push_back("-g");
3377 CmdArgs.push_back("-backend-option");
3378 CmdArgs.push_back("-split-dwarf=Enable");
3379 }
3380
Eric Christopher138c32b2013-09-13 22:37:55 +00003381 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3382 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3383 CmdArgs.push_back("-backend-option");
3384 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3385 }
Eric Christophereec89c22013-06-18 00:03:50 +00003386
Eric Christopher0d403d22014-02-14 01:27:03 +00003387 // -gdwarf-aranges turns on the emission of the aranges section in the
3388 // backend.
3389 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3390 CmdArgs.push_back("-backend-option");
3391 CmdArgs.push_back("-generate-arange-section");
3392 }
3393
David Blaikief36d9ba2014-01-27 18:52:43 +00003394 if (Args.hasFlag(options::OPT_fdebug_types_section,
3395 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003396 CmdArgs.push_back("-backend-option");
3397 CmdArgs.push_back("-generate-type-units");
3398 }
Eric Christophereec89c22013-06-18 00:03:50 +00003399
Ed Schouten6e576152015-03-26 17:50:28 +00003400 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3401 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3402
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003403 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003404 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003405 CmdArgs.push_back("-ffunction-sections");
3406 }
3407
3408 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003409 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003410 CmdArgs.push_back("-fdata-sections");
3411 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003412
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003413 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindola298059a2015-04-06 04:36:45 +00003414 options::OPT_fno_unique_section_names,
3415 !UsingIntegratedAssembler))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003416 CmdArgs.push_back("-fno-unique-section-names");
3417
Chris Lattner3c77a352010-06-22 00:03:40 +00003418 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3419
Justin Bognera71e6812015-04-30 23:49:42 +00003420 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3421 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003422 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3423 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3424 D.Diag(diag::err_drv_argument_not_allowed_with)
3425 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3426
Justin Bognera71e6812015-04-30 23:49:42 +00003427 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3428 A->render(Args, CmdArgs);
3429 else
3430 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003431
3432 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3433 A->render(Args, CmdArgs);
3434 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3435 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3436
Nick Lewycky207bce32011-04-21 23:44:07 +00003437 if (Args.hasArg(options::OPT_ftest_coverage) ||
3438 Args.hasArg(options::OPT_coverage))
3439 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003440 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3441 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003442 Args.hasArg(options::OPT_coverage))
3443 CmdArgs.push_back("-femit-coverage-data");
3444
Alex Lorenzee024992014-08-04 18:41:51 +00003445 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003446 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3447 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003448 D.Diag(diag::err_drv_argument_only_allowed_with)
3449 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3450
3451 if (Args.hasArg(options::OPT_fcoverage_mapping))
3452 CmdArgs.push_back("-fcoverage-mapping");
3453
Nick Lewycky480cb992011-05-04 20:46:58 +00003454 if (C.getArgs().hasArg(options::OPT_c) ||
3455 C.getArgs().hasArg(options::OPT_S)) {
3456 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003457 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003458 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003459 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003460 CoverageFilename = FinalOutput->getValue();
3461 } else {
3462 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3463 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003464 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003465 SmallString<128> Pwd;
3466 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003467 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003468 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003469 }
3470 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003471 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003472 }
3473 }
3474
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003475 // Pass options for controlling the default header search paths.
3476 if (Args.hasArg(options::OPT_nostdinc)) {
3477 CmdArgs.push_back("-nostdsysteminc");
3478 CmdArgs.push_back("-nobuiltininc");
3479 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003480 if (Args.hasArg(options::OPT_nostdlibinc))
3481 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003482 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3483 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3484 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003485
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003486 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003487 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003488 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003489
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003490 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3491
Ted Kremenekf7639e12012-03-06 20:06:33 +00003492 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003493 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003494 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003495 options::OPT_ccc_arcmt_modify,
3496 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003497 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003498 switch (A->getOption().getID()) {
3499 default:
3500 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003501 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003502 CmdArgs.push_back("-arcmt-check");
3503 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003504 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003505 CmdArgs.push_back("-arcmt-modify");
3506 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003507 case options::OPT_ccc_arcmt_migrate:
3508 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003509 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003510 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003511
3512 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3513 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003514 break;
John McCalld70fb982011-06-15 23:25:17 +00003515 }
3516 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003517 } else {
3518 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3519 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3520 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003521 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003522
Ted Kremenekf7639e12012-03-06 20:06:33 +00003523 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3524 if (ARCMTEnabled) {
3525 D.Diag(diag::err_drv_argument_not_allowed_with)
3526 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3527 }
3528 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003529 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003530
3531 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003532 options::OPT_objcmt_migrate_subscripting,
3533 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003534 // None specified, means enable them all.
3535 CmdArgs.push_back("-objcmt-migrate-literals");
3536 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003537 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003538 } else {
3539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003542 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003543 } else {
3544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003551 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3552 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3553 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3554 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3555 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3556 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3557 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003558 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003559 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003560 }
3561
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003562 // Add preprocessing options like -I, -D, etc. if we are using the
3563 // preprocessor.
3564 //
3565 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003566 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003567 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003568
Rafael Espindolaa7431922011-07-21 23:40:37 +00003569 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3570 // that "The compiler can only warn and ignore the option if not recognized".
3571 // When building with ccache, it will pass -D options to clang even on
3572 // preprocessed inputs and configure concludes that -fPIC is not supported.
3573 Args.ClaimAllArgs(options::OPT_D);
3574
Alp Toker7874bdc2013-11-15 20:40:58 +00003575 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003576 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3577 if (A->getOption().matches(options::OPT_O4)) {
3578 CmdArgs.push_back("-O3");
3579 D.Diag(diag::warn_O4_is_O3);
3580 } else {
3581 A->render(Args, CmdArgs);
3582 }
3583 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003584
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003585 // Warn about ignored options to clang.
3586 for (arg_iterator it = Args.filtered_begin(
3587 options::OPT_clang_ignored_gcc_optimization_f_Group),
3588 ie = Args.filtered_end(); it != ie; ++it) {
3589 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3590 }
3591
Rafael Espindola577637a2015-01-03 00:06:04 +00003592 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003593
Richard Smith3be1cb22014-08-07 00:24:21 +00003594 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003595 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003596 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3597 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003598 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003599 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003600
3601 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003602 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003603 //
3604 // If a std is supplied, only add -trigraphs if it follows the
3605 // option.
3606 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3607 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003608 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003609 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003610 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003611 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003612 else
3613 Std->render(Args, CmdArgs);
3614
Nico Weber00721502014-12-23 22:32:37 +00003615 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003616 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003617 options::OPT_ftrigraphs,
3618 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003619 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003620 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003621 } else {
3622 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003623 //
3624 // FIXME: Clang doesn't correctly handle -std= when the input language
3625 // doesn't match. For the time being just ignore this for C++ inputs;
3626 // eventually we want to do all the standard defaulting here instead of
3627 // splitting it between the driver and clang -cc1.
3628 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003629 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3630 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003631 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003632 CmdArgs.push_back("-std=c++11");
3633
Nico Weber00721502014-12-23 22:32:37 +00003634 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3635 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003636 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003637
Richard Smith282b4492013-09-04 22:50:31 +00003638 // GCC's behavior for -Wwrite-strings is a bit strange:
3639 // * In C, this "warning flag" changes the types of string literals from
3640 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3641 // for the discarded qualifier.
3642 // * In C++, this is just a normal warning flag.
3643 //
3644 // Implementing this warning correctly in C is hard, so we follow GCC's
3645 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3646 // a non-const char* in C, rather than using this crude hack.
3647 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003648 // FIXME: This should behave just like a warning flag, and thus should also
3649 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3650 Arg *WriteStrings =
3651 Args.getLastArg(options::OPT_Wwrite_strings,
3652 options::OPT_Wno_write_strings, options::OPT_w);
3653 if (WriteStrings &&
3654 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003655 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003656 }
3657
Chandler Carruth61fbf622011-04-23 09:27:53 +00003658 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003659 // during C++ compilation, which it is by default. GCC keeps this define even
3660 // in the presence of '-w', match this behavior bug-for-bug.
3661 if (types::isCXX(InputType) &&
3662 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3663 true)) {
3664 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003665 }
3666
Chandler Carruthe0391482010-05-22 02:21:53 +00003667 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3668 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3669 if (Asm->getOption().matches(options::OPT_fasm))
3670 CmdArgs.push_back("-fgnu-keywords");
3671 else
3672 CmdArgs.push_back("-fno-gnu-keywords");
3673 }
3674
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003675 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3676 CmdArgs.push_back("-fno-dwarf-directory-asm");
3677
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003678 if (ShouldDisableAutolink(Args, getToolChain()))
3679 CmdArgs.push_back("-fno-autolink");
3680
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003681 // Add in -fdebug-compilation-dir if necessary.
3682 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003683
Richard Smith9a568822011-11-21 19:36:32 +00003684 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3685 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003687 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003688 }
3689
Richard Smith79c927b2013-11-06 19:31:51 +00003690 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3691 CmdArgs.push_back("-foperator-arrow-depth");
3692 CmdArgs.push_back(A->getValue());
3693 }
3694
Richard Smith9a568822011-11-21 19:36:32 +00003695 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3696 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003697 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003698 }
3699
Richard Smitha3d3bd22013-05-08 02:12:03 +00003700 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3701 CmdArgs.push_back("-fconstexpr-steps");
3702 CmdArgs.push_back(A->getValue());
3703 }
3704
Richard Smithb3a14522013-02-22 01:59:51 +00003705 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3706 CmdArgs.push_back("-fbracket-depth");
3707 CmdArgs.push_back(A->getValue());
3708 }
3709
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003710 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3711 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003712 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003713 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003714 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3715 } else
3716 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003717 }
3718
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003719
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003720 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003721 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003722
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003723 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3724 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003725 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003726 }
David Chisnall5778fce2009-08-31 16:41:57 +00003727
Chris Lattnere23003d2010-01-09 21:54:33 +00003728 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3729 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003730 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003731 }
3732
Chris Lattnerb35583d2010-04-07 20:49:23 +00003733 CmdArgs.push_back("-ferror-limit");
3734 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003735 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003736 else
3737 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003738
Chandler Carrutha77a7272010-05-06 04:55:18 +00003739 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3740 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003741 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003742 }
3743
3744 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3745 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003746 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003747 }
3748
Richard Smithf6f003a2011-12-16 19:06:07 +00003749 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3750 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003751 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003752 }
3753
Nick Lewycky24653262014-12-16 21:39:02 +00003754 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3755 CmdArgs.push_back("-fspell-checking-limit");
3756 CmdArgs.push_back(A->getValue());
3757 }
3758
Daniel Dunbar2c978472009-11-04 06:24:47 +00003759 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003760 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003761 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003762 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003763 } else {
3764 // If -fmessage-length=N was not specified, determine whether this is a
3765 // terminal and, if so, implicitly define -fmessage-length appropriately.
3766 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003767 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003768 }
3769
John McCallb4a99d32013-02-19 01:57:35 +00003770 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3771 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3772 options::OPT_fvisibility_ms_compat)) {
3773 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3774 CmdArgs.push_back("-fvisibility");
3775 CmdArgs.push_back(A->getValue());
3776 } else {
3777 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3778 CmdArgs.push_back("-fvisibility");
3779 CmdArgs.push_back("hidden");
3780 CmdArgs.push_back("-ftype-visibility");
3781 CmdArgs.push_back("default");
3782 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003783 }
3784
Douglas Gregor08329632010-06-15 17:05:35 +00003785 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003786
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003787 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3788
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003789 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003790 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3791 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003792 CmdArgs.push_back("-ffreestanding");
3793
Daniel Dunbare357d562009-12-03 18:42:11 +00003794 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003795 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003796 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003797 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3798 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003799 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003800 // AltiVec language extensions aren't relevant for assembling.
3801 if (!isa<PreprocessJobAction>(JA) ||
3802 Output.getType() != types::TY_PP_Asm)
3803 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003804 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3805 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003806
Peter Collingbourne32701642013-11-01 18:16:25 +00003807 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3808 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003809
Eric Christopher459d2712013-02-19 06:16:53 +00003810 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003811 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003812 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003813 getToolChain().getArch() == llvm::Triple::ppc64 ||
3814 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003815 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003816 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003817
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003818 if (getToolChain().SupportsProfiling())
3819 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003820
3821 // -flax-vector-conversions is default.
3822 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3823 options::OPT_fno_lax_vector_conversions))
3824 CmdArgs.push_back("-fno-lax-vector-conversions");
3825
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003826 if (Args.getLastArg(options::OPT_fapple_kext))
3827 CmdArgs.push_back("-fapple-kext");
3828
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003829 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003830 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003831 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003832 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3833 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003834
3835 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3836 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003837 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003838 }
3839
Bob Wilson14adb362012-02-03 06:27:22 +00003840 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003841
Chandler Carruth6e501032011-03-27 00:04:55 +00003842 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3843 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3844 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3845 options::OPT_fno_wrapv)) {
3846 if (A->getOption().matches(options::OPT_fwrapv))
3847 CmdArgs.push_back("-fwrapv");
3848 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3849 options::OPT_fno_strict_overflow)) {
3850 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3851 CmdArgs.push_back("-fwrapv");
3852 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003853
3854 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3855 options::OPT_fno_reroll_loops))
3856 if (A->getOption().matches(options::OPT_freroll_loops))
3857 CmdArgs.push_back("-freroll-loops");
3858
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003859 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003860 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3861 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003862
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003863 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3864
Mahesha S6a682be42012-10-27 07:47:56 +00003865
Daniel Dunbar4930e332009-11-17 08:07:36 +00003866 // -stack-protector=0 is default.
3867 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003868 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3869 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003870 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003871 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003872 if (A->getOption().matches(options::OPT_fstack_protector)) {
3873 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3874 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3875 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003876 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003877 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003878 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003879 } else {
3880 StackProtectorLevel =
3881 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3882 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003883 if (StackProtectorLevel) {
3884 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003885 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003886 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003887
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003888 // --param ssp-buffer-size=
3889 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3890 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003891 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003892 if (Str.startswith("ssp-buffer-size=")) {
3893 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003894 CmdArgs.push_back("-stack-protector-buffer-size");
3895 // FIXME: Verify the argument is a valid integer.
3896 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003897 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003898 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003899 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003900 }
3901
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003902 // Translate -mstackrealign
3903 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3904 false)) {
3905 CmdArgs.push_back("-backend-option");
3906 CmdArgs.push_back("-force-align-stack");
3907 }
3908 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3909 false)) {
3910 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3911 }
3912
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003913 if (Args.hasArg(options::OPT_mstack_alignment)) {
3914 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3915 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003916 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003917
Hans Wennborg77dc2362015-01-20 19:45:50 +00003918 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3919 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3920
3921 if (!Size.empty())
3922 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3923 else
3924 CmdArgs.push_back("-mstack-probe-size=0");
3925 }
3926
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003927 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3928 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3929 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3930
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003931 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3932 options::OPT_mno_restrict_it)) {
3933 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3934 CmdArgs.push_back("-backend-option");
3935 CmdArgs.push_back("-arm-restrict-it");
3936 } else {
3937 CmdArgs.push_back("-backend-option");
3938 CmdArgs.push_back("-arm-no-restrict-it");
3939 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003940 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3941 TT.getArch() == llvm::Triple::thumb)) {
3942 // Windows on ARM expects restricted IT blocks
3943 CmdArgs.push_back("-backend-option");
3944 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003945 }
3946
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003947 if (TT.getArch() == llvm::Triple::arm ||
3948 TT.getArch() == llvm::Triple::thumb) {
3949 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3950 options::OPT_mno_long_calls)) {
3951 if (A->getOption().matches(options::OPT_mlong_calls)) {
3952 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003953 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003954 }
3955 }
3956 }
3957
Daniel Dunbard18049a2009-04-07 21:16:11 +00003958 // Forward -f options with positive and negative forms; we translate
3959 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003960 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3961 StringRef fname = A->getValue();
3962 if (!llvm::sys::fs::exists(fname))
3963 D.Diag(diag::err_drv_no_such_file) << fname;
3964 else
3965 A->render(Args, CmdArgs);
3966 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003967
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003968 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003969 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003970 CmdArgs.push_back("-fapple-kext");
3971 if (!Args.hasArg(options::OPT_fbuiltin))
3972 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003973 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003974 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003975 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003976 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003977 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003978
Nuno Lopes13c88c72009-12-16 16:59:22 +00003979 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3980 options::OPT_fno_assume_sane_operator_new))
3981 CmdArgs.push_back("-fno-assume-sane-operator-new");
3982
Daniel Dunbar4930e332009-11-17 08:07:36 +00003983 // -fblocks=0 is default.
3984 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003985 getToolChain().IsBlocksDefault()) ||
3986 (Args.hasArg(options::OPT_fgnu_runtime) &&
3987 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3988 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003989 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003990
3991 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3992 !getToolChain().hasBlocksRuntime())
3993 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003994 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003995
Richard Smithffb65082014-09-30 23:10:19 +00003996 // -fmodules enables modules (off by default).
3997 // Users can pass -fno-cxx-modules to turn off modules support for
3998 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003999 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004000 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
4001 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4002 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004003 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004004 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004005 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004006 HaveModules = true;
4007 }
4008 }
4009
Daniel Jasper07e6c402013-08-05 20:26:17 +00004010 // -fmodule-maps enables module map processing (off by default) for header
4011 // checking. It is implied by -fmodules.
4012 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4013 false)) {
4014 CmdArgs.push_back("-fmodule-maps");
4015 }
4016
Daniel Jasperac42b752013-10-21 06:34:34 +00004017 // -fmodules-decluse checks that modules used are declared so (off by
4018 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004019 if (Args.hasFlag(options::OPT_fmodules_decluse,
4020 options::OPT_fno_modules_decluse,
4021 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004022 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004023 }
4024
Daniel Jasper962b38e2014-04-11 11:47:45 +00004025 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4026 // all #included headers are part of modules.
4027 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4028 options::OPT_fno_modules_strict_decluse,
4029 false)) {
4030 CmdArgs.push_back("-fmodules-strict-decluse");
4031 }
4032
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004033 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4034 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4035 options::OPT_fno_implicit_modules)) {
4036 CmdArgs.push_back("-fno-implicit-modules");
4037 }
4038
Daniel Jasperac42b752013-10-21 06:34:34 +00004039 // -fmodule-name specifies the module that is currently being built (or
4040 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004041 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004042
Richard Smith9887d792014-10-17 01:42:53 +00004043 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004044 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004045 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004046
Richard Smithe842a472014-10-22 02:05:46 +00004047 // -fmodule-file can be used to specify files containing precompiled modules.
4048 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4049
4050 // -fmodule-cache-path specifies where our implicitly-built module files
4051 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004052 SmallString<128> ModuleCachePath;
4053 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4054 ModuleCachePath = A->getValue();
4055 if (HaveModules) {
4056 if (C.isForDiagnostics()) {
4057 // When generating crash reports, we want to emit the modules along with
4058 // the reproduction sources, so we ignore any provided module path.
4059 ModuleCachePath = Output.getFilename();
4060 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4061 llvm::sys::path::append(ModuleCachePath, "modules");
4062 } else if (ModuleCachePath.empty()) {
4063 // No module path was provided: use the default.
4064 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4065 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004066 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4067 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004068 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4069 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004070 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004071 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4072 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4073 }
4074
4075 // When building modules and generating crashdumps, we need to dump a module
4076 // dependency VFS alongside the output.
4077 if (HaveModules && C.isForDiagnostics()) {
4078 SmallString<128> VFSDir(Output.getFilename());
4079 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004080 // Add the cache directory as a temp so the crash diagnostics pick it up.
4081 C.addTempFile(Args.MakeArgString(VFSDir));
4082
Justin Bognera88f0122014-06-20 22:59:50 +00004083 llvm::sys::path::append(VFSDir, "vfs");
4084 CmdArgs.push_back("-module-dependency-dir");
4085 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004086 }
4087
Richard Smith9887d792014-10-17 01:42:53 +00004088 if (HaveModules)
4089 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004090
Douglas Gregor35b04d62013-02-07 19:01:24 +00004091 // Pass through all -fmodules-ignore-macro arguments.
4092 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004093 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4094 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004095
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004096 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4097
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004098 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4099 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4100 D.Diag(diag::err_drv_argument_not_allowed_with)
4101 << A->getAsString(Args) << "-fbuild-session-timestamp";
4102
4103 llvm::sys::fs::file_status Status;
4104 if (llvm::sys::fs::status(A->getValue(), Status))
4105 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004106 CmdArgs.push_back(Args.MakeArgString(
4107 "-fbuild-session-timestamp=" +
4108 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004109 }
4110
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004111 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004112 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4113 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004114 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4115
4116 Args.AddLastArg(CmdArgs,
4117 options::OPT_fmodules_validate_once_per_build_session);
4118 }
4119
Ben Langmuirdcf73862014-03-12 00:06:17 +00004120 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4121
John McCalldfea9982010-04-09 19:12:06 +00004122 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004123 if (Args.hasFlag(options::OPT_fno_access_control,
4124 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004125 false))
John McCall3155f572010-04-09 19:03:51 +00004126 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004127
Anders Carlssond470fef2010-11-21 00:09:52 +00004128 // -felide-constructors is the default.
4129 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4130 options::OPT_felide_constructors,
4131 false))
4132 CmdArgs.push_back("-fno-elide-constructors");
4133
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004134 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004135
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004136 if (KernelOrKext || (types::isCXX(InputType) &&
4137 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4138 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004139 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004140
Tony Linthicum76329bf2011-12-12 21:14:55 +00004141 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004142 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004143 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004144 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004145 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004146 CmdArgs.push_back("-fshort-enums");
4147
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004148 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004149 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004150 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004151 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004152
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004153 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004154 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4155 options::OPT_fno_use_cxa_atexit,
4156 !IsWindowsCygnus && !IsWindowsGNU &&
4157 getToolChain().getArch() != llvm::Triple::hexagon &&
4158 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004159 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004160 CmdArgs.push_back("-fno-use-cxa-atexit");
4161
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004162 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004163 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004164 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004165 CmdArgs.push_back("-fms-extensions");
4166
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004167 // -fno-use-line-directives is default.
4168 if (Args.hasFlag(options::OPT_fuse_line_directives,
4169 options::OPT_fno_use_line_directives, false))
4170 CmdArgs.push_back("-fuse-line-directives");
4171
Francois Pichet1b4f1632011-09-17 04:32:15 +00004172 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004173 if (Args.hasFlag(options::OPT_fms_compatibility,
4174 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004175 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4176 options::OPT_fno_ms_extensions,
4177 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004178 CmdArgs.push_back("-fms-compatibility");
4179
David Majnemerc371ff02015-03-22 08:39:22 +00004180 // -fms-compatibility-version=18.00 is default.
4181 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004182 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004183 IsWindowsMSVC) ||
4184 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004185 Args.hasArg(options::OPT_fms_compatibility_version)) {
4186 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4187 const Arg *MSCompatibilityVersion =
4188 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004189
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004190 if (MSCVersion && MSCompatibilityVersion)
4191 D.Diag(diag::err_drv_argument_not_allowed_with)
4192 << MSCVersion->getAsString(Args)
4193 << MSCompatibilityVersion->getAsString(Args);
4194
David Majnemerc371ff02015-03-22 08:39:22 +00004195 if (MSCompatibilityVersion) {
4196 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4197 D.Diag(diag::err_drv_invalid_value)
4198 << MSCompatibilityVersion->getAsString(Args)
4199 << MSCompatibilityVersion->getValue();
4200 } else if (MSCVersion) {
4201 unsigned Version = 0;
4202 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4203 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4204 << MSCVersion->getValue();
4205 MSVT = getMSCompatibilityVersion(Version);
4206 } else {
4207 MSVT = VersionTuple(18);
4208 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004209
David Majnemerc371ff02015-03-22 08:39:22 +00004210 CmdArgs.push_back(
4211 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004212 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004213
Eric Christopher5ecce122013-02-18 00:38:31 +00004214 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004215 if (Args.hasFlag(options::OPT_fborland_extensions,
4216 options::OPT_fno_borland_extensions, false))
4217 CmdArgs.push_back("-fborland-extensions");
4218
David Majnemerc371ff02015-03-22 08:39:22 +00004219 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4220 // than 19.
4221 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4222 options::OPT_fno_threadsafe_statics,
4223 !IsWindowsMSVC || MSVT.getMajor() >= 19))
4224 CmdArgs.push_back("-fno-threadsafe-statics");
4225
Francois Pichet02744872011-09-01 16:38:08 +00004226 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4227 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004228 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004229 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004230 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004231
Chandler Carruthe03aa552010-04-17 20:17:31 +00004232 // -fgnu-keywords default varies depending on language; only pass if
4233 // specified.
4234 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004235 options::OPT_fno_gnu_keywords))
4236 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004237
Rafael Espindola922a6242011-06-02 17:30:53 +00004238 if (Args.hasFlag(options::OPT_fgnu89_inline,
4239 options::OPT_fno_gnu89_inline,
4240 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004241 CmdArgs.push_back("-fgnu89-inline");
4242
Chad Rosier9c76d242012-03-15 22:31:42 +00004243 if (Args.hasArg(options::OPT_fno_inline))
4244 CmdArgs.push_back("-fno-inline");
4245
Chad Rosier64d6be92012-03-06 21:17:19 +00004246 if (Args.hasArg(options::OPT_fno_inline_functions))
4247 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004248
John McCall5fb5df92012-06-20 06:18:46 +00004249 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004250
John McCall5fb5df92012-06-20 06:18:46 +00004251 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004252 // legacy is the default. Except for deployment taget of 10.5,
4253 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4254 // gets ignored silently.
4255 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004256 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4257 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004258 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004259 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004260 if (getToolChain().UseObjCMixedDispatch())
4261 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4262 else
4263 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4264 }
4265 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004266
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004267 // When ObjectiveC legacy runtime is in effect on MacOSX,
4268 // turn on the option to do Array/Dictionary subscripting
4269 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004270 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4271 getToolChain().getTriple().isMacOSX() &&
4272 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4273 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004274 objcRuntime.isNeXTFamily())
4275 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4276
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004277 // -fencode-extended-block-signature=1 is default.
4278 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4279 CmdArgs.push_back("-fencode-extended-block-signature");
4280 }
4281
John McCall24fc0de2011-07-06 00:26:06 +00004282 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4283 // NOTE: This logic is duplicated in ToolChains.cpp.
4284 bool ARC = isObjCAutoRefCount(Args);
4285 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004286 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004287
John McCall24fc0de2011-07-06 00:26:06 +00004288 CmdArgs.push_back("-fobjc-arc");
4289
Chandler Carruth491db322011-11-04 07:34:47 +00004290 // FIXME: It seems like this entire block, and several around it should be
4291 // wrapped in isObjC, but for now we just use it here as this is where it
4292 // was being used previously.
4293 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4294 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4295 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4296 else
4297 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4298 }
4299
John McCall24fc0de2011-07-06 00:26:06 +00004300 // Allow the user to enable full exceptions code emission.
4301 // We define off for Objective-CC, on for Objective-C++.
4302 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4303 options::OPT_fno_objc_arc_exceptions,
4304 /*default*/ types::isCXX(InputType)))
4305 CmdArgs.push_back("-fobjc-arc-exceptions");
4306 }
4307
4308 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4309 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004310 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004311 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004312
John McCall24fc0de2011-07-06 00:26:06 +00004313 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4314 // takes precedence.
4315 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4316 if (!GCArg)
4317 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4318 if (GCArg) {
4319 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004320 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004321 << GCArg->getAsString(Args);
4322 } else if (getToolChain().SupportsObjCGC()) {
4323 GCArg->render(Args, CmdArgs);
4324 } else {
4325 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004326 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004327 << GCArg->getAsString(Args);
4328 }
4329 }
4330
Bob Wilsonb111ec92015-03-02 19:01:14 +00004331 if (Args.hasFlag(options::OPT_fapplication_extension,
4332 options::OPT_fno_application_extension, false))
4333 CmdArgs.push_back("-fapplication-extension");
4334
Reid Klecknerc542d372014-06-27 17:02:02 +00004335 // Handle GCC-style exception args.
4336 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004337 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004338 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004339
4340 if (getToolChain().UseSjLjExceptions())
4341 CmdArgs.push_back("-fsjlj-exceptions");
4342
4343 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004344 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4345 options::OPT_fno_assume_sane_operator_new))
4346 CmdArgs.push_back("-fno-assume-sane-operator-new");
4347
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004348 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4349 // most platforms.
4350 if (Args.hasFlag(options::OPT_fsized_deallocation,
4351 options::OPT_fno_sized_deallocation, false))
4352 CmdArgs.push_back("-fsized-deallocation");
4353
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004354 // -fconstant-cfstrings is default, and may be subject to argument translation
4355 // on Darwin.
4356 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4357 options::OPT_fno_constant_cfstrings) ||
4358 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4359 options::OPT_mno_constant_cfstrings))
4360 CmdArgs.push_back("-fno-constant-cfstrings");
4361
John Thompsoned4e2952009-11-05 20:14:16 +00004362 // -fshort-wchar default varies depending on platform; only
4363 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004364 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4365 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004366 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004367
Hans Wennborg28c96312013-07-31 23:39:13 +00004368 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004369 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004370 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004371 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004372 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004373
Daniel Dunbar096ed292011-10-05 21:04:55 +00004374 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4375 // -fno-pack-struct doesn't apply to -fpack-struct=.
4376 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004377 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004378 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004379 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004380 } else if (Args.hasFlag(options::OPT_fpack_struct,
4381 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004382 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004383 }
4384
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004385 // Handle -fmax-type-align=N and -fno-type-align
4386 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4387 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4388 if (!SkipMaxTypeAlign) {
4389 std::string MaxTypeAlignStr = "-fmax-type-align=";
4390 MaxTypeAlignStr += A->getValue();
4391 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4392 }
4393 } else if (getToolChain().getTriple().isOSDarwin()) {
4394 if (!SkipMaxTypeAlign) {
4395 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4396 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4397 }
4398 }
4399
Robert Lytton0e076492013-08-13 09:43:10 +00004400 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004401 if (!Args.hasArg(options::OPT_fcommon))
4402 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004403 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004404 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004405
Daniel Dunbard18049a2009-04-07 21:16:11 +00004406 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004407 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004408 CmdArgs.push_back("-fno-common");
4409
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004410 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004411 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004412 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004413 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004414 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004415 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4416
Daniel Dunbar6358d682010-10-15 22:30:42 +00004417 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4418 if (!Args.hasFlag(options::OPT_ffor_scope,
4419 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004420 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004421 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4422
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004423 // -finput_charset=UTF-8 is default. Reject others
4424 if (Arg *inputCharset = Args.getLastArg(
4425 options::OPT_finput_charset_EQ)) {
4426 StringRef value = inputCharset->getValue();
4427 if (value != "UTF-8")
4428 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4429 }
4430
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004431 // -fexec_charset=UTF-8 is default. Reject others
4432 if (Arg *execCharset = Args.getLastArg(
4433 options::OPT_fexec_charset_EQ)) {
4434 StringRef value = execCharset->getValue();
4435 if (value != "UTF-8")
4436 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4437 }
4438
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004439 // -fcaret-diagnostics is default.
4440 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4441 options::OPT_fno_caret_diagnostics, true))
4442 CmdArgs.push_back("-fno-caret-diagnostics");
4443
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004444 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004445 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004446 options::OPT_fno_diagnostics_fixit_info))
4447 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004448
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004449 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004450 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004451 options::OPT_fno_diagnostics_show_option))
4452 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004453
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004454 if (const Arg *A =
4455 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4456 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004457 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004458 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004459
Douglas Gregor643c9222011-05-21 17:07:29 +00004460 if (const Arg *A =
4461 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4462 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004463 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004464 }
4465
Chandler Carruthb6766f02011-03-27 01:50:55 +00004466 if (Arg *A = Args.getLastArg(
4467 options::OPT_fdiagnostics_show_note_include_stack,
4468 options::OPT_fno_diagnostics_show_note_include_stack)) {
4469 if (A->getOption().matches(
4470 options::OPT_fdiagnostics_show_note_include_stack))
4471 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4472 else
4473 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4474 }
4475
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004476 // Color diagnostics are the default, unless the terminal doesn't support
4477 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004478 // Support both clang's -f[no-]color-diagnostics and gcc's
4479 // -f[no-]diagnostics-colors[=never|always|auto].
4480 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004481 for (const auto &Arg : Args) {
4482 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004483 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4484 !O.matches(options::OPT_fdiagnostics_color) &&
4485 !O.matches(options::OPT_fno_color_diagnostics) &&
4486 !O.matches(options::OPT_fno_diagnostics_color) &&
4487 !O.matches(options::OPT_fdiagnostics_color_EQ))
4488 continue;
4489
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004490 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004491 if (O.matches(options::OPT_fcolor_diagnostics) ||
4492 O.matches(options::OPT_fdiagnostics_color)) {
4493 ShowColors = Colors_On;
4494 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4495 O.matches(options::OPT_fno_diagnostics_color)) {
4496 ShowColors = Colors_Off;
4497 } else {
4498 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004499 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004500 if (value == "always")
4501 ShowColors = Colors_On;
4502 else if (value == "never")
4503 ShowColors = Colors_Off;
4504 else if (value == "auto")
4505 ShowColors = Colors_Auto;
4506 else
4507 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4508 << ("-fdiagnostics-color=" + value).str();
4509 }
4510 }
4511 if (ShowColors == Colors_On ||
4512 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004513 CmdArgs.push_back("-fcolor-diagnostics");
4514
Nico Rieck7857d462013-09-11 00:38:02 +00004515 if (Args.hasArg(options::OPT_fansi_escape_codes))
4516 CmdArgs.push_back("-fansi-escape-codes");
4517
Daniel Dunbardb097022009-06-08 21:13:54 +00004518 if (!Args.hasFlag(options::OPT_fshow_source_location,
4519 options::OPT_fno_show_source_location))
4520 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004521
Douglas Gregor643c9222011-05-21 17:07:29 +00004522 if (!Args.hasFlag(options::OPT_fshow_column,
4523 options::OPT_fno_show_column,
4524 true))
4525 CmdArgs.push_back("-fno-show-column");
4526
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004527 if (!Args.hasFlag(options::OPT_fspell_checking,
4528 options::OPT_fno_spell_checking))
4529 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004530
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004531
Chad Rosierc8e56e82012-12-05 21:08:21 +00004532 // -fno-asm-blocks is default.
4533 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4534 false))
4535 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004536
Steven Wucb0d13f2015-01-16 23:05:28 +00004537 // -fgnu-inline-asm is default.
4538 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4539 options::OPT_fno_gnu_inline_asm, true))
4540 CmdArgs.push_back("-fno-gnu-inline-asm");
4541
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004542 // Enable vectorization per default according to the optimization level
4543 // selected. For optimization levels that want vectorization we use the alias
4544 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004545 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004546 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004547 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004548 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004549 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004550 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004551
Chad Rosier136d67d2014-04-28 19:30:57 +00004552 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004553 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4554 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004555 options::OPT_fslp_vectorize;
4556 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004557 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004558 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004559
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004560 // -fno-slp-vectorize-aggressive is default.
4561 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004562 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004563 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004564
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004565 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4566 A->render(Args, CmdArgs);
4567
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004568 // -fdollars-in-identifiers default varies depending on platform and
4569 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004570 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004571 options::OPT_fno_dollars_in_identifiers)) {
4572 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004573 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004574 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004575 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004576 }
4577
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004578 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4579 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004580 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004581 options::OPT_fno_unit_at_a_time)) {
4582 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004583 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004584 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004585
Eli Friedman055c9702011-11-02 01:53:16 +00004586 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4587 options::OPT_fno_apple_pragma_pack, false))
4588 CmdArgs.push_back("-fapple-pragma-pack");
4589
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004590 // le32-specific flags:
4591 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4592 // by default.
4593 if (getToolChain().getArch() == llvm::Triple::le32) {
4594 CmdArgs.push_back("-fno-math-builtin");
4595 }
4596
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004597 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004598 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004599 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004600#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004601 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004602 (getToolChain().getArch() == llvm::Triple::arm ||
4603 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004604 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4605 CmdArgs.push_back("-fno-builtin-strcat");
4606 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4607 CmdArgs.push_back("-fno-builtin-strcpy");
4608 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004609#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004610
Justin Bognera88f0122014-06-20 22:59:50 +00004611 // Enable rewrite includes if the user's asked for it or if we're generating
4612 // diagnostics.
4613 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4614 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004615 if (Args.hasFlag(options::OPT_frewrite_includes,
4616 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004617 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004618 CmdArgs.push_back("-frewrite-includes");
4619
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004620 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004621 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004622 options::OPT_traditional_cpp)) {
4623 if (isa<PreprocessJobAction>(JA))
4624 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004625 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004626 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004627 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004628
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004629 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004630 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004631
4632 // Handle serialized diagnostics.
4633 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4634 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004635 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004636 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004637
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004638 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4639 CmdArgs.push_back("-fretain-comments-from-system-headers");
4640
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004641 // Forward -fcomment-block-commands to -cc1.
4642 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004643 // Forward -fparse-all-comments to -cc1.
4644 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004645
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004646 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4647 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004648 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004649 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004650 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4651 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004652 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004653
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004654 // We translate this by hand to the -cc1 argument, since nightly test uses
4655 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004656 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004657 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004658 OptDisabled = true;
4659 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004660 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004661 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004662
Bob Wilson23a55f12014-12-21 07:00:00 +00004663 // With -save-temps, we want to save the unoptimized bitcode output from the
4664 // CompileJobAction, so disable optimizations if they are not already
4665 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004666 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004667 isa<CompileJobAction>(JA))
4668 CmdArgs.push_back("-disable-llvm-optzns");
4669
Daniel Dunbard67a3222009-03-30 06:36:42 +00004670 if (Output.getType() == types::TY_Dependencies) {
4671 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004672 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004673 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004674 CmdArgs.push_back(Output.getFilename());
4675 } else {
4676 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004677 }
4678
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004679 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004680 addDashXForInput(Args, II, CmdArgs);
4681
Daniel Dunbarb440f562010-08-02 02:38:21 +00004682 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004683 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004684 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004685 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004686 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004687
Chris Lattnere9d7d782009-11-03 19:50:27 +00004688 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4689
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004690 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004691
4692 // Optionally embed the -cc1 level arguments into the debug info, for build
4693 // analysis.
4694 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004695 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004696 for (const auto &Arg : Args)
4697 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004698
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004699 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004700 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004701 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004702 SmallString<128> EscapedArg;
4703 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004704 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004705 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004706 }
4707 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004708 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004709 }
4710
Eric Christopherd3804002013-02-22 20:12:52 +00004711 // Add the split debug info name to the command lines here so we
4712 // can propagate it to the backend.
4713 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004714 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004715 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4716 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004717 const char *SplitDwarfOut;
4718 if (SplitDwarf) {
4719 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004720 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004721 CmdArgs.push_back(SplitDwarfOut);
4722 }
4723
4724 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004725 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004726 Output.getType() == types::TY_Object &&
4727 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004728 auto CLCommand =
4729 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4730 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4731 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004732 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004734 }
4735
Daniel Dunbar17731772009-03-23 19:03:36 +00004736
Eric Christopherf1545832013-02-22 23:50:16 +00004737 // Handle the debug info splitting at object creation time if we're
4738 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004739 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004740 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004741 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004742
Roman Divacky178e01602011-02-10 16:52:03 +00004743 if (Arg *A = Args.getLastArg(options::OPT_pg))
4744 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004745 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004746 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004747
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004748 // Claim some arguments which clang supports automatically.
4749
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004750 // -fpch-preprocess is used with gcc to add a special marker in the output to
4751 // include the PCH file. Clang's PTH solution is completely transparent, so we
4752 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004753 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004754
Daniel Dunbar17731772009-03-23 19:03:36 +00004755 // Claim some arguments which clang doesn't support, but we don't
4756 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004757 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4758 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004759
Rafael Espindolab0092d72013-09-04 19:37:35 +00004760 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004761 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004762}
4763
John McCall5fb5df92012-06-20 06:18:46 +00004764/// Add options related to the Objective-C runtime/ABI.
4765///
4766/// Returns true if the runtime is non-fragile.
4767ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4768 ArgStringList &cmdArgs,
4769 RewriteKind rewriteKind) const {
4770 // Look for the controlling runtime option.
4771 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4772 options::OPT_fgnu_runtime,
4773 options::OPT_fobjc_runtime_EQ);
4774
4775 // Just forward -fobjc-runtime= to the frontend. This supercedes
4776 // options about fragility.
4777 if (runtimeArg &&
4778 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4779 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004780 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004781 if (runtime.tryParse(value)) {
4782 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4783 << value;
4784 }
4785
4786 runtimeArg->render(args, cmdArgs);
4787 return runtime;
4788 }
4789
4790 // Otherwise, we'll need the ABI "version". Version numbers are
4791 // slightly confusing for historical reasons:
4792 // 1 - Traditional "fragile" ABI
4793 // 2 - Non-fragile ABI, version 1
4794 // 3 - Non-fragile ABI, version 2
4795 unsigned objcABIVersion = 1;
4796 // If -fobjc-abi-version= is present, use that to set the version.
4797 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004798 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004799 if (value == "1")
4800 objcABIVersion = 1;
4801 else if (value == "2")
4802 objcABIVersion = 2;
4803 else if (value == "3")
4804 objcABIVersion = 3;
4805 else
4806 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4807 << value;
4808 } else {
4809 // Otherwise, determine if we are using the non-fragile ABI.
4810 bool nonFragileABIIsDefault =
4811 (rewriteKind == RK_NonFragile ||
4812 (rewriteKind == RK_None &&
4813 getToolChain().IsObjCNonFragileABIDefault()));
4814 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4815 options::OPT_fno_objc_nonfragile_abi,
4816 nonFragileABIIsDefault)) {
4817 // Determine the non-fragile ABI version to use.
4818#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4819 unsigned nonFragileABIVersion = 1;
4820#else
4821 unsigned nonFragileABIVersion = 2;
4822#endif
4823
4824 if (Arg *abiArg = args.getLastArg(
4825 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004826 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004827 if (value == "1")
4828 nonFragileABIVersion = 1;
4829 else if (value == "2")
4830 nonFragileABIVersion = 2;
4831 else
4832 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4833 << value;
4834 }
4835
4836 objcABIVersion = 1 + nonFragileABIVersion;
4837 } else {
4838 objcABIVersion = 1;
4839 }
4840 }
4841
4842 // We don't actually care about the ABI version other than whether
4843 // it's non-fragile.
4844 bool isNonFragile = objcABIVersion != 1;
4845
4846 // If we have no runtime argument, ask the toolchain for its default runtime.
4847 // However, the rewriter only really supports the Mac runtime, so assume that.
4848 ObjCRuntime runtime;
4849 if (!runtimeArg) {
4850 switch (rewriteKind) {
4851 case RK_None:
4852 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4853 break;
4854 case RK_Fragile:
4855 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4856 break;
4857 case RK_NonFragile:
4858 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4859 break;
4860 }
4861
4862 // -fnext-runtime
4863 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4864 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004865 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004866 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4867
4868 // Otherwise, build for a generic macosx port.
4869 } else {
4870 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4871 }
4872
4873 // -fgnu-runtime
4874 } else {
4875 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004876 // Legacy behaviour is to target the gnustep runtime if we are i
4877 // non-fragile mode or the GCC runtime in fragile mode.
4878 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004879 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004880 else
4881 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004882 }
4883
4884 cmdArgs.push_back(args.MakeArgString(
4885 "-fobjc-runtime=" + runtime.getAsString()));
4886 return runtime;
4887}
4888
Reid Klecknerc542d372014-06-27 17:02:02 +00004889static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4890 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4891 I += HaveDash;
4892 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004893}
Reid Klecknerc542d372014-06-27 17:02:02 +00004894
4895struct EHFlags {
4896 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4897 bool Synch;
4898 bool Asynch;
4899 bool NoExceptC;
4900};
4901
4902/// /EH controls whether to run destructor cleanups when exceptions are
4903/// thrown. There are three modifiers:
4904/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4905/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4906/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4907/// - c: Assume that extern "C" functions are implicitly noexcept. This
4908/// modifier is an optimization, so we ignore it for now.
4909/// The default is /EHs-c-, meaning cleanups are disabled.
4910static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4911 EHFlags EH;
4912 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4913 for (auto EHVal : EHArgs) {
4914 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4915 switch (EHVal[I]) {
4916 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4917 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4918 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4919 default: break;
4920 }
4921 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4922 break;
4923 }
4924 }
4925 return EH;
4926}
4927
Hans Wennborg75958c42013-08-08 00:17:41 +00004928void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4929 unsigned RTOptionID = options::OPT__SLASH_MT;
4930
Hans Wennborgf1a74252013-09-10 20:18:04 +00004931 if (Args.hasArg(options::OPT__SLASH_LDd))
4932 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4933 // but defining _DEBUG is sticky.
4934 RTOptionID = options::OPT__SLASH_MTd;
4935
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004936 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004937 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004938
Hans Wennborg75958c42013-08-08 00:17:41 +00004939 switch(RTOptionID) {
4940 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004941 if (Args.hasArg(options::OPT__SLASH_LDd))
4942 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004943 CmdArgs.push_back("-D_MT");
4944 CmdArgs.push_back("-D_DLL");
4945 CmdArgs.push_back("--dependent-lib=msvcrt");
4946 break;
4947 case options::OPT__SLASH_MDd:
4948 CmdArgs.push_back("-D_DEBUG");
4949 CmdArgs.push_back("-D_MT");
4950 CmdArgs.push_back("-D_DLL");
4951 CmdArgs.push_back("--dependent-lib=msvcrtd");
4952 break;
4953 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004954 if (Args.hasArg(options::OPT__SLASH_LDd))
4955 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004956 CmdArgs.push_back("-D_MT");
4957 CmdArgs.push_back("--dependent-lib=libcmt");
4958 break;
4959 case options::OPT__SLASH_MTd:
4960 CmdArgs.push_back("-D_DEBUG");
4961 CmdArgs.push_back("-D_MT");
4962 CmdArgs.push_back("--dependent-lib=libcmtd");
4963 break;
4964 default:
4965 llvm_unreachable("Unexpected option ID.");
4966 }
4967
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004968 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4969 // users want. The /Za flag to cl.exe turns this off, but it's not
4970 // implemented in clang.
4971 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004972
Hans Wennborg8858a032014-07-21 23:42:07 +00004973 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4974 // would produce interleaved output, so ignore /showIncludes in such cases.
4975 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4976 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4977 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004978
David Majnemerf6072342014-07-01 22:24:56 +00004979 // This controls whether or not we emit RTTI data for polymorphic types.
4980 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4981 /*default=*/false))
4982 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004983
Reid Klecknerc542d372014-06-27 17:02:02 +00004984 const Driver &D = getToolChain().getDriver();
4985 EHFlags EH = parseClangCLEHFlags(D, Args);
4986 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004987 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004988 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004989 CmdArgs.push_back("-fexceptions");
4990 }
Reid Klecknerc542d372014-06-27 17:02:02 +00004991
Hans Wennborge50cec32014-06-13 20:59:54 +00004992 // /EP should expand to -E -P.
4993 if (Args.hasArg(options::OPT__SLASH_EP)) {
4994 CmdArgs.push_back("-E");
4995 CmdArgs.push_back("-P");
4996 }
4997
David Majnemera5b195a2015-02-14 01:35:12 +00004998 unsigned VolatileOptionID;
4999 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
5000 getToolChain().getTriple().getArch() == llvm::Triple::x86)
5001 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5002 else
5003 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5004
5005 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5006 VolatileOptionID = A->getOption().getID();
5007
5008 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5009 CmdArgs.push_back("-fms-volatile");
5010
David Majnemer86c318f2014-02-11 21:05:00 +00005011 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5012 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5013 if (MostGeneralArg && BestCaseArg)
5014 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5015 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5016
5017 if (MostGeneralArg) {
5018 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5019 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5020 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5021
5022 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5023 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5024 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5025 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5026 << FirstConflict->getAsString(Args)
5027 << SecondConflict->getAsString(Args);
5028
5029 if (SingleArg)
5030 CmdArgs.push_back("-fms-memptr-rep=single");
5031 else if (MultipleArg)
5032 CmdArgs.push_back("-fms-memptr-rep=multiple");
5033 else
5034 CmdArgs.push_back("-fms-memptr-rep=virtual");
5035 }
5036
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005037 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5038 A->render(Args, CmdArgs);
5039
Hans Wennborg81f74482013-09-10 01:07:07 +00005040 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5041 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005042 if (Args.hasArg(options::OPT__SLASH_fallback))
5043 CmdArgs.push_back("msvc-fallback");
5044 else
5045 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005046 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005047}
5048
Hans Wennborg1da044a2014-06-26 19:59:02 +00005049visualstudio::Compile *Clang::getCLFallback() const {
5050 if (!CLFallback)
5051 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5052 return CLFallback.get();
5053}
5054
Daniel Sanders7f933f42015-01-30 17:35:23 +00005055void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5056 ArgStringList &CmdArgs) const {
5057 StringRef CPUName;
5058 StringRef ABIName;
5059 const llvm::Triple &Triple = getToolChain().getTriple();
5060 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5061
5062 CmdArgs.push_back("-target-abi");
5063 CmdArgs.push_back(ABIName.data());
5064}
5065
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005066void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005067 const InputInfo &Output,
5068 const InputInfoList &Inputs,
5069 const ArgList &Args,
5070 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005071 ArgStringList CmdArgs;
5072
5073 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5074 const InputInfo &Input = Inputs[0];
5075
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005076 // Don't warn about "clang -w -c foo.s"
5077 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005078 // and "clang -emit-llvm -c foo.s"
5079 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005080
Rafael Espindola577637a2015-01-03 00:06:04 +00005081 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005082
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005083 // Invoke ourselves in -cc1as mode.
5084 //
5085 // FIXME: Implement custom jobs for internal actions.
5086 CmdArgs.push_back("-cc1as");
5087
5088 // Add the "effective" target triple.
5089 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005090 std::string TripleStr =
5091 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005092 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5093
5094 // Set the output mode, we currently only expect to be used as a real
5095 // assembler.
5096 CmdArgs.push_back("-filetype");
5097 CmdArgs.push_back("obj");
5098
Eric Christopher45f2e712012-12-18 00:31:10 +00005099 // Set the main file name, so that debug info works even with
5100 // -save-temps or preprocessed assembly.
5101 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005102 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005103
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005104 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005105 const llvm::Triple &Triple = getToolChain().getTriple();
5106 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005107 if (!CPU.empty()) {
5108 CmdArgs.push_back("-target-cpu");
5109 CmdArgs.push_back(Args.MakeArgString(CPU));
5110 }
5111
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005112 // Add the target features
5113 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005114 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005115
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005116 // Ignore explicit -force_cpusubtype_ALL option.
5117 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005118
Eric Christopherfc3ee562012-01-10 00:38:01 +00005119 // Determine the original source input.
5120 const Action *SourceAction = &JA;
5121 while (SourceAction->getKind() != Action::InputClass) {
5122 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5123 SourceAction = SourceAction->getInputs()[0];
5124 }
5125
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005126 // Forward -g and handle debug info related flags, assuming we are dealing
5127 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005128 if (SourceAction->getType() == types::TY_Asm ||
5129 SourceAction->getType() == types::TY_PP_Asm) {
5130 Args.ClaimAllArgs(options::OPT_g_Group);
5131 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5132 if (!A->getOption().matches(options::OPT_g0))
5133 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005134
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005135 if (Args.hasArg(options::OPT_gdwarf_2))
5136 CmdArgs.push_back("-gdwarf-2");
5137 if (Args.hasArg(options::OPT_gdwarf_3))
5138 CmdArgs.push_back("-gdwarf-3");
5139 if (Args.hasArg(options::OPT_gdwarf_4))
5140 CmdArgs.push_back("-gdwarf-4");
5141
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005142 // Add the -fdebug-compilation-dir flag if needed.
5143 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005144
5145 // Set the AT_producer to the clang version when using the integrated
5146 // assembler on assembly source files.
5147 CmdArgs.push_back("-dwarf-debug-producer");
5148 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005149 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005150
5151 // Optionally embed the -cc1as level arguments into the debug info, for build
5152 // analysis.
5153 if (getToolChain().UseDwarfDebugFlags()) {
5154 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005155 for (const auto &Arg : Args)
5156 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005157
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005158 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005159 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5160 Flags += Exec;
5161 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005162 SmallString<128> EscapedArg;
5163 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005164 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005165 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005166 }
5167 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005168 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005169 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005170
5171 // FIXME: Add -static support, once we have it.
5172
Daniel Sanders7f933f42015-01-30 17:35:23 +00005173 // Add target specific flags.
5174 switch(getToolChain().getArch()) {
5175 default:
5176 break;
5177
5178 case llvm::Triple::mips:
5179 case llvm::Triple::mipsel:
5180 case llvm::Triple::mips64:
5181 case llvm::Triple::mips64el:
5182 AddMIPSTargetArgs(Args, CmdArgs);
5183 break;
5184 }
5185
David Blaikie372d9502014-01-17 03:17:40 +00005186 // Consume all the warning flags. Usually this would be handled more
5187 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5188 // doesn't handle that so rather than warning about unused flags that are
5189 // actually used, we'll lie by omission instead.
5190 // FIXME: Stop lying and consume only the appropriate driver flags
5191 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5192 ie = Args.filtered_end();
5193 it != ie; ++it)
5194 (*it)->claim();
5195
David Blaikie9260ed62013-07-25 21:19:01 +00005196 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5197 getToolChain().getDriver());
5198
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005199 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005200
5201 assert(Output.isFilename() && "Unexpected lipo output.");
5202 CmdArgs.push_back("-o");
5203 CmdArgs.push_back(Output.getFilename());
5204
Daniel Dunbarb440f562010-08-02 02:38:21 +00005205 assert(Input.isFilename() && "Invalid input.");
5206 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005207
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005208 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005209 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005210
5211 // Handle the debug info splitting at object creation time if we're
5212 // creating an object.
5213 // TODO: Currently only works on linux with newer objcopy.
5214 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005215 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005216 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005217 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005218}
5219
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005220void GnuTool::anchor() {}
5221
Daniel Dunbara3246a02009-03-18 08:07:30 +00005222void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005223 const InputInfo &Output,
5224 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005225 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005226 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005227 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005228 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005229
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005230 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005231 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005232 // Don't forward any -g arguments to assembly steps.
5233 if (isa<AssembleJobAction>(JA) &&
5234 A->getOption().matches(options::OPT_g_Group))
5235 continue;
5236
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005237 // Don't forward any -W arguments to assembly and link steps.
5238 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5239 A->getOption().matches(options::OPT_W_Group))
5240 continue;
5241
Daniel Dunbar2da02722009-03-19 07:55:12 +00005242 // It is unfortunate that we have to claim here, as this means
5243 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005244 // platforms using a generic gcc, even if we are just using gcc
5245 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005246 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005247 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005248 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005249 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005250
Daniel Dunbar4e295052010-01-25 22:35:08 +00005251 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005252
5253 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005254 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005255 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005256 CmdArgs.push_back(
5257 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005258 }
5259
Daniel Dunbar5716d872009-05-02 21:41:52 +00005260 // Try to force gcc to match the tool chain we want, if we recognize
5261 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005262 //
5263 // FIXME: The triple class should directly provide the information we want
5264 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005265 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005266 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005267 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005268 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5269 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005270 CmdArgs.push_back("-m64");
5271
Daniel Dunbarb440f562010-08-02 02:38:21 +00005272 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005273 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005274 CmdArgs.push_back(Output.getFilename());
5275 } else {
5276 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005277 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005278 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005279
Tony Linthicum76329bf2011-12-12 21:14:55 +00005280 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5281 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005282
5283 // Only pass -x if gcc will understand it; otherwise hope gcc
5284 // understands the suffix correctly. The main use case this would go
5285 // wrong in is for linker inputs if they happened to have an odd
5286 // suffix; really the only way to get this to happen is a command
5287 // like '-x foobar a.c' which will treat a.c like a linker input.
5288 //
5289 // FIXME: For the linker case specifically, can we safely convert
5290 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005291 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005292 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005293 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5294 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005295 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005296 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005297 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005298 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005299 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005300 else if (II.getType() == types::TY_ModuleFile)
5301 D.Diag(diag::err_drv_no_module_support)
5302 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005303
Daniel Dunbara3246a02009-03-18 08:07:30 +00005304 if (types::canTypeBeUserSpecified(II.getType())) {
5305 CmdArgs.push_back("-x");
5306 CmdArgs.push_back(types::getTypeName(II.getType()));
5307 }
5308
Daniel Dunbarb440f562010-08-02 02:38:21 +00005309 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005310 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005311 else {
5312 const Arg &A = II.getInputArg();
5313
5314 // Reverse translate some rewritten options.
5315 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5316 CmdArgs.push_back("-lstdc++");
5317 continue;
5318 }
5319
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005320 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005321 A.render(Args, CmdArgs);
5322 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005323 }
5324
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005325 const std::string customGCCName = D.getCCCGenericGCCName();
5326 const char *GCCName;
5327 if (!customGCCName.empty())
5328 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005329 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005330 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005331 } else
5332 GCCName = "gcc";
5333
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005334 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005335 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005336 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005337}
5338
Daniel Dunbar4e295052010-01-25 22:35:08 +00005339void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5340 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005341 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005342}
5343
Daniel Dunbar4e295052010-01-25 22:35:08 +00005344void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5345 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005346 const Driver &D = getToolChain().getDriver();
5347
Eric Christophercc7ff502015-01-29 00:56:17 +00005348 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005349 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005350 case types::TY_LLVM_IR:
5351 case types::TY_LTO_IR:
5352 case types::TY_LLVM_BC:
5353 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005354 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005355 break;
5356 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005357 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005358 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005359 case types::TY_Nothing:
5360 CmdArgs.push_back("-fsyntax-only");
5361 break;
5362 default:
5363 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005364 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005365}
5366
Daniel Dunbar4e295052010-01-25 22:35:08 +00005367void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5368 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005369 // The types are (hopefully) good enough.
5370}
5371
Tony Linthicum76329bf2011-12-12 21:14:55 +00005372// Hexagon tools start.
5373void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5374 ArgStringList &CmdArgs) const {
5375
5376}
5377void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5378 const InputInfo &Output,
5379 const InputInfoList &Inputs,
5380 const ArgList &Args,
5381 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005382 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005383
5384 const Driver &D = getToolChain().getDriver();
5385 ArgStringList CmdArgs;
5386
5387 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005388 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005389 CmdArgs.push_back(Args.MakeArgString(MarchString));
5390
5391 RenderExtraToolArgs(JA, CmdArgs);
5392
5393 if (Output.isFilename()) {
5394 CmdArgs.push_back("-o");
5395 CmdArgs.push_back(Output.getFilename());
5396 } else {
5397 assert(Output.isNothing() && "Unexpected output");
5398 CmdArgs.push_back("-fsyntax-only");
5399 }
5400
Matthew Curtise8f80a12012-12-06 17:49:03 +00005401 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5402 if (!SmallDataThreshold.empty())
5403 CmdArgs.push_back(
5404 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005405
Matthew Curtise5df3812012-12-07 17:23:04 +00005406 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5407 options::OPT_Xassembler);
5408
Tony Linthicum76329bf2011-12-12 21:14:55 +00005409 // Only pass -x if gcc will understand it; otherwise hope gcc
5410 // understands the suffix correctly. The main use case this would go
5411 // wrong in is for linker inputs if they happened to have an odd
5412 // suffix; really the only way to get this to happen is a command
5413 // like '-x foobar a.c' which will treat a.c like a linker input.
5414 //
5415 // FIXME: For the linker case specifically, can we safely convert
5416 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005417 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005418 // Don't try to pass LLVM or AST inputs to a generic gcc.
5419 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5420 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5421 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5422 << getToolChain().getTripleString();
5423 else if (II.getType() == types::TY_AST)
5424 D.Diag(clang::diag::err_drv_no_ast_support)
5425 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005426 else if (II.getType() == types::TY_ModuleFile)
5427 D.Diag(diag::err_drv_no_module_support)
5428 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005429
5430 if (II.isFilename())
5431 CmdArgs.push_back(II.getFilename());
5432 else
5433 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5434 II.getInputArg().render(Args, CmdArgs);
5435 }
5436
5437 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005438 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005440}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005441
Tony Linthicum76329bf2011-12-12 21:14:55 +00005442void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5443 ArgStringList &CmdArgs) const {
5444 // The types are (hopefully) good enough.
5445}
5446
5447void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5448 const InputInfo &Output,
5449 const InputInfoList &Inputs,
5450 const ArgList &Args,
5451 const char *LinkingOutput) const {
5452
Matthew Curtise689b052012-12-06 15:46:07 +00005453 const toolchains::Hexagon_TC& ToolChain =
5454 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5455 const Driver &D = ToolChain.getDriver();
5456
Tony Linthicum76329bf2011-12-12 21:14:55 +00005457 ArgStringList CmdArgs;
5458
Matthew Curtise689b052012-12-06 15:46:07 +00005459 //----------------------------------------------------------------------------
5460 //
5461 //----------------------------------------------------------------------------
5462 bool hasStaticArg = Args.hasArg(options::OPT_static);
5463 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005464 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005465 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5466 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5467 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5468 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005469
Matthew Curtise689b052012-12-06 15:46:07 +00005470 //----------------------------------------------------------------------------
5471 // Silence warnings for various options
5472 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005473
Matthew Curtise689b052012-12-06 15:46:07 +00005474 Args.ClaimAllArgs(options::OPT_g_Group);
5475 Args.ClaimAllArgs(options::OPT_emit_llvm);
5476 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5477 // handled somewhere else.
5478 Args.ClaimAllArgs(options::OPT_static_libgcc);
5479
5480 //----------------------------------------------------------------------------
5481 //
5482 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005483 for (const auto &Opt : ToolChain.ExtraOpts)
5484 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005485
Matthew Curtisf10a5952012-12-06 14:16:43 +00005486 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5487 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005488
Matthew Curtise689b052012-12-06 15:46:07 +00005489 if (buildingLib) {
5490 CmdArgs.push_back("-shared");
5491 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5492 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005493 }
5494
Matthew Curtise689b052012-12-06 15:46:07 +00005495 if (hasStaticArg)
5496 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005497
Matthew Curtise8f80a12012-12-06 17:49:03 +00005498 if (buildPIE && !buildingLib)
5499 CmdArgs.push_back("-pie");
5500
5501 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5502 if (!SmallDataThreshold.empty()) {
5503 CmdArgs.push_back(
5504 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5505 }
5506
Matthew Curtise689b052012-12-06 15:46:07 +00005507 //----------------------------------------------------------------------------
5508 //
5509 //----------------------------------------------------------------------------
5510 CmdArgs.push_back("-o");
5511 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005512
Matthew Curtise689b052012-12-06 15:46:07 +00005513 const std::string MarchSuffix = "/" + MarchString;
5514 const std::string G0Suffix = "/G0";
5515 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005516 const std::string RootDir =
5517 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005518 const std::string StartFilesDir = RootDir
5519 + "hexagon/lib"
5520 + (buildingLib
5521 ? MarchG0Suffix : MarchSuffix);
5522
5523 //----------------------------------------------------------------------------
5524 // moslib
5525 //----------------------------------------------------------------------------
5526 std::vector<std::string> oslibs;
5527 bool hasStandalone= false;
5528
5529 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5530 ie = Args.filtered_end(); it != ie; ++it) {
5531 (*it)->claim();
5532 oslibs.push_back((*it)->getValue());
5533 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005534 }
Matthew Curtise689b052012-12-06 15:46:07 +00005535 if (oslibs.empty()) {
5536 oslibs.push_back("standalone");
5537 hasStandalone = true;
5538 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005539
Matthew Curtise689b052012-12-06 15:46:07 +00005540 //----------------------------------------------------------------------------
5541 // Start Files
5542 //----------------------------------------------------------------------------
5543 if (incStdLib && incStartFiles) {
5544
5545 if (!buildingLib) {
5546 if (hasStandalone) {
5547 CmdArgs.push_back(
5548 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5549 }
5550 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5551 }
5552 std::string initObj = useShared ? "/initS.o" : "/init.o";
5553 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5554 }
5555
5556 //----------------------------------------------------------------------------
5557 // Library Search Paths
5558 //----------------------------------------------------------------------------
5559 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005560 for (const auto &LibPath : LibPaths)
5561 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005562
5563 //----------------------------------------------------------------------------
5564 //
5565 //----------------------------------------------------------------------------
5566 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5567 Args.AddAllArgs(CmdArgs, options::OPT_e);
5568 Args.AddAllArgs(CmdArgs, options::OPT_s);
5569 Args.AddAllArgs(CmdArgs, options::OPT_t);
5570 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5571
5572 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5573
5574 //----------------------------------------------------------------------------
5575 // Libraries
5576 //----------------------------------------------------------------------------
5577 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005578 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005579 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5580 CmdArgs.push_back("-lm");
5581 }
5582
5583 CmdArgs.push_back("--start-group");
5584
5585 if (!buildingLib) {
5586 for(std::vector<std::string>::iterator i = oslibs.begin(),
5587 e = oslibs.end(); i != e; ++i)
5588 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5589 CmdArgs.push_back("-lc");
5590 }
5591 CmdArgs.push_back("-lgcc");
5592
5593 CmdArgs.push_back("--end-group");
5594 }
5595
5596 //----------------------------------------------------------------------------
5597 // End files
5598 //----------------------------------------------------------------------------
5599 if (incStdLib && incStartFiles) {
5600 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5601 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5602 }
5603
5604 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005605 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5606 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005607}
5608// Hexagon tools end.
5609
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005610/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005611const char *arm::getARMCPUForMArch(const ArgList &Args,
5612 const llvm::Triple &Triple) {
5613 StringRef MArch;
5614 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5615 // Otherwise, if we have -march= choose the base CPU for that arch.
5616 MArch = A->getValue();
5617 } else {
5618 // Otherwise, use the Arch from the triple.
5619 MArch = Triple.getArchName();
5620 }
5621
5622 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005623 if (MArch == "native") {
5624 std::string CPU = llvm::sys::getHostCPUName();
5625 if (CPU != "generic") {
5626 // Translate the native cpu into the architecture. The switch below will
5627 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005628 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005629 }
5630 }
5631
John Brawna95c1a82015-05-08 12:52:18 +00005632 // We need to return an empty string here on invalid MArch values as the
5633 // various places that call this function can't cope with a null result.
5634 const char *result = Triple.getARMCPUForArch(MArch);
5635 if (result)
5636 return result;
5637 else
5638 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005639}
5640
5641/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005642StringRef arm::getARMTargetCPU(const ArgList &Args,
5643 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005644 // FIXME: Warn on inconsistent use of -mcpu and -march.
5645 // If we have -mcpu=, use that.
5646 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin4045f662015-05-08 15:44:36 +00005647 StringRef MCPU = A->getValue();
Bernard Ogden31561762013-12-12 13:27:11 +00005648 // Handle -mcpu=native.
5649 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005650 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005651 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005652 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005653 }
5654
5655 return getARMCPUForMArch(Args, Triple);
5656}
5657
5658/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5659/// CPU.
5660//
5661// FIXME: This is redundant with -mcpu, why does LLVM use this.
5662// FIXME: tblgen this, or kill it!
Renato Golin0600e1e2015-05-08 21:04:50 +00005663// FIXME: Use ARMTargetParser.
Bernard Ogden31561762013-12-12 13:27:11 +00005664const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5665 return llvm::StringSwitch<const char *>(CPU)
5666 .Case("strongarm", "v4")
5667 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5668 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5669 .Cases("arm920", "arm920t", "arm922t", "v4t")
5670 .Cases("arm940t", "ep9312","v4t")
5671 .Cases("arm10tdmi", "arm1020t", "v5")
5672 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5673 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5674 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005675 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5676 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5677 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005678 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005679 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005680 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005681 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005682 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5683 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005684 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005685 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005686 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005687 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005688 .Default("");
5689}
5690
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005691void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5692 if (Args.hasArg(options::OPT_r))
5693 return;
5694
5695 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5696 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5697 .Cases("v4", "v4t", "v5", "v5e", nullptr)
Renato Goline11531f2015-03-17 11:55:43 +00005698 .Cases("v6", "v6k", "v6t2", nullptr)
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005699 .Default("--be8");
5700
5701 if (LinkFlag)
5702 CmdArgs.push_back(LinkFlag);
5703}
5704
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005705mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5706 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5707 .Case("mips1", NanLegacy)
5708 .Case("mips2", NanLegacy)
5709 .Case("mips3", NanLegacy)
5710 .Case("mips4", NanLegacy)
5711 .Case("mips5", NanLegacy)
5712 .Case("mips32", NanLegacy)
5713 .Case("mips32r2", NanLegacy)
5714 .Case("mips32r3", NanLegacy | Nan2008)
5715 .Case("mips32r5", NanLegacy | Nan2008)
5716 .Case("mips32r6", Nan2008)
5717 .Case("mips64", NanLegacy)
5718 .Case("mips64r2", NanLegacy)
5719 .Case("mips64r3", NanLegacy | Nan2008)
5720 .Case("mips64r5", NanLegacy | Nan2008)
5721 .Case("mips64r6", Nan2008)
5722 .Default(NanLegacy);
5723}
5724
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005725bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5726 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5727 return A && (A->getValue() == StringRef(Value));
5728}
5729
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005730bool mips::isUCLibc(const ArgList &Args) {
5731 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005732 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005733}
5734
Daniel Sanders2bf13662014-07-10 14:40:57 +00005735bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005736 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5737 return llvm::StringSwitch<bool>(NaNArg->getValue())
5738 .Case("2008", true)
5739 .Case("legacy", false)
5740 .Default(false);
5741
5742 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005743 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5744 .Cases("mips32r6", "mips64r6", true)
5745 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005746
5747 return false;
5748}
5749
Daniel Sanders379d44b2014-07-16 11:52:23 +00005750bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5751 StringRef ABIName) {
5752 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005753 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005754 return false;
5755
5756 if (ABIName != "32")
5757 return false;
5758
5759 return llvm::StringSwitch<bool>(CPUName)
5760 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005761 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5762 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005763 .Default(false);
5764}
5765
Tim Northover157d9112014-01-16 08:48:16 +00005766llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005767 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5768 // archs which Darwin doesn't use.
5769
5770 // The matching this routine does is fairly pointless, since it is neither the
5771 // complete architecture list, nor a reasonable subset. The problem is that
5772 // historically the driver driver accepts this and also ties its -march=
5773 // handling to the architecture name, so we need to be careful before removing
5774 // support for it.
5775
5776 // This code must be kept in sync with Clang's Darwin specific argument
5777 // translation.
5778
5779 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5780 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5781 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5782 .Case("ppc64", llvm::Triple::ppc64)
5783 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5784 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5785 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005786 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005787 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005788 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005789 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005790 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005791 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005792 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005793 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005794 .Case("nvptx", llvm::Triple::nvptx)
5795 .Case("nvptx64", llvm::Triple::nvptx64)
5796 .Case("amdil", llvm::Triple::amdil)
5797 .Case("spir", llvm::Triple::spir)
5798 .Default(llvm::Triple::UnknownArch);
5799}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005800
Tim Northover157d9112014-01-16 08:48:16 +00005801void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5802 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5803 T.setArch(Arch);
5804
5805 if (Str == "x86_64h")
5806 T.setArchName(Str);
5807 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5808 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005809 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005810 }
5811}
5812
Bob Wilsondecc03e2012-11-23 06:14:39 +00005813const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005814 const InputInfo &Input) {
5815 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005816}
5817
Bob Wilsondecc03e2012-11-23 06:14:39 +00005818const char *Clang::getBaseInputStem(const ArgList &Args,
5819 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005820 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005821
Chris Lattner906bb902011-01-16 08:14:11 +00005822 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005823 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005824
5825 return Str;
5826}
5827
Bob Wilsondecc03e2012-11-23 06:14:39 +00005828const char *Clang::getDependencyFileName(const ArgList &Args,
5829 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005830 // FIXME: Think about this more.
5831 std::string Res;
5832
5833 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005834 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005835 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005836 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005837 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005838 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005839 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005840}
5841
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005842void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5843 const InputInfo &Output,
5844 const InputInfoList &Inputs,
5845 const ArgList &Args,
5846 const char *LinkingOutput) const {
5847 const ToolChain &ToolChain = getToolChain();
5848 const Driver &D = ToolChain.getDriver();
5849 ArgStringList CmdArgs;
5850
5851 // Silence warning for "clang -g foo.o -o foo"
5852 Args.ClaimAllArgs(options::OPT_g_Group);
5853 // and "clang -emit-llvm foo.o -o foo"
5854 Args.ClaimAllArgs(options::OPT_emit_llvm);
5855 // and for "clang -w foo.o -o foo". Other warning options are already
5856 // handled somewhere else.
5857 Args.ClaimAllArgs(options::OPT_w);
5858
5859 if (!D.SysRoot.empty())
5860 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5861
5862 // CloudABI only supports static linkage.
5863 CmdArgs.push_back("-Bstatic");
5864 CmdArgs.push_back("--eh-frame-hdr");
5865 CmdArgs.push_back("--gc-sections");
5866
5867 if (Output.isFilename()) {
5868 CmdArgs.push_back("-o");
5869 CmdArgs.push_back(Output.getFilename());
5870 } else {
5871 assert(Output.isNothing() && "Invalid output.");
5872 }
5873
5874 if (!Args.hasArg(options::OPT_nostdlib) &&
5875 !Args.hasArg(options::OPT_nostartfiles)) {
5876 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5877 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5878 }
5879
5880 Args.AddAllArgs(CmdArgs, options::OPT_L);
5881 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5882 for (const auto &Path : Paths)
5883 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5884 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5885 Args.AddAllArgs(CmdArgs, options::OPT_e);
5886 Args.AddAllArgs(CmdArgs, options::OPT_s);
5887 Args.AddAllArgs(CmdArgs, options::OPT_t);
5888 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5889 Args.AddAllArgs(CmdArgs, options::OPT_r);
5890
5891 if (D.IsUsingLTO(ToolChain, Args))
5892 AddGoldPlugin(ToolChain, Args, CmdArgs);
5893
5894 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5895
5896 if (!Args.hasArg(options::OPT_nostdlib) &&
5897 !Args.hasArg(options::OPT_nodefaultlibs)) {
5898 if (D.CCCIsCXX())
5899 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5900 CmdArgs.push_back("-lc");
5901 CmdArgs.push_back("-lcompiler_rt");
5902 }
5903
5904 if (!Args.hasArg(options::OPT_nostdlib) &&
5905 !Args.hasArg(options::OPT_nostartfiles))
5906 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5907
5908 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5909 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5910}
5911
Daniel Dunbarbe220842009-03-20 16:06:39 +00005912void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005913 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005914 const InputInfoList &Inputs,
5915 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005916 const char *LinkingOutput) const {
5917 ArgStringList CmdArgs;
5918
5919 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5920 const InputInfo &Input = Inputs[0];
5921
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005922 // Determine the original source input.
5923 const Action *SourceAction = &JA;
5924 while (SourceAction->getKind() != Action::InputClass) {
5925 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5926 SourceAction = SourceAction->getInputs()[0];
5927 }
5928
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005929 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005930 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005931 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5932 // FIXME: at run-time detect assembler capabilities or rely on version
5933 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005934 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005935 const llvm::Triple &T(getToolChain().getTriple());
5936 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005937 CmdArgs.push_back("-Q");
5938 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005939
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005940 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005941 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005942 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005943 if (Args.hasArg(options::OPT_gstabs))
5944 CmdArgs.push_back("--gstabs");
5945 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005946 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005947 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005948
Daniel Dunbarbe220842009-03-20 16:06:39 +00005949 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005950 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005951
Daniel Dunbar6d484762010-07-22 01:47:22 +00005952 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005953 if (getToolChain().getArch() == llvm::Triple::x86 ||
5954 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005955 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5956 CmdArgs.push_back("-force_cpusubtype_ALL");
5957
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005958 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005959 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005960 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005961 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005962 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005963 CmdArgs.push_back("-static");
5964
Daniel Dunbarbe220842009-03-20 16:06:39 +00005965 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5966 options::OPT_Xassembler);
5967
5968 assert(Output.isFilename() && "Unexpected lipo output.");
5969 CmdArgs.push_back("-o");
5970 CmdArgs.push_back(Output.getFilename());
5971
Daniel Dunbarb440f562010-08-02 02:38:21 +00005972 assert(Input.isFilename() && "Invalid input.");
5973 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005974
5975 // asm_final spec is empty.
5976
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005977 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005978 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005979 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005980}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005981
Tim Northover157d9112014-01-16 08:48:16 +00005982void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005983
Tim Northover157d9112014-01-16 08:48:16 +00005984void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5985 ArgStringList &CmdArgs) const {
5986 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005987
Daniel Dunbarc1964212009-03-26 16:23:12 +00005988 // Derived from darwin_arch spec.
5989 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005990 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005991
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005992 // FIXME: Is this needed anymore?
5993 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005994 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005995}
5996
Bill Wendling3b2000f2012-10-02 18:02:50 +00005997bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5998 // We only need to generate a temp path for LTO if we aren't compiling object
5999 // files. When compiling source files, we run 'dsymutil' after linking. We
6000 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006001 for (const auto &Input : Inputs)
6002 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006003 return true;
6004
6005 return false;
6006}
6007
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006008void darwin::Link::AddLinkArgs(Compilation &C,
6009 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006010 ArgStringList &CmdArgs,
6011 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006012 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006013 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006014
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006015 unsigned Version[3] = { 0, 0, 0 };
6016 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6017 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006018 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006019 Version[1], Version[2], HadExtra) ||
6020 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006021 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006022 << A->getAsString(Args);
6023 }
6024
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006025 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006026 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006027 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6028 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006029
Bob Wilson3d27dad2013-08-02 22:25:34 +00006030 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6031 CmdArgs.push_back("-export_dynamic");
6032
Bob Wilsonb111ec92015-03-02 19:01:14 +00006033 // If we are using App Extension restrictions, pass a flag to the linker
6034 // telling it that the compiled code has been audited.
6035 if (Args.hasFlag(options::OPT_fapplication_extension,
6036 options::OPT_fno_application_extension, false))
6037 CmdArgs.push_back("-application_extension");
6038
Bill Wendling313b6bf2012-11-16 23:03:00 +00006039 // If we are using LTO, then automatically create a temporary file path for
6040 // the linker to use, so that it's lifetime will extend past a possible
6041 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006042 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6043 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006044 const char *TmpPath = C.getArgs().MakeArgString(
6045 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6046 C.addTempFile(TmpPath);
6047 CmdArgs.push_back("-object_path_lto");
6048 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006049 }
6050
Daniel Dunbarc1964212009-03-26 16:23:12 +00006051 // Derived from the "link" spec.
6052 Args.AddAllArgs(CmdArgs, options::OPT_static);
6053 if (!Args.hasArg(options::OPT_static))
6054 CmdArgs.push_back("-dynamic");
6055 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6056 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6057 // here. How do we wish to handle such things?
6058 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006059
Daniel Dunbarc1964212009-03-26 16:23:12 +00006060 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006061 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006062 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006063 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006064
6065 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6066 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6067 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6068
6069 Arg *A;
6070 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6071 (A = Args.getLastArg(options::OPT_current__version)) ||
6072 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006073 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006074 << A->getAsString(Args) << "-dynamiclib";
6075
6076 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6077 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6078 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6079 } else {
6080 CmdArgs.push_back("-dylib");
6081
6082 Arg *A;
6083 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6084 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6085 (A = Args.getLastArg(options::OPT_client__name)) ||
6086 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6087 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6088 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006089 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006090 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006091
Daniel Dunbarc1964212009-03-26 16:23:12 +00006092 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6093 "-dylib_compatibility_version");
6094 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6095 "-dylib_current_version");
6096
Tim Northover157d9112014-01-16 08:48:16 +00006097 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006098
6099 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6100 "-dylib_install_name");
6101 }
6102
6103 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6104 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6105 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006106 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006107 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006108 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6109 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6110 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6111 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6112 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6113 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006114 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006115 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6116 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6117 Args.AddAllArgs(CmdArgs, options::OPT_init);
6118
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006119 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006120 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006121
Daniel Dunbarc1964212009-03-26 16:23:12 +00006122 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6123 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6124 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6125 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6126 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006127
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006128 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6129 options::OPT_fno_pie,
6130 options::OPT_fno_PIE)) {
6131 if (A->getOption().matches(options::OPT_fpie) ||
6132 A->getOption().matches(options::OPT_fPIE))
6133 CmdArgs.push_back("-pie");
6134 else
6135 CmdArgs.push_back("-no_pie");
6136 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006137
6138 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6139 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6140 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6141 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6142 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6143 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6144 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6145 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6146 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6147 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6148 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6149 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6150 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6151 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6152 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6153 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006154
Daniel Dunbar84384642011-05-02 21:03:47 +00006155 // Give --sysroot= preference, over the Apple specific behavior to also use
6156 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006157 StringRef sysroot = C.getSysRoot();
6158 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006159 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006160 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006161 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6162 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006163 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006164 }
6165
Daniel Dunbarc1964212009-03-26 16:23:12 +00006166 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6167 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6168 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6169 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6170 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006171 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006172 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6173 Args.AddAllArgs(CmdArgs, options::OPT_y);
6174 Args.AddLastArg(CmdArgs, options::OPT_w);
6175 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6176 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6177 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6178 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6179 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6180 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6181 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6182 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6183 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6184 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6185 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6186 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6187}
6188
Alexey Bataev186b28a2014-03-06 05:43:53 +00006189enum LibOpenMP {
6190 LibUnknown,
6191 LibGOMP,
6192 LibIOMP5
6193};
6194
Daniel Dunbarc1964212009-03-26 16:23:12 +00006195void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006196 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006197 const InputInfoList &Inputs,
6198 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006199 const char *LinkingOutput) const {
6200 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006201
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006202 // If the number of arguments surpasses the system limits, we will encode the
6203 // input files in a separate file, shortening the command line. To this end,
6204 // build a list of input file names that can be passed via a file with the
6205 // -filelist linker option.
6206 llvm::opt::ArgStringList InputFileList;
6207
Daniel Dunbarc1964212009-03-26 16:23:12 +00006208 // The logic here is derived from gcc's behavior; most of which
6209 // comes from specs (starting with link_command). Consult gcc for
6210 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006211 ArgStringList CmdArgs;
6212
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006213 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6214 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6215 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006216 for (const auto &Arg : Args)
6217 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006218 const char *Exec =
6219 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6220 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006221 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006222 return;
6223 }
6224
Daniel Dunbarc1964212009-03-26 16:23:12 +00006225 // I'm not sure why this particular decomposition exists in gcc, but
6226 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006227 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006228
Daniel Dunbarc1964212009-03-26 16:23:12 +00006229 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6230 Args.AddAllArgs(CmdArgs, options::OPT_s);
6231 Args.AddAllArgs(CmdArgs, options::OPT_t);
6232 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6233 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006234 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006235 Args.AddAllArgs(CmdArgs, options::OPT_r);
6236
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006237 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6238 // members of static archive libraries which implement Objective-C classes or
6239 // categories.
6240 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6241 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006242
Daniel Dunbarc1964212009-03-26 16:23:12 +00006243 CmdArgs.push_back("-o");
6244 CmdArgs.push_back(Output.getFilename());
6245
Chad Rosier06fd3c62012-05-16 23:45:12 +00006246 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006247 !Args.hasArg(options::OPT_nostartfiles))
6248 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006249
6250 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006251
Alexey Bataev186b28a2014-03-06 05:43:53 +00006252 LibOpenMP UsedOpenMPLib = LibUnknown;
6253 if (Args.hasArg(options::OPT_fopenmp)) {
6254 UsedOpenMPLib = LibGOMP;
6255 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
6256 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
6257 .Case("libgomp", LibGOMP)
6258 .Case("libiomp5", LibIOMP5)
6259 .Default(LibUnknown);
6260 if (UsedOpenMPLib == LibUnknown)
6261 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6262 << A->getOption().getName() << A->getValue();
6263 }
6264 switch (UsedOpenMPLib) {
6265 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00006266 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00006267 break;
6268 case LibIOMP5:
6269 CmdArgs.push_back("-liomp5");
6270 break;
6271 case LibUnknown:
6272 break;
6273 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006274
Douglas Gregor9295df02012-05-15 21:00:27 +00006275 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006276 // Build the input file for -filelist (list of linker input files) in case we
6277 // need it later
6278 for (const auto &II : Inputs) {
6279 if (!II.isFilename()) {
6280 // This is a linker input argument.
6281 // We cannot mix input arguments and file names in a -filelist input, thus
6282 // we prematurely stop our list (remaining files shall be passed as
6283 // arguments).
6284 if (InputFileList.size() > 0)
6285 break;
6286
6287 continue;
6288 }
6289
6290 InputFileList.push_back(II.getFilename());
6291 }
6292
Bob Wilson16d93952012-05-15 18:57:39 +00006293 if (isObjCRuntimeLinked(Args) &&
6294 !Args.hasArg(options::OPT_nostdlib) &&
6295 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006296 // We use arclite library for both ARC and subscripting support.
6297 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6298
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006299 CmdArgs.push_back("-framework");
6300 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006301 // Link libobj.
6302 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006303 }
John McCall31168b02011-06-15 23:02:42 +00006304
Daniel Dunbarc1964212009-03-26 16:23:12 +00006305 if (LinkingOutput) {
6306 CmdArgs.push_back("-arch_multiple");
6307 CmdArgs.push_back("-final_output");
6308 CmdArgs.push_back(LinkingOutput);
6309 }
6310
Daniel Dunbarc1964212009-03-26 16:23:12 +00006311 if (Args.hasArg(options::OPT_fnested_functions))
6312 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006313
Daniel Dunbarc1964212009-03-26 16:23:12 +00006314 if (!Args.hasArg(options::OPT_nostdlib) &&
6315 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006316 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006317 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006318
Daniel Dunbarc1964212009-03-26 16:23:12 +00006319 // link_ssp spec is empty.
6320
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006321 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006322 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006323 }
6324
Chad Rosier06fd3c62012-05-16 23:45:12 +00006325 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006326 !Args.hasArg(options::OPT_nostartfiles)) {
6327 // endfile_spec is empty.
6328 }
6329
6330 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6331 Args.AddAllArgs(CmdArgs, options::OPT_F);
6332
Steven Wu3ffb61b2015-02-06 18:08:29 +00006333 // -iframework should be forwarded as -F.
6334 for (auto it = Args.filtered_begin(options::OPT_iframework),
6335 ie = Args.filtered_end(); it != ie; ++it)
6336 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6337 (*it)->getValue()));
6338
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006339 if (!Args.hasArg(options::OPT_nostdlib) &&
6340 !Args.hasArg(options::OPT_nodefaultlibs)) {
6341 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6342 if (A->getValue() == StringRef("Accelerate")) {
6343 CmdArgs.push_back("-framework");
6344 CmdArgs.push_back("Accelerate");
6345 }
6346 }
6347 }
6348
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006349 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006350 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006351 std::unique_ptr<Command> Cmd =
6352 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6353 Cmd->setInputFileList(std::move(InputFileList));
6354 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006355}
6356
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006357void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006358 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006359 const InputInfoList &Inputs,
6360 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006361 const char *LinkingOutput) const {
6362 ArgStringList CmdArgs;
6363
6364 CmdArgs.push_back("-create");
6365 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006366
6367 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006368 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006369
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006370 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006371 assert(II.isFilename() && "Unexpected lipo input.");
6372 CmdArgs.push_back(II.getFilename());
6373 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006374
6375 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006376 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006377}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006378
Daniel Dunbar88299622010-06-04 18:28:36 +00006379void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006380 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006381 const InputInfoList &Inputs,
6382 const ArgList &Args,
6383 const char *LinkingOutput) const {
6384 ArgStringList CmdArgs;
6385
Daniel Dunbareb86b042011-05-09 17:23:16 +00006386 CmdArgs.push_back("-o");
6387 CmdArgs.push_back(Output.getFilename());
6388
Daniel Dunbar88299622010-06-04 18:28:36 +00006389 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6390 const InputInfo &Input = Inputs[0];
6391 assert(Input.isFilename() && "Unexpected dsymutil input.");
6392 CmdArgs.push_back(Input.getFilename());
6393
Daniel Dunbar88299622010-06-04 18:28:36 +00006394 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006395 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006396 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006397}
6398
Eric Christopher551ef452011-08-23 17:56:55 +00006399void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006400 const InputInfo &Output,
6401 const InputInfoList &Inputs,
6402 const ArgList &Args,
6403 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006404 ArgStringList CmdArgs;
6405 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006406 CmdArgs.push_back("--debug-info");
6407 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006408 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006409
6410 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6411 const InputInfo &Input = Inputs[0];
6412 assert(Input.isFilename() && "Unexpected verify input");
6413
6414 // Grabbing the output of the earlier dsymutil run.
6415 CmdArgs.push_back(Input.getFilename());
6416
6417 const char *Exec =
6418 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006419 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006420}
6421
David Chisnallf571cde2012-02-15 13:39:01 +00006422void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6423 const InputInfo &Output,
6424 const InputInfoList &Inputs,
6425 const ArgList &Args,
6426 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006427 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006428 ArgStringList CmdArgs;
6429
6430 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6431 options::OPT_Xassembler);
6432
6433 CmdArgs.push_back("-o");
6434 CmdArgs.push_back(Output.getFilename());
6435
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006436 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006437 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006438
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006439 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006440 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006441}
6442
David Chisnallf571cde2012-02-15 13:39:01 +00006443void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6444 const InputInfo &Output,
6445 const InputInfoList &Inputs,
6446 const ArgList &Args,
6447 const char *LinkingOutput) const {
6448 // FIXME: Find a real GCC, don't hard-code versions here
6449 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6450 const llvm::Triple &T = getToolChain().getTriple();
6451 std::string LibPath = "/usr/lib/";
6452 llvm::Triple::ArchType Arch = T.getArch();
6453 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006454 case llvm::Triple::x86:
6455 GCCLibPath +=
6456 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6457 break;
6458 case llvm::Triple::x86_64:
6459 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6460 GCCLibPath += "/4.5.2/amd64/";
6461 LibPath += "amd64/";
6462 break;
6463 default:
6464 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006465 }
6466
6467 ArgStringList CmdArgs;
6468
David Chisnall272a0712012-02-29 15:06:12 +00006469 // Demangle C++ names in errors
6470 CmdArgs.push_back("-C");
6471
David Chisnallf571cde2012-02-15 13:39:01 +00006472 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6473 (!Args.hasArg(options::OPT_shared))) {
6474 CmdArgs.push_back("-e");
6475 CmdArgs.push_back("_start");
6476 }
6477
6478 if (Args.hasArg(options::OPT_static)) {
6479 CmdArgs.push_back("-Bstatic");
6480 CmdArgs.push_back("-dn");
6481 } else {
6482 CmdArgs.push_back("-Bdynamic");
6483 if (Args.hasArg(options::OPT_shared)) {
6484 CmdArgs.push_back("-shared");
6485 } else {
6486 CmdArgs.push_back("--dynamic-linker");
6487 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6488 }
6489 }
6490
6491 if (Output.isFilename()) {
6492 CmdArgs.push_back("-o");
6493 CmdArgs.push_back(Output.getFilename());
6494 } else {
6495 assert(Output.isNothing() && "Invalid output.");
6496 }
6497
6498 if (!Args.hasArg(options::OPT_nostdlib) &&
6499 !Args.hasArg(options::OPT_nostartfiles)) {
6500 if (!Args.hasArg(options::OPT_shared)) {
6501 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6502 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006503 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006504 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6505 } else {
6506 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006507 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6508 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006509 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006510 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006511 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006512 }
6513
6514 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6515
6516 Args.AddAllArgs(CmdArgs, options::OPT_L);
6517 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6518 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006519 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006520
6521 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6522
6523 if (!Args.hasArg(options::OPT_nostdlib) &&
6524 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006525 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006526 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006527 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006528 if (!Args.hasArg(options::OPT_shared)) {
6529 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006530 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006531 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006532 }
David Chisnallf571cde2012-02-15 13:39:01 +00006533 }
6534
6535 if (!Args.hasArg(options::OPT_nostdlib) &&
6536 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006537 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006538 }
David Chisnall96de9932012-02-16 16:00:47 +00006539 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006540
Alexey Samsonov7811d192014-02-20 13:57:37 +00006541 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006542
6543 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006544 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006545 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006546}
6547
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006548void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006549 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006550 const InputInfoList &Inputs,
6551 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006552 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006553 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006554 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006555 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006556
Rafael Espindolacc126272014-02-28 01:55:21 +00006557 switch (getToolChain().getArch()) {
6558 case llvm::Triple::x86:
6559 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6560 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006561 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006562 break;
6563
6564 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006565 CmdArgs.push_back("-mppc");
6566 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006567 break;
6568
6569 case llvm::Triple::sparc:
6570 CmdArgs.push_back("-32");
6571 NeedsKPIC = true;
6572 break;
6573
6574 case llvm::Triple::sparcv9:
6575 CmdArgs.push_back("-64");
6576 CmdArgs.push_back("-Av9a");
6577 NeedsKPIC = true;
6578 break;
6579
6580 case llvm::Triple::mips64:
6581 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006582 StringRef CPUName;
6583 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006584 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006585
6586 CmdArgs.push_back("-mabi");
6587 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6588
6589 if (getToolChain().getArch() == llvm::Triple::mips64)
6590 CmdArgs.push_back("-EB");
6591 else
6592 CmdArgs.push_back("-EL");
6593
Rafael Espindolacc126272014-02-28 01:55:21 +00006594 NeedsKPIC = true;
6595 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006596 }
6597
Rafael Espindolacc126272014-02-28 01:55:21 +00006598 default:
6599 break;
6600 }
6601
6602 if (NeedsKPIC)
6603 addAssemblerKPIC(Args, CmdArgs);
6604
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006605 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6606 options::OPT_Xassembler);
6607
6608 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006609 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006610
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006611 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006612 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006613
6614 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006615 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006617}
6618
6619void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006620 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006621 const InputInfoList &Inputs,
6622 const ArgList &Args,
6623 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006624 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006625 ArgStringList CmdArgs;
6626
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006627 // Silence warning for "clang -g foo.o -o foo"
6628 Args.ClaimAllArgs(options::OPT_g_Group);
6629 // and "clang -emit-llvm foo.o -o foo"
6630 Args.ClaimAllArgs(options::OPT_emit_llvm);
6631 // and for "clang -w foo.o -o foo". Other warning options are already
6632 // handled somewhere else.
6633 Args.ClaimAllArgs(options::OPT_w);
6634
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006635 if (getToolChain().getArch() == llvm::Triple::mips64)
6636 CmdArgs.push_back("-EB");
6637 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6638 CmdArgs.push_back("-EL");
6639
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006640 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006641 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006642 CmdArgs.push_back("-e");
6643 CmdArgs.push_back("__start");
6644 }
6645
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006646 if (Args.hasArg(options::OPT_static)) {
6647 CmdArgs.push_back("-Bstatic");
6648 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006649 if (Args.hasArg(options::OPT_rdynamic))
6650 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006651 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006652 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006653 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006654 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006655 } else {
6656 CmdArgs.push_back("-dynamic-linker");
6657 CmdArgs.push_back("/usr/libexec/ld.so");
6658 }
6659 }
6660
Rafael Espindola044f7832013-06-05 04:28:55 +00006661 if (Args.hasArg(options::OPT_nopie))
6662 CmdArgs.push_back("-nopie");
6663
Daniel Dunbarb440f562010-08-02 02:38:21 +00006664 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006665 CmdArgs.push_back("-o");
6666 CmdArgs.push_back(Output.getFilename());
6667 } else {
6668 assert(Output.isNothing() && "Invalid output.");
6669 }
6670
6671 if (!Args.hasArg(options::OPT_nostdlib) &&
6672 !Args.hasArg(options::OPT_nostartfiles)) {
6673 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006674 if (Args.hasArg(options::OPT_pg))
6675 CmdArgs.push_back(Args.MakeArgString(
6676 getToolChain().GetFilePath("gcrt0.o")));
6677 else
6678 CmdArgs.push_back(Args.MakeArgString(
6679 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006680 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006681 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006682 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006683 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006684 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006685 }
6686 }
6687
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006688 std::string Triple = getToolChain().getTripleString();
6689 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006690 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006691 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006692 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006693
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006694 Args.AddAllArgs(CmdArgs, options::OPT_L);
6695 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6696 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006697 Args.AddAllArgs(CmdArgs, options::OPT_s);
6698 Args.AddAllArgs(CmdArgs, options::OPT_t);
6699 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6700 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006701
Daniel Dunbar54423b22010-09-17 00:24:54 +00006702 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006703
6704 if (!Args.hasArg(options::OPT_nostdlib) &&
6705 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006706 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006707 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006708 if (Args.hasArg(options::OPT_pg))
6709 CmdArgs.push_back("-lm_p");
6710 else
6711 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006712 }
6713
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006714 // FIXME: For some reason GCC passes -lgcc before adding
6715 // the default system libraries. Just mimic this for now.
6716 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006717
Eric Christopher17674ec2012-09-13 06:32:34 +00006718 if (Args.hasArg(options::OPT_pthread)) {
6719 if (!Args.hasArg(options::OPT_shared) &&
6720 Args.hasArg(options::OPT_pg))
6721 CmdArgs.push_back("-lpthread_p");
6722 else
6723 CmdArgs.push_back("-lpthread");
6724 }
6725
Chandler Carruth45661652011-12-17 22:32:42 +00006726 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006727 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006728 CmdArgs.push_back("-lc_p");
6729 else
6730 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006731 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006732
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006733 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006734 }
6735
6736 if (!Args.hasArg(options::OPT_nostdlib) &&
6737 !Args.hasArg(options::OPT_nostartfiles)) {
6738 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006739 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006740 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006741 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006742 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006743 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006744 }
6745
6746 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006747 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006748 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006749}
Ed Schoutene33194b2009-04-02 19:13:12 +00006750
Eli Friedman9fa28852012-08-08 23:57:20 +00006751void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6752 const InputInfo &Output,
6753 const InputInfoList &Inputs,
6754 const ArgList &Args,
6755 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006756 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006757 ArgStringList CmdArgs;
6758
6759 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6760 options::OPT_Xassembler);
6761
6762 CmdArgs.push_back("-o");
6763 CmdArgs.push_back(Output.getFilename());
6764
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006765 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006766 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006767
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006768 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006769 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006770}
6771
6772void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6773 const InputInfo &Output,
6774 const InputInfoList &Inputs,
6775 const ArgList &Args,
6776 const char *LinkingOutput) const {
6777 const Driver &D = getToolChain().getDriver();
6778 ArgStringList CmdArgs;
6779
6780 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6781 (!Args.hasArg(options::OPT_shared))) {
6782 CmdArgs.push_back("-e");
6783 CmdArgs.push_back("__start");
6784 }
6785
6786 if (Args.hasArg(options::OPT_static)) {
6787 CmdArgs.push_back("-Bstatic");
6788 } else {
6789 if (Args.hasArg(options::OPT_rdynamic))
6790 CmdArgs.push_back("-export-dynamic");
6791 CmdArgs.push_back("--eh-frame-hdr");
6792 CmdArgs.push_back("-Bdynamic");
6793 if (Args.hasArg(options::OPT_shared)) {
6794 CmdArgs.push_back("-shared");
6795 } else {
6796 CmdArgs.push_back("-dynamic-linker");
6797 CmdArgs.push_back("/usr/libexec/ld.so");
6798 }
6799 }
6800
6801 if (Output.isFilename()) {
6802 CmdArgs.push_back("-o");
6803 CmdArgs.push_back(Output.getFilename());
6804 } else {
6805 assert(Output.isNothing() && "Invalid output.");
6806 }
6807
6808 if (!Args.hasArg(options::OPT_nostdlib) &&
6809 !Args.hasArg(options::OPT_nostartfiles)) {
6810 if (!Args.hasArg(options::OPT_shared)) {
6811 if (Args.hasArg(options::OPT_pg))
6812 CmdArgs.push_back(Args.MakeArgString(
6813 getToolChain().GetFilePath("gcrt0.o")));
6814 else
6815 CmdArgs.push_back(Args.MakeArgString(
6816 getToolChain().GetFilePath("crt0.o")));
6817 CmdArgs.push_back(Args.MakeArgString(
6818 getToolChain().GetFilePath("crtbegin.o")));
6819 } else {
6820 CmdArgs.push_back(Args.MakeArgString(
6821 getToolChain().GetFilePath("crtbeginS.o")));
6822 }
6823 }
6824
6825 Args.AddAllArgs(CmdArgs, options::OPT_L);
6826 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6827 Args.AddAllArgs(CmdArgs, options::OPT_e);
6828
6829 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6830
6831 if (!Args.hasArg(options::OPT_nostdlib) &&
6832 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006833 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006834 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6835 if (Args.hasArg(options::OPT_pg))
6836 CmdArgs.push_back("-lm_p");
6837 else
6838 CmdArgs.push_back("-lm");
6839 }
6840
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006841 if (Args.hasArg(options::OPT_pthread)) {
6842 if (!Args.hasArg(options::OPT_shared) &&
6843 Args.hasArg(options::OPT_pg))
6844 CmdArgs.push_back("-lpthread_p");
6845 else
6846 CmdArgs.push_back("-lpthread");
6847 }
6848
Eli Friedman9fa28852012-08-08 23:57:20 +00006849 if (!Args.hasArg(options::OPT_shared)) {
6850 if (Args.hasArg(options::OPT_pg))
6851 CmdArgs.push_back("-lc_p");
6852 else
6853 CmdArgs.push_back("-lc");
6854 }
6855
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006856 StringRef MyArch;
6857 switch (getToolChain().getTriple().getArch()) {
6858 case llvm::Triple::arm:
6859 MyArch = "arm";
6860 break;
6861 case llvm::Triple::x86:
6862 MyArch = "i386";
6863 break;
6864 case llvm::Triple::x86_64:
6865 MyArch = "amd64";
6866 break;
6867 default:
6868 llvm_unreachable("Unsupported architecture");
6869 }
6870 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006871 }
6872
6873 if (!Args.hasArg(options::OPT_nostdlib) &&
6874 !Args.hasArg(options::OPT_nostartfiles)) {
6875 if (!Args.hasArg(options::OPT_shared))
6876 CmdArgs.push_back(Args.MakeArgString(
6877 getToolChain().GetFilePath("crtend.o")));
6878 else
6879 CmdArgs.push_back(Args.MakeArgString(
6880 getToolChain().GetFilePath("crtendS.o")));
6881 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006882
6883 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006884 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006885 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006886}
6887
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006888void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006889 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006890 const InputInfoList &Inputs,
6891 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006892 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006893 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006894 ArgStringList CmdArgs;
6895
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006896 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6897 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006898 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006899 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006900 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006901 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006902 else if (getToolChain().getArch() == llvm::Triple::mips ||
6903 getToolChain().getArch() == llvm::Triple::mipsel ||
6904 getToolChain().getArch() == llvm::Triple::mips64 ||
6905 getToolChain().getArch() == llvm::Triple::mips64el) {
6906 StringRef CPUName;
6907 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006908 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006909
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006910 CmdArgs.push_back("-march");
6911 CmdArgs.push_back(CPUName.data());
6912
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006913 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006914 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006915
6916 if (getToolChain().getArch() == llvm::Triple::mips ||
6917 getToolChain().getArch() == llvm::Triple::mips64)
6918 CmdArgs.push_back("-EB");
6919 else
6920 CmdArgs.push_back("-EL");
6921
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006922 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006923 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006924 getToolChain().getArch() == llvm::Triple::armeb ||
6925 getToolChain().getArch() == llvm::Triple::thumb ||
6926 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006927 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006928 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006929 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6930
6931 if (FloatABI == "hard") {
6932 CmdArgs.push_back("-mfpu=vfp");
6933 } else {
6934 CmdArgs.push_back("-mfpu=softvfp");
6935 }
6936
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006937 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006938 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006939 case llvm::Triple::GNUEABI:
6940 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006941 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006942 break;
6943
6944 default:
6945 CmdArgs.push_back("-matpcs");
6946 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006947 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006948 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006949 if (getToolChain().getArch() == llvm::Triple::sparc)
6950 CmdArgs.push_back("-Av8plusa");
6951 else
6952 CmdArgs.push_back("-Av9a");
6953
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006954 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006955 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006956
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006957 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6958 options::OPT_Xassembler);
6959
6960 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006961 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006962
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006963 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006964 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006965
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006966 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006967 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006968}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006969
6970void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006971 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006972 const InputInfoList &Inputs,
6973 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006974 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006975 const toolchains::FreeBSD& ToolChain =
6976 static_cast<const toolchains::FreeBSD&>(getToolChain());
6977 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006978 const bool IsPIE =
6979 !Args.hasArg(options::OPT_shared) &&
6980 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006981 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006982
6983 // Silence warning for "clang -g foo.o -o foo"
6984 Args.ClaimAllArgs(options::OPT_g_Group);
6985 // and "clang -emit-llvm foo.o -o foo"
6986 Args.ClaimAllArgs(options::OPT_emit_llvm);
6987 // and for "clang -w foo.o -o foo". Other warning options are already
6988 // handled somewhere else.
6989 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006990
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006991 if (!D.SysRoot.empty())
6992 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6993
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006994 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006995 CmdArgs.push_back("-pie");
6996
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006997 if (Args.hasArg(options::OPT_static)) {
6998 CmdArgs.push_back("-Bstatic");
6999 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007000 if (Args.hasArg(options::OPT_rdynamic))
7001 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007002 CmdArgs.push_back("--eh-frame-hdr");
7003 if (Args.hasArg(options::OPT_shared)) {
7004 CmdArgs.push_back("-Bshareable");
7005 } else {
7006 CmdArgs.push_back("-dynamic-linker");
7007 CmdArgs.push_back("/libexec/ld-elf.so.1");
7008 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007009 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
7010 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00007011 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7012 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7013 CmdArgs.push_back("--hash-style=both");
7014 }
7015 }
7016 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007017 }
7018
7019 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7020 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007021 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007022 CmdArgs.push_back("-m");
7023 CmdArgs.push_back("elf_i386_fbsd");
7024 }
7025
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007026 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007027 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007028 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007029 }
7030
Daniel Dunbarb440f562010-08-02 02:38:21 +00007031 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007032 CmdArgs.push_back("-o");
7033 CmdArgs.push_back(Output.getFilename());
7034 } else {
7035 assert(Output.isNothing() && "Invalid output.");
7036 }
7037
7038 if (!Args.hasArg(options::OPT_nostdlib) &&
7039 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007040 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007041 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007042 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007043 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007044 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007045 crt1 = "Scrt1.o";
7046 else
7047 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007048 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007049 if (crt1)
7050 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7051
7052 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7053
Craig Topper92fc2df2014-05-17 16:56:41 +00007054 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007055 if (Args.hasArg(options::OPT_static))
7056 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007057 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007058 crtbegin = "crtbeginS.o";
7059 else
7060 crtbegin = "crtbegin.o";
7061
7062 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007063 }
7064
7065 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007066 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007067 for (const auto &Path : Paths)
7068 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007069 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7070 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007071 Args.AddAllArgs(CmdArgs, options::OPT_s);
7072 Args.AddAllArgs(CmdArgs, options::OPT_t);
7073 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7074 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007075
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007076 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007077 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007078
Alexey Samsonov52550342014-09-15 19:58:40 +00007079 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007080 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007081
7082 if (!Args.hasArg(options::OPT_nostdlib) &&
7083 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007084 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007085 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007086 if (Args.hasArg(options::OPT_pg))
7087 CmdArgs.push_back("-lm_p");
7088 else
7089 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007090 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007091 if (NeedsSanitizerDeps)
7092 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007093 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7094 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007095 if (Args.hasArg(options::OPT_pg))
7096 CmdArgs.push_back("-lgcc_p");
7097 else
7098 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007099 if (Args.hasArg(options::OPT_static)) {
7100 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007101 } else if (Args.hasArg(options::OPT_pg)) {
7102 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007103 } else {
7104 CmdArgs.push_back("--as-needed");
7105 CmdArgs.push_back("-lgcc_s");
7106 CmdArgs.push_back("--no-as-needed");
7107 }
7108
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007109 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007110 if (Args.hasArg(options::OPT_pg))
7111 CmdArgs.push_back("-lpthread_p");
7112 else
7113 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007114 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007115
Roman Divacky66f22762011-02-10 16:59:40 +00007116 if (Args.hasArg(options::OPT_pg)) {
7117 if (Args.hasArg(options::OPT_shared))
7118 CmdArgs.push_back("-lc");
7119 else
7120 CmdArgs.push_back("-lc_p");
7121 CmdArgs.push_back("-lgcc_p");
7122 } else {
7123 CmdArgs.push_back("-lc");
7124 CmdArgs.push_back("-lgcc");
7125 }
7126
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007127 if (Args.hasArg(options::OPT_static)) {
7128 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007129 } else if (Args.hasArg(options::OPT_pg)) {
7130 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007131 } else {
7132 CmdArgs.push_back("--as-needed");
7133 CmdArgs.push_back("-lgcc_s");
7134 CmdArgs.push_back("--no-as-needed");
7135 }
7136 }
7137
7138 if (!Args.hasArg(options::OPT_nostdlib) &&
7139 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007140 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007141 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007142 else
7143 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007144 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007145 }
7146
Alexey Samsonov7811d192014-02-20 13:57:37 +00007147 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007148
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007149 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007150 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007151 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007152}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007153
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007154void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7155 const InputInfo &Output,
7156 const InputInfoList &Inputs,
7157 const ArgList &Args,
7158 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007159 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007160 ArgStringList CmdArgs;
7161
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007162 // GNU as needs different flags for creating the correct output format
7163 // on architectures with different ABIs or optional feature sets.
7164 switch (getToolChain().getArch()) {
7165 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007166 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007167 break;
7168 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007169 case llvm::Triple::armeb:
7170 case llvm::Triple::thumb:
7171 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007172 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007173 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007174 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007175 }
7176
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007177 case llvm::Triple::mips:
7178 case llvm::Triple::mipsel:
7179 case llvm::Triple::mips64:
7180 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007181 StringRef CPUName;
7182 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007183 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007184
7185 CmdArgs.push_back("-march");
7186 CmdArgs.push_back(CPUName.data());
7187
7188 CmdArgs.push_back("-mabi");
7189 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7190
7191 if (getToolChain().getArch() == llvm::Triple::mips ||
7192 getToolChain().getArch() == llvm::Triple::mips64)
7193 CmdArgs.push_back("-EB");
7194 else
7195 CmdArgs.push_back("-EL");
7196
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007197 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007198 break;
7199 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007200
7201 case llvm::Triple::sparc:
7202 CmdArgs.push_back("-32");
7203 addAssemblerKPIC(Args, CmdArgs);
7204 break;
7205
7206 case llvm::Triple::sparcv9:
7207 CmdArgs.push_back("-64");
7208 CmdArgs.push_back("-Av9");
7209 addAssemblerKPIC(Args, CmdArgs);
7210 break;
7211
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007212 default:
7213 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007214 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007215
7216 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7217 options::OPT_Xassembler);
7218
7219 CmdArgs.push_back("-o");
7220 CmdArgs.push_back(Output.getFilename());
7221
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007222 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007223 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007224
David Chisnallddbd68f2011-09-27 22:03:18 +00007225 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007226 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007227}
7228
7229void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7230 const InputInfo &Output,
7231 const InputInfoList &Inputs,
7232 const ArgList &Args,
7233 const char *LinkingOutput) const {
7234 const Driver &D = getToolChain().getDriver();
7235 ArgStringList CmdArgs;
7236
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007237 if (!D.SysRoot.empty())
7238 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7239
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007240 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007241 if (Args.hasArg(options::OPT_static)) {
7242 CmdArgs.push_back("-Bstatic");
7243 } else {
7244 if (Args.hasArg(options::OPT_rdynamic))
7245 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007246 if (Args.hasArg(options::OPT_shared)) {
7247 CmdArgs.push_back("-Bshareable");
7248 } else {
7249 CmdArgs.push_back("-dynamic-linker");
7250 CmdArgs.push_back("/libexec/ld.elf_so");
7251 }
7252 }
7253
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007254 // Many NetBSD architectures support more than one ABI.
7255 // Determine the correct emulation for ld.
7256 switch (getToolChain().getArch()) {
7257 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007258 CmdArgs.push_back("-m");
7259 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007260 break;
7261 case llvm::Triple::arm:
7262 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007263 CmdArgs.push_back("-m");
7264 switch (getToolChain().getTriple().getEnvironment()) {
7265 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007266 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007267 CmdArgs.push_back("armelf_nbsd_eabi");
7268 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007269 case llvm::Triple::EABIHF:
7270 case llvm::Triple::GNUEABIHF:
7271 CmdArgs.push_back("armelf_nbsd_eabihf");
7272 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007273 default:
7274 CmdArgs.push_back("armelf_nbsd");
7275 break;
7276 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007277 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007278 case llvm::Triple::armeb:
7279 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007280 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007281 CmdArgs.push_back("-m");
7282 switch (getToolChain().getTriple().getEnvironment()) {
7283 case llvm::Triple::EABI:
7284 case llvm::Triple::GNUEABI:
7285 CmdArgs.push_back("armelfb_nbsd_eabi");
7286 break;
7287 case llvm::Triple::EABIHF:
7288 case llvm::Triple::GNUEABIHF:
7289 CmdArgs.push_back("armelfb_nbsd_eabihf");
7290 break;
7291 default:
7292 CmdArgs.push_back("armelfb_nbsd");
7293 break;
7294 }
7295 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007296 case llvm::Triple::mips64:
7297 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007298 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007299 CmdArgs.push_back("-m");
7300 if (getToolChain().getArch() == llvm::Triple::mips64)
7301 CmdArgs.push_back("elf32btsmip");
7302 else
7303 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007304 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007305 CmdArgs.push_back("-m");
7306 if (getToolChain().getArch() == llvm::Triple::mips64)
7307 CmdArgs.push_back("elf64btsmip");
7308 else
7309 CmdArgs.push_back("elf64ltsmip");
7310 }
7311 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007312 case llvm::Triple::ppc:
7313 CmdArgs.push_back("-m");
7314 CmdArgs.push_back("elf32ppc_nbsd");
7315 break;
7316
7317 case llvm::Triple::ppc64:
7318 case llvm::Triple::ppc64le:
7319 CmdArgs.push_back("-m");
7320 CmdArgs.push_back("elf64ppc");
7321 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007322
7323 case llvm::Triple::sparc:
7324 CmdArgs.push_back("-m");
7325 CmdArgs.push_back("elf32_sparc");
7326 break;
7327
7328 case llvm::Triple::sparcv9:
7329 CmdArgs.push_back("-m");
7330 CmdArgs.push_back("elf64_sparc");
7331 break;
7332
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007333 default:
7334 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007335 }
7336
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007337 if (Output.isFilename()) {
7338 CmdArgs.push_back("-o");
7339 CmdArgs.push_back(Output.getFilename());
7340 } else {
7341 assert(Output.isNothing() && "Invalid output.");
7342 }
7343
7344 if (!Args.hasArg(options::OPT_nostdlib) &&
7345 !Args.hasArg(options::OPT_nostartfiles)) {
7346 if (!Args.hasArg(options::OPT_shared)) {
7347 CmdArgs.push_back(Args.MakeArgString(
7348 getToolChain().GetFilePath("crt0.o")));
7349 CmdArgs.push_back(Args.MakeArgString(
7350 getToolChain().GetFilePath("crti.o")));
7351 CmdArgs.push_back(Args.MakeArgString(
7352 getToolChain().GetFilePath("crtbegin.o")));
7353 } else {
7354 CmdArgs.push_back(Args.MakeArgString(
7355 getToolChain().GetFilePath("crti.o")));
7356 CmdArgs.push_back(Args.MakeArgString(
7357 getToolChain().GetFilePath("crtbeginS.o")));
7358 }
7359 }
7360
7361 Args.AddAllArgs(CmdArgs, options::OPT_L);
7362 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7363 Args.AddAllArgs(CmdArgs, options::OPT_e);
7364 Args.AddAllArgs(CmdArgs, options::OPT_s);
7365 Args.AddAllArgs(CmdArgs, options::OPT_t);
7366 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7367 Args.AddAllArgs(CmdArgs, options::OPT_r);
7368
7369 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7370
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007371 unsigned Major, Minor, Micro;
7372 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7373 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007374 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007375 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007376 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007377 case llvm::Triple::arm:
7378 case llvm::Triple::armeb:
7379 case llvm::Triple::thumb:
7380 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007381 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007382 case llvm::Triple::ppc64:
7383 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007384 case llvm::Triple::x86:
7385 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007386 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007387 break;
7388 default:
7389 break;
7390 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007391 }
7392
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007393 if (!Args.hasArg(options::OPT_nostdlib) &&
7394 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007395 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007396 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7397 CmdArgs.push_back("-lm");
7398 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007399 if (Args.hasArg(options::OPT_pthread))
7400 CmdArgs.push_back("-lpthread");
7401 CmdArgs.push_back("-lc");
7402
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007403 if (useLibgcc) {
7404 if (Args.hasArg(options::OPT_static)) {
7405 // libgcc_eh depends on libc, so resolve as much as possible,
7406 // pull in any new requirements from libc and then get the rest
7407 // of libgcc.
7408 CmdArgs.push_back("-lgcc_eh");
7409 CmdArgs.push_back("-lc");
7410 CmdArgs.push_back("-lgcc");
7411 } else {
7412 CmdArgs.push_back("-lgcc");
7413 CmdArgs.push_back("--as-needed");
7414 CmdArgs.push_back("-lgcc_s");
7415 CmdArgs.push_back("--no-as-needed");
7416 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007417 }
7418 }
7419
7420 if (!Args.hasArg(options::OPT_nostdlib) &&
7421 !Args.hasArg(options::OPT_nostartfiles)) {
7422 if (!Args.hasArg(options::OPT_shared))
7423 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7424 "crtend.o")));
7425 else
7426 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7427 "crtendS.o")));
7428 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7429 "crtn.o")));
7430 }
7431
Alexey Samsonov7811d192014-02-20 13:57:37 +00007432 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007433
Logan Chieneb9162f2014-06-26 14:23:45 +00007434 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007435 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007436}
7437
Thomas Schwinge4e555262013-03-28 19:04:25 +00007438void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7439 const InputInfo &Output,
7440 const InputInfoList &Inputs,
7441 const ArgList &Args,
7442 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007443 claimNoWarnArgs(Args);
7444
Rafael Espindola92b00932010-08-10 00:25:48 +00007445 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007446 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007447
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007448 switch (getToolChain().getArch()) {
7449 default:
7450 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007451 // Add --32/--64 to make sure we get the format we want.
7452 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007453 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007454 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007455 break;
7456 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007457 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7458 CmdArgs.push_back("--x32");
7459 else
7460 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007461 break;
7462 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007463 CmdArgs.push_back("-a32");
7464 CmdArgs.push_back("-mppc");
7465 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007466 break;
7467 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007468 CmdArgs.push_back("-a64");
7469 CmdArgs.push_back("-mppc64");
7470 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007471 break;
7472 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007473 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007474 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007475 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007476 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007477 break;
7478 case llvm::Triple::sparc:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007479 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007480 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007481 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007482 break;
7483 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007484 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007485 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007486 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007487 break;
7488 case llvm::Triple::arm:
7489 case llvm::Triple::armeb:
7490 case llvm::Triple::thumb:
7491 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007492 const llvm::Triple &Triple = getToolChain().getTriple();
7493 switch (Triple.getSubArch()) {
7494 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007495 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007496 break;
7497 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007498 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007499 break;
7500 default:
7501 break;
7502 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007503
Tim Northover9c7e0352013-12-12 11:55:52 +00007504 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007505 getToolChain().getDriver(), Args,
7506 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007507 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007508
7509 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007510
7511 // FIXME: remove krait check when GNU tools support krait cpu
7512 // for now replace it with -march=armv7-a to avoid a lower
7513 // march from being picked in the absence of a cpu flag.
7514 Arg *A;
7515 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin4045f662015-05-08 15:44:36 +00007516 StringRef(A->getValue()) == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007517 CmdArgs.push_back("-march=armv7-a");
7518 else
7519 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007520 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007521 break;
7522 }
7523 case llvm::Triple::mips:
7524 case llvm::Triple::mipsel:
7525 case llvm::Triple::mips64:
7526 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007527 StringRef CPUName;
7528 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007529 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007530 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007531
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007532 CmdArgs.push_back("-march");
7533 CmdArgs.push_back(CPUName.data());
7534
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007535 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007536 CmdArgs.push_back(ABIName.data());
7537
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007538 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7539 // or -mshared (not implemented) is in effect.
7540 bool IsPicOrPie = false;
7541 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7542 options::OPT_fpic, options::OPT_fno_pic,
7543 options::OPT_fPIE, options::OPT_fno_PIE,
7544 options::OPT_fpie, options::OPT_fno_pie)) {
7545 if (A->getOption().matches(options::OPT_fPIC) ||
7546 A->getOption().matches(options::OPT_fpic) ||
7547 A->getOption().matches(options::OPT_fPIE) ||
7548 A->getOption().matches(options::OPT_fpie))
7549 IsPicOrPie = true;
7550 }
7551 if (!IsPicOrPie)
7552 CmdArgs.push_back("-mno-shared");
7553
Daniel Sanders379d44b2014-07-16 11:52:23 +00007554 // LLVM doesn't support -mplt yet and acts as if it is always given.
7555 // However, -mplt has no effect with the N64 ABI.
7556 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007557
7558 if (getToolChain().getArch() == llvm::Triple::mips ||
7559 getToolChain().getArch() == llvm::Triple::mips64)
7560 CmdArgs.push_back("-EB");
7561 else
7562 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007563
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007564 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7565 if (StringRef(A->getValue()) == "2008")
7566 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7567 }
7568
Daniel Sanders379d44b2014-07-16 11:52:23 +00007569 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7570 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7571 options::OPT_mfp64)) {
7572 A->claim();
7573 A->render(Args, CmdArgs);
7574 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7575 ABIName))
7576 CmdArgs.push_back("-mfpxx");
7577
7578 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7579 // -mno-mips16 is actually -no-mips16.
7580 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7581 options::OPT_mno_mips16)) {
7582 if (A->getOption().matches(options::OPT_mips16)) {
7583 A->claim();
7584 A->render(Args, CmdArgs);
7585 } else {
7586 A->claim();
7587 CmdArgs.push_back("-no-mips16");
7588 }
7589 }
7590
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007591 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7592 options::OPT_mno_micromips);
7593 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7594 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7595
Simon Atanasyanbd986632013-11-26 11:58:04 +00007596 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7597 // Do not use AddLastArg because not all versions of MIPS assembler
7598 // support -mmsa / -mno-msa options.
7599 if (A->getOption().matches(options::OPT_mmsa))
7600 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7601 }
7602
Daniel Sanders379d44b2014-07-16 11:52:23 +00007603 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7604 options::OPT_msoft_float);
7605
7606 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7607 options::OPT_mno_odd_spreg);
7608
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007609 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007610 break;
7611 }
7612 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007613 // Always pass an -march option, since our default of z10 is later
7614 // than the GNU assembler's default.
7615 StringRef CPUName = getSystemZTargetCPU(Args);
7616 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007617 break;
7618 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007619 }
7620
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007621 if (NeedsKPIC)
7622 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007623
7624 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7625 options::OPT_Xassembler);
7626
7627 CmdArgs.push_back("-o");
7628 CmdArgs.push_back(Output.getFilename());
7629
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007630 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007631 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007632
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007633 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007634 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007635
7636 // Handle the debug info splitting at object creation time if we're
7637 // creating an object.
7638 // TODO: Currently only works on linux with newer objcopy.
7639 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007640 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007641 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007642 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007643}
7644
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007645static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007646 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007647 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007648 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7649 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007650 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007651 CmdArgs.push_back("-lgcc");
7652
Logan Chien3d3373c2012-11-19 12:04:11 +00007653 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007654 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007655 CmdArgs.push_back("-lgcc");
7656 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007657 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007658 CmdArgs.push_back("--as-needed");
7659 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007660 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007661 CmdArgs.push_back("--no-as-needed");
7662 }
7663
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007664 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007665 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007666 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007667 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007668
7669 // According to Android ABI, we have to link with libdl if we are
7670 // linking with non-static libgcc.
7671 //
7672 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7673 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7674 if (isAndroid && !StaticLibgcc)
7675 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007676}
7677
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007678static std::string getLinuxDynamicLinker(const ArgList &Args,
7679 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007680 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7681 if (ToolChain.getTriple().isArch64Bit())
7682 return "/system/bin/linker64";
7683 else
7684 return "/system/bin/linker";
7685 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7686 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007687 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007688 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007689 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007690 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007691 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007692 else if (ToolChain.getArch() == llvm::Triple::arm ||
7693 ToolChain.getArch() == llvm::Triple::thumb) {
7694 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7695 return "/lib/ld-linux-armhf.so.3";
7696 else
7697 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007698 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7699 ToolChain.getArch() == llvm::Triple::thumbeb) {
7700 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7701 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7702 else
7703 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007704 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007705 ToolChain.getArch() == llvm::Triple::mipsel ||
7706 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007707 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007708 StringRef CPUName;
7709 StringRef ABIName;
7710 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7711 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7712
7713 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7714 .Case("o32", "/lib")
7715 .Case("n32", "/lib32")
7716 .Case("n64", "/lib64")
7717 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007718 StringRef LibName;
7719 if (mips::isUCLibc(Args))
7720 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7721 else
7722 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007723
7724 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007725 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7726 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007727 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7728 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7729 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007730 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007731 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7732 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7733 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007734 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007735 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7736 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007737 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7738 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007739 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7740 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7741 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007742 else
7743 return "/lib64/ld-linux-x86-64.so.2";
7744}
7745
Renato Golinc4b49242014-02-13 10:01:16 +00007746static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007747 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007748 // Make use of compiler-rt if --rtlib option is used
7749 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7750
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007751 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007752 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007753 switch (TC.getTriple().getOS()) {
7754 default: llvm_unreachable("unsupported OS");
7755 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007756 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007757 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007758 break;
7759 }
Renato Golinc4b49242014-02-13 10:01:16 +00007760 break;
7761 case ToolChain::RLT_Libgcc:
7762 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7763 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007764 }
7765}
7766
Rafael Espindola1e085772014-08-15 17:14:35 +00007767static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7768 switch (T.getArch()) {
7769 case llvm::Triple::x86:
7770 return "elf_i386";
7771 case llvm::Triple::aarch64:
7772 return "aarch64linux";
7773 case llvm::Triple::aarch64_be:
7774 return "aarch64_be_linux";
7775 case llvm::Triple::arm:
7776 case llvm::Triple::thumb:
7777 return "armelf_linux_eabi";
7778 case llvm::Triple::armeb:
7779 case llvm::Triple::thumbeb:
7780 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7781 case llvm::Triple::ppc:
7782 return "elf32ppclinux";
7783 case llvm::Triple::ppc64:
7784 return "elf64ppc";
7785 case llvm::Triple::ppc64le:
7786 return "elf64lppc";
7787 case llvm::Triple::sparc:
7788 return "elf32_sparc";
7789 case llvm::Triple::sparcv9:
7790 return "elf64_sparc";
7791 case llvm::Triple::mips:
7792 return "elf32btsmip";
7793 case llvm::Triple::mipsel:
7794 return "elf32ltsmip";
7795 case llvm::Triple::mips64:
7796 if (mips::hasMipsAbiArg(Args, "n32"))
7797 return "elf32btsmipn32";
7798 return "elf64btsmip";
7799 case llvm::Triple::mips64el:
7800 if (mips::hasMipsAbiArg(Args, "n32"))
7801 return "elf32ltsmipn32";
7802 return "elf64ltsmip";
7803 case llvm::Triple::systemz:
7804 return "elf64_s390";
7805 case llvm::Triple::x86_64:
7806 if (T.getEnvironment() == llvm::Triple::GNUX32)
7807 return "elf32_x86_64";
7808 return "elf_x86_64";
7809 default:
7810 llvm_unreachable("Unexpected arch");
7811 }
7812}
7813
Thomas Schwinge4e555262013-03-28 19:04:25 +00007814void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7815 const InputInfo &Output,
7816 const InputInfoList &Inputs,
7817 const ArgList &Args,
7818 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007819 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007820 static_cast<const toolchains::Linux&>(getToolChain());
7821 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007822 const bool isAndroid =
7823 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007824 const bool IsPIE =
7825 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007826 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007827 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007828
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007829 ArgStringList CmdArgs;
7830
Rafael Espindolad1002f62010-11-15 18:28:16 +00007831 // Silence warning for "clang -g foo.o -o foo"
7832 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007833 // and "clang -emit-llvm foo.o -o foo"
7834 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007835 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007836 // handled somewhere else.
7837 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007838
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007839 if (!D.SysRoot.empty())
7840 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007841
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007842 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007843 CmdArgs.push_back("-pie");
7844
Rafael Espindola1c76c592010-11-07 22:57:16 +00007845 if (Args.hasArg(options::OPT_rdynamic))
7846 CmdArgs.push_back("-export-dynamic");
7847
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007848 if (Args.hasArg(options::OPT_s))
7849 CmdArgs.push_back("-s");
7850
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007851 if (ToolChain.getArch() == llvm::Triple::armeb ||
7852 ToolChain.getArch() == llvm::Triple::thumbeb)
7853 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7854
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007855 for (const auto &Opt : ToolChain.ExtraOpts)
7856 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007857
7858 if (!Args.hasArg(options::OPT_static)) {
7859 CmdArgs.push_back("--eh-frame-hdr");
7860 }
7861
7862 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007863 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007864
7865 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007866 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007867 ToolChain.getArch() == llvm::Triple::armeb ||
7868 ToolChain.getArch() == llvm::Triple::thumb ||
7869 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007870 CmdArgs.push_back("-Bstatic");
7871 else
7872 CmdArgs.push_back("-static");
7873 } else if (Args.hasArg(options::OPT_shared)) {
7874 CmdArgs.push_back("-shared");
7875 }
7876
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007877 if (ToolChain.getArch() == llvm::Triple::arm ||
7878 ToolChain.getArch() == llvm::Triple::armeb ||
7879 ToolChain.getArch() == llvm::Triple::thumb ||
7880 ToolChain.getArch() == llvm::Triple::thumbeb ||
7881 (!Args.hasArg(options::OPT_static) &&
7882 !Args.hasArg(options::OPT_shared))) {
7883 CmdArgs.push_back("-dynamic-linker");
7884 CmdArgs.push_back(Args.MakeArgString(
7885 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7886 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007887
7888 CmdArgs.push_back("-o");
7889 CmdArgs.push_back(Output.getFilename());
7890
Rafael Espindola81937ec2010-12-01 01:52:43 +00007891 if (!Args.hasArg(options::OPT_nostdlib) &&
7892 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007893 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007894 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007895 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007896 if (Args.hasArg(options::OPT_pg))
7897 crt1 = "gcrt1.o";
7898 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007899 crt1 = "Scrt1.o";
7900 else
7901 crt1 = "crt1.o";
7902 }
7903 if (crt1)
7904 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007905
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007906 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7907 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007908
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007909 const char *crtbegin;
7910 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007911 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007912 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007913 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007914 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007915 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007916 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007917 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007918 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007919
7920 // Add crtfastmath.o if available and fast math is enabled.
7921 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007922 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007923
7924 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007925 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007926
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007927 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007928
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007929 for (const auto &Path : Paths)
7930 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007931
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007932 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007933 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007934
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007935 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7936 CmdArgs.push_back("--no-demangle");
7937
Alexey Samsonov52550342014-09-15 19:58:40 +00007938 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007939 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007940 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007941 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007942
Hans Wennborg70850d82013-07-18 20:29:38 +00007943 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007944 !Args.hasArg(options::OPT_nostdlib) &&
7945 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007946 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7947 !Args.hasArg(options::OPT_static);
7948 if (OnlyLibstdcxxStatic)
7949 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007950 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007951 if (OnlyLibstdcxxStatic)
7952 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007953 CmdArgs.push_back("-lm");
7954 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007955 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7956 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007957
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007958 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007959 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7960 if (Args.hasArg(options::OPT_static))
7961 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007962
Alexey Samsonov52550342014-09-15 19:58:40 +00007963 if (NeedsSanitizerDeps)
7964 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7965
Alexey Bataev186b28a2014-03-06 05:43:53 +00007966 LibOpenMP UsedOpenMPLib = LibUnknown;
7967 if (Args.hasArg(options::OPT_fopenmp)) {
7968 UsedOpenMPLib = LibGOMP;
7969 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7970 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7971 .Case("libgomp", LibGOMP)
7972 .Case("libiomp5", LibIOMP5)
7973 .Default(LibUnknown);
7974 if (UsedOpenMPLib == LibUnknown)
7975 D.Diag(diag::err_drv_unsupported_option_argument)
7976 << A->getOption().getName() << A->getValue();
7977 }
7978 switch (UsedOpenMPLib) {
7979 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007980 CmdArgs.push_back("-lgomp");
7981
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007982 // FIXME: Exclude this for platforms with libgomp that don't require
7983 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007984 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007985 break;
7986 case LibIOMP5:
7987 CmdArgs.push_back("-liomp5");
7988 break;
7989 case LibUnknown:
7990 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007991 }
Renato Golinc4b49242014-02-13 10:01:16 +00007992 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007993
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007994 if ((Args.hasArg(options::OPT_pthread) ||
7995 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7996 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007997 CmdArgs.push_back("-lpthread");
7998
7999 CmdArgs.push_back("-lc");
8000
8001 if (Args.hasArg(options::OPT_static))
8002 CmdArgs.push_back("--end-group");
8003 else
Renato Golinc4b49242014-02-13 10:01:16 +00008004 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008005 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008006
Rafael Espindola81937ec2010-12-01 01:52:43 +00008007 if (!Args.hasArg(options::OPT_nostartfiles)) {
8008 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008009 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008010 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008011 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008012 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008013 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008014 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008015
Rafael Espindola81937ec2010-12-01 01:52:43 +00008016 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008017 if (!isAndroid)
8018 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008019 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008020 }
8021
David Blaikiec11bf802014-09-04 16:04:28 +00008022 C.addCommand(
8023 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008024}
8025
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008026
8027// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8028// for the various SFI requirements like register masking. The assembly tool
8029// inserts the file containing the macros as an input into all the assembly
8030// jobs.
8031void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8032 const InputInfo &Output,
8033 const InputInfoList &Inputs,
8034 const ArgList &Args,
8035 const char *LinkingOutput) const {
8036 const toolchains::NaCl_TC& ToolChain =
8037 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8038 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8039 "nacl-arm-macros.s");
8040 InputInfoList NewInputs;
8041 NewInputs.push_back(NaClMacros);
8042 NewInputs.append(Inputs.begin(), Inputs.end());
8043 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8044 LinkingOutput);
8045}
8046
8047
8048// This is quite similar to gnutools::link::ConstructJob with changes that
8049// we use static by default, do not yet support sanitizers or LTO, and a few
8050// others. Eventually we can support more of that and hopefully migrate back
8051// to gnutools::link.
8052void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8053 const InputInfo &Output,
8054 const InputInfoList &Inputs,
8055 const ArgList &Args,
8056 const char *LinkingOutput) const {
8057
8058 const toolchains::NaCl_TC& ToolChain =
8059 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8060 const Driver &D = ToolChain.getDriver();
8061 const bool IsStatic =
8062 !Args.hasArg(options::OPT_dynamic) &&
8063 !Args.hasArg(options::OPT_shared);
8064
8065 ArgStringList CmdArgs;
8066
8067 // Silence warning for "clang -g foo.o -o foo"
8068 Args.ClaimAllArgs(options::OPT_g_Group);
8069 // and "clang -emit-llvm foo.o -o foo"
8070 Args.ClaimAllArgs(options::OPT_emit_llvm);
8071 // and for "clang -w foo.o -o foo". Other warning options are already
8072 // handled somewhere else.
8073 Args.ClaimAllArgs(options::OPT_w);
8074
8075 if (!D.SysRoot.empty())
8076 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8077
8078 if (Args.hasArg(options::OPT_rdynamic))
8079 CmdArgs.push_back("-export-dynamic");
8080
8081 if (Args.hasArg(options::OPT_s))
8082 CmdArgs.push_back("-s");
8083
8084 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8085 // there is --build-id, which we do want.
8086 CmdArgs.push_back("--build-id");
8087
8088 if (!IsStatic)
8089 CmdArgs.push_back("--eh-frame-hdr");
8090
8091 CmdArgs.push_back("-m");
8092 if (ToolChain.getArch() == llvm::Triple::x86)
8093 CmdArgs.push_back("elf_i386_nacl");
8094 else if (ToolChain.getArch() == llvm::Triple::arm)
8095 CmdArgs.push_back("armelf_nacl");
8096 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8097 CmdArgs.push_back("elf_x86_64_nacl");
8098 else
8099 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8100 "Native Client";
8101
8102
8103 if (IsStatic)
8104 CmdArgs.push_back("-static");
8105 else if (Args.hasArg(options::OPT_shared))
8106 CmdArgs.push_back("-shared");
8107
8108 CmdArgs.push_back("-o");
8109 CmdArgs.push_back(Output.getFilename());
8110 if (!Args.hasArg(options::OPT_nostdlib) &&
8111 !Args.hasArg(options::OPT_nostartfiles)) {
8112 if (!Args.hasArg(options::OPT_shared))
8113 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8114 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8115
8116 const char *crtbegin;
8117 if (IsStatic)
8118 crtbegin = "crtbeginT.o";
8119 else if (Args.hasArg(options::OPT_shared))
8120 crtbegin = "crtbeginS.o";
8121 else
8122 crtbegin = "crtbegin.o";
8123 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8124 }
8125
8126 Args.AddAllArgs(CmdArgs, options::OPT_L);
8127 Args.AddAllArgs(CmdArgs, options::OPT_u);
8128
8129 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8130
8131 for (const auto &Path : Paths)
8132 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8133
8134 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8135 CmdArgs.push_back("--no-demangle");
8136
8137 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8138
8139 if (D.CCCIsCXX() &&
8140 !Args.hasArg(options::OPT_nostdlib) &&
8141 !Args.hasArg(options::OPT_nodefaultlibs)) {
8142 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8143 !IsStatic;
8144 if (OnlyLibstdcxxStatic)
8145 CmdArgs.push_back("-Bstatic");
8146 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8147 if (OnlyLibstdcxxStatic)
8148 CmdArgs.push_back("-Bdynamic");
8149 CmdArgs.push_back("-lm");
8150 }
8151
8152 if (!Args.hasArg(options::OPT_nostdlib)) {
8153 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8154 // Always use groups, since it has no effect on dynamic libraries.
8155 CmdArgs.push_back("--start-group");
8156 CmdArgs.push_back("-lc");
8157 // NaCl's libc++ currently requires libpthread, so just always include it
8158 // in the group for C++.
8159 if (Args.hasArg(options::OPT_pthread) ||
8160 Args.hasArg(options::OPT_pthreads) ||
8161 D.CCCIsCXX()) {
8162 CmdArgs.push_back("-lpthread");
8163 }
8164
8165 CmdArgs.push_back("-lgcc");
8166 CmdArgs.push_back("--as-needed");
8167 if (IsStatic)
8168 CmdArgs.push_back("-lgcc_eh");
8169 else
8170 CmdArgs.push_back("-lgcc_s");
8171 CmdArgs.push_back("--no-as-needed");
8172 CmdArgs.push_back("--end-group");
8173 }
8174
8175 if (!Args.hasArg(options::OPT_nostartfiles)) {
8176 const char *crtend;
8177 if (Args.hasArg(options::OPT_shared))
8178 crtend = "crtendS.o";
8179 else
8180 crtend = "crtend.o";
8181
8182 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8183 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8184 }
8185 }
8186
8187 C.addCommand(llvm::make_unique<Command>(JA, *this,
8188 ToolChain.Linker.c_str(), CmdArgs));
8189}
8190
8191
Chris Lattner3e2ee142010-07-07 16:01:42 +00008192void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008193 const InputInfo &Output,
8194 const InputInfoList &Inputs,
8195 const ArgList &Args,
8196 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008197 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008198 ArgStringList CmdArgs;
8199
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008201
8202 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008203 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008205 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008206 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008207
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008208 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008209 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008210}
8211
8212void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008213 const InputInfo &Output,
8214 const InputInfoList &Inputs,
8215 const ArgList &Args,
8216 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008217 const Driver &D = getToolChain().getDriver();
8218 ArgStringList CmdArgs;
8219
Daniel Dunbarb440f562010-08-02 02:38:21 +00008220 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008221 CmdArgs.push_back("-o");
8222 CmdArgs.push_back(Output.getFilename());
8223 } else {
8224 assert(Output.isNothing() && "Invalid output.");
8225 }
8226
8227 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008228 !Args.hasArg(options::OPT_nostartfiles)) {
8229 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8230 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8231 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8232 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8233 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008234
8235 Args.AddAllArgs(CmdArgs, options::OPT_L);
8236 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8237 Args.AddAllArgs(CmdArgs, options::OPT_e);
8238
Daniel Dunbar54423b22010-09-17 00:24:54 +00008239 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008240
Alexey Samsonov7811d192014-02-20 13:57:37 +00008241 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008242
Chris Lattner3e2ee142010-07-07 16:01:42 +00008243 if (!Args.hasArg(options::OPT_nostdlib) &&
8244 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008245 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008246 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008247 CmdArgs.push_back("-lm");
8248 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008249 }
8250
8251 if (!Args.hasArg(options::OPT_nostdlib) &&
8252 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008253 if (Args.hasArg(options::OPT_pthread))
8254 CmdArgs.push_back("-lpthread");
8255 CmdArgs.push_back("-lc");
8256 CmdArgs.push_back("-lCompilerRT-Generic");
8257 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8258 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008259 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008260 }
8261
Logan Chieneb9162f2014-06-26 14:23:45 +00008262 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008263 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008264}
8265
Daniel Dunbarcc912342009-05-02 18:28:39 +00008266/// DragonFly Tools
8267
8268// For now, DragonFly Assemble does just about the same as for
8269// FreeBSD, but this may change soon.
8270void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008271 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008272 const InputInfoList &Inputs,
8273 const ArgList &Args,
8274 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008275 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008276 ArgStringList CmdArgs;
8277
8278 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8279 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008280 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008281 CmdArgs.push_back("--32");
8282
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008283 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008284
8285 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008286 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008287
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008288 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008289 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008290
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008291 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008292 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008293}
8294
8295void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008296 const InputInfo &Output,
8297 const InputInfoList &Inputs,
8298 const ArgList &Args,
8299 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008300 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008301 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008302 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008303
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008304 if (!D.SysRoot.empty())
8305 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8306
John McCall65b8da02013-04-11 22:55:55 +00008307 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008308 if (Args.hasArg(options::OPT_static)) {
8309 CmdArgs.push_back("-Bstatic");
8310 } else {
John McCall65b8da02013-04-11 22:55:55 +00008311 if (Args.hasArg(options::OPT_rdynamic))
8312 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008313 if (Args.hasArg(options::OPT_shared))
8314 CmdArgs.push_back("-Bshareable");
8315 else {
8316 CmdArgs.push_back("-dynamic-linker");
8317 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8318 }
John McCall65b8da02013-04-11 22:55:55 +00008319 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008320 }
8321
8322 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8323 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008324 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008325 CmdArgs.push_back("-m");
8326 CmdArgs.push_back("elf_i386");
8327 }
8328
Daniel Dunbarb440f562010-08-02 02:38:21 +00008329 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008330 CmdArgs.push_back("-o");
8331 CmdArgs.push_back(Output.getFilename());
8332 } else {
8333 assert(Output.isNothing() && "Invalid output.");
8334 }
8335
8336 if (!Args.hasArg(options::OPT_nostdlib) &&
8337 !Args.hasArg(options::OPT_nostartfiles)) {
8338 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008339 if (Args.hasArg(options::OPT_pg))
8340 CmdArgs.push_back(Args.MakeArgString(
8341 getToolChain().GetFilePath("gcrt1.o")));
8342 else {
8343 if (Args.hasArg(options::OPT_pie))
8344 CmdArgs.push_back(Args.MakeArgString(
8345 getToolChain().GetFilePath("Scrt1.o")));
8346 else
8347 CmdArgs.push_back(Args.MakeArgString(
8348 getToolChain().GetFilePath("crt1.o")));
8349 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008350 }
John McCall65b8da02013-04-11 22:55:55 +00008351 CmdArgs.push_back(Args.MakeArgString(
8352 getToolChain().GetFilePath("crti.o")));
8353 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8354 CmdArgs.push_back(Args.MakeArgString(
8355 getToolChain().GetFilePath("crtbeginS.o")));
8356 else
8357 CmdArgs.push_back(Args.MakeArgString(
8358 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008359 }
8360
8361 Args.AddAllArgs(CmdArgs, options::OPT_L);
8362 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8363 Args.AddAllArgs(CmdArgs, options::OPT_e);
8364
Daniel Dunbar54423b22010-09-17 00:24:54 +00008365 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008366
8367 if (!Args.hasArg(options::OPT_nostdlib) &&
8368 !Args.hasArg(options::OPT_nodefaultlibs)) {
8369 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8370 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008371 if (UseGCC47)
8372 CmdArgs.push_back("-L/usr/lib/gcc47");
8373 else
8374 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008375
8376 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008377 if (UseGCC47) {
8378 CmdArgs.push_back("-rpath");
8379 CmdArgs.push_back("/usr/lib/gcc47");
8380 } else {
8381 CmdArgs.push_back("-rpath");
8382 CmdArgs.push_back("/usr/lib/gcc44");
8383 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008384 }
8385
Hans Wennborg70850d82013-07-18 20:29:38 +00008386 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008387 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008388 CmdArgs.push_back("-lm");
8389 }
8390
Daniel Dunbarcc912342009-05-02 18:28:39 +00008391 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008392 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008393
8394 if (!Args.hasArg(options::OPT_nolibc)) {
8395 CmdArgs.push_back("-lc");
8396 }
8397
John McCall65b8da02013-04-11 22:55:55 +00008398 if (UseGCC47) {
8399 if (Args.hasArg(options::OPT_static) ||
8400 Args.hasArg(options::OPT_static_libgcc)) {
8401 CmdArgs.push_back("-lgcc");
8402 CmdArgs.push_back("-lgcc_eh");
8403 } else {
8404 if (Args.hasArg(options::OPT_shared_libgcc)) {
8405 CmdArgs.push_back("-lgcc_pic");
8406 if (!Args.hasArg(options::OPT_shared))
8407 CmdArgs.push_back("-lgcc");
8408 } else {
8409 CmdArgs.push_back("-lgcc");
8410 CmdArgs.push_back("--as-needed");
8411 CmdArgs.push_back("-lgcc_pic");
8412 CmdArgs.push_back("--no-as-needed");
8413 }
8414 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008415 } else {
John McCall65b8da02013-04-11 22:55:55 +00008416 if (Args.hasArg(options::OPT_shared)) {
8417 CmdArgs.push_back("-lgcc_pic");
8418 } else {
8419 CmdArgs.push_back("-lgcc");
8420 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008421 }
8422 }
8423
8424 if (!Args.hasArg(options::OPT_nostdlib) &&
8425 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008426 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008427 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008428 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008429 else
8430 CmdArgs.push_back(Args.MakeArgString(
8431 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008432 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008433 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008434 }
8435
Alexey Samsonov7811d192014-02-20 13:57:37 +00008436 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008437
Logan Chieneb9162f2014-06-26 14:23:45 +00008438 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008440}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008441
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008442// Try to find Exe from a Visual Studio distribution. This first tries to find
8443// an installed copy of Visual Studio and, failing that, looks in the PATH,
8444// making sure that whatever executable that's found is not a same-named exe
8445// from clang itself to prevent clang from falling back to itself.
8446static std::string FindVisualStudioExecutable(const ToolChain &TC,
8447 const char *Exe,
8448 const char *ClangProgramPath) {
8449 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8450 std::string visualStudioBinDir;
8451 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8452 visualStudioBinDir)) {
8453 SmallString<128> FilePath(visualStudioBinDir);
8454 llvm::sys::path::append(FilePath, Exe);
8455 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8456 return FilePath.str();
8457 }
8458
8459 return Exe;
8460}
8461
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008462void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8463 const InputInfo &Output,
8464 const InputInfoList &Inputs,
8465 const ArgList &Args,
8466 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008467 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008468 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008469
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008470 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8471 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008472 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8473 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008474
8475 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008476 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008477 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008478
Zachary Turner10d75b22014-10-22 20:40:43 +00008479 if (!llvm::sys::Process::GetEnv("LIB")) {
8480 // If the VC environment hasn't been configured (perhaps because the user
8481 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008482 // the environment variable is set however, assume the user knows what
8483 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008484 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008485 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008486 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8487 SmallString<128> LibDir(VisualStudioDir);
8488 llvm::sys::path::append(LibDir, "VC", "lib");
8489 switch (MSVC.getArch()) {
8490 case llvm::Triple::x86:
8491 // x86 just puts the libraries directly in lib
8492 break;
8493 case llvm::Triple::x86_64:
8494 llvm::sys::path::append(LibDir, "amd64");
8495 break;
8496 case llvm::Triple::arm:
8497 llvm::sys::path::append(LibDir, "arm");
8498 break;
8499 default:
8500 break;
8501 }
8502 CmdArgs.push_back(
8503 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8504 }
8505
8506 std::string WindowsSdkLibPath;
8507 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8508 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8509 WindowsSdkLibPath.c_str()));
8510 }
8511
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008512 CmdArgs.push_back("-nologo");
8513
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008514 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008515 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008516
Hans Wennborge4c47f22015-03-04 23:16:21 +00008517 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8518 options::OPT__SLASH_LDd,
8519 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008520 if (DLL) {
8521 CmdArgs.push_back(Args.MakeArgString("-dll"));
8522
8523 SmallString<128> ImplibName(Output.getFilename());
8524 llvm::sys::path::replace_extension(ImplibName, "lib");
8525 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008526 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008527 }
8528
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008529 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008530 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008531 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008532 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008533 static const char *CompilerRTComponents[] = {
8534 "asan_dynamic",
8535 "asan_dynamic_runtime_thunk",
8536 };
8537 for (const auto &Component : CompilerRTComponents)
8538 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008539 // Make sure the dynamic runtime thunk is not optimized out at link time
8540 // to ensure proper SEH handling.
8541 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008542 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008543 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008544 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008545 static const char *CompilerRTComponents[] = {
8546 "asan",
8547 "asan_cxx",
8548 };
8549 for (const auto &Component : CompilerRTComponents)
8550 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008551 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008552 }
8553
Hans Wennborg2e274592013-08-13 23:38:57 +00008554 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008555
Reid Kleckner337188f2014-09-16 19:22:00 +00008556 // Add filenames, libraries, and other linker inputs.
8557 for (const auto &Input : Inputs) {
8558 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008559 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008560 continue;
8561 }
8562
8563 const Arg &A = Input.getInputArg();
8564
8565 // Render -l options differently for the MSVC linker.
8566 if (A.getOption().matches(options::OPT_l)) {
8567 StringRef Lib = A.getValue();
8568 const char *LinkLibArg;
8569 if (Lib.endswith(".lib"))
8570 LinkLibArg = Args.MakeArgString(Lib);
8571 else
8572 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8573 CmdArgs.push_back(LinkLibArg);
8574 continue;
8575 }
8576
8577 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8578 // or -L. Render it, even if MSVC doesn't understand it.
8579 A.renderAsInput(Args, CmdArgs);
8580 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008581
Zachary Turner719f58c2014-12-01 23:06:47 +00008582 // We need to special case some linker paths. In the case of lld, we need to
8583 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8584 // linker, we need to use a special search algorithm.
8585 llvm::SmallString<128> linkPath;
8586 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8587 if (Linker.equals_lower("lld"))
8588 Linker = "lld-link";
8589
8590 if (Linker.equals_lower("link")) {
8591 // If we're using the MSVC linker, it's not sufficient to just use link
8592 // from the program PATH, because other environments like GnuWin32 install
8593 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008594 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008595 C.getDriver().getClangProgramPath());
8596 } else {
8597 linkPath = Linker;
8598 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008599 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008600 }
8601
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008602 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008603 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008604}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008605
8606void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8607 const InputInfo &Output,
8608 const InputInfoList &Inputs,
8609 const ArgList &Args,
8610 const char *LinkingOutput) const {
8611 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8612}
8613
David Blaikiec11bf802014-09-04 16:04:28 +00008614std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8615 Compilation &C, const JobAction &JA, const InputInfo &Output,
8616 const InputInfoList &Inputs, const ArgList &Args,
8617 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008618 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008619 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008620 CmdArgs.push_back("/c"); // Compile only.
8621 CmdArgs.push_back("/W0"); // No warnings.
8622
8623 // The goal is to be able to invoke this tool correctly based on
8624 // any flag accepted by clang-cl.
8625
8626 // These are spelled the same way in clang and cl.exe,.
8627 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8628 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008629
8630 // Optimization level.
8631 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8632 if (A->getOption().getID() == options::OPT_O0) {
8633 CmdArgs.push_back("/Od");
8634 } else {
8635 StringRef OptLevel = A->getValue();
8636 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8637 A->render(Args, CmdArgs);
8638 else if (OptLevel == "3")
8639 CmdArgs.push_back("/Ox");
8640 }
8641 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008642
Nico Weber3f8dafb2015-03-12 19:37:10 +00008643 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008644 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8645
David Majnemerf6072342014-07-01 22:24:56 +00008646 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8647 /*default=*/false))
8648 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008649 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8650 options::OPT_fno_function_sections))
8651 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8652 ? "/Gy"
8653 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008654 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8655 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008656 CmdArgs.push_back(
8657 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008658 if (Args.hasArg(options::OPT_fsyntax_only))
8659 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008660 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8661 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008662
Nico Weber3f8dafb2015-03-12 19:37:10 +00008663 std::vector<std::string> Includes =
8664 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008665 for (const auto &Include : Includes)
8666 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008667
Hans Wennborg87cfa712013-09-19 20:32:16 +00008668 // Flags that can simply be passed through.
8669 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8670 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008671 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008672
8673 // The order of these flags is relevant, so pick the last one.
8674 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8675 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8676 A->render(Args, CmdArgs);
8677
8678
8679 // Input filename.
8680 assert(Inputs.size() == 1);
8681 const InputInfo &II = Inputs[0];
8682 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8683 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8684 if (II.isFilename())
8685 CmdArgs.push_back(II.getFilename());
8686 else
8687 II.getInputArg().renderAsInput(Args, CmdArgs);
8688
8689 // Output filename.
8690 assert(Output.getType() == types::TY_Object);
8691 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8692 Output.getFilename());
8693 CmdArgs.push_back(Fo);
8694
Hans Wennborg188382e2013-09-20 18:16:35 +00008695 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008696 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8697 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008698 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8699 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008700}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008701
8702
8703/// XCore Tools
8704// We pass assemble and link construction to the xcc tool.
8705
8706void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8707 const InputInfo &Output,
8708 const InputInfoList &Inputs,
8709 const ArgList &Args,
8710 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008711 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008712 ArgStringList CmdArgs;
8713
8714 CmdArgs.push_back("-o");
8715 CmdArgs.push_back(Output.getFilename());
8716
8717 CmdArgs.push_back("-c");
8718
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008719 if (Args.hasArg(options::OPT_v))
8720 CmdArgs.push_back("-v");
8721
Robert Lytton894d25c2014-05-02 09:33:25 +00008722 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8723 if (!A->getOption().matches(options::OPT_g0))
8724 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008725
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008726 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8727 false))
8728 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008729
8730 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8731 options::OPT_Xassembler);
8732
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008733 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008734 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008735
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008736 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008738}
8739
8740void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8741 const InputInfo &Output,
8742 const InputInfoList &Inputs,
8743 const ArgList &Args,
8744 const char *LinkingOutput) const {
8745 ArgStringList CmdArgs;
8746
8747 if (Output.isFilename()) {
8748 CmdArgs.push_back("-o");
8749 CmdArgs.push_back(Output.getFilename());
8750 } else {
8751 assert(Output.isNothing() && "Invalid output.");
8752 }
8753
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008754 if (Args.hasArg(options::OPT_v))
8755 CmdArgs.push_back("-v");
8756
David Majnemer8de68642014-12-05 08:11:58 +00008757 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008758 CmdArgs.push_back("-fexceptions");
8759
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008760 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8761
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008762 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008763 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008764}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008765
8766void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8767 const InputInfo &Output,
8768 const InputInfoList &Inputs,
8769 const ArgList &Args,
8770 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008771 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008772 const auto &TC =
8773 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8774 ArgStringList CmdArgs;
8775 const char *Exec;
8776
8777 switch (TC.getArch()) {
8778 default: llvm_unreachable("unsupported architecture");
8779 case llvm::Triple::arm:
8780 case llvm::Triple::thumb:
8781 break;
8782 case llvm::Triple::x86:
8783 CmdArgs.push_back("--32");
8784 break;
8785 case llvm::Triple::x86_64:
8786 CmdArgs.push_back("--64");
8787 break;
8788 }
8789
8790 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8791
8792 CmdArgs.push_back("-o");
8793 CmdArgs.push_back(Output.getFilename());
8794
8795 for (const auto &Input : Inputs)
8796 CmdArgs.push_back(Input.getFilename());
8797
8798 const std::string Assembler = TC.GetProgramPath("as");
8799 Exec = Args.MakeArgString(Assembler);
8800
8801 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8802}
8803
8804void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8805 const InputInfo &Output,
8806 const InputInfoList &Inputs,
8807 const ArgList &Args,
8808 const char *LinkingOutput) const {
8809 const auto &TC =
8810 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8811 const llvm::Triple &T = TC.getTriple();
8812 const Driver &D = TC.getDriver();
8813 SmallString<128> EntryPoint;
8814 ArgStringList CmdArgs;
8815 const char *Exec;
8816
8817 // Silence warning for "clang -g foo.o -o foo"
8818 Args.ClaimAllArgs(options::OPT_g_Group);
8819 // and "clang -emit-llvm foo.o -o foo"
8820 Args.ClaimAllArgs(options::OPT_emit_llvm);
8821 // and for "clang -w foo.o -o foo"
8822 Args.ClaimAllArgs(options::OPT_w);
8823 // Other warning options are already handled somewhere else.
8824
8825 if (!D.SysRoot.empty())
8826 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8827
8828 if (Args.hasArg(options::OPT_pie))
8829 CmdArgs.push_back("-pie");
8830 if (Args.hasArg(options::OPT_rdynamic))
8831 CmdArgs.push_back("-export-dynamic");
8832 if (Args.hasArg(options::OPT_s))
8833 CmdArgs.push_back("--strip-all");
8834
8835 CmdArgs.push_back("-m");
8836 switch (TC.getArch()) {
8837 default: llvm_unreachable("unsupported architecture");
8838 case llvm::Triple::arm:
8839 case llvm::Triple::thumb:
8840 // FIXME: this is incorrect for WinCE
8841 CmdArgs.push_back("thumb2pe");
8842 break;
8843 case llvm::Triple::x86:
8844 CmdArgs.push_back("i386pe");
8845 EntryPoint.append("_");
8846 break;
8847 case llvm::Triple::x86_64:
8848 CmdArgs.push_back("i386pep");
8849 break;
8850 }
8851
8852 if (Args.hasArg(options::OPT_shared)) {
8853 switch (T.getArch()) {
8854 default: llvm_unreachable("unsupported architecture");
8855 case llvm::Triple::arm:
8856 case llvm::Triple::thumb:
8857 case llvm::Triple::x86_64:
8858 EntryPoint.append("_DllMainCRTStartup");
8859 break;
8860 case llvm::Triple::x86:
8861 EntryPoint.append("_DllMainCRTStartup@12");
8862 break;
8863 }
8864
8865 CmdArgs.push_back("-shared");
8866 CmdArgs.push_back("-Bdynamic");
8867
8868 CmdArgs.push_back("--enable-auto-image-base");
8869
8870 CmdArgs.push_back("--entry");
8871 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8872 } else {
8873 EntryPoint.append("mainCRTStartup");
8874
8875 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8876 : "-Bdynamic");
8877
8878 if (!Args.hasArg(options::OPT_nostdlib) &&
8879 !Args.hasArg(options::OPT_nostartfiles)) {
8880 CmdArgs.push_back("--entry");
8881 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8882 }
8883
8884 // FIXME: handle subsystem
8885 }
8886
8887 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008888 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008889
8890 CmdArgs.push_back("-o");
8891 CmdArgs.push_back(Output.getFilename());
8892
8893 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8894 SmallString<261> ImpLib(Output.getFilename());
8895 llvm::sys::path::replace_extension(ImpLib, ".lib");
8896
8897 CmdArgs.push_back("--out-implib");
8898 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8899 }
8900
8901 if (!Args.hasArg(options::OPT_nostdlib) &&
8902 !Args.hasArg(options::OPT_nostartfiles)) {
8903 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8904 const char *CRTBegin;
8905
8906 CRTBegin =
8907 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8908 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8909 }
8910
8911 Args.AddAllArgs(CmdArgs, options::OPT_L);
8912
8913 const auto &Paths = TC.getFilePaths();
8914 for (const auto &Path : Paths)
8915 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8916
8917 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8918
8919 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8920 !Args.hasArg(options::OPT_nodefaultlibs)) {
8921 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8922 !Args.hasArg(options::OPT_static);
8923 if (StaticCXX)
8924 CmdArgs.push_back("-Bstatic");
8925 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8926 if (StaticCXX)
8927 CmdArgs.push_back("-Bdynamic");
8928 }
8929
8930 if (!Args.hasArg(options::OPT_nostdlib)) {
8931 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8932 // TODO handle /MT[d] /MD[d]
8933 CmdArgs.push_back("-lmsvcrt");
8934 AddRunTimeLibs(TC, D, CmdArgs, Args);
8935 }
8936 }
8937
8938 const std::string Linker = TC.GetProgramPath("ld");
8939 Exec = Args.MakeArgString(Linker);
8940
8941 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8942}