blob: 9b25cab97051dc2408b2ce86472c1493a82775a5 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
87 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
88 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000090 << A->getAsString(Args) << "-static";
91}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
98 for ( ; *Arg; ++Arg) {
99 switch (*Arg) {
100 default: break;
101 case ' ':
102 case '\\':
103 Res.push_back('\\');
104 break;
105 }
106 Res.push_back(*Arg);
107 }
108}
109
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000110// Quote target names for inclusion in GNU Make dependency files.
111// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112static void QuoteTarget(StringRef Target,
113 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Bill Wendlingc0938f32012-03-12 22:10:06 +0000139static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000140 ArgStringList &CmdArgs,
141 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000142 const char *EnvVar) {
143 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 bool CombinedArg = false;
145
Bill Wendling281ca292012-03-12 21:22:35 +0000146 if (!DirList)
147 return; // Nothing to do.
148
Chad Rosier616e8a52012-10-30 21:42:09 +0000149 StringRef Name(ArgName);
150 if (Name.equals("-I") || Name.equals("-L"))
151 CombinedArg = true;
152
Bill Wendling281ca292012-03-12 21:22:35 +0000153 StringRef Dirs(DirList);
154 if (Dirs.empty()) // Empty string should not add '.'.
155 return;
156
157 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000158 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000159 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000160 if (CombinedArg) {
161 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
162 } else {
163 CmdArgs.push_back(ArgName);
164 CmdArgs.push_back(".");
165 }
Bill Wendling281ca292012-03-12 21:22:35 +0000166 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000167 if (CombinedArg) {
168 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
169 } else {
170 CmdArgs.push_back(ArgName);
171 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
172 }
Bill Wendling281ca292012-03-12 21:22:35 +0000173 }
Nico Weber89355782012-03-19 15:00:03 +0000174 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000175 }
176
177 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000178 if (CombinedArg) {
179 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
180 } else {
181 CmdArgs.push_back(ArgName);
182 CmdArgs.push_back(".");
183 }
Bill Wendling281ca292012-03-12 21:22:35 +0000184 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000185 if (CombinedArg) {
186 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
187 } else {
188 CmdArgs.push_back(ArgName);
189 CmdArgs.push_back(Args.MakeArgString(Dirs));
190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191 }
192}
193
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194static void AddLinkerInputs(const ToolChain &TC,
195 const InputInfoList &Inputs, const ArgList &Args,
196 ArgStringList &CmdArgs) {
197 const Driver &D = TC.getDriver();
198
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000199 // Add extra linker input arguments which are not treated as inputs
200 // (constructed via -Xarch_).
201 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
202
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000203 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000204 if (!TC.HasNativeLLVMSupport()) {
205 // Don't try to pass LLVM inputs unless we have native support.
206 if (II.getType() == types::TY_LLVM_IR ||
207 II.getType() == types::TY_LTO_IR ||
208 II.getType() == types::TY_LLVM_BC ||
209 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000210 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 << TC.getTripleString();
212 }
213
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000214 // Add filenames immediately.
215 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000216 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000217 continue;
218 }
219
220 // Otherwise, this is a linker input argument.
221 const Arg &A = II.getInputArg();
222
223 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000224 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000225 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000226 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000227 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000228 else if (A.getOption().matches(options::OPT_z)) {
229 // Pass -z prefix for gcc linker compatibility.
230 A.claim();
231 A.render(Args, CmdArgs);
232 } else {
233 A.renderAsInput(Args, CmdArgs);
234 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000235 }
Bill Wendling281ca292012-03-12 21:22:35 +0000236
237 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000238 // and only supported on native toolchains.
239 if (!TC.isCrossCompiling())
240 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000241}
242
John McCall31168b02011-06-15 23:02:42 +0000243/// \brief Determine whether Objective-C automated reference counting is
244/// enabled.
245static bool isObjCAutoRefCount(const ArgList &Args) {
246 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
247}
248
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249/// \brief Determine whether we are linking the ObjC runtime.
250static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000251 if (isObjCAutoRefCount(Args)) {
252 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000253 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000254 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000255 return Args.hasArg(options::OPT_fobjc_link_runtime);
256}
257
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000258static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000259 // Don't forward inputs from the original command line. They are added from
260 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000261 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000262 !O.hasFlag(options::DriverOption) &&
263 !O.hasFlag(options::LinkerInput);
264}
265
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000266void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000268 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000269 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000270 ArgStringList &CmdArgs,
271 const InputInfo &Output,
272 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000274
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000275 CheckPreprocessingOptions(D, Args);
276
277 Args.AddLastArg(CmdArgs, options::OPT_C);
278 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000279
280 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000281 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 (A = Args.getLastArg(options::OPT_MD)) ||
283 (A = Args.getLastArg(options::OPT_MMD))) {
284 // Determine the output location.
285 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000286 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000287 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000288 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000289 } else if (Output.getType() == types::TY_Dependencies) {
290 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000291 } else if (A->getOption().matches(options::OPT_M) ||
292 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 DepFile = "-";
294 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000295 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000296 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 }
298 CmdArgs.push_back("-dependency-file");
299 CmdArgs.push_back(DepFile);
300
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000301 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
303 const char *DepTarget;
304
305 // If user provided -o, that is the dependency target, except
306 // when we are only generating a dependency file.
307 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
308 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000309 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 } else {
311 // Otherwise derive from the base input.
312 //
313 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000315 llvm::sys::path::replace_extension(P, "o");
316 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 }
318
319 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 QuoteTarget(DepTarget, Quoted);
322 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000325 if (A->getOption().matches(options::OPT_M) ||
326 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000328 if ((isa<PrecompileJobAction>(JA) &&
329 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
330 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000331 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332 }
333
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000334 if (Args.hasArg(options::OPT_MG)) {
335 if (!A || A->getOption().matches(options::OPT_MD) ||
336 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000337 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000338 CmdArgs.push_back("-MG");
339 }
340
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000342 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000343
344 // Convert all -MQ <target> args to -MT <quoted target>
345 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
346 options::OPT_MQ),
347 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 const Arg *A = *it;
349 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350
Daniel Dunbara442fd52010-06-11 22:00:13 +0000351 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000353 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000354 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back(Args.MakeArgString(Quoted));
356
357 // -MT flag - no change
358 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000359 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000360 }
361 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 // Add -i* options, and automatically translate to
364 // -include-pch/-include-pth for transparent PCH support. It's
365 // wonky, but we include looking for .gch so we can support seamless
366 // replacement into a build system already set up to be generating
367 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000368 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000369 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
370 ie = Args.filtered_end(); it != ie; ++it) {
371 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372
373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
428 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000429 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
430 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
432 // Add -Wp, and -Xassembler if using the preprocessor.
433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000470 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000471 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000472 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000473
474 // Add system include arguments.
475 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000476}
477
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478// FIXME: Move to target hook.
479static bool isSignedCharDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return true;
483
Tim Northover9bb857a2013-01-31 12:13:10 +0000484 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000485 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000487 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000488 case llvm::Triple::thumb:
489 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000490 if (Triple.isOSDarwin() || Triple.isOSWindows())
491 return true;
492 return false;
493
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 case llvm::Triple::ppc:
495 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000496 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000497 return true;
498 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000499
Bill Schmidt778d3872013-07-26 01:36:11 +0000500 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000501 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000502 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000503 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000504 }
505}
506
Robert Lytton0e076492013-08-13 09:43:10 +0000507static bool isNoCommonDefault(const llvm::Triple &Triple) {
508 switch (Triple.getArch()) {
509 default:
510 return false;
511
512 case llvm::Triple::xcore:
513 return true;
514 }
515}
516
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000517// Handle -mhwdiv=.
518static void getARMHWDivFeatures(const Driver &D, const Arg *A,
519 const ArgList &Args,
520 std::vector<const char *> &Features) {
521 StringRef HWDiv = A->getValue();
522 if (HWDiv == "arm") {
523 Features.push_back("+hwdiv-arm");
524 Features.push_back("-hwdiv");
525 } else if (HWDiv == "thumb") {
526 Features.push_back("-hwdiv-arm");
527 Features.push_back("+hwdiv");
528 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
529 Features.push_back("+hwdiv-arm");
530 Features.push_back("+hwdiv");
531 } else if (HWDiv == "none") {
532 Features.push_back("-hwdiv-arm");
533 Features.push_back("-hwdiv");
534 } else
535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
539//
540// FIXME: Centralize feature selection, defaulting shouldn't be also in the
541// frontend target.
542static void getARMFPUFeatures(const Driver &D, const Arg *A,
543 const ArgList &Args,
544 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000545 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000546
Renato Golin0600e1e2015-05-08 21:04:50 +0000547 // FIXME: Why does "none" disable more than "invalid"?
548 if (FPU == "none") {
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000549 Features.push_back("-vfp2");
550 Features.push_back("-vfp3");
551 Features.push_back("-vfp4");
552 Features.push_back("-fp-armv8");
553 Features.push_back("-crypto");
554 Features.push_back("-neon");
Renato Golin0600e1e2015-05-08 21:04:50 +0000555 return;
556 }
557
558 // FIXME: Make sure we differentiate sp-only.
559 if (FPU.find("-sp-") != StringRef::npos) {
560 Features.push_back("+fp-only-sp");
561 }
562
563 // All other FPU types, valid or invalid.
564 switch(llvm::ARMTargetParser::parseFPU(FPU)) {
Renato Golincb3b0c62015-05-12 10:34:10 +0000565 case llvm::ARM::FK_INVALID:
566 case llvm::ARM::FK_SOFTVFP:
Renato Golin0600e1e2015-05-08 21:04:50 +0000567 Features.push_back("-vfp2");
568 Features.push_back("-vfp3");
569 Features.push_back("-neon");
570 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000571 case llvm::ARM::FK_VFP:
572 case llvm::ARM::FK_VFPV2:
Renato Golin0600e1e2015-05-08 21:04:50 +0000573 Features.push_back("+vfp2");
574 Features.push_back("-neon");
575 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000576 case llvm::ARM::FK_VFPV3_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000577 Features.push_back("+d16");
578 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000579 case llvm::ARM::FK_VFPV3:
Renato Golin0600e1e2015-05-08 21:04:50 +0000580 Features.push_back("+vfp3");
581 Features.push_back("-neon");
582 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000583 case llvm::ARM::FK_VFPV4_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000584 Features.push_back("+d16");
585 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000586 case llvm::ARM::FK_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000587 Features.push_back("+vfp4");
588 Features.push_back("-neon");
589 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000590 case llvm::ARM::FK_FPV5_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000591 Features.push_back("+d16");
592 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000593 case llvm::ARM::FK_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000594 Features.push_back("+fp-armv8");
595 Features.push_back("-neon");
596 Features.push_back("-crypto");
597 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000598 case llvm::ARM::FK_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000599 Features.push_back("+fp-armv8");
600 Features.push_back("+neon");
601 Features.push_back("-crypto");
602 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000603 case llvm::ARM::FK_CRYPTO_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000604 Features.push_back("+fp-armv8");
605 Features.push_back("+neon");
606 Features.push_back("+crypto");
607 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000608 case llvm::ARM::FK_NEON:
Renato Golin0600e1e2015-05-08 21:04:50 +0000609 Features.push_back("+neon");
610 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000611 case llvm::ARM::FK_NEON_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000612 Features.push_back("+neon");
613 Features.push_back("+vfp4");
614 break;
615 default:
Chad Rosiercfbfc582012-04-04 20:51:35 +0000616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Renato Golin0600e1e2015-05-08 21:04:50 +0000617 }
Chad Rosiercfbfc582012-04-04 20:51:35 +0000618}
619
John Brawn94fd9632015-05-21 12:19:49 +0000620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000621 llvm::StringRef Arch = Triple.getArchName();
622 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000623}
624
John Brawn94fd9632015-05-21 12:19:49 +0000625static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000626 llvm::StringRef Arch = Triple.getArchName();
627 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
628 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000629}
630
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000631// Select the float ABI as determined by -msoft-float, -mhard-float, and
632// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000633StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000634 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000635 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000636 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
637 options::OPT_mhard_float,
638 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 if (A->getOption().matches(options::OPT_msoft_float))
640 FloatABI = "soft";
641 else if (A->getOption().matches(options::OPT_mhard_float))
642 FloatABI = "hard";
643 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000644 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000646 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000647 << A->getAsString(Args);
648 FloatABI = "soft";
649 }
650 }
651 }
652
653 // If unspecified, choose the default based on the platform.
654 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000655 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000656 case llvm::Triple::Darwin:
657 case llvm::Triple::MacOSX:
658 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000659 // Darwin defaults to "softfp" for v6 and v7.
660 //
John Brawn94fd9632015-05-21 12:19:49 +0000661 if (getARMSubArchVersionNumber(Triple) == 6 ||
662 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000663 FloatABI = "softfp";
664 else
665 FloatABI = "soft";
666 break;
667 }
668
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000669 // FIXME: this is invalid for WindowsCE
670 case llvm::Triple::Win32:
671 FloatABI = "hard";
672 break;
673
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000674 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000675 switch(Triple.getEnvironment()) {
676 case llvm::Triple::GNUEABIHF:
677 FloatABI = "hard";
678 break;
679 default:
680 // FreeBSD defaults to soft float
681 FloatABI = "soft";
682 break;
683 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000684 break;
685
Daniel Dunbar78485922009-09-10 23:00:09 +0000686 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000687 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000688 case llvm::Triple::GNUEABIHF:
689 FloatABI = "hard";
690 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000691 case llvm::Triple::GNUEABI:
692 FloatABI = "softfp";
693 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000694 case llvm::Triple::EABIHF:
695 FloatABI = "hard";
696 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000697 case llvm::Triple::EABI:
698 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
699 FloatABI = "softfp";
700 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000701 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000702 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000703 FloatABI = "softfp";
704 else
705 FloatABI = "soft";
706 break;
707 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000708 default:
709 // Assume "soft", but warn the user we are guessing.
710 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000711 if (Triple.getOS() != llvm::Triple::UnknownOS ||
712 !Triple.isOSBinFormatMachO())
713 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000714 break;
715 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000716 }
717 }
718
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000719 return FloatABI;
720}
721
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000722static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
723 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000724 std::vector<const char *> &Features,
725 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000726 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
727 if (!ForAS) {
728 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
729 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
730 // stripped out by the ARM target. We should probably pass this a new
731 // -target-option, which is handled by the -cc1/-cc1as invocation.
732 //
733 // FIXME2: For consistency, it would be ideal if we set up the target
734 // machine state the same when using the frontend or the assembler. We don't
735 // currently do that for the assembler, we pass the options directly to the
736 // backend and never even instantiate the frontend TargetInfo. If we did,
737 // and used its handleTargetFeatures hook, then we could ensure the
738 // assembler and the frontend behave the same.
739
740 // Use software floating point operations?
741 if (FloatABI == "soft")
742 Features.push_back("+soft-float");
743
744 // Use software floating point argument passing?
745 if (FloatABI != "hard")
746 Features.push_back("+soft-float-abi");
747 }
748
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000749 // Honor -mfpu=.
750 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000751 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000752 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
753 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000754
John Brawn94fd9632015-05-21 12:19:49 +0000755 // Check if -march is valid by checking if it can be canonicalised. getARMArch
756 // is used here instead of just checking the -march value in order to handle
757 // -march=native correctly.
758 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
759 StringRef Arch = arm::getARMArch(Args, Triple);
760 if (llvm::ARMTargetParser::getCanonicalArchName(Arch).empty())
John Brawna95c1a82015-05-08 12:52:18 +0000761 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000762 }
763
764 // We do a similar thing with -mcpu, but here things are complicated because
765 // the only function we have to check if a cpu is valid is
766 // getLLVMArchSuffixForARM which also needs an architecture.
767 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
768 StringRef CPU = arm::getARMTargetCPU(Args, Triple);
769 StringRef Arch = arm::getARMArch(Args, Triple);
770 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
771 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
772 }
John Brawna95c1a82015-05-08 12:52:18 +0000773
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000774 // Setting -msoft-float effectively disables NEON because of the GCC
775 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000776 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000777 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000778 // Also need to explicitly disable features which imply NEON.
779 Features.push_back("-crypto");
780 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000781
Eric Christopher269c2a22015-04-04 03:34:43 +0000782 // En/disable crc code generation.
783 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000784 if (A->getOption().matches(options::OPT_mcrc))
785 Features.push_back("+crc");
786 else
787 Features.push_back("-crc");
788 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000789
790 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
791 Features.insert(Features.begin(), "+v8.1a");
792 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000793}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000794
795void Clang::AddARMTargetArgs(const ArgList &Args,
796 ArgStringList &CmdArgs,
797 bool KernelOrKext) const {
798 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000799 // Get the effective triple, which takes into account the deployment target.
800 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
801 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000802
803 // Select the ABI to use.
804 //
805 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000806 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000807 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000809 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000810 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000811 // The backend is hardwired to assume AAPCS for M-class processors, ensure
812 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000813 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000814 Triple.getOS() == llvm::Triple::UnknownOS ||
John Brawn94fd9632015-05-21 12:19:49 +0000815 isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000816 ABIName = "aapcs";
817 } else {
818 ABIName = "apcs-gnu";
819 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000820 } else if (Triple.isOSWindows()) {
821 // FIXME: this is invalid for WindowsCE
822 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000823 } else {
824 // Select the default based on the platform.
825 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000826 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000827 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000828 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000829 ABIName = "aapcs-linux";
830 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000831 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000832 case llvm::Triple::EABI:
833 ABIName = "aapcs";
834 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000835 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000836 if (Triple.getOS() == llvm::Triple::NetBSD)
837 ABIName = "apcs-gnu";
838 else
839 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000840 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000841 }
842 }
843 CmdArgs.push_back("-target-abi");
844 CmdArgs.push_back(ABIName);
845
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000846 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000847 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000848 if (FloatABI == "soft") {
849 // Floating point operations and argument passing are soft.
850 //
851 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000852 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000853 CmdArgs.push_back("-mfloat-abi");
854 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000855 } else if (FloatABI == "softfp") {
856 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000857 CmdArgs.push_back("-mfloat-abi");
858 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000859 } else {
860 // Floating point operations and argument passing are hard.
861 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000862 CmdArgs.push_back("-mfloat-abi");
863 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000864 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000865
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000866 // Kernel code has more strict alignment requirements.
867 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000868 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000869 CmdArgs.push_back("-backend-option");
870 CmdArgs.push_back("-arm-long-calls");
871 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000872
Daniel Dunbar12100e22011-03-22 16:48:17 +0000873 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000874 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000875
876 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000877 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000878 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000879 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000880
Bob Wilson0874e532014-07-29 00:23:18 +0000881 // -mkernel implies -mstrict-align; don't add the redundant option.
882 if (!KernelOrKext) {
883 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
884 options::OPT_munaligned_access)) {
885 CmdArgs.push_back("-backend-option");
886 if (A->getOption().matches(options::OPT_mno_unaligned_access))
887 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000888 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000889 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000890 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000891 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000892 }
Bob Wilson0874e532014-07-29 00:23:18 +0000893 }
894 }
895
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000896 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000897 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
898 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000899 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000900 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000901 CmdArgs.push_back("-arm-global-merge=false");
902 else
903 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000904 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000905
Bob Wilson9c8af452013-04-11 18:53:25 +0000906 if (!Args.hasFlag(options::OPT_mimplicit_float,
907 options::OPT_mno_implicit_float,
908 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000909 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000910
Logan Chien749763e2014-04-03 13:12:44 +0000911 // llvm does not support reserving registers in general. There is support
912 // for reserving r9 on ARM though (defined as a platform-specific register
913 // in ARM EABI).
914 if (Args.hasArg(options::OPT_ffixed_r9)) {
915 CmdArgs.push_back("-backend-option");
916 CmdArgs.push_back("-arm-reserve-r9");
917 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000918}
919
Tim Northover573cbee2014-05-24 12:52:07 +0000920/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
921/// targeting.
922static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000923 Arg *A;
924 std::string CPU;
925 // If we have -mtune or -mcpu, use that.
926 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
927 CPU = A->getValue();
928 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000929 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000930 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000931 }
932
Kevin Qin110db6f2014-07-18 07:03:22 +0000933 // Handle CPU name is 'native'.
934 if (CPU == "native")
935 return llvm::sys::getHostCPUName();
936 else if (CPU.size())
937 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000938
James Molloy9b1586b2014-04-17 12:51:17 +0000939 // Make sure we pick "cyclone" if -arch is used.
940 // FIXME: Should this be picked by checking the target triple instead?
941 if (Args.getLastArg(options::OPT_arch))
942 return "cyclone";
943
944 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000945}
946
Tim Northover573cbee2014-05-24 12:52:07 +0000947void Clang::AddAArch64TargetArgs(const ArgList &Args,
948 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000949 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
950 llvm::Triple Triple(TripleStr);
951
952 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
953 Args.hasArg(options::OPT_mkernel) ||
954 Args.hasArg(options::OPT_fapple_kext))
955 CmdArgs.push_back("-disable-red-zone");
956
957 if (!Args.hasFlag(options::OPT_mimplicit_float,
958 options::OPT_mno_implicit_float, true))
959 CmdArgs.push_back("-no-implicit-float");
960
Craig Topper92fc2df2014-05-17 16:56:41 +0000961 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000962 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
963 ABIName = A->getValue();
964 else if (Triple.isOSDarwin())
965 ABIName = "darwinpcs";
966 else
967 ABIName = "aapcs";
968
969 CmdArgs.push_back("-target-abi");
970 CmdArgs.push_back(ABIName);
971
Bob Wilson0874e532014-07-29 00:23:18 +0000972 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
973 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000974 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000975 if (A->getOption().matches(options::OPT_mno_unaligned_access))
976 CmdArgs.push_back("-aarch64-strict-align");
977 else
978 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000979 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000980
Bradley Smith9ff64332014-10-13 10:16:06 +0000981 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
982 options::OPT_mno_fix_cortex_a53_835769)) {
983 CmdArgs.push_back("-backend-option");
984 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
985 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
986 else
987 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000988 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
989 // Enabled A53 errata (835769) workaround by default on android
990 CmdArgs.push_back("-backend-option");
991 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000992 }
993
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000994 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000995 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
996 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000997 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000998 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000999 CmdArgs.push_back("-aarch64-global-merge=false");
1000 else
1001 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001002 }
Renato Golinb625f482015-01-25 23:17:48 +00001003
1004 if (Args.hasArg(options::OPT_ffixed_x18)) {
1005 CmdArgs.push_back("-backend-option");
1006 CmdArgs.push_back("-aarch64-reserve-x18");
1007 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001008}
1009
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001010// Get CPU and ABI names. They are not independent
1011// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001012void mips::getMipsCPUAndABI(const ArgList &Args,
1013 const llvm::Triple &Triple,
1014 StringRef &CPUName,
1015 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001016 const char *DefMips32CPU = "mips32r2";
1017 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001018
Daniel Sanders2bf13662014-07-10 14:40:57 +00001019 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1020 // default for mips64(el)?-img-linux-gnu.
1021 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1022 Triple.getEnvironment() == llvm::Triple::GNU) {
1023 DefMips32CPU = "mips32r6";
1024 DefMips64CPU = "mips64r6";
1025 }
1026
Brad Smithba26f582015-01-06 02:53:17 +00001027 // MIPS3 is the default for mips64*-unknown-openbsd.
1028 if (Triple.getOS() == llvm::Triple::OpenBSD)
1029 DefMips64CPU = "mips3";
1030
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001031 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001032 options::OPT_mcpu_EQ))
1033 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001034
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001035 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001036 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001037 // Convert a GNU style Mips ABI name to the name
1038 // accepted by LLVM Mips backend.
1039 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1040 .Case("32", "o32")
1041 .Case("64", "n64")
1042 .Default(ABIName);
1043 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001044
1045 // Setup default CPU and ABI names.
1046 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001047 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001048 default:
1049 llvm_unreachable("Unexpected triple arch name");
1050 case llvm::Triple::mips:
1051 case llvm::Triple::mipsel:
1052 CPUName = DefMips32CPU;
1053 break;
1054 case llvm::Triple::mips64:
1055 case llvm::Triple::mips64el:
1056 CPUName = DefMips64CPU;
1057 break;
1058 }
1059 }
1060
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001061 if (ABIName.empty()) {
1062 // Deduce ABI name from the target triple.
1063 if (Triple.getArch() == llvm::Triple::mips ||
1064 Triple.getArch() == llvm::Triple::mipsel)
1065 ABIName = "o32";
1066 else
1067 ABIName = "n64";
1068 }
1069
1070 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001071 // Deduce CPU name from ABI name.
1072 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001073 .Cases("o32", "eabi", DefMips32CPU)
1074 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001075 .Default("");
1076 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001077
1078 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001079}
1080
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001081// Convert ABI name to the GNU tools acceptable variant.
1082static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1083 return llvm::StringSwitch<llvm::StringRef>(ABI)
1084 .Case("o32", "32")
1085 .Case("n64", "64")
1086 .Default(ABI);
1087}
1088
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001089// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1090// and -mfloat-abi=.
1091static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001092 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001093 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001094 options::OPT_mhard_float,
1095 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001096 if (A->getOption().matches(options::OPT_msoft_float))
1097 FloatABI = "soft";
1098 else if (A->getOption().matches(options::OPT_mhard_float))
1099 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001100 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001101 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001102 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001103 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001104 FloatABI = "hard";
1105 }
1106 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001107 }
1108
1109 // If unspecified, choose the default based on the platform.
1110 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001111 // Assume "hard", because it's a default value used by gcc.
1112 // When we start to recognize specific target MIPS processors,
1113 // we will be able to select the default more correctly.
1114 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001115 }
1116
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001117 return FloatABI;
1118}
1119
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001120static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001121 std::vector<const char *> &Features,
1122 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001123 StringRef FeatureName) {
1124 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001125 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001126 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001128 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129 }
1130}
1131
Daniel Sanders379d44b2014-07-16 11:52:23 +00001132static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1133 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001134 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001135 StringRef CPUName;
1136 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001137 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001138 ABIName = getGnuCompatibleMipsABIName(ABIName);
1139
Daniel Sandersfeb61302014-08-08 15:47:17 +00001140 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1141 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001142
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001143 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001144 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001145 // FIXME: Note, this is a hack. We need to pass the selected float
1146 // mode to the MipsTargetInfoBase to define appropriate macros there.
1147 // Now it is the only method.
1148 Features.push_back("+soft-float");
1149 }
1150
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001151 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001152 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001153 if (Val == "2008") {
1154 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1155 Features.push_back("+nan2008");
1156 else {
1157 Features.push_back("-nan2008");
1158 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1159 }
1160 } else if (Val == "legacy") {
1161 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1162 Features.push_back("-nan2008");
1163 else {
1164 Features.push_back("+nan2008");
1165 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1166 }
1167 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001168 D.Diag(diag::err_drv_unsupported_option_argument)
1169 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001170 }
1171
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001172 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1173 options::OPT_mdouble_float, "single-float");
1174 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1175 "mips16");
1176 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1177 options::OPT_mno_micromips, "micromips");
1178 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1179 "dsp");
1180 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1181 "dspr2");
1182 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1183 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001184
1185 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1186 // pass -mfpxx
1187 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1188 options::OPT_mfp64)) {
1189 if (A->getOption().matches(options::OPT_mfp32))
1190 Features.push_back(Args.MakeArgString("-fp64"));
1191 else if (A->getOption().matches(options::OPT_mfpxx)) {
1192 Features.push_back(Args.MakeArgString("+fpxx"));
1193 Features.push_back(Args.MakeArgString("+nooddspreg"));
1194 } else
1195 Features.push_back(Args.MakeArgString("+fp64"));
1196 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001197 Features.push_back(Args.MakeArgString("+fpxx"));
1198 Features.push_back(Args.MakeArgString("+nooddspreg"));
1199 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001200
Daniel Sanders28e5d392014-07-10 10:39:51 +00001201 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1202 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001203}
1204
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001205void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001206 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001207 const Driver &D = getToolChain().getDriver();
1208 StringRef CPUName;
1209 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001210 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001211 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001212
1213 CmdArgs.push_back("-target-abi");
1214 CmdArgs.push_back(ABIName.data());
1215
1216 StringRef FloatABI = getMipsFloatABI(D, Args);
1217
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001218 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001219 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001220 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001221 CmdArgs.push_back("-mfloat-abi");
1222 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001223 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001224 else {
1225 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001226 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001227 CmdArgs.push_back("-mfloat-abi");
1228 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001230
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001231 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1232 if (A->getOption().matches(options::OPT_mxgot)) {
1233 CmdArgs.push_back("-mllvm");
1234 CmdArgs.push_back("-mxgot");
1235 }
1236 }
1237
Simon Atanasyanc580b322013-05-11 06:33:44 +00001238 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1239 options::OPT_mno_ldc1_sdc1)) {
1240 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1241 CmdArgs.push_back("-mllvm");
1242 CmdArgs.push_back("-mno-ldc1-sdc1");
1243 }
1244 }
1245
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001246 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1247 options::OPT_mno_check_zero_division)) {
1248 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1249 CmdArgs.push_back("-mllvm");
1250 CmdArgs.push_back("-mno-check-zero-division");
1251 }
1252 }
1253
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001254 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001255 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001256 CmdArgs.push_back("-mllvm");
1257 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1258 A->claim();
1259 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001260}
1261
Hal Finkel8eb59282012-06-11 22:35:19 +00001262/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1263static std::string getPPCTargetCPU(const ArgList &Args) {
1264 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001265 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001266
1267 if (CPUName == "native") {
1268 std::string CPU = llvm::sys::getHostCPUName();
1269 if (!CPU.empty() && CPU != "generic")
1270 return CPU;
1271 else
1272 return "";
1273 }
1274
1275 return llvm::StringSwitch<const char *>(CPUName)
1276 .Case("common", "generic")
1277 .Case("440", "440")
1278 .Case("440fp", "440")
1279 .Case("450", "450")
1280 .Case("601", "601")
1281 .Case("602", "602")
1282 .Case("603", "603")
1283 .Case("603e", "603e")
1284 .Case("603ev", "603ev")
1285 .Case("604", "604")
1286 .Case("604e", "604e")
1287 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001288 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001289 .Case("G3", "g3")
1290 .Case("7400", "7400")
1291 .Case("G4", "g4")
1292 .Case("7450", "7450")
1293 .Case("G4+", "g4+")
1294 .Case("750", "750")
1295 .Case("970", "970")
1296 .Case("G5", "g5")
1297 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001298 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001299 .Case("e500mc", "e500mc")
1300 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001301 .Case("power3", "pwr3")
1302 .Case("power4", "pwr4")
1303 .Case("power5", "pwr5")
1304 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001305 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001306 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001307 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001308 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001309 .Case("pwr3", "pwr3")
1310 .Case("pwr4", "pwr4")
1311 .Case("pwr5", "pwr5")
1312 .Case("pwr5x", "pwr5x")
1313 .Case("pwr6", "pwr6")
1314 .Case("pwr6x", "pwr6x")
1315 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001316 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001317 .Case("powerpc", "ppc")
1318 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001319 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001320 .Default("");
1321 }
1322
1323 return "";
1324}
1325
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001326static void getPPCTargetFeatures(const ArgList &Args,
1327 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001328 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1329 ie = Args.filtered_end();
1330 it != ie; ++it) {
1331 StringRef Name = (*it)->getOption().getName();
1332 (*it)->claim();
1333
1334 // Skip over "-m".
1335 assert(Name.startswith("m") && "Invalid feature name.");
1336 Name = Name.substr(1);
1337
1338 bool IsNegative = Name.startswith("no-");
1339 if (IsNegative)
1340 Name = Name.substr(3);
1341
1342 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1343 // pass the correct option to the backend while calling the frontend
1344 // option the same.
1345 // TODO: Change the LLVM backend option maybe?
1346 if (Name == "mfcrf")
1347 Name = "mfocrf";
1348
1349 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1350 }
1351
1352 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001353 AddTargetFeature(Args, Features, options::OPT_faltivec,
1354 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001355}
1356
Ulrich Weigand8afad612014-07-28 13:17:52 +00001357void Clang::AddPPCTargetArgs(const ArgList &Args,
1358 ArgStringList &CmdArgs) const {
1359 // Select the ABI to use.
1360 const char *ABIName = nullptr;
1361 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1362 ABIName = A->getValue();
1363 } else if (getToolChain().getTriple().isOSLinux())
1364 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001365 case llvm::Triple::ppc64: {
1366 // When targeting a processor that supports QPX, or if QPX is
1367 // specifically enabled, default to using the ABI that supports QPX (so
1368 // long as it is not specifically disabled).
1369 bool HasQPX = false;
1370 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1371 HasQPX = A->getValue() == StringRef("a2q");
1372 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1373 if (HasQPX) {
1374 ABIName = "elfv1-qpx";
1375 break;
1376 }
1377
Ulrich Weigand8afad612014-07-28 13:17:52 +00001378 ABIName = "elfv1";
1379 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001380 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001381 case llvm::Triple::ppc64le:
1382 ABIName = "elfv2";
1383 break;
1384 default:
1385 break;
1386 }
1387
1388 if (ABIName) {
1389 CmdArgs.push_back("-target-abi");
1390 CmdArgs.push_back(ABIName);
1391 }
1392}
1393
1394bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1395 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1396 return A && (A->getValue() == StringRef(Value));
1397}
1398
Tom Stellard6674c702013-04-01 20:56:53 +00001399/// Get the (LLVM) name of the R600 gpu we are targeting.
1400static std::string getR600TargetGPU(const ArgList &Args) {
1401 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001402 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001403 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001404 .Cases("rv630", "rv635", "r600")
1405 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001406 .Case("rv740", "rv770")
1407 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001408 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001409 .Case("hemlock", "cypress")
1410 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001411 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001412 }
1413 return "";
1414}
1415
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001416static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001417 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001418 bool SoftFloatABI = true;
1419 if (Arg *A =
1420 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1421 if (A->getOption().matches(options::OPT_mhard_float))
1422 SoftFloatABI = false;
1423 }
1424 if (SoftFloatABI)
1425 Features.push_back("+soft-float");
1426}
1427
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001428void Clang::AddSparcTargetArgs(const ArgList &Args,
1429 ArgStringList &CmdArgs) const {
1430 const Driver &D = getToolChain().getDriver();
1431
Brad Smith10cd0f42014-07-11 20:12:08 +00001432 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001433 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001434 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1435 options::OPT_mhard_float)) {
1436 if (A->getOption().matches(options::OPT_msoft_float))
1437 FloatABI = "soft";
1438 else if (A->getOption().matches(options::OPT_mhard_float))
1439 FloatABI = "hard";
1440 }
1441
1442 // If unspecified, choose the default based on the platform.
1443 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001444 // Assume "soft", but warn the user we are guessing.
1445 FloatABI = "soft";
1446 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001447 }
1448
1449 if (FloatABI == "soft") {
1450 // Floating point operations and argument passing are soft.
1451 //
1452 // FIXME: This changes CPP defines, we need -target-soft-float.
1453 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001454 } else {
1455 assert(FloatABI == "hard" && "Invalid float abi!");
1456 CmdArgs.push_back("-mhard-float");
1457 }
1458}
1459
Richard Sandiford4652d892013-07-19 16:51:51 +00001460static const char *getSystemZTargetCPU(const ArgList &Args) {
1461 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1462 return A->getValue();
1463 return "z10";
1464}
1465
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001466static void getSystemZTargetFeatures(const ArgList &Args,
1467 std::vector<const char *> &Features) {
1468 // -m(no-)htm overrides use of the transactional-execution facility.
1469 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1470 options::OPT_mno_htm)) {
1471 if (A->getOption().matches(options::OPT_mhtm))
1472 Features.push_back("+transactional-execution");
1473 else
1474 Features.push_back("-transactional-execution");
1475 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001476 // -m(no-)vx overrides use of the vector facility.
1477 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1478 options::OPT_mno_vx)) {
1479 if (A->getOption().matches(options::OPT_mvx))
1480 Features.push_back("+vector");
1481 else
1482 Features.push_back("-vector");
1483 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001484}
1485
Chandler Carruth953fb082013-01-13 11:46:33 +00001486static const char *getX86TargetCPU(const ArgList &Args,
1487 const llvm::Triple &Triple) {
1488 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001489 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001490 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001491 return "core-avx2";
1492
Chandler Carruth953fb082013-01-13 11:46:33 +00001493 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001494 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001495
1496 // FIXME: Reject attempts to use -march=native unless the target matches
1497 // the host.
1498 //
1499 // FIXME: We should also incorporate the detected target features for use
1500 // with -native.
1501 std::string CPU = llvm::sys::getHostCPUName();
1502 if (!CPU.empty() && CPU != "generic")
1503 return Args.MakeArgString(CPU);
1504 }
1505
1506 // Select the default CPU if none was given (or detection failed).
1507
1508 if (Triple.getArch() != llvm::Triple::x86_64 &&
1509 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001510 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001511
1512 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1513
1514 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001515 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001516 if (Triple.getArchName() == "x86_64h")
1517 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001518 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001519 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001520
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001521 // Set up default CPU name for PS4 compilers.
1522 if (Triple.isPS4CPU())
1523 return "btver2";
1524
Alexey Bataev286d1b92014-01-31 04:07:13 +00001525 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001526 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001527 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001528
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001529 // Everything else goes to x86-64 in 64-bit mode.
1530 if (Is64Bit)
1531 return "x86-64";
1532
1533 switch (Triple.getOS()) {
1534 case llvm::Triple::FreeBSD:
1535 case llvm::Triple::NetBSD:
1536 case llvm::Triple::OpenBSD:
1537 return "i486";
1538 case llvm::Triple::Haiku:
1539 return "i586";
1540 case llvm::Triple::Bitrig:
1541 return "i686";
1542 default:
1543 // Fallback to p4.
1544 return "pentium4";
1545 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001546}
1547
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001548static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1549 switch(T.getArch()) {
1550 default:
1551 return "";
1552
Amara Emerson703da2e2013-10-31 09:32:33 +00001553 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001554 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001555 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001556
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001557 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001558 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001559 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001560 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001561 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001562
1563 case llvm::Triple::mips:
1564 case llvm::Triple::mipsel:
1565 case llvm::Triple::mips64:
1566 case llvm::Triple::mips64el: {
1567 StringRef CPUName;
1568 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001569 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001570 return CPUName;
1571 }
1572
1573 case llvm::Triple::ppc:
1574 case llvm::Triple::ppc64:
1575 case llvm::Triple::ppc64le: {
1576 std::string TargetCPUName = getPPCTargetCPU(Args);
1577 // LLVM may default to generating code for the native CPU,
1578 // but, like gcc, we default to a more generic option for
1579 // each architecture. (except on Darwin)
1580 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1581 if (T.getArch() == llvm::Triple::ppc64)
1582 TargetCPUName = "ppc64";
1583 else if (T.getArch() == llvm::Triple::ppc64le)
1584 TargetCPUName = "ppc64le";
1585 else
1586 TargetCPUName = "ppc";
1587 }
1588 return TargetCPUName;
1589 }
1590
1591 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001592 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001593 case llvm::Triple::sparcv9:
1594 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001595 return A->getValue();
1596 return "";
1597
1598 case llvm::Triple::x86:
1599 case llvm::Triple::x86_64:
1600 return getX86TargetCPU(Args, T);
1601
1602 case llvm::Triple::hexagon:
1603 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1604
1605 case llvm::Triple::systemz:
1606 return getSystemZTargetCPU(Args);
1607
1608 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001609 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001610 return getR600TargetGPU(Args);
1611 }
1612}
1613
Alp Tokerce365ca2013-12-02 12:43:03 +00001614static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1615 ArgStringList &CmdArgs) {
1616 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1617 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1618 // forward.
1619 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001620 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001621 CmdArgs.push_back(Args.MakeArgString(Plugin));
1622
1623 // Try to pass driver level flags relevant to LTO code generation down to
1624 // the plugin.
1625
1626 // Handle flags for selecting CPU variants.
1627 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1628 if (!CPU.empty())
1629 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1630}
1631
Eric Christopherc54920a2015-03-23 19:26:05 +00001632static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001633 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001634 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001635 // If -march=native, autodetect the feature list.
1636 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1637 if (StringRef(A->getValue()) == "native") {
1638 llvm::StringMap<bool> HostFeatures;
1639 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1640 for (auto &F : HostFeatures)
1641 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1642 F.first()));
1643 }
1644 }
1645
Jim Grosbach82eee262013-11-16 00:53:35 +00001646 if (Triple.getArchName() == "x86_64h") {
1647 // x86_64h implies quite a few of the more modern subtarget features
1648 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1649 Features.push_back("-rdrnd");
1650 Features.push_back("-aes");
1651 Features.push_back("-pclmul");
1652 Features.push_back("-rtm");
1653 Features.push_back("-hle");
1654 Features.push_back("-fsgsbase");
1655 }
1656
Eric Christopherc54920a2015-03-23 19:26:05 +00001657 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001658 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001659 if (Triple.getArch() == llvm::Triple::x86_64) {
1660 Features.push_back("+sse4.2");
1661 Features.push_back("+popcnt");
1662 } else
1663 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001664 }
1665
Eric Christopherc54920a2015-03-23 19:26:05 +00001666 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001667 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1668 StringRef Arch = A->getValue();
1669 bool ArchUsed = false;
1670 // First, look for flags that are shared in x86 and x86-64.
1671 if (Triple.getArch() == llvm::Triple::x86_64 ||
1672 Triple.getArch() == llvm::Triple::x86) {
1673 if (Arch == "AVX" || Arch == "AVX2") {
1674 ArchUsed = true;
1675 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1676 }
1677 }
1678 // Then, look for x86-specific flags.
1679 if (Triple.getArch() == llvm::Triple::x86) {
1680 if (Arch == "IA32") {
1681 ArchUsed = true;
1682 } else if (Arch == "SSE" || Arch == "SSE2") {
1683 ArchUsed = true;
1684 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1685 }
1686 }
1687 if (!ArchUsed)
1688 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1689 }
1690
Jim Grosbach82eee262013-11-16 00:53:35 +00001691 // Now add any that the user explicitly requested on the command line,
1692 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001693 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1694 ie = Args.filtered_end();
1695 it != ie; ++it) {
1696 StringRef Name = (*it)->getOption().getName();
1697 (*it)->claim();
1698
1699 // Skip over "-m".
1700 assert(Name.startswith("m") && "Invalid feature name.");
1701 Name = Name.substr(1);
1702
1703 bool IsNegative = Name.startswith("no-");
1704 if (IsNegative)
1705 Name = Name.substr(3);
1706
1707 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1708 }
1709}
1710
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001711void Clang::AddX86TargetArgs(const ArgList &Args,
1712 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001713 if (!Args.hasFlag(options::OPT_mred_zone,
1714 options::OPT_mno_red_zone,
1715 true) ||
1716 Args.hasArg(options::OPT_mkernel) ||
1717 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001718 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001719
Bob Wilson2616e2e2013-02-10 16:01:41 +00001720 // Default to avoid implicit floating-point for kernel/kext code, but allow
1721 // that to be overridden with -mno-soft-float.
1722 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1723 Args.hasArg(options::OPT_fapple_kext));
1724 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1725 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001726 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001727 options::OPT_mno_implicit_float)) {
1728 const Option &O = A->getOption();
1729 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1730 O.matches(options::OPT_msoft_float));
1731 }
1732 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001733 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001734
1735 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1736 StringRef Value = A->getValue();
1737 if (Value == "intel" || Value == "att") {
1738 CmdArgs.push_back("-mllvm");
1739 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1740 } else {
1741 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1742 << A->getOption().getName() << Value;
1743 }
1744 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001745}
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
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001753 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1754 std::string SmallDataThreshold="-hexagon-small-data-threshold=";
1755 SmallDataThreshold += v;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001756 CmdArgs.push_back ("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001757 CmdArgs.push_back(Args.MakeArgString(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:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001949 case llvm::Triple::sparcel:
Brad Smithf436e9e2014-08-19 21:50:15 +00001950 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001951 getSparcTargetFeatures(Args, Features);
1952 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001953 case llvm::Triple::systemz:
1954 getSystemZTargetFeatures(Args, Features);
1955 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001956 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001957 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001958 getAArch64TargetFeatures(D, Args, Features);
1959 break;
1960 case llvm::Triple::x86:
1961 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001962 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001963 break;
1964 }
Rafael Espindola43964802013-08-21 17:34:32 +00001965
1966 // Find the last of each feature.
1967 llvm::StringMap<unsigned> LastOpt;
1968 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1969 const char *Name = Features[I];
1970 assert(Name[0] == '-' || Name[0] == '+');
1971 LastOpt[Name + 1] = I;
1972 }
1973
1974 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1975 // If this feature was overridden, ignore it.
1976 const char *Name = Features[I];
1977 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1978 assert(LastI != LastOpt.end());
1979 unsigned Last = LastI->second;
1980 if (Last != I)
1981 continue;
1982
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001983 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001984 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001985 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001986}
1987
David Majnemerae394812014-12-09 00:12:30 +00001988static bool
1989shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1990 const llvm::Triple &Triple) {
1991 // We use the zero-cost exception tables for Objective-C if the non-fragile
1992 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1993 // later.
1994 if (runtime.isNonFragile())
1995 return true;
1996
1997 if (!Triple.isMacOSX())
1998 return false;
1999
2000 return (!Triple.isMacOSXVersionLT(10,5) &&
2001 (Triple.getArch() == llvm::Triple::x86_64 ||
2002 Triple.getArch() == llvm::Triple::arm));
2003}
2004
Nico Webere8e53112014-05-11 01:04:02 +00002005// exceptionSettings() exists to share the logic between -cc1 and linker
2006// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002007static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002008 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002009 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002010 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002011 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002012
David Majnemer8de68642014-12-05 08:11:58 +00002013 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002014}
2015
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002016/// Adds exception related arguments to the driver command arguments. There's a
2017/// master flag, -fexceptions and also language specific flags to enable/disable
2018/// C++ and Objective-C exceptions. This makes it possible to for example
2019/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002020static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002021 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002022 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002023 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002024 const Driver &D = TC.getDriver();
2025 const llvm::Triple &Triple = TC.getTriple();
2026
Chad Rosier4fab82c2012-03-26 22:04:46 +00002027 if (KernelOrKext) {
2028 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2029 // arguments now to avoid warnings about unused arguments.
2030 Args.ClaimAllArgs(options::OPT_fexceptions);
2031 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2032 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2033 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2034 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2035 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002036 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002037 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002038
David Majnemer8de68642014-12-05 08:11:58 +00002039 // Gather the exception settings from the command line arguments.
2040 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002041
David Majnemerae394812014-12-09 00:12:30 +00002042 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2043 // is not necessarily sensible, but follows GCC.
2044 if (types::isObjC(InputType) &&
2045 Args.hasFlag(options::OPT_fobjc_exceptions,
2046 options::OPT_fno_objc_exceptions,
2047 true)) {
2048 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002049
David Majnemerae394812014-12-09 00:12:30 +00002050 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002051 }
2052
2053 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002054 bool CXXExceptionsEnabled =
2055 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002056 Arg *ExceptionArg = Args.getLastArg(
2057 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2058 options::OPT_fexceptions, options::OPT_fno_exceptions);
2059 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002060 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002061 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2062 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002063
2064 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002065 if (Triple.isPS4CPU()) {
2066 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2067 assert(ExceptionArg &&
2068 "On the PS4 exceptions should only be enabled if passing "
2069 "an argument");
2070 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2071 const Arg *RTTIArg = TC.getRTTIArg();
2072 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2073 D.Diag(diag::err_drv_argument_not_allowed_with)
2074 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2075 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2076 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2077 } else
2078 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2079
Anders Carlssone96ab552011-02-28 02:27:16 +00002080 CmdArgs.push_back("-fcxx-exceptions");
2081
David Majnemer8de68642014-12-05 08:11:58 +00002082 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002083 }
2084 }
2085
David Majnemer8de68642014-12-05 08:11:58 +00002086 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002087 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002088}
2089
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002090static bool ShouldDisableAutolink(const ArgList &Args,
2091 const ToolChain &TC) {
2092 bool Default = true;
2093 if (TC.getTriple().isOSDarwin()) {
2094 // The native darwin assembler doesn't support the linker_option directives,
2095 // so we disable them if we think the .s file will be passed to it.
2096 Default = TC.useIntegratedAs();
2097 }
2098 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2099 Default);
2100}
2101
Ted Kremenek62093662013-03-12 17:02:12 +00002102static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2103 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002104 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2105 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002106 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002107 return !UseDwarfDirectory;
2108}
2109
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002110/// \brief Check whether the given input tree contains any compilation actions.
2111static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002112 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002113 return true;
2114
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002115 for (const auto &Act : *A)
2116 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002117 return true;
2118
2119 return false;
2120}
2121
2122/// \brief Check if -relax-all should be passed to the internal assembler.
2123/// This is done by default when compiling non-assembler source with -O0.
2124static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2125 bool RelaxDefault = true;
2126
2127 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2128 RelaxDefault = A->getOption().matches(options::OPT_O0);
2129
2130 if (RelaxDefault) {
2131 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002132 for (const auto &Act : C.getActions()) {
2133 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002134 RelaxDefault = true;
2135 break;
2136 }
2137 }
2138 }
2139
2140 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2141 RelaxDefault);
2142}
2143
David Blaikie9260ed62013-07-25 21:19:01 +00002144static void CollectArgsForIntegratedAssembler(Compilation &C,
2145 const ArgList &Args,
2146 ArgStringList &CmdArgs,
2147 const Driver &D) {
2148 if (UseRelaxAll(C, Args))
2149 CmdArgs.push_back("-mrelax-all");
2150
David Peixottodfb66142013-11-14 22:52:58 +00002151 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002152 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002153 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2154 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2155 // arg after parsing the '-I' arg.
2156 bool TakeNextArg = false;
2157
David Blaikie9260ed62013-07-25 21:19:01 +00002158 // When using an integrated assembler, translate -Wa, and -Xassembler
2159 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002160 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002161 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2162 options::OPT_Xassembler),
2163 ie = Args.filtered_end(); it != ie; ++it) {
2164 const Arg *A = *it;
2165 A->claim();
2166
2167 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2168 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002169 if (TakeNextArg) {
2170 CmdArgs.push_back(Value.data());
2171 TakeNextArg = false;
2172 continue;
2173 }
David Blaikie9260ed62013-07-25 21:19:01 +00002174
2175 if (Value == "-force_cpusubtype_ALL") {
2176 // Do nothing, this is the default and we don't support anything else.
2177 } else if (Value == "-L") {
2178 CmdArgs.push_back("-msave-temp-labels");
2179 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002180 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002181 } else if (Value == "--noexecstack") {
2182 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002183 } else if (Value == "-compress-debug-sections" ||
2184 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002185 CompressDebugSections = true;
2186 } else if (Value == "-nocompress-debug-sections" ||
2187 Value == "--nocompress-debug-sections") {
2188 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002189 } else if (Value.startswith("-I")) {
2190 CmdArgs.push_back(Value.data());
2191 // We need to consume the next argument if the current arg is a plain
2192 // -I. The next arg will be the include directory.
2193 if (Value == "-I")
2194 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002195 } else if (Value.startswith("-gdwarf-")) {
2196 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002197 } else {
2198 D.Diag(diag::err_drv_unsupported_option_argument)
2199 << A->getOption().getName() << Value;
2200 }
2201 }
2202 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002203 if (CompressDebugSections) {
2204 if (llvm::zlib::isAvailable())
2205 CmdArgs.push_back("-compress-debug-sections");
2206 else
2207 D.Diag(diag::warn_debug_compression_unavailable);
2208 }
David Blaikie9260ed62013-07-25 21:19:01 +00002209}
2210
Renato Goline807c122014-01-31 11:47:28 +00002211// Until ARM libraries are build separately, we have them all in one library
2212static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002213 // FIXME: handle 64-bit
2214 if (TC.getTriple().isOSWindows() &&
2215 !TC.getTriple().isWindowsItaniumEnvironment())
2216 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002217 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002218 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002219 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002220}
2221
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002222static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2223 // The runtimes are located in the OS-specific resource directory.
2224 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002225 const llvm::Triple &Triple = TC.getTriple();
2226 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002227 StringRef OSLibName =
2228 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002229 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002230 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002231}
2232
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002233static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002234 bool Shared = false) {
2235 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2236 ? "-android"
2237 : "";
2238
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002239 bool IsOSWindows = TC.getTriple().isOSWindows();
2240 StringRef Arch = getArchNameForCompilerRTLib(TC);
2241 const char *Prefix = IsOSWindows ? "" : "lib";
2242 const char *Suffix =
2243 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2244
2245 SmallString<128> Path = getCompilerRTLibDir(TC);
2246 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2247 Arch + Env + Suffix);
2248
2249 return Path;
2250}
2251
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002252// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002253// FIXME: Make sure we can also emit shared objects if they're requested
2254// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002255static void addClangRT(const ToolChain &TC, const ArgList &Args,
2256 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002257 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002258
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002259 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002260 // FIXME: why do we link against gcc when we are using compiler-rt?
2261 CmdArgs.push_back("-lgcc_s");
2262 if (TC.getDriver().CCCIsCXX())
2263 CmdArgs.push_back("-lgcc_eh");
2264 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002265}
2266
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002267static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2268 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002269 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2270 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002271 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002272 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002273 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002274 Args.hasArg(options::OPT_fcreate_profile) ||
2275 Args.hasArg(options::OPT_coverage)))
2276 return;
2277
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002278 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002279}
2280
Alexey Samsonov52550342014-09-15 19:58:40 +00002281static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2282 ArgStringList &CmdArgs, StringRef Sanitizer,
2283 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002284 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002285 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002286 if (!IsShared)
2287 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002288 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002289 if (!IsShared)
2290 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002291}
2292
Alexey Samsonov52550342014-09-15 19:58:40 +00002293// Tries to use a file with the list of dynamic symbols that need to be exported
2294// from the runtime library. Returns true if the file was found.
2295static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2296 ArgStringList &CmdArgs,
2297 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002298 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2299 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2300 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002301 return true;
2302 }
2303 return false;
2304}
2305
2306static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2307 ArgStringList &CmdArgs) {
2308 // Force linking against the system libraries sanitizers depends on
2309 // (see PR15823 why this is necessary).
2310 CmdArgs.push_back("--no-as-needed");
2311 CmdArgs.push_back("-lpthread");
2312 CmdArgs.push_back("-lrt");
2313 CmdArgs.push_back("-lm");
2314 // There's no libdl on FreeBSD.
2315 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2316 CmdArgs.push_back("-ldl");
2317}
2318
2319static void
2320collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2321 SmallVectorImpl<StringRef> &SharedRuntimes,
2322 SmallVectorImpl<StringRef> &StaticRuntimes,
2323 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2324 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2325 // Collect shared runtimes.
2326 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2327 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002328 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002329
Alexey Samsonov52550342014-09-15 19:58:40 +00002330 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002331 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002332 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2333 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002334 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002335 }
2336 if (SanArgs.needsAsanRt()) {
2337 if (SanArgs.needsSharedAsanRt()) {
2338 HelperStaticRuntimes.push_back("asan-preinit");
2339 } else {
2340 StaticRuntimes.push_back("asan");
2341 if (SanArgs.linkCXXRuntimes())
2342 StaticRuntimes.push_back("asan_cxx");
2343 }
2344 }
2345 if (SanArgs.needsDfsanRt())
2346 StaticRuntimes.push_back("dfsan");
2347 if (SanArgs.needsLsanRt())
2348 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002349 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002350 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002351 if (SanArgs.linkCXXRuntimes())
2352 StaticRuntimes.push_back("msan_cxx");
2353 }
2354 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002355 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002356 if (SanArgs.linkCXXRuntimes())
2357 StaticRuntimes.push_back("tsan_cxx");
2358 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002359 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002360 StaticRuntimes.push_back("ubsan_standalone");
2361 if (SanArgs.linkCXXRuntimes())
2362 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002363 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002364}
2365
Alexey Samsonov52550342014-09-15 19:58:40 +00002366// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2367// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2368static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002369 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002370 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2371 HelperStaticRuntimes;
2372 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2373 HelperStaticRuntimes);
2374 for (auto RT : SharedRuntimes)
2375 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2376 for (auto RT : HelperStaticRuntimes)
2377 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2378 bool AddExportDynamic = false;
2379 for (auto RT : StaticRuntimes) {
2380 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2381 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2382 }
2383 // If there is a static runtime with no dynamic list, force all the symbols
2384 // to be dynamic to be sure we export sanitizer interface functions.
2385 if (AddExportDynamic)
2386 CmdArgs.push_back("-export-dynamic");
2387 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002388}
2389
Reid Kleckner86ea7702015-02-04 23:45:07 +00002390static bool areOptimizationsEnabled(const ArgList &Args) {
2391 // Find the last -O arg and see if it is non-zero.
2392 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2393 return !A->getOption().matches(options::OPT_O0);
2394 // Defaults to -O0.
2395 return false;
2396}
2397
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002398static bool shouldUseFramePointerForTarget(const ArgList &Args,
2399 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002400 // XCore never wants frame pointers, regardless of OS.
2401 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002402 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002403 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002404
2405 if (Triple.isOSLinux()) {
2406 switch (Triple.getArch()) {
2407 // Don't use a frame pointer on linux if optimizing for certain targets.
2408 case llvm::Triple::mips64:
2409 case llvm::Triple::mips64el:
2410 case llvm::Triple::mips:
2411 case llvm::Triple::mipsel:
2412 case llvm::Triple::systemz:
2413 case llvm::Triple::x86:
2414 case llvm::Triple::x86_64:
2415 return !areOptimizationsEnabled(Args);
2416 default:
2417 return true;
2418 }
2419 }
2420
2421 if (Triple.isOSWindows()) {
2422 switch (Triple.getArch()) {
2423 case llvm::Triple::x86:
2424 return !areOptimizationsEnabled(Args);
2425 default:
2426 // All other supported Windows ISAs use xdata unwind information, so frame
2427 // pointers are not generally useful.
2428 return false;
2429 }
2430 }
2431
2432 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002433}
2434
Rafael Espindola224dd632011-12-14 21:02:23 +00002435static bool shouldUseFramePointer(const ArgList &Args,
2436 const llvm::Triple &Triple) {
2437 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2438 options::OPT_fomit_frame_pointer))
2439 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2440
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002441 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002442}
2443
Eric Christopherb7d97e92013-04-03 01:58:53 +00002444static bool shouldUseLeafFramePointer(const ArgList &Args,
2445 const llvm::Triple &Triple) {
2446 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2447 options::OPT_momit_leaf_frame_pointer))
2448 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2449
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002450 if (Triple.isPS4CPU())
2451 return false;
2452
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002453 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002454}
2455
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002456/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002457static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002458 SmallString<128> cwd;
2459 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002460 CmdArgs.push_back("-fdebug-compilation-dir");
2461 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002462 }
2463}
2464
Eric Christopherd3804002013-02-22 20:12:52 +00002465static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002466 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002467 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2468 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2469 SmallString<128> T(FinalOutput->getValue());
2470 llvm::sys::path::replace_extension(T, "dwo");
2471 return Args.MakeArgString(T);
2472 } else {
2473 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002474 SmallString<128> T(
2475 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002476 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002477 llvm::sys::path::replace_extension(F, "dwo");
2478 T += F;
2479 return Args.MakeArgString(F);
2480 }
2481}
2482
2483static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2484 const Tool &T, const JobAction &JA,
2485 const ArgList &Args, const InputInfo &Output,
2486 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002487 ArgStringList ExtractArgs;
2488 ExtractArgs.push_back("--extract-dwo");
2489
2490 ArgStringList StripArgs;
2491 StripArgs.push_back("--strip-dwo");
2492
2493 // Grabbing the output of the earlier compile step.
2494 StripArgs.push_back(Output.getFilename());
2495 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002496 ExtractArgs.push_back(OutFile);
2497
2498 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002499 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002500
2501 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002502 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002503
2504 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002505 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002506}
2507
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002508/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002509/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2510static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002511 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002512 if (A->getOption().matches(options::OPT_O4) ||
2513 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002514 return true;
2515
2516 if (A->getOption().matches(options::OPT_O0))
2517 return false;
2518
2519 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2520
Rafael Espindola91780de2013-08-26 14:05:41 +00002521 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002522 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002523 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002524 return true;
2525
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002526 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002527 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002528 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002529
2530 unsigned OptLevel = 0;
2531 if (S.getAsInteger(10, OptLevel))
2532 return false;
2533
2534 return OptLevel > 1;
2535 }
2536
2537 return false;
2538}
2539
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002540/// Add -x lang to \p CmdArgs for \p Input.
2541static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2542 ArgStringList &CmdArgs) {
2543 // When using -verify-pch, we don't want to provide the type
2544 // 'precompiled-header' if it was inferred from the file extension
2545 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2546 return;
2547
2548 CmdArgs.push_back("-x");
2549 if (Args.hasArg(options::OPT_rewrite_objc))
2550 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2551 else
2552 CmdArgs.push_back(types::getTypeName(Input.getType()));
2553}
2554
David Majnemerc371ff02015-03-22 08:39:22 +00002555static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002556 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002557 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002558
2559 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002560 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002561
2562 unsigned Build = 0, Factor = 1;
2563 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2564 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002565 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002566}
2567
Rafael Espindola577637a2015-01-03 00:06:04 +00002568// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002569// options that build systems might add but are unused when assembling or only
2570// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002571static void claimNoWarnArgs(const ArgList &Args) {
2572 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002573 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002574 Args.ClaimAllArgs(options::OPT_flto);
2575 Args.ClaimAllArgs(options::OPT_fno_lto);
2576}
2577
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002578static void appendUserToPath(SmallVectorImpl<char> &Result) {
2579#ifdef LLVM_ON_UNIX
2580 const char *Username = getenv("LOGNAME");
2581#else
2582 const char *Username = getenv("USERNAME");
2583#endif
2584 if (Username) {
2585 // Validate that LoginName can be used in a path, and get its length.
2586 size_t Len = 0;
2587 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002588 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002589 Username = nullptr;
2590 break;
2591 }
2592 }
2593
2594 if (Username && Len > 0) {
2595 Result.append(Username, Username + Len);
2596 return;
2597 }
2598 }
2599
2600 // Fallback to user id.
2601#ifdef LLVM_ON_UNIX
2602 std::string UID = llvm::utostr(getuid());
2603#else
2604 // FIXME: Windows seems to have an 'SID' that might work.
2605 std::string UID = "9999";
2606#endif
2607 Result.append(UID.begin(), UID.end());
2608}
2609
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002610void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002611 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002612 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002613 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002614 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002615 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2616 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002617 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002618 ArgStringList CmdArgs;
2619
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002620 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002621 bool IsWindowsCygnus =
2622 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002623 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2624
Daniel Dunbare521a892009-03-31 20:53:55 +00002625 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002626 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002627
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002628 // Invoke ourselves in -cc1 mode.
2629 //
2630 // FIXME: Implement custom jobs for internal actions.
2631 CmdArgs.push_back("-cc1");
2632
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002633 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002634 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002635 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002636 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002637
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002638 const llvm::Triple TT(TripleStr);
2639 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2640 TT.getArch() == llvm::Triple::thumb)) {
2641 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2642 unsigned Version;
2643 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2644 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002645 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2646 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002647 }
2648
Tim Northover336f1892014-03-29 13:16:12 +00002649 // Push all default warning arguments that are specific to
2650 // the given target. These come before user provided warning options
2651 // are provided.
2652 getToolChain().addClangWarningOptions(CmdArgs);
2653
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002654 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002655 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002656
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002657 if (isa<AnalyzeJobAction>(JA)) {
2658 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2659 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002660 } else if (isa<MigrateJobAction>(JA)) {
2661 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002662 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002663 if (Output.getType() == types::TY_Dependencies)
2664 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002665 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002666 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002667 if (Args.hasArg(options::OPT_rewrite_objc) &&
2668 !Args.hasArg(options::OPT_g_Group))
2669 CmdArgs.push_back("-P");
2670 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002671 } else if (isa<AssembleJobAction>(JA)) {
2672 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002673
David Blaikie9260ed62013-07-25 21:19:01 +00002674 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002675
2676 // Also ignore explicit -force_cpusubtype_ALL option.
2677 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002678 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002679 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002680 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002681
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002682 if (JA.getType() == types::TY_Nothing)
2683 CmdArgs.push_back("-fsyntax-only");
2684 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002685 CmdArgs.push_back("-emit-pch");
2686 else
2687 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002688 } else if (isa<VerifyPCHJobAction>(JA)) {
2689 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002690 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002691 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2692 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002693
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002694 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002695 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002696 } else if (JA.getType() == types::TY_LLVM_IR ||
2697 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002698 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002699 } else if (JA.getType() == types::TY_LLVM_BC ||
2700 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002701 CmdArgs.push_back("-emit-llvm-bc");
2702 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002703 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002704 } else if (JA.getType() == types::TY_AST) {
2705 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002706 } else if (JA.getType() == types::TY_ModuleFile) {
2707 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002708 } else if (JA.getType() == types::TY_RewrittenObjC) {
2709 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002710 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002711 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2712 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002713 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002714 } else {
2715 assert(JA.getType() == types::TY_PP_Asm &&
2716 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002717 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002718
2719 // Preserve use-list order by default when emitting bitcode, so that
2720 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2721 // same result as running passes here. For LTO, we don't need to preserve
2722 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002723 if (JA.getType() == types::TY_LLVM_BC)
2724 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002725 }
2726
Justin Bognera88f0122014-06-20 22:59:50 +00002727 // We normally speed up the clang process a bit by skipping destructors at
2728 // exit, but when we're generating diagnostics we can rely on some of the
2729 // cleanup.
2730 if (!C.isForDiagnostics())
2731 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002732
John McCallbb79b5f2010-02-13 03:50:24 +00002733 // Disable the verification pass in -asserts builds.
2734#ifdef NDEBUG
2735 CmdArgs.push_back("-disable-llvm-verifier");
2736#endif
2737
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002738 // Set the main file name, so that debug info works even with
2739 // -save-temps.
2740 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002741 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002742
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002743 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002744 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002745 if (Args.hasArg(options::OPT_static))
2746 CmdArgs.push_back("-static-define");
2747
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002748 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002749 // Enable region store model by default.
2750 CmdArgs.push_back("-analyzer-store=region");
2751
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002752 // Treat blocks as analysis entry points.
2753 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2754
Ted Kremenek49c79792011-03-24 00:28:47 +00002755 CmdArgs.push_back("-analyzer-eagerly-assume");
2756
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002757 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002758 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002759 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002760
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002761 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002762 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002763
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002764 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002765 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002766
2767 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002768
Artem Belevichba558952015-05-06 18:20:23 +00002769 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002770 CmdArgs.push_back("-analyzer-checker=cplusplus");
2771
Nico Webere8e53112014-05-11 01:04:02 +00002772 // Enable the following experimental checkers for testing.
2773 CmdArgs.push_back(
2774 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2776 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2777 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2778 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2779 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002780 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002781
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002782 // Set the output format. The default is plist, for (lame) historical
2783 // reasons.
2784 CmdArgs.push_back("-analyzer-output");
2785 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002786 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002787 else
2788 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002789
Ted Kremenekfe449a22010-03-22 22:32:05 +00002790 // Disable the presentation of standard compiler warnings when
2791 // using --analyze. We only want to show static analyzer diagnostics
2792 // or frontend errors.
2793 CmdArgs.push_back("-w");
2794
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002795 // Add -Xanalyzer arguments when running as analyzer.
2796 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002797 }
2798
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002799 CheckCodeGenerationOptions(D, Args);
2800
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002801 bool PIE = getToolChain().isPIEDefault();
2802 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002803 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002804
Alexey Bataev40e75222014-01-28 06:30:35 +00002805 // Android-specific defaults for PIC/PIE
2806 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2807 switch (getToolChain().getTriple().getArch()) {
2808 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002809 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002810 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002811 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002812 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002813 case llvm::Triple::mips:
2814 case llvm::Triple::mipsel:
2815 case llvm::Triple::mips64:
2816 case llvm::Triple::mips64el:
2817 PIC = true; // "-fpic"
2818 break;
2819
2820 case llvm::Triple::x86:
2821 case llvm::Triple::x86_64:
2822 PIC = true; // "-fPIC"
2823 IsPICLevelTwo = true;
2824 break;
2825
2826 default:
2827 break;
2828 }
2829 }
2830
Brad Smith5b05db82014-06-24 19:51:29 +00002831 // OpenBSD-specific defaults for PIE
2832 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2833 switch (getToolChain().getTriple().getArch()) {
2834 case llvm::Triple::mips64:
2835 case llvm::Triple::mips64el:
2836 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002837 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002838 case llvm::Triple::x86:
2839 case llvm::Triple::x86_64:
2840 IsPICLevelTwo = false; // "-fpie"
2841 break;
2842
2843 case llvm::Triple::ppc:
2844 case llvm::Triple::sparcv9:
2845 IsPICLevelTwo = true; // "-fPIE"
2846 break;
2847
2848 default:
2849 break;
2850 }
2851 }
2852
Alexey Samsonov090301e2013-04-09 12:28:19 +00002853 // For the PIC and PIE flag options, this logic is different from the
2854 // legacy logic in very old versions of GCC, as that logic was just
2855 // a bug no one had ever fixed. This logic is both more rational and
2856 // consistent with GCC's new logic now that the bugs are fixed. The last
2857 // argument relating to either PIC or PIE wins, and no other argument is
2858 // used. If the last argument is any flavor of the '-fno-...' arguments,
2859 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2860 // at the same level.
2861 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2862 options::OPT_fpic, options::OPT_fno_pic,
2863 options::OPT_fPIE, options::OPT_fno_PIE,
2864 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002865 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2866 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002867 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002868 if (LastPICArg) {
2869 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002870 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2871 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2872 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2873 PIC = PIE || O.matches(options::OPT_fPIC) ||
2874 O.matches(options::OPT_fpic);
2875 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2876 O.matches(options::OPT_fPIC);
2877 } else {
2878 PIE = PIC = false;
2879 }
2880 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002881 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002882
Nick Lewycky609dd662013-10-11 03:33:53 +00002883 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002884 // specified while enabling PIC enabled level 1 PIC, just force it back to
2885 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2886 // informal testing).
2887 if (PIC && getToolChain().getTriple().isOSDarwin())
2888 IsPICLevelTwo |= getToolChain().isPICDefault();
2889
Chandler Carruthc0c04552012-04-08 16:40:35 +00002890 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2891 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002892 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002893 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002894 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002895 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002896 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002897
Chandler Carruth76a943b2012-11-19 03:52:03 +00002898 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2899 // This is a very special mode. It trumps the other modes, almost no one
2900 // uses it, and it isn't even valid on any OS but Darwin.
2901 if (!getToolChain().getTriple().isOSDarwin())
2902 D.Diag(diag::err_drv_unsupported_opt_for_target)
2903 << A->getSpelling() << getToolChain().getTriple().str();
2904
2905 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2906
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002907 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002908 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002909
Chandler Carruth76a943b2012-11-19 03:52:03 +00002910 // Only a forced PIC mode can cause the actual compile to have PIC defines
2911 // etc., no flags are sufficient. This behavior was selected to closely
2912 // match that of llvm-gcc and Apple GCC before that.
2913 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2914 CmdArgs.push_back("-pic-level");
2915 CmdArgs.push_back("2");
2916 }
2917 } else {
2918 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2919 // handled in Clang's IRGen by the -pie-level flag.
2920 CmdArgs.push_back("-mrelocation-model");
2921 CmdArgs.push_back(PIC ? "pic" : "static");
2922
2923 if (PIC) {
2924 CmdArgs.push_back("-pic-level");
2925 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2926 if (PIE) {
2927 CmdArgs.push_back("-pie-level");
2928 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2929 }
2930 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002931 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002932
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002933 CmdArgs.push_back("-mthread-model");
2934 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2935 CmdArgs.push_back(A->getValue());
2936 else
2937 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2938
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002939 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2940
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002941 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2942 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002943 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002944
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002945 // LLVM Code Generator Options.
2946
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002947 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2948 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2949 for (arg_iterator
2950 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2951 options::OPT_frewrite_map_file_EQ),
2952 MFE = Args.filtered_end();
2953 MFI != MFE; ++MFI) {
2954 CmdArgs.push_back("-frewrite-map-file");
2955 CmdArgs.push_back((*MFI)->getValue());
2956 (*MFI)->claim();
2957 }
2958 }
2959
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002960 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2961 StringRef v = A->getValue();
2962 CmdArgs.push_back("-mllvm");
2963 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2964 A->claim();
2965 }
2966
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002967 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2968 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002969 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002970 }
2971
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002972 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2973 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002974 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002975 D.Diag(diag::err_drv_unsupported_opt_for_target)
2976 << A->getSpelling() << getToolChain().getTriple().str();
2977 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2978 CmdArgs.push_back("-fpcc-struct-return");
2979 } else {
2980 assert(A->getOption().matches(options::OPT_freg_struct_return));
2981 CmdArgs.push_back("-freg-struct-return");
2982 }
2983 }
2984
Roman Divacky65b88cd2011-03-01 17:40:53 +00002985 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2986 CmdArgs.push_back("-mrtd");
2987
Rafael Espindola224dd632011-12-14 21:02:23 +00002988 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002989 CmdArgs.push_back("-mdisable-fp-elim");
2990 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2991 options::OPT_fno_zero_initialized_in_bss))
2992 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002993
2994 bool OFastEnabled = isOptimizationLevelFast(Args);
2995 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2996 // enabled. This alias option is being used to simplify the hasFlag logic.
2997 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2998 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002999 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3000 // doesn't do any TBAA.
3001 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003002 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003003 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003004 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003005 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3006 options::OPT_fno_struct_path_tbaa))
3007 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003008 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3009 false))
3010 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003011 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3012 options::OPT_fno_optimize_sibling_calls))
3013 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003014
Eric Christopher006208c2013-04-04 06:29:47 +00003015 // Handle segmented stacks.
3016 if (Args.hasArg(options::OPT_fsplit_stack))
3017 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003018
3019 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3020 // This alias option is being used to simplify the getLastArg logic.
3021 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3022 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003023
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003024 // Handle various floating point optimization flags, mapping them to the
3025 // appropriate LLVM code generation flags. The pattern for all of these is to
3026 // default off the codegen optimizations, and if any flag enables them and no
3027 // flag disables them after the flag enabling them, enable the codegen
3028 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003029 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003030 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003031 options::OPT_ffinite_math_only,
3032 options::OPT_fno_finite_math_only,
3033 options::OPT_fhonor_infinities,
3034 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003035 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3036 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003037 A->getOption().getID() != options::OPT_fhonor_infinities)
3038 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003039 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003040 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003041 options::OPT_ffinite_math_only,
3042 options::OPT_fno_finite_math_only,
3043 options::OPT_fhonor_nans,
3044 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003045 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3046 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003047 A->getOption().getID() != options::OPT_fhonor_nans)
3048 CmdArgs.push_back("-menable-no-nans");
3049
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003050 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3051 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003052 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003053 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003054 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003055 options::OPT_fno_math_errno)) {
3056 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3057 // However, turning *off* -ffast_math merely restores the toolchain default
3058 // (which may be false).
3059 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3060 A->getOption().getID() == options::OPT_ffast_math ||
3061 A->getOption().getID() == options::OPT_Ofast)
3062 MathErrno = false;
3063 else if (A->getOption().getID() == options::OPT_fmath_errno)
3064 MathErrno = true;
3065 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003066 if (MathErrno)
3067 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003068
3069 // There are several flags which require disabling very specific
3070 // optimizations. Any of these being disabled forces us to turn off the
3071 // entire set of LLVM optimizations, so collect them through all the flag
3072 // madness.
3073 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003074 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003075 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003076 options::OPT_funsafe_math_optimizations,
3077 options::OPT_fno_unsafe_math_optimizations,
3078 options::OPT_fassociative_math,
3079 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003080 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3081 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003082 A->getOption().getID() != options::OPT_fno_associative_math)
3083 AssociativeMath = true;
3084 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003085 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003086 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003087 options::OPT_funsafe_math_optimizations,
3088 options::OPT_fno_unsafe_math_optimizations,
3089 options::OPT_freciprocal_math,
3090 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003091 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3092 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003093 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3094 ReciprocalMath = true;
3095 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003096 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003097 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003098 options::OPT_funsafe_math_optimizations,
3099 options::OPT_fno_unsafe_math_optimizations,
3100 options::OPT_fsigned_zeros,
3101 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003102 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3103 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003104 A->getOption().getID() != options::OPT_fsigned_zeros)
3105 SignedZeros = false;
3106 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003107 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003108 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003109 options::OPT_funsafe_math_optimizations,
3110 options::OPT_fno_unsafe_math_optimizations,
3111 options::OPT_ftrapping_math,
3112 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003113 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3114 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003115 A->getOption().getID() != options::OPT_ftrapping_math)
3116 TrappingMath = false;
3117 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3118 !TrappingMath)
3119 CmdArgs.push_back("-menable-unsafe-fp-math");
3120
Sanjay Patel76c9e092015-01-23 16:40:50 +00003121 if (!SignedZeros)
3122 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003123
Sanjay Patel359b1052015-04-09 15:03:23 +00003124 if (ReciprocalMath)
3125 CmdArgs.push_back("-freciprocal-math");
3126
Lang Hamesaa53b932012-07-06 00:59:19 +00003127 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003128 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003129 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003130 options::OPT_ffp_contract)) {
3131 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003132 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003133 if (Val == "fast" || Val == "on" || Val == "off") {
3134 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3135 } else {
3136 D.Diag(diag::err_drv_unsupported_option_argument)
3137 << A->getOption().getName() << Val;
3138 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003139 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3140 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003141 // If fast-math is set then set the fp-contract mode to fast.
3142 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3143 }
3144 }
3145
Bob Wilson6a039162012-07-19 03:52:53 +00003146 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3147 // and if we find them, tell the frontend to provide the appropriate
3148 // preprocessor macros. This is distinct from enabling any optimizations as
3149 // these options induce language changes which must survive serialization
3150 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003151 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3152 options::OPT_fno_fast_math))
3153 if (!A->getOption().matches(options::OPT_fno_fast_math))
3154 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003155 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3156 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003157 if (A->getOption().matches(options::OPT_ffinite_math_only))
3158 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003159
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003160 // Decide whether to use verbose asm. Verbose assembly is the default on
3161 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003162 bool IsIntegratedAssemblerDefault =
3163 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003164 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003165 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003166 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003167 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003168
Rafael Espindolab8a12932015-05-22 20:44:03 +00003169 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3170 IsIntegratedAssemblerDefault))
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
John Brawn94fd9632015-05-21 12:19:49 +00003225 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003226 if (!CPU.empty()) {
3227 CmdArgs.push_back("-target-cpu");
3228 CmdArgs.push_back(Args.MakeArgString(CPU));
3229 }
3230
Rafael Espindolaeb265472013-08-21 21:59:03 +00003231 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3232 CmdArgs.push_back("-mfpmath");
3233 CmdArgs.push_back(A->getValue());
3234 }
3235
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003236 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003237 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003238
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003239 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003240 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003241 default:
3242 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003243
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003244 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003245 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003246 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003247 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003248 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003249 break;
3250
Tim Northover573cbee2014-05-24 12:52:07 +00003251 case llvm::Triple::aarch64:
3252 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003253 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003254 break;
3255
Eric Christopher0b26a612010-03-02 02:41:08 +00003256 case llvm::Triple::mips:
3257 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003258 case llvm::Triple::mips64:
3259 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003260 AddMIPSTargetArgs(Args, CmdArgs);
3261 break;
3262
Ulrich Weigand8afad612014-07-28 13:17:52 +00003263 case llvm::Triple::ppc:
3264 case llvm::Triple::ppc64:
3265 case llvm::Triple::ppc64le:
3266 AddPPCTargetArgs(Args, CmdArgs);
3267 break;
3268
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003269 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003270 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003271 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003272 AddSparcTargetArgs(Args, CmdArgs);
3273 break;
3274
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003275 case llvm::Triple::x86:
3276 case llvm::Triple::x86_64:
3277 AddX86TargetArgs(Args, CmdArgs);
3278 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003279
3280 case llvm::Triple::hexagon:
3281 AddHexagonTargetArgs(Args, CmdArgs);
3282 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003283 }
3284
Hans Wennborg75958c42013-08-08 00:17:41 +00003285 // Add clang-cl arguments.
3286 if (getToolChain().getDriver().IsCLMode())
3287 AddClangCLArgs(Args, CmdArgs);
3288
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003289 // Pass the linker version in use.
3290 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3291 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003292 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003293 }
3294
Eric Christopherb7d97e92013-04-03 01:58:53 +00003295 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003296 CmdArgs.push_back("-momit-leaf-frame-pointer");
3297
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003298 // Explicitly error on some things we know we don't support and can't just
3299 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003300 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003301 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3302 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003303 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003304 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003305 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003306 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3307 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003308 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003309 << Unsupported->getOption().getName();
3310 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003311 }
3312
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003313 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003314 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003315 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003316 CmdArgs.push_back("-header-include-file");
3317 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3318 D.CCPrintHeadersFilename : "-");
3319 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003320 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003321 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003322
Chad Rosierbe10f982011-08-02 17:58:04 +00003323 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003324 CmdArgs.push_back("-diagnostic-log-file");
3325 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3326 D.CCLogDiagnosticsFilename : "-");
3327 }
3328
Manman Ren17bdb0f2013-11-20 20:22:14 +00003329 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3330 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003331 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003332 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003333 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3334 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003335 // FIXME: we should support specifying dwarf version with
3336 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003337 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003338 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003339 const llvm::Triple &Triple = getToolChain().getTriple();
3340 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003341 Triple.getOS() == llvm::Triple::FreeBSD ||
3342 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003343 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003344 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003345 CmdArgs.push_back("-gdwarf-2");
3346 else if (A->getOption().matches(options::OPT_gdwarf_3))
3347 CmdArgs.push_back("-gdwarf-3");
3348 else if (A->getOption().matches(options::OPT_gdwarf_4))
3349 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003350 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003351 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003352 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003353 const llvm::Triple &Triple = getToolChain().getTriple();
3354 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003355 Triple.getOS() == llvm::Triple::FreeBSD ||
3356 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003357 CmdArgs.push_back("-gdwarf-2");
3358 else
3359 CmdArgs.push_back("-g");
3360 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003361 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003362
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003363 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3364 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003365 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3366 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003367 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003368
Eric Christopher138c32b2013-09-13 22:37:55 +00003369 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003370 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3371 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003372 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003373 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003374 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003375 CmdArgs.push_back("-g");
3376 CmdArgs.push_back("-backend-option");
3377 CmdArgs.push_back("-split-dwarf=Enable");
3378 }
3379
Eric Christopher138c32b2013-09-13 22:37:55 +00003380 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3381 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3382 CmdArgs.push_back("-backend-option");
3383 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3384 }
Eric Christophereec89c22013-06-18 00:03:50 +00003385
Eric Christopher0d403d22014-02-14 01:27:03 +00003386 // -gdwarf-aranges turns on the emission of the aranges section in the
3387 // backend.
3388 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3389 CmdArgs.push_back("-backend-option");
3390 CmdArgs.push_back("-generate-arange-section");
3391 }
3392
David Blaikief36d9ba2014-01-27 18:52:43 +00003393 if (Args.hasFlag(options::OPT_fdebug_types_section,
3394 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003395 CmdArgs.push_back("-backend-option");
3396 CmdArgs.push_back("-generate-type-units");
3397 }
Eric Christophereec89c22013-06-18 00:03:50 +00003398
Ed Schouten6e576152015-03-26 17:50:28 +00003399 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3400 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3401
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003402 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003403 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003404 CmdArgs.push_back("-ffunction-sections");
3405 }
3406
3407 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003408 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003409 CmdArgs.push_back("-fdata-sections");
3410 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003411
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003412 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003413 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003414 CmdArgs.push_back("-fno-unique-section-names");
3415
Chris Lattner3c77a352010-06-22 00:03:40 +00003416 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3417
Justin Bognera71e6812015-04-30 23:49:42 +00003418 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3419 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003420 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3421 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3422 D.Diag(diag::err_drv_argument_not_allowed_with)
3423 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3424
Justin Bognera71e6812015-04-30 23:49:42 +00003425 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3426 A->render(Args, CmdArgs);
3427 else
3428 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003429
3430 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3431 A->render(Args, CmdArgs);
3432 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3433 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3434
Nick Lewycky207bce32011-04-21 23:44:07 +00003435 if (Args.hasArg(options::OPT_ftest_coverage) ||
3436 Args.hasArg(options::OPT_coverage))
3437 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003438 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3439 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003440 Args.hasArg(options::OPT_coverage))
3441 CmdArgs.push_back("-femit-coverage-data");
3442
Alex Lorenzee024992014-08-04 18:41:51 +00003443 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003444 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3445 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003446 D.Diag(diag::err_drv_argument_only_allowed_with)
3447 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3448
3449 if (Args.hasArg(options::OPT_fcoverage_mapping))
3450 CmdArgs.push_back("-fcoverage-mapping");
3451
Nick Lewycky480cb992011-05-04 20:46:58 +00003452 if (C.getArgs().hasArg(options::OPT_c) ||
3453 C.getArgs().hasArg(options::OPT_S)) {
3454 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003455 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003456 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003457 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003458 CoverageFilename = FinalOutput->getValue();
3459 } else {
3460 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3461 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003462 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003463 SmallString<128> Pwd;
3464 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003465 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003466 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003467 }
3468 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003469 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003470 }
3471 }
3472
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003473 // Pass options for controlling the default header search paths.
3474 if (Args.hasArg(options::OPT_nostdinc)) {
3475 CmdArgs.push_back("-nostdsysteminc");
3476 CmdArgs.push_back("-nobuiltininc");
3477 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003478 if (Args.hasArg(options::OPT_nostdlibinc))
3479 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003480 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3481 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3482 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003483
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003484 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003485 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003486 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003487
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003488 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3489
Ted Kremenekf7639e12012-03-06 20:06:33 +00003490 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003491 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003492 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003493 options::OPT_ccc_arcmt_modify,
3494 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003495 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003496 switch (A->getOption().getID()) {
3497 default:
3498 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003499 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003500 CmdArgs.push_back("-arcmt-check");
3501 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003502 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003503 CmdArgs.push_back("-arcmt-modify");
3504 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003505 case options::OPT_ccc_arcmt_migrate:
3506 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003507 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003508 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003509
3510 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3511 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003512 break;
John McCalld70fb982011-06-15 23:25:17 +00003513 }
3514 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003515 } else {
3516 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3517 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3518 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003519 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003520
Ted Kremenekf7639e12012-03-06 20:06:33 +00003521 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3522 if (ARCMTEnabled) {
3523 D.Diag(diag::err_drv_argument_not_allowed_with)
3524 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3525 }
3526 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003527 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003528
3529 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003530 options::OPT_objcmt_migrate_subscripting,
3531 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003532 // None specified, means enable them all.
3533 CmdArgs.push_back("-objcmt-migrate-literals");
3534 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003535 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003536 } else {
3537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003540 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003541 } else {
3542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3551 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3552 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3553 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3554 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3555 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003556 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003557 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003558 }
3559
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003560 // Add preprocessing options like -I, -D, etc. if we are using the
3561 // preprocessor.
3562 //
3563 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003564 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003565 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566
Rafael Espindolaa7431922011-07-21 23:40:37 +00003567 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3568 // that "The compiler can only warn and ignore the option if not recognized".
3569 // When building with ccache, it will pass -D options to clang even on
3570 // preprocessed inputs and configure concludes that -fPIC is not supported.
3571 Args.ClaimAllArgs(options::OPT_D);
3572
Alp Toker7874bdc2013-11-15 20:40:58 +00003573 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003574 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3575 if (A->getOption().matches(options::OPT_O4)) {
3576 CmdArgs.push_back("-O3");
3577 D.Diag(diag::warn_O4_is_O3);
3578 } else {
3579 A->render(Args, CmdArgs);
3580 }
3581 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003582
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003583 // Warn about ignored options to clang.
3584 for (arg_iterator it = Args.filtered_begin(
3585 options::OPT_clang_ignored_gcc_optimization_f_Group),
3586 ie = Args.filtered_end(); it != ie; ++it) {
3587 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3588 }
3589
Rafael Espindola577637a2015-01-03 00:06:04 +00003590 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003591
Richard Smith3be1cb22014-08-07 00:24:21 +00003592 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003593 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003594 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3595 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003596 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003597 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003598
3599 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003600 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003601 //
3602 // If a std is supplied, only add -trigraphs if it follows the
3603 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003604 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003605 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3606 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003607 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003608 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003609 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003610 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003611 else
3612 Std->render(Args, CmdArgs);
3613
Nico Weber00721502014-12-23 22:32:37 +00003614 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003615 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003616 options::OPT_ftrigraphs,
3617 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003618 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003619 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003620 } else {
3621 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003622 //
3623 // FIXME: Clang doesn't correctly handle -std= when the input language
3624 // doesn't match. For the time being just ignore this for C++ inputs;
3625 // eventually we want to do all the standard defaulting here instead of
3626 // splitting it between the driver and clang -cc1.
3627 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003628 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3629 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003630 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003631 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003632
Nico Weber00721502014-12-23 22:32:37 +00003633 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3634 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003635 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003636
Richard Smith282b4492013-09-04 22:50:31 +00003637 // GCC's behavior for -Wwrite-strings is a bit strange:
3638 // * In C, this "warning flag" changes the types of string literals from
3639 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3640 // for the discarded qualifier.
3641 // * In C++, this is just a normal warning flag.
3642 //
3643 // Implementing this warning correctly in C is hard, so we follow GCC's
3644 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3645 // a non-const char* in C, rather than using this crude hack.
3646 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003647 // FIXME: This should behave just like a warning flag, and thus should also
3648 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3649 Arg *WriteStrings =
3650 Args.getLastArg(options::OPT_Wwrite_strings,
3651 options::OPT_Wno_write_strings, options::OPT_w);
3652 if (WriteStrings &&
3653 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003654 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003655 }
3656
Chandler Carruth61fbf622011-04-23 09:27:53 +00003657 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003658 // during C++ compilation, which it is by default. GCC keeps this define even
3659 // in the presence of '-w', match this behavior bug-for-bug.
3660 if (types::isCXX(InputType) &&
3661 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3662 true)) {
3663 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003664 }
3665
Chandler Carruthe0391482010-05-22 02:21:53 +00003666 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3667 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3668 if (Asm->getOption().matches(options::OPT_fasm))
3669 CmdArgs.push_back("-fgnu-keywords");
3670 else
3671 CmdArgs.push_back("-fno-gnu-keywords");
3672 }
3673
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003674 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3675 CmdArgs.push_back("-fno-dwarf-directory-asm");
3676
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003677 if (ShouldDisableAutolink(Args, getToolChain()))
3678 CmdArgs.push_back("-fno-autolink");
3679
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003680 // Add in -fdebug-compilation-dir if necessary.
3681 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003682
Richard Smith9a568822011-11-21 19:36:32 +00003683 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3684 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003685 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003686 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003687 }
3688
Richard Smith79c927b2013-11-06 19:31:51 +00003689 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3690 CmdArgs.push_back("-foperator-arrow-depth");
3691 CmdArgs.push_back(A->getValue());
3692 }
3693
Richard Smith9a568822011-11-21 19:36:32 +00003694 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3695 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003696 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003697 }
3698
Richard Smitha3d3bd22013-05-08 02:12:03 +00003699 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3700 CmdArgs.push_back("-fconstexpr-steps");
3701 CmdArgs.push_back(A->getValue());
3702 }
3703
Richard Smithb3a14522013-02-22 01:59:51 +00003704 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3705 CmdArgs.push_back("-fbracket-depth");
3706 CmdArgs.push_back(A->getValue());
3707 }
3708
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003709 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3710 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003711 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003712 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003713 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3714 } else
3715 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003716 }
3717
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003718
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003719 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003720 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003721
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003722 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3723 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003724 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003725 }
David Chisnall5778fce2009-08-31 16:41:57 +00003726
Chris Lattnere23003d2010-01-09 21:54:33 +00003727 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3728 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003729 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003730 }
3731
Chris Lattnerb35583d2010-04-07 20:49:23 +00003732 CmdArgs.push_back("-ferror-limit");
3733 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003734 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003735 else
3736 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003737
Chandler Carrutha77a7272010-05-06 04:55:18 +00003738 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3739 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003740 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003741 }
3742
3743 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3744 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003745 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003746 }
3747
Richard Smithf6f003a2011-12-16 19:06:07 +00003748 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3749 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003750 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003751 }
3752
Nick Lewycky24653262014-12-16 21:39:02 +00003753 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3754 CmdArgs.push_back("-fspell-checking-limit");
3755 CmdArgs.push_back(A->getValue());
3756 }
3757
Daniel Dunbar2c978472009-11-04 06:24:47 +00003758 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003759 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003760 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003761 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003762 } else {
3763 // If -fmessage-length=N was not specified, determine whether this is a
3764 // terminal and, if so, implicitly define -fmessage-length appropriately.
3765 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003766 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003767 }
3768
John McCallb4a99d32013-02-19 01:57:35 +00003769 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3770 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3771 options::OPT_fvisibility_ms_compat)) {
3772 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3773 CmdArgs.push_back("-fvisibility");
3774 CmdArgs.push_back(A->getValue());
3775 } else {
3776 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3777 CmdArgs.push_back("-fvisibility");
3778 CmdArgs.push_back("hidden");
3779 CmdArgs.push_back("-ftype-visibility");
3780 CmdArgs.push_back("default");
3781 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003782 }
3783
Douglas Gregor08329632010-06-15 17:05:35 +00003784 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003785
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003786 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3787
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003788 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003789 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3790 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003791 CmdArgs.push_back("-ffreestanding");
3792
Daniel Dunbare357d562009-12-03 18:42:11 +00003793 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003794 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003795 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003796 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3797 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003798 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003799 // AltiVec language extensions aren't relevant for assembling.
3800 if (!isa<PreprocessJobAction>(JA) ||
3801 Output.getType() != types::TY_PP_Asm)
3802 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003803 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3804 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003805
Alexey Bataevdb390212015-05-20 04:24:19 +00003806 // Forward flags for OpenMP
3807 if (Args.hasArg(options::OPT_fopenmp_EQ) ||
3808 Args.hasArg(options::OPT_fopenmp)) {
3809 CmdArgs.push_back("-fopenmp");
3810 }
3811
Peter Collingbourne32701642013-11-01 18:16:25 +00003812 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3813 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003814
Eric Christopher459d2712013-02-19 06:16:53 +00003815 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003816 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003817 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003818 getToolChain().getArch() == llvm::Triple::ppc64 ||
3819 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003820 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003821 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003822
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003823 if (getToolChain().SupportsProfiling())
3824 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003825
3826 // -flax-vector-conversions is default.
3827 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3828 options::OPT_fno_lax_vector_conversions))
3829 CmdArgs.push_back("-fno-lax-vector-conversions");
3830
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003831 if (Args.getLastArg(options::OPT_fapple_kext))
3832 CmdArgs.push_back("-fapple-kext");
3833
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003834 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003835 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003836 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003837 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3838 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003839
3840 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3841 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003842 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003843 }
3844
Bob Wilson14adb362012-02-03 06:27:22 +00003845 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003846
Chandler Carruth6e501032011-03-27 00:04:55 +00003847 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3848 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3849 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3850 options::OPT_fno_wrapv)) {
3851 if (A->getOption().matches(options::OPT_fwrapv))
3852 CmdArgs.push_back("-fwrapv");
3853 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3854 options::OPT_fno_strict_overflow)) {
3855 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3856 CmdArgs.push_back("-fwrapv");
3857 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003858
3859 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3860 options::OPT_fno_reroll_loops))
3861 if (A->getOption().matches(options::OPT_freroll_loops))
3862 CmdArgs.push_back("-freroll-loops");
3863
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003864 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003865 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3866 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003867
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003868 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3869
Mahesha S6a682be42012-10-27 07:47:56 +00003870
Daniel Dunbar4930e332009-11-17 08:07:36 +00003871 // -stack-protector=0 is default.
3872 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003873 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3874 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003875 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003876 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003877 if (A->getOption().matches(options::OPT_fstack_protector)) {
3878 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3879 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3880 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003881 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003882 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003883 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003884 } else {
3885 StackProtectorLevel =
3886 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3887 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003888 if (StackProtectorLevel) {
3889 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003890 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003891 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003892
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003893 // --param ssp-buffer-size=
3894 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3895 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003896 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003897 if (Str.startswith("ssp-buffer-size=")) {
3898 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003899 CmdArgs.push_back("-stack-protector-buffer-size");
3900 // FIXME: Verify the argument is a valid integer.
3901 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003902 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003903 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003904 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003905 }
3906
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003907 // Translate -mstackrealign
3908 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3909 false)) {
3910 CmdArgs.push_back("-backend-option");
3911 CmdArgs.push_back("-force-align-stack");
3912 }
3913 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3914 false)) {
3915 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3916 }
3917
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003918 if (Args.hasArg(options::OPT_mstack_alignment)) {
3919 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3920 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003921 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003922
Hans Wennborg77dc2362015-01-20 19:45:50 +00003923 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3924 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3925
3926 if (!Size.empty())
3927 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3928 else
3929 CmdArgs.push_back("-mstack-probe-size=0");
3930 }
3931
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003932 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3933 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3934 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3935
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003936 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3937 options::OPT_mno_restrict_it)) {
3938 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3939 CmdArgs.push_back("-backend-option");
3940 CmdArgs.push_back("-arm-restrict-it");
3941 } else {
3942 CmdArgs.push_back("-backend-option");
3943 CmdArgs.push_back("-arm-no-restrict-it");
3944 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003945 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3946 TT.getArch() == llvm::Triple::thumb)) {
3947 // Windows on ARM expects restricted IT blocks
3948 CmdArgs.push_back("-backend-option");
3949 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003950 }
3951
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003952 if (TT.getArch() == llvm::Triple::arm ||
3953 TT.getArch() == llvm::Triple::thumb) {
3954 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3955 options::OPT_mno_long_calls)) {
3956 if (A->getOption().matches(options::OPT_mlong_calls)) {
3957 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003958 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003959 }
3960 }
3961 }
3962
Daniel Dunbard18049a2009-04-07 21:16:11 +00003963 // Forward -f options with positive and negative forms; we translate
3964 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003965 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3966 StringRef fname = A->getValue();
3967 if (!llvm::sys::fs::exists(fname))
3968 D.Diag(diag::err_drv_no_such_file) << fname;
3969 else
3970 A->render(Args, CmdArgs);
3971 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003972
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003973 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003974 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003975 CmdArgs.push_back("-fapple-kext");
3976 if (!Args.hasArg(options::OPT_fbuiltin))
3977 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003978 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003979 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003980 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003981 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003982 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003983
Nuno Lopes13c88c72009-12-16 16:59:22 +00003984 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3985 options::OPT_fno_assume_sane_operator_new))
3986 CmdArgs.push_back("-fno-assume-sane-operator-new");
3987
Daniel Dunbar4930e332009-11-17 08:07:36 +00003988 // -fblocks=0 is default.
3989 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003990 getToolChain().IsBlocksDefault()) ||
3991 (Args.hasArg(options::OPT_fgnu_runtime) &&
3992 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3993 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003994 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003995
3996 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3997 !getToolChain().hasBlocksRuntime())
3998 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003999 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004000
Richard Smithffb65082014-09-30 23:10:19 +00004001 // -fmodules enables modules (off by default).
4002 // Users can pass -fno-cxx-modules to turn off modules support for
4003 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004004 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004005 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
4006 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4007 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004008 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004009 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004010 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004011 HaveModules = true;
4012 }
4013 }
4014
Daniel Jasper07e6c402013-08-05 20:26:17 +00004015 // -fmodule-maps enables module map processing (off by default) for header
4016 // checking. It is implied by -fmodules.
4017 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4018 false)) {
4019 CmdArgs.push_back("-fmodule-maps");
4020 }
4021
Daniel Jasperac42b752013-10-21 06:34:34 +00004022 // -fmodules-decluse checks that modules used are declared so (off by
4023 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004024 if (Args.hasFlag(options::OPT_fmodules_decluse,
4025 options::OPT_fno_modules_decluse,
4026 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004027 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004028 }
4029
Daniel Jasper962b38e2014-04-11 11:47:45 +00004030 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4031 // all #included headers are part of modules.
4032 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4033 options::OPT_fno_modules_strict_decluse,
4034 false)) {
4035 CmdArgs.push_back("-fmodules-strict-decluse");
4036 }
4037
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004038 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4039 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4040 options::OPT_fno_implicit_modules)) {
4041 CmdArgs.push_back("-fno-implicit-modules");
4042 }
4043
Daniel Jasperac42b752013-10-21 06:34:34 +00004044 // -fmodule-name specifies the module that is currently being built (or
4045 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004046 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004047
Richard Smith9887d792014-10-17 01:42:53 +00004048 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004049 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004050 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004051
Richard Smithe842a472014-10-22 02:05:46 +00004052 // -fmodule-file can be used to specify files containing precompiled modules.
4053 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4054
4055 // -fmodule-cache-path specifies where our implicitly-built module files
4056 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004057 SmallString<128> ModuleCachePath;
4058 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4059 ModuleCachePath = A->getValue();
4060 if (HaveModules) {
4061 if (C.isForDiagnostics()) {
4062 // When generating crash reports, we want to emit the modules along with
4063 // the reproduction sources, so we ignore any provided module path.
4064 ModuleCachePath = Output.getFilename();
4065 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4066 llvm::sys::path::append(ModuleCachePath, "modules");
4067 } else if (ModuleCachePath.empty()) {
4068 // No module path was provided: use the default.
4069 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4070 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004071 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4072 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004073 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4074 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004075 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004076 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4077 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4078 }
4079
4080 // When building modules and generating crashdumps, we need to dump a module
4081 // dependency VFS alongside the output.
4082 if (HaveModules && C.isForDiagnostics()) {
4083 SmallString<128> VFSDir(Output.getFilename());
4084 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004085 // Add the cache directory as a temp so the crash diagnostics pick it up.
4086 C.addTempFile(Args.MakeArgString(VFSDir));
4087
Justin Bognera88f0122014-06-20 22:59:50 +00004088 llvm::sys::path::append(VFSDir, "vfs");
4089 CmdArgs.push_back("-module-dependency-dir");
4090 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004091 }
4092
Richard Smith9887d792014-10-17 01:42:53 +00004093 if (HaveModules)
4094 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004095
Douglas Gregor35b04d62013-02-07 19:01:24 +00004096 // Pass through all -fmodules-ignore-macro arguments.
4097 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004098 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4099 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004100
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004101 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4102
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004103 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4104 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4105 D.Diag(diag::err_drv_argument_not_allowed_with)
4106 << A->getAsString(Args) << "-fbuild-session-timestamp";
4107
4108 llvm::sys::fs::file_status Status;
4109 if (llvm::sys::fs::status(A->getValue(), Status))
4110 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004111 CmdArgs.push_back(Args.MakeArgString(
4112 "-fbuild-session-timestamp=" +
4113 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004114 }
4115
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004116 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004117 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4118 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004119 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4120
4121 Args.AddLastArg(CmdArgs,
4122 options::OPT_fmodules_validate_once_per_build_session);
4123 }
4124
Ben Langmuirdcf73862014-03-12 00:06:17 +00004125 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4126
John McCalldfea9982010-04-09 19:12:06 +00004127 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004128 if (Args.hasFlag(options::OPT_fno_access_control,
4129 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004130 false))
John McCall3155f572010-04-09 19:03:51 +00004131 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004132
Anders Carlssond470fef2010-11-21 00:09:52 +00004133 // -felide-constructors is the default.
4134 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4135 options::OPT_felide_constructors,
4136 false))
4137 CmdArgs.push_back("-fno-elide-constructors");
4138
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004139 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004140
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004141 if (KernelOrKext || (types::isCXX(InputType) &&
4142 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4143 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004144 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004145
Tony Linthicum76329bf2011-12-12 21:14:55 +00004146 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004147 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004148 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004149 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004150 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004151 CmdArgs.push_back("-fshort-enums");
4152
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004153 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004154 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004155 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004156 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004157
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004158 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004159 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4160 options::OPT_fno_use_cxa_atexit,
4161 !IsWindowsCygnus && !IsWindowsGNU &&
4162 getToolChain().getArch() != llvm::Triple::hexagon &&
4163 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004164 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004165 CmdArgs.push_back("-fno-use-cxa-atexit");
4166
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004167 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004168 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004169 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004170 CmdArgs.push_back("-fms-extensions");
4171
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004172 // -fno-use-line-directives is default.
4173 if (Args.hasFlag(options::OPT_fuse_line_directives,
4174 options::OPT_fno_use_line_directives, false))
4175 CmdArgs.push_back("-fuse-line-directives");
4176
Francois Pichet1b4f1632011-09-17 04:32:15 +00004177 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004178 if (Args.hasFlag(options::OPT_fms_compatibility,
4179 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004180 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4181 options::OPT_fno_ms_extensions,
4182 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004183 CmdArgs.push_back("-fms-compatibility");
4184
David Majnemerc371ff02015-03-22 08:39:22 +00004185 // -fms-compatibility-version=18.00 is default.
4186 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004187 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004188 IsWindowsMSVC) ||
4189 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004190 Args.hasArg(options::OPT_fms_compatibility_version)) {
4191 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4192 const Arg *MSCompatibilityVersion =
4193 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004194
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004195 if (MSCVersion && MSCompatibilityVersion)
4196 D.Diag(diag::err_drv_argument_not_allowed_with)
4197 << MSCVersion->getAsString(Args)
4198 << MSCompatibilityVersion->getAsString(Args);
4199
David Majnemerc371ff02015-03-22 08:39:22 +00004200 if (MSCompatibilityVersion) {
4201 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4202 D.Diag(diag::err_drv_invalid_value)
4203 << MSCompatibilityVersion->getAsString(Args)
4204 << MSCompatibilityVersion->getValue();
4205 } else if (MSCVersion) {
4206 unsigned Version = 0;
4207 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4208 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4209 << MSCVersion->getValue();
4210 MSVT = getMSCompatibilityVersion(Version);
4211 } else {
4212 MSVT = VersionTuple(18);
4213 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004214
David Majnemerc371ff02015-03-22 08:39:22 +00004215 CmdArgs.push_back(
4216 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004217 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004218
David Majnemer8db91762015-05-18 04:49:30 +00004219 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4220 if (ImplyVCPPCXXVer) {
4221 if (IsMSVC2015Compatible)
4222 CmdArgs.push_back("-std=c++14");
4223 else
4224 CmdArgs.push_back("-std=c++11");
4225 }
4226
Eric Christopher5ecce122013-02-18 00:38:31 +00004227 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004228 if (Args.hasFlag(options::OPT_fborland_extensions,
4229 options::OPT_fno_borland_extensions, false))
4230 CmdArgs.push_back("-fborland-extensions");
4231
David Majnemerc371ff02015-03-22 08:39:22 +00004232 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4233 // than 19.
4234 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4235 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004236 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004237 CmdArgs.push_back("-fno-threadsafe-statics");
4238
Francois Pichet02744872011-09-01 16:38:08 +00004239 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4240 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004241 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004242 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004243 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004244
Chandler Carruthe03aa552010-04-17 20:17:31 +00004245 // -fgnu-keywords default varies depending on language; only pass if
4246 // specified.
4247 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004248 options::OPT_fno_gnu_keywords))
4249 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004250
Rafael Espindola922a6242011-06-02 17:30:53 +00004251 if (Args.hasFlag(options::OPT_fgnu89_inline,
4252 options::OPT_fno_gnu89_inline,
4253 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004254 CmdArgs.push_back("-fgnu89-inline");
4255
Chad Rosier9c76d242012-03-15 22:31:42 +00004256 if (Args.hasArg(options::OPT_fno_inline))
4257 CmdArgs.push_back("-fno-inline");
4258
Chad Rosier64d6be92012-03-06 21:17:19 +00004259 if (Args.hasArg(options::OPT_fno_inline_functions))
4260 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004261
John McCall5fb5df92012-06-20 06:18:46 +00004262 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004263
John McCall5fb5df92012-06-20 06:18:46 +00004264 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004265 // legacy is the default. Except for deployment taget of 10.5,
4266 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4267 // gets ignored silently.
4268 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004269 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4270 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004271 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004272 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004273 if (getToolChain().UseObjCMixedDispatch())
4274 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4275 else
4276 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4277 }
4278 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004279
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004280 // When ObjectiveC legacy runtime is in effect on MacOSX,
4281 // turn on the option to do Array/Dictionary subscripting
4282 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004283 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4284 getToolChain().getTriple().isMacOSX() &&
4285 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4286 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004287 objcRuntime.isNeXTFamily())
4288 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4289
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004290 // -fencode-extended-block-signature=1 is default.
4291 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4292 CmdArgs.push_back("-fencode-extended-block-signature");
4293 }
4294
John McCall24fc0de2011-07-06 00:26:06 +00004295 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4296 // NOTE: This logic is duplicated in ToolChains.cpp.
4297 bool ARC = isObjCAutoRefCount(Args);
4298 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004299 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004300
John McCall24fc0de2011-07-06 00:26:06 +00004301 CmdArgs.push_back("-fobjc-arc");
4302
Chandler Carruth491db322011-11-04 07:34:47 +00004303 // FIXME: It seems like this entire block, and several around it should be
4304 // wrapped in isObjC, but for now we just use it here as this is where it
4305 // was being used previously.
4306 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4307 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4308 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4309 else
4310 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4311 }
4312
John McCall24fc0de2011-07-06 00:26:06 +00004313 // Allow the user to enable full exceptions code emission.
4314 // We define off for Objective-CC, on for Objective-C++.
4315 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4316 options::OPT_fno_objc_arc_exceptions,
4317 /*default*/ types::isCXX(InputType)))
4318 CmdArgs.push_back("-fobjc-arc-exceptions");
4319 }
4320
4321 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4322 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004323 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004324 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004325
John McCall24fc0de2011-07-06 00:26:06 +00004326 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4327 // takes precedence.
4328 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4329 if (!GCArg)
4330 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4331 if (GCArg) {
4332 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004333 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004334 << GCArg->getAsString(Args);
4335 } else if (getToolChain().SupportsObjCGC()) {
4336 GCArg->render(Args, CmdArgs);
4337 } else {
4338 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004339 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004340 << GCArg->getAsString(Args);
4341 }
4342 }
4343
Bob Wilsonb111ec92015-03-02 19:01:14 +00004344 if (Args.hasFlag(options::OPT_fapplication_extension,
4345 options::OPT_fno_application_extension, false))
4346 CmdArgs.push_back("-fapplication-extension");
4347
Reid Klecknerc542d372014-06-27 17:02:02 +00004348 // Handle GCC-style exception args.
4349 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004350 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004351 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004352
4353 if (getToolChain().UseSjLjExceptions())
4354 CmdArgs.push_back("-fsjlj-exceptions");
4355
4356 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004357 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4358 options::OPT_fno_assume_sane_operator_new))
4359 CmdArgs.push_back("-fno-assume-sane-operator-new");
4360
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004361 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4362 // most platforms.
4363 if (Args.hasFlag(options::OPT_fsized_deallocation,
4364 options::OPT_fno_sized_deallocation, false))
4365 CmdArgs.push_back("-fsized-deallocation");
4366
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004367 // -fconstant-cfstrings is default, and may be subject to argument translation
4368 // on Darwin.
4369 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4370 options::OPT_fno_constant_cfstrings) ||
4371 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4372 options::OPT_mno_constant_cfstrings))
4373 CmdArgs.push_back("-fno-constant-cfstrings");
4374
John Thompsoned4e2952009-11-05 20:14:16 +00004375 // -fshort-wchar default varies depending on platform; only
4376 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004377 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4378 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004379 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004380
Hans Wennborg28c96312013-07-31 23:39:13 +00004381 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004382 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004383 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004384 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004385 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004386
Daniel Dunbar096ed292011-10-05 21:04:55 +00004387 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4388 // -fno-pack-struct doesn't apply to -fpack-struct=.
4389 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004390 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004391 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004392 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004393 } else if (Args.hasFlag(options::OPT_fpack_struct,
4394 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004395 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004396 }
4397
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004398 // Handle -fmax-type-align=N and -fno-type-align
4399 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4400 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4401 if (!SkipMaxTypeAlign) {
4402 std::string MaxTypeAlignStr = "-fmax-type-align=";
4403 MaxTypeAlignStr += A->getValue();
4404 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4405 }
4406 } else if (getToolChain().getTriple().isOSDarwin()) {
4407 if (!SkipMaxTypeAlign) {
4408 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4409 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4410 }
4411 }
4412
Robert Lytton0e076492013-08-13 09:43:10 +00004413 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004414 if (!Args.hasArg(options::OPT_fcommon))
4415 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004416 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004417 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004418
Daniel Dunbard18049a2009-04-07 21:16:11 +00004419 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004420 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004421 CmdArgs.push_back("-fno-common");
4422
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004423 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004424 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004425 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004426 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004427 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004428 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4429
Daniel Dunbar6358d682010-10-15 22:30:42 +00004430 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4431 if (!Args.hasFlag(options::OPT_ffor_scope,
4432 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004433 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004434 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4435
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004436 // -finput_charset=UTF-8 is default. Reject others
4437 if (Arg *inputCharset = Args.getLastArg(
4438 options::OPT_finput_charset_EQ)) {
4439 StringRef value = inputCharset->getValue();
4440 if (value != "UTF-8")
4441 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4442 }
4443
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004444 // -fexec_charset=UTF-8 is default. Reject others
4445 if (Arg *execCharset = Args.getLastArg(
4446 options::OPT_fexec_charset_EQ)) {
4447 StringRef value = execCharset->getValue();
4448 if (value != "UTF-8")
4449 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4450 }
4451
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004452 // -fcaret-diagnostics is default.
4453 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4454 options::OPT_fno_caret_diagnostics, true))
4455 CmdArgs.push_back("-fno-caret-diagnostics");
4456
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004457 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004458 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004459 options::OPT_fno_diagnostics_fixit_info))
4460 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004461
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004462 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004463 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004464 options::OPT_fno_diagnostics_show_option))
4465 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004466
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004467 if (const Arg *A =
4468 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4469 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004470 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004471 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004472
Douglas Gregor643c9222011-05-21 17:07:29 +00004473 if (const Arg *A =
4474 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4475 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004476 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004477 }
4478
Chandler Carruthb6766f02011-03-27 01:50:55 +00004479 if (Arg *A = Args.getLastArg(
4480 options::OPT_fdiagnostics_show_note_include_stack,
4481 options::OPT_fno_diagnostics_show_note_include_stack)) {
4482 if (A->getOption().matches(
4483 options::OPT_fdiagnostics_show_note_include_stack))
4484 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4485 else
4486 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4487 }
4488
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004489 // Color diagnostics are the default, unless the terminal doesn't support
4490 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004491 // Support both clang's -f[no-]color-diagnostics and gcc's
4492 // -f[no-]diagnostics-colors[=never|always|auto].
4493 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004494 for (const auto &Arg : Args) {
4495 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004496 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4497 !O.matches(options::OPT_fdiagnostics_color) &&
4498 !O.matches(options::OPT_fno_color_diagnostics) &&
4499 !O.matches(options::OPT_fno_diagnostics_color) &&
4500 !O.matches(options::OPT_fdiagnostics_color_EQ))
4501 continue;
4502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004503 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004504 if (O.matches(options::OPT_fcolor_diagnostics) ||
4505 O.matches(options::OPT_fdiagnostics_color)) {
4506 ShowColors = Colors_On;
4507 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4508 O.matches(options::OPT_fno_diagnostics_color)) {
4509 ShowColors = Colors_Off;
4510 } else {
4511 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004512 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004513 if (value == "always")
4514 ShowColors = Colors_On;
4515 else if (value == "never")
4516 ShowColors = Colors_Off;
4517 else if (value == "auto")
4518 ShowColors = Colors_Auto;
4519 else
4520 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4521 << ("-fdiagnostics-color=" + value).str();
4522 }
4523 }
4524 if (ShowColors == Colors_On ||
4525 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004526 CmdArgs.push_back("-fcolor-diagnostics");
4527
Nico Rieck7857d462013-09-11 00:38:02 +00004528 if (Args.hasArg(options::OPT_fansi_escape_codes))
4529 CmdArgs.push_back("-fansi-escape-codes");
4530
Daniel Dunbardb097022009-06-08 21:13:54 +00004531 if (!Args.hasFlag(options::OPT_fshow_source_location,
4532 options::OPT_fno_show_source_location))
4533 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004534
Douglas Gregor643c9222011-05-21 17:07:29 +00004535 if (!Args.hasFlag(options::OPT_fshow_column,
4536 options::OPT_fno_show_column,
4537 true))
4538 CmdArgs.push_back("-fno-show-column");
4539
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004540 if (!Args.hasFlag(options::OPT_fspell_checking,
4541 options::OPT_fno_spell_checking))
4542 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004543
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004544
Chad Rosierc8e56e82012-12-05 21:08:21 +00004545 // -fno-asm-blocks is default.
4546 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4547 false))
4548 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004549
Steven Wucb0d13f2015-01-16 23:05:28 +00004550 // -fgnu-inline-asm is default.
4551 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4552 options::OPT_fno_gnu_inline_asm, true))
4553 CmdArgs.push_back("-fno-gnu-inline-asm");
4554
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004555 // Enable vectorization per default according to the optimization level
4556 // selected. For optimization levels that want vectorization we use the alias
4557 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004558 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004559 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004560 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004561 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004562 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004563 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004564
Chad Rosier136d67d2014-04-28 19:30:57 +00004565 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004566 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4567 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004568 options::OPT_fslp_vectorize;
4569 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004570 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004571 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004572
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004573 // -fno-slp-vectorize-aggressive is default.
4574 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004575 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004576 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004577
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004578 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4579 A->render(Args, CmdArgs);
4580
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004581 // -fdollars-in-identifiers default varies depending on platform and
4582 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004583 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004584 options::OPT_fno_dollars_in_identifiers)) {
4585 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004586 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004587 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004588 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004589 }
4590
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004591 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4592 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004593 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004594 options::OPT_fno_unit_at_a_time)) {
4595 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004596 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004597 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004598
Eli Friedman055c9702011-11-02 01:53:16 +00004599 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4600 options::OPT_fno_apple_pragma_pack, false))
4601 CmdArgs.push_back("-fapple-pragma-pack");
4602
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004603 // le32-specific flags:
4604 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4605 // by default.
4606 if (getToolChain().getArch() == llvm::Triple::le32) {
4607 CmdArgs.push_back("-fno-math-builtin");
4608 }
4609
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004610 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004611 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004612 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004613#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004614 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004615 (getToolChain().getArch() == llvm::Triple::arm ||
4616 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004617 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4618 CmdArgs.push_back("-fno-builtin-strcat");
4619 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4620 CmdArgs.push_back("-fno-builtin-strcpy");
4621 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004622#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004623
Justin Bognera88f0122014-06-20 22:59:50 +00004624 // Enable rewrite includes if the user's asked for it or if we're generating
4625 // diagnostics.
4626 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4627 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004628 if (Args.hasFlag(options::OPT_frewrite_includes,
4629 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004630 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004631 CmdArgs.push_back("-frewrite-includes");
4632
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004633 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004634 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004635 options::OPT_traditional_cpp)) {
4636 if (isa<PreprocessJobAction>(JA))
4637 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004638 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004639 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004640 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004641
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004642 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004643 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004644
4645 // Handle serialized diagnostics.
4646 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4647 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004648 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004649 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004650
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004651 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4652 CmdArgs.push_back("-fretain-comments-from-system-headers");
4653
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004654 // Forward -fcomment-block-commands to -cc1.
4655 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004656 // Forward -fparse-all-comments to -cc1.
4657 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004658
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004659 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4660 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004661 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004662 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004663 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4664 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004665 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004666
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004667 // We translate this by hand to the -cc1 argument, since nightly test uses
4668 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004669 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004670 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004671 OptDisabled = true;
4672 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004673 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004674 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004675
Bob Wilson23a55f12014-12-21 07:00:00 +00004676 // With -save-temps, we want to save the unoptimized bitcode output from the
4677 // CompileJobAction, so disable optimizations if they are not already
4678 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004679 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004680 isa<CompileJobAction>(JA))
4681 CmdArgs.push_back("-disable-llvm-optzns");
4682
Daniel Dunbard67a3222009-03-30 06:36:42 +00004683 if (Output.getType() == types::TY_Dependencies) {
4684 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004685 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004686 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004687 CmdArgs.push_back(Output.getFilename());
4688 } else {
4689 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004690 }
4691
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004692 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004693 addDashXForInput(Args, II, CmdArgs);
4694
Daniel Dunbarb440f562010-08-02 02:38:21 +00004695 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004696 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004697 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004698 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004699 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004700
Chris Lattnere9d7d782009-11-03 19:50:27 +00004701 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4702
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004703 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004704
4705 // Optionally embed the -cc1 level arguments into the debug info, for build
4706 // analysis.
4707 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004708 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004709 for (const auto &Arg : Args)
4710 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004711
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004712 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004713 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004714 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004715 SmallString<128> EscapedArg;
4716 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004717 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004718 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004719 }
4720 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004721 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004722 }
4723
Eric Christopherd3804002013-02-22 20:12:52 +00004724 // Add the split debug info name to the command lines here so we
4725 // can propagate it to the backend.
4726 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004727 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004728 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4729 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004730 const char *SplitDwarfOut;
4731 if (SplitDwarf) {
4732 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004733 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004734 CmdArgs.push_back(SplitDwarfOut);
4735 }
4736
4737 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004738 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004739 Output.getType() == types::TY_Object &&
4740 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004741 auto CLCommand =
4742 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4743 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4744 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004745 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004746 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004747 }
4748
Daniel Dunbar17731772009-03-23 19:03:36 +00004749
Eric Christopherf1545832013-02-22 23:50:16 +00004750 // Handle the debug info splitting at object creation time if we're
4751 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004752 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004753 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004754 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004755
Roman Divacky178e01602011-02-10 16:52:03 +00004756 if (Arg *A = Args.getLastArg(options::OPT_pg))
4757 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004758 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004759 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004760
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004761 // Claim some arguments which clang supports automatically.
4762
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004763 // -fpch-preprocess is used with gcc to add a special marker in the output to
4764 // include the PCH file. Clang's PTH solution is completely transparent, so we
4765 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004766 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004767
Daniel Dunbar17731772009-03-23 19:03:36 +00004768 // Claim some arguments which clang doesn't support, but we don't
4769 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004770 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4771 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004772
Rafael Espindolab0092d72013-09-04 19:37:35 +00004773 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004774 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004775}
4776
John McCall5fb5df92012-06-20 06:18:46 +00004777/// Add options related to the Objective-C runtime/ABI.
4778///
4779/// Returns true if the runtime is non-fragile.
4780ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4781 ArgStringList &cmdArgs,
4782 RewriteKind rewriteKind) const {
4783 // Look for the controlling runtime option.
4784 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4785 options::OPT_fgnu_runtime,
4786 options::OPT_fobjc_runtime_EQ);
4787
4788 // Just forward -fobjc-runtime= to the frontend. This supercedes
4789 // options about fragility.
4790 if (runtimeArg &&
4791 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4792 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004793 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004794 if (runtime.tryParse(value)) {
4795 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4796 << value;
4797 }
4798
4799 runtimeArg->render(args, cmdArgs);
4800 return runtime;
4801 }
4802
4803 // Otherwise, we'll need the ABI "version". Version numbers are
4804 // slightly confusing for historical reasons:
4805 // 1 - Traditional "fragile" ABI
4806 // 2 - Non-fragile ABI, version 1
4807 // 3 - Non-fragile ABI, version 2
4808 unsigned objcABIVersion = 1;
4809 // If -fobjc-abi-version= is present, use that to set the version.
4810 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004811 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004812 if (value == "1")
4813 objcABIVersion = 1;
4814 else if (value == "2")
4815 objcABIVersion = 2;
4816 else if (value == "3")
4817 objcABIVersion = 3;
4818 else
4819 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4820 << value;
4821 } else {
4822 // Otherwise, determine if we are using the non-fragile ABI.
4823 bool nonFragileABIIsDefault =
4824 (rewriteKind == RK_NonFragile ||
4825 (rewriteKind == RK_None &&
4826 getToolChain().IsObjCNonFragileABIDefault()));
4827 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4828 options::OPT_fno_objc_nonfragile_abi,
4829 nonFragileABIIsDefault)) {
4830 // Determine the non-fragile ABI version to use.
4831#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4832 unsigned nonFragileABIVersion = 1;
4833#else
4834 unsigned nonFragileABIVersion = 2;
4835#endif
4836
4837 if (Arg *abiArg = args.getLastArg(
4838 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004839 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004840 if (value == "1")
4841 nonFragileABIVersion = 1;
4842 else if (value == "2")
4843 nonFragileABIVersion = 2;
4844 else
4845 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4846 << value;
4847 }
4848
4849 objcABIVersion = 1 + nonFragileABIVersion;
4850 } else {
4851 objcABIVersion = 1;
4852 }
4853 }
4854
4855 // We don't actually care about the ABI version other than whether
4856 // it's non-fragile.
4857 bool isNonFragile = objcABIVersion != 1;
4858
4859 // If we have no runtime argument, ask the toolchain for its default runtime.
4860 // However, the rewriter only really supports the Mac runtime, so assume that.
4861 ObjCRuntime runtime;
4862 if (!runtimeArg) {
4863 switch (rewriteKind) {
4864 case RK_None:
4865 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4866 break;
4867 case RK_Fragile:
4868 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4869 break;
4870 case RK_NonFragile:
4871 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4872 break;
4873 }
4874
4875 // -fnext-runtime
4876 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4877 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004878 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004879 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4880
4881 // Otherwise, build for a generic macosx port.
4882 } else {
4883 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4884 }
4885
4886 // -fgnu-runtime
4887 } else {
4888 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004889 // Legacy behaviour is to target the gnustep runtime if we are i
4890 // non-fragile mode or the GCC runtime in fragile mode.
4891 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004892 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004893 else
4894 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004895 }
4896
4897 cmdArgs.push_back(args.MakeArgString(
4898 "-fobjc-runtime=" + runtime.getAsString()));
4899 return runtime;
4900}
4901
Reid Klecknerc542d372014-06-27 17:02:02 +00004902static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4903 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4904 I += HaveDash;
4905 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004906}
Reid Klecknerc542d372014-06-27 17:02:02 +00004907
4908struct EHFlags {
4909 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4910 bool Synch;
4911 bool Asynch;
4912 bool NoExceptC;
4913};
4914
4915/// /EH controls whether to run destructor cleanups when exceptions are
4916/// thrown. There are three modifiers:
4917/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4918/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4919/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4920/// - c: Assume that extern "C" functions are implicitly noexcept. This
4921/// modifier is an optimization, so we ignore it for now.
4922/// The default is /EHs-c-, meaning cleanups are disabled.
4923static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4924 EHFlags EH;
4925 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4926 for (auto EHVal : EHArgs) {
4927 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4928 switch (EHVal[I]) {
4929 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4930 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4931 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4932 default: break;
4933 }
4934 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4935 break;
4936 }
4937 }
4938 return EH;
4939}
4940
Hans Wennborg75958c42013-08-08 00:17:41 +00004941void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4942 unsigned RTOptionID = options::OPT__SLASH_MT;
4943
Hans Wennborgf1a74252013-09-10 20:18:04 +00004944 if (Args.hasArg(options::OPT__SLASH_LDd))
4945 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4946 // but defining _DEBUG is sticky.
4947 RTOptionID = options::OPT__SLASH_MTd;
4948
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004949 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004950 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004951
Hans Wennborg75958c42013-08-08 00:17:41 +00004952 switch(RTOptionID) {
4953 case options::OPT__SLASH_MD:
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("-D_DLL");
4958 CmdArgs.push_back("--dependent-lib=msvcrt");
4959 break;
4960 case options::OPT__SLASH_MDd:
4961 CmdArgs.push_back("-D_DEBUG");
4962 CmdArgs.push_back("-D_MT");
4963 CmdArgs.push_back("-D_DLL");
4964 CmdArgs.push_back("--dependent-lib=msvcrtd");
4965 break;
4966 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004967 if (Args.hasArg(options::OPT__SLASH_LDd))
4968 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004969 CmdArgs.push_back("-D_MT");
4970 CmdArgs.push_back("--dependent-lib=libcmt");
4971 break;
4972 case options::OPT__SLASH_MTd:
4973 CmdArgs.push_back("-D_DEBUG");
4974 CmdArgs.push_back("-D_MT");
4975 CmdArgs.push_back("--dependent-lib=libcmtd");
4976 break;
4977 default:
4978 llvm_unreachable("Unexpected option ID.");
4979 }
4980
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004981 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4982 // users want. The /Za flag to cl.exe turns this off, but it's not
4983 // implemented in clang.
4984 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004985
Hans Wennborg8858a032014-07-21 23:42:07 +00004986 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4987 // would produce interleaved output, so ignore /showIncludes in such cases.
4988 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4989 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4990 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004991
David Majnemerf6072342014-07-01 22:24:56 +00004992 // This controls whether or not we emit RTTI data for polymorphic types.
4993 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4994 /*default=*/false))
4995 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004996
Reid Klecknerc542d372014-06-27 17:02:02 +00004997 const Driver &D = getToolChain().getDriver();
4998 EHFlags EH = parseClangCLEHFlags(D, Args);
4999 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005000 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005001 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005002 CmdArgs.push_back("-fexceptions");
5003 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005004
Hans Wennborge50cec32014-06-13 20:59:54 +00005005 // /EP should expand to -E -P.
5006 if (Args.hasArg(options::OPT__SLASH_EP)) {
5007 CmdArgs.push_back("-E");
5008 CmdArgs.push_back("-P");
5009 }
5010
David Majnemera5b195a2015-02-14 01:35:12 +00005011 unsigned VolatileOptionID;
5012 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
5013 getToolChain().getTriple().getArch() == llvm::Triple::x86)
5014 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5015 else
5016 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5017
5018 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5019 VolatileOptionID = A->getOption().getID();
5020
5021 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5022 CmdArgs.push_back("-fms-volatile");
5023
David Majnemer86c318f2014-02-11 21:05:00 +00005024 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5025 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5026 if (MostGeneralArg && BestCaseArg)
5027 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5028 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5029
5030 if (MostGeneralArg) {
5031 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5032 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5033 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5034
5035 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5036 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5037 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5038 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5039 << FirstConflict->getAsString(Args)
5040 << SecondConflict->getAsString(Args);
5041
5042 if (SingleArg)
5043 CmdArgs.push_back("-fms-memptr-rep=single");
5044 else if (MultipleArg)
5045 CmdArgs.push_back("-fms-memptr-rep=multiple");
5046 else
5047 CmdArgs.push_back("-fms-memptr-rep=virtual");
5048 }
5049
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005050 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5051 A->render(Args, CmdArgs);
5052
Hans Wennborg81f74482013-09-10 01:07:07 +00005053 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5054 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005055 if (Args.hasArg(options::OPT__SLASH_fallback))
5056 CmdArgs.push_back("msvc-fallback");
5057 else
5058 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005059 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005060}
5061
Hans Wennborg1da044a2014-06-26 19:59:02 +00005062visualstudio::Compile *Clang::getCLFallback() const {
5063 if (!CLFallback)
5064 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5065 return CLFallback.get();
5066}
5067
Daniel Sanders7f933f42015-01-30 17:35:23 +00005068void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5069 ArgStringList &CmdArgs) const {
5070 StringRef CPUName;
5071 StringRef ABIName;
5072 const llvm::Triple &Triple = getToolChain().getTriple();
5073 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5074
5075 CmdArgs.push_back("-target-abi");
5076 CmdArgs.push_back(ABIName.data());
5077}
5078
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005079void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005080 const InputInfo &Output,
5081 const InputInfoList &Inputs,
5082 const ArgList &Args,
5083 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005084 ArgStringList CmdArgs;
5085
5086 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5087 const InputInfo &Input = Inputs[0];
5088
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005089 // Don't warn about "clang -w -c foo.s"
5090 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005091 // and "clang -emit-llvm -c foo.s"
5092 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005093
Rafael Espindola577637a2015-01-03 00:06:04 +00005094 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005095
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005096 // Invoke ourselves in -cc1as mode.
5097 //
5098 // FIXME: Implement custom jobs for internal actions.
5099 CmdArgs.push_back("-cc1as");
5100
5101 // Add the "effective" target triple.
5102 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005103 std::string TripleStr =
5104 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005105 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5106
5107 // Set the output mode, we currently only expect to be used as a real
5108 // assembler.
5109 CmdArgs.push_back("-filetype");
5110 CmdArgs.push_back("obj");
5111
Eric Christopher45f2e712012-12-18 00:31:10 +00005112 // Set the main file name, so that debug info works even with
5113 // -save-temps or preprocessed assembly.
5114 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005115 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005116
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005117 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005118 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005119 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005120 if (!CPU.empty()) {
5121 CmdArgs.push_back("-target-cpu");
5122 CmdArgs.push_back(Args.MakeArgString(CPU));
5123 }
5124
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005125 // Add the target features
5126 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005127 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005128
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005129 // Ignore explicit -force_cpusubtype_ALL option.
5130 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005131
Eric Christopherfc3ee562012-01-10 00:38:01 +00005132 // Determine the original source input.
5133 const Action *SourceAction = &JA;
5134 while (SourceAction->getKind() != Action::InputClass) {
5135 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5136 SourceAction = SourceAction->getInputs()[0];
5137 }
5138
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005139 // Forward -g and handle debug info related flags, assuming we are dealing
5140 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005141 if (SourceAction->getType() == types::TY_Asm ||
5142 SourceAction->getType() == types::TY_PP_Asm) {
5143 Args.ClaimAllArgs(options::OPT_g_Group);
5144 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5145 if (!A->getOption().matches(options::OPT_g0))
5146 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005147
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005148 if (Args.hasArg(options::OPT_gdwarf_2))
5149 CmdArgs.push_back("-gdwarf-2");
5150 if (Args.hasArg(options::OPT_gdwarf_3))
5151 CmdArgs.push_back("-gdwarf-3");
5152 if (Args.hasArg(options::OPT_gdwarf_4))
5153 CmdArgs.push_back("-gdwarf-4");
5154
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005155 // Add the -fdebug-compilation-dir flag if needed.
5156 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005157
5158 // Set the AT_producer to the clang version when using the integrated
5159 // assembler on assembly source files.
5160 CmdArgs.push_back("-dwarf-debug-producer");
5161 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005162 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005163
5164 // Optionally embed the -cc1as level arguments into the debug info, for build
5165 // analysis.
5166 if (getToolChain().UseDwarfDebugFlags()) {
5167 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005168 for (const auto &Arg : Args)
5169 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005170
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005171 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005172 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5173 Flags += Exec;
5174 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005175 SmallString<128> EscapedArg;
5176 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005177 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005178 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005179 }
5180 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005181 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005182 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005183
5184 // FIXME: Add -static support, once we have it.
5185
Daniel Sanders7f933f42015-01-30 17:35:23 +00005186 // Add target specific flags.
5187 switch(getToolChain().getArch()) {
5188 default:
5189 break;
5190
5191 case llvm::Triple::mips:
5192 case llvm::Triple::mipsel:
5193 case llvm::Triple::mips64:
5194 case llvm::Triple::mips64el:
5195 AddMIPSTargetArgs(Args, CmdArgs);
5196 break;
5197 }
5198
David Blaikie372d9502014-01-17 03:17:40 +00005199 // Consume all the warning flags. Usually this would be handled more
5200 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5201 // doesn't handle that so rather than warning about unused flags that are
5202 // actually used, we'll lie by omission instead.
5203 // FIXME: Stop lying and consume only the appropriate driver flags
5204 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5205 ie = Args.filtered_end();
5206 it != ie; ++it)
5207 (*it)->claim();
5208
David Blaikie9260ed62013-07-25 21:19:01 +00005209 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5210 getToolChain().getDriver());
5211
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005212 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005213
5214 assert(Output.isFilename() && "Unexpected lipo output.");
5215 CmdArgs.push_back("-o");
5216 CmdArgs.push_back(Output.getFilename());
5217
Daniel Dunbarb440f562010-08-02 02:38:21 +00005218 assert(Input.isFilename() && "Invalid input.");
5219 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005220
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005221 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005222 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005223
5224 // Handle the debug info splitting at object creation time if we're
5225 // creating an object.
5226 // TODO: Currently only works on linux with newer objcopy.
5227 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005228 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005229 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005230 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005231}
5232
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005233void GnuTool::anchor() {}
5234
Daniel Dunbara3246a02009-03-18 08:07:30 +00005235void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005236 const InputInfo &Output,
5237 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005238 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005239 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005240 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005241 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005242
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005243 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005244 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005245 // Don't forward any -g arguments to assembly steps.
5246 if (isa<AssembleJobAction>(JA) &&
5247 A->getOption().matches(options::OPT_g_Group))
5248 continue;
5249
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005250 // Don't forward any -W arguments to assembly and link steps.
5251 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5252 A->getOption().matches(options::OPT_W_Group))
5253 continue;
5254
Daniel Dunbar2da02722009-03-19 07:55:12 +00005255 // It is unfortunate that we have to claim here, as this means
5256 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005257 // platforms using a generic gcc, even if we are just using gcc
5258 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005259 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005260 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005261 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005262 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005263
Daniel Dunbar4e295052010-01-25 22:35:08 +00005264 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005265
5266 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005267 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005268 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005269 CmdArgs.push_back(
5270 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005271 }
5272
Daniel Dunbar5716d872009-05-02 21:41:52 +00005273 // Try to force gcc to match the tool chain we want, if we recognize
5274 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005275 //
5276 // FIXME: The triple class should directly provide the information we want
5277 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005278 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005279 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005280 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005281 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5282 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005283 CmdArgs.push_back("-m64");
5284
Daniel Dunbarb440f562010-08-02 02:38:21 +00005285 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005286 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005287 CmdArgs.push_back(Output.getFilename());
5288 } else {
5289 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005290 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005291 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005292
Tony Linthicum76329bf2011-12-12 21:14:55 +00005293 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5294 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005295
5296 // Only pass -x if gcc will understand it; otherwise hope gcc
5297 // understands the suffix correctly. The main use case this would go
5298 // wrong in is for linker inputs if they happened to have an odd
5299 // suffix; really the only way to get this to happen is a command
5300 // like '-x foobar a.c' which will treat a.c like a linker input.
5301 //
5302 // FIXME: For the linker case specifically, can we safely convert
5303 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005304 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005305 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005306 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5307 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005308 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005309 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005310 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005311 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005312 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005313 else if (II.getType() == types::TY_ModuleFile)
5314 D.Diag(diag::err_drv_no_module_support)
5315 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005316
Daniel Dunbara3246a02009-03-18 08:07:30 +00005317 if (types::canTypeBeUserSpecified(II.getType())) {
5318 CmdArgs.push_back("-x");
5319 CmdArgs.push_back(types::getTypeName(II.getType()));
5320 }
5321
Daniel Dunbarb440f562010-08-02 02:38:21 +00005322 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005323 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005324 else {
5325 const Arg &A = II.getInputArg();
5326
5327 // Reverse translate some rewritten options.
5328 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5329 CmdArgs.push_back("-lstdc++");
5330 continue;
5331 }
5332
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005333 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005334 A.render(Args, CmdArgs);
5335 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005336 }
5337
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005338 const std::string customGCCName = D.getCCCGenericGCCName();
5339 const char *GCCName;
5340 if (!customGCCName.empty())
5341 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005342 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005343 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005344 } else
5345 GCCName = "gcc";
5346
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005347 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005348 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005349 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005350}
5351
Daniel Dunbar4e295052010-01-25 22:35:08 +00005352void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5353 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005354 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005355}
5356
Daniel Dunbar4e295052010-01-25 22:35:08 +00005357void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5358 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005359 const Driver &D = getToolChain().getDriver();
5360
Eric Christophercc7ff502015-01-29 00:56:17 +00005361 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005362 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005363 case types::TY_LLVM_IR:
5364 case types::TY_LTO_IR:
5365 case types::TY_LLVM_BC:
5366 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005367 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005368 break;
5369 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005370 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005371 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005372 case types::TY_Nothing:
5373 CmdArgs.push_back("-fsyntax-only");
5374 break;
5375 default:
5376 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005377 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005378}
5379
Daniel Dunbar4e295052010-01-25 22:35:08 +00005380void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5381 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005382 // The types are (hopefully) good enough.
5383}
5384
Tony Linthicum76329bf2011-12-12 21:14:55 +00005385// Hexagon tools start.
5386void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5387 ArgStringList &CmdArgs) const {
5388
5389}
5390void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5391 const InputInfo &Output,
5392 const InputInfoList &Inputs,
5393 const ArgList &Args,
5394 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005395 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005396
5397 const Driver &D = getToolChain().getDriver();
5398 ArgStringList CmdArgs;
5399
5400 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005401 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005402 CmdArgs.push_back(Args.MakeArgString(MarchString));
5403
5404 RenderExtraToolArgs(JA, CmdArgs);
5405
5406 if (Output.isFilename()) {
5407 CmdArgs.push_back("-o");
5408 CmdArgs.push_back(Output.getFilename());
5409 } else {
5410 assert(Output.isNothing() && "Unexpected output");
5411 CmdArgs.push_back("-fsyntax-only");
5412 }
5413
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005414 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
5415 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005416
Matthew Curtise5df3812012-12-07 17:23:04 +00005417 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5418 options::OPT_Xassembler);
5419
Tony Linthicum76329bf2011-12-12 21:14:55 +00005420 // Only pass -x if gcc will understand it; otherwise hope gcc
5421 // understands the suffix correctly. The main use case this would go
5422 // wrong in is for linker inputs if they happened to have an odd
5423 // suffix; really the only way to get this to happen is a command
5424 // like '-x foobar a.c' which will treat a.c like a linker input.
5425 //
5426 // FIXME: For the linker case specifically, can we safely convert
5427 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005428 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005429 // Don't try to pass LLVM or AST inputs to a generic gcc.
5430 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5431 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5432 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5433 << getToolChain().getTripleString();
5434 else if (II.getType() == types::TY_AST)
5435 D.Diag(clang::diag::err_drv_no_ast_support)
5436 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005437 else if (II.getType() == types::TY_ModuleFile)
5438 D.Diag(diag::err_drv_no_module_support)
5439 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005440
5441 if (II.isFilename())
5442 CmdArgs.push_back(II.getFilename());
5443 else
5444 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5445 II.getInputArg().render(Args, CmdArgs);
5446 }
5447
5448 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005449 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005450 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005451}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005452
Tony Linthicum76329bf2011-12-12 21:14:55 +00005453void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5454 ArgStringList &CmdArgs) const {
5455 // The types are (hopefully) good enough.
5456}
5457
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005458static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5459 const toolchains::Hexagon_TC& ToolChain,
5460 const InputInfo &Output,
5461 const InputInfoList &Inputs,
5462 const ArgList &Args,
5463 ArgStringList &CmdArgs,
5464 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005465
Matthew Curtise689b052012-12-06 15:46:07 +00005466 const Driver &D = ToolChain.getDriver();
5467
Tony Linthicum76329bf2011-12-12 21:14:55 +00005468
Matthew Curtise689b052012-12-06 15:46:07 +00005469 //----------------------------------------------------------------------------
5470 //
5471 //----------------------------------------------------------------------------
5472 bool hasStaticArg = Args.hasArg(options::OPT_static);
5473 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005474 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005475 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5476 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5477 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005478 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005479 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005480
Matthew Curtise689b052012-12-06 15:46:07 +00005481 //----------------------------------------------------------------------------
5482 // Silence warnings for various options
5483 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005484
Matthew Curtise689b052012-12-06 15:46:07 +00005485 Args.ClaimAllArgs(options::OPT_g_Group);
5486 Args.ClaimAllArgs(options::OPT_emit_llvm);
5487 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5488 // handled somewhere else.
5489 Args.ClaimAllArgs(options::OPT_static_libgcc);
5490
5491 //----------------------------------------------------------------------------
5492 //
5493 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005494 for (const auto &Opt : ToolChain.ExtraOpts)
5495 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005496
Matthew Curtisf10a5952012-12-06 14:16:43 +00005497 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5498 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005499
Matthew Curtise689b052012-12-06 15:46:07 +00005500 if (buildingLib) {
5501 CmdArgs.push_back("-shared");
5502 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5503 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005504 }
5505
Matthew Curtise689b052012-12-06 15:46:07 +00005506 if (hasStaticArg)
5507 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005508
Matthew Curtise8f80a12012-12-06 17:49:03 +00005509 if (buildPIE && !buildingLib)
5510 CmdArgs.push_back("-pie");
5511
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005512 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
5513 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5514 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005515 }
5516
Matthew Curtise689b052012-12-06 15:46:07 +00005517 //----------------------------------------------------------------------------
5518 //
5519 //----------------------------------------------------------------------------
5520 CmdArgs.push_back("-o");
5521 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005522
Matthew Curtise689b052012-12-06 15:46:07 +00005523 const std::string MarchSuffix = "/" + MarchString;
5524 const std::string G0Suffix = "/G0";
5525 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005526 const std::string RootDir =
5527 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005528 const std::string StartFilesDir = RootDir
5529 + "hexagon/lib"
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005530 + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005531
5532 //----------------------------------------------------------------------------
5533 // moslib
5534 //----------------------------------------------------------------------------
5535 std::vector<std::string> oslibs;
5536 bool hasStandalone= false;
5537
5538 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5539 ie = Args.filtered_end(); it != ie; ++it) {
5540 (*it)->claim();
5541 oslibs.push_back((*it)->getValue());
5542 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005543 }
Matthew Curtise689b052012-12-06 15:46:07 +00005544 if (oslibs.empty()) {
5545 oslibs.push_back("standalone");
5546 hasStandalone = true;
5547 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005548
Matthew Curtise689b052012-12-06 15:46:07 +00005549 //----------------------------------------------------------------------------
5550 // Start Files
5551 //----------------------------------------------------------------------------
5552 if (incStdLib && incStartFiles) {
5553
5554 if (!buildingLib) {
5555 if (hasStandalone) {
5556 CmdArgs.push_back(
5557 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5558 }
5559 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5560 }
5561 std::string initObj = useShared ? "/initS.o" : "/init.o";
5562 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5563 }
5564
5565 //----------------------------------------------------------------------------
5566 // Library Search Paths
5567 //----------------------------------------------------------------------------
5568 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005569 for (const auto &LibPath : LibPaths)
5570 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005571
5572 //----------------------------------------------------------------------------
5573 //
5574 //----------------------------------------------------------------------------
5575 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5576 Args.AddAllArgs(CmdArgs, options::OPT_e);
5577 Args.AddAllArgs(CmdArgs, options::OPT_s);
5578 Args.AddAllArgs(CmdArgs, options::OPT_t);
5579 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5580
5581 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5582
5583 //----------------------------------------------------------------------------
5584 // Libraries
5585 //----------------------------------------------------------------------------
5586 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005587 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005588 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5589 CmdArgs.push_back("-lm");
5590 }
5591
5592 CmdArgs.push_back("--start-group");
5593
5594 if (!buildingLib) {
5595 for(std::vector<std::string>::iterator i = oslibs.begin(),
5596 e = oslibs.end(); i != e; ++i)
5597 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5598 CmdArgs.push_back("-lc");
5599 }
5600 CmdArgs.push_back("-lgcc");
5601
5602 CmdArgs.push_back("--end-group");
5603 }
5604
5605 //----------------------------------------------------------------------------
5606 // End files
5607 //----------------------------------------------------------------------------
5608 if (incStdLib && incStartFiles) {
5609 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5610 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5611 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005612}
5613
5614void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5615 const InputInfo &Output,
5616 const InputInfoList &Inputs,
5617 const ArgList &Args,
5618 const char *LinkingOutput) const {
5619
5620 const toolchains::Hexagon_TC& ToolChain =
5621 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5622
5623 ArgStringList CmdArgs;
5624 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5625 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005626
5627 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005628 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5629 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005630}
5631// Hexagon tools end.
5632
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005633const StringRef arm::getARMArch(const ArgList &Args,
5634 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005635 StringRef MArch;
5636 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5637 // Otherwise, if we have -march= choose the base CPU for that arch.
5638 MArch = A->getValue();
5639 } else {
5640 // Otherwise, use the Arch from the triple.
5641 MArch = Triple.getArchName();
5642 }
John Brawn94fd9632015-05-21 12:19:49 +00005643
5644 // Handle -march=native.
5645 if (MArch == "native") {
5646 std::string CPU = llvm::sys::getHostCPUName();
5647 if (CPU != "generic") {
5648 // Translate the native cpu into the architecture suffix for that CPU.
5649 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5650 // If there is no valid architecture suffix for this CPU we don't know how
5651 // to handle it, so return no architecture.
5652 if (strcmp(Suffix,"") == 0)
5653 MArch = "";
5654 else
5655 MArch = std::string("arm") + Suffix;
5656 }
5657 }
5658
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005659 return MArch;
5660}
5661/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5662const char *arm::getARMCPUForMArch(const ArgList &Args,
5663 const llvm::Triple &Triple) {
5664 StringRef MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005665 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5666 // here means an -march=native that we can't handle, so instead return no CPU.
5667 if (MArch.empty())
5668 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005669
John Brawna95c1a82015-05-08 12:52:18 +00005670 // We need to return an empty string here on invalid MArch values as the
5671 // various places that call this function can't cope with a null result.
5672 const char *result = Triple.getARMCPUForArch(MArch);
5673 if (result)
5674 return result;
5675 else
5676 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005677}
5678
5679/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005680StringRef arm::getARMTargetCPU(const ArgList &Args,
5681 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005682 // FIXME: Warn on inconsistent use of -mcpu and -march.
5683 // If we have -mcpu=, use that.
5684 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin4045f662015-05-08 15:44:36 +00005685 StringRef MCPU = A->getValue();
Bernard Ogden31561762013-12-12 13:27:11 +00005686 // Handle -mcpu=native.
5687 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005688 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005689 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005690 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005691 }
5692
5693 return getARMCPUForMArch(Args, Triple);
5694}
5695
5696/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005697/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005698//
5699// FIXME: This is redundant with -mcpu, why does LLVM use this.
5700// FIXME: tblgen this, or kill it!
Renato Golin0600e1e2015-05-08 21:04:50 +00005701// FIXME: Use ARMTargetParser.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005702const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
5703 // FIXME: Use ARMTargetParser
5704 if (CPU == "generic") {
5705 if (Arch == "armv8.1a" || Arch == "armv8.1-a" ||
5706 Arch == "armebv8.1a" || Arch == "armebv8.1-a") {
5707 return "v8.1a";
5708 }
5709 }
5710
John Brawn94fd9632015-05-21 12:19:49 +00005711 // FIXME: Use ARMTargetParser
Bernard Ogden31561762013-12-12 13:27:11 +00005712 return llvm::StringSwitch<const char *>(CPU)
John Brawn94fd9632015-05-21 12:19:49 +00005713 .Cases("arm8", "arm810", "v4")
5714 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "v4")
Bernard Ogden31561762013-12-12 13:27:11 +00005715 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5716 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5717 .Cases("arm920", "arm920t", "arm922t", "v4t")
5718 .Cases("arm940t", "ep9312","v4t")
5719 .Cases("arm10tdmi", "arm1020t", "v5")
5720 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5721 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5722 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005723 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5724 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5725 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005726 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005727 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005728 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005729 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005730 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5731 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005732 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005733 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005734 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005735 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005736 .Default("");
5737}
5738
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005739void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
5740 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005741 if (Args.hasArg(options::OPT_r))
5742 return;
5743
John Brawn94fd9632015-05-21 12:19:49 +00005744 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5745 // to generate BE-8 executables.
5746 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5747 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005748}
5749
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005750mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5751 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5752 .Case("mips1", NanLegacy)
5753 .Case("mips2", NanLegacy)
5754 .Case("mips3", NanLegacy)
5755 .Case("mips4", NanLegacy)
5756 .Case("mips5", NanLegacy)
5757 .Case("mips32", NanLegacy)
5758 .Case("mips32r2", NanLegacy)
5759 .Case("mips32r3", NanLegacy | Nan2008)
5760 .Case("mips32r5", NanLegacy | Nan2008)
5761 .Case("mips32r6", Nan2008)
5762 .Case("mips64", NanLegacy)
5763 .Case("mips64r2", NanLegacy)
5764 .Case("mips64r3", NanLegacy | Nan2008)
5765 .Case("mips64r5", NanLegacy | Nan2008)
5766 .Case("mips64r6", Nan2008)
5767 .Default(NanLegacy);
5768}
5769
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005770bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5771 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5772 return A && (A->getValue() == StringRef(Value));
5773}
5774
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005775bool mips::isUCLibc(const ArgList &Args) {
5776 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005777 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005778}
5779
Daniel Sanders2bf13662014-07-10 14:40:57 +00005780bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005781 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5782 return llvm::StringSwitch<bool>(NaNArg->getValue())
5783 .Case("2008", true)
5784 .Case("legacy", false)
5785 .Default(false);
5786
5787 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005788 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5789 .Cases("mips32r6", "mips64r6", true)
5790 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005791
5792 return false;
5793}
5794
Daniel Sanders379d44b2014-07-16 11:52:23 +00005795bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5796 StringRef ABIName) {
5797 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005798 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005799 return false;
5800
5801 if (ABIName != "32")
5802 return false;
5803
5804 return llvm::StringSwitch<bool>(CPUName)
5805 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005806 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5807 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005808 .Default(false);
5809}
5810
Tim Northover157d9112014-01-16 08:48:16 +00005811llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005812 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5813 // archs which Darwin doesn't use.
5814
5815 // The matching this routine does is fairly pointless, since it is neither the
5816 // complete architecture list, nor a reasonable subset. The problem is that
5817 // historically the driver driver accepts this and also ties its -march=
5818 // handling to the architecture name, so we need to be careful before removing
5819 // support for it.
5820
5821 // This code must be kept in sync with Clang's Darwin specific argument
5822 // translation.
5823
5824 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5825 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5826 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5827 .Case("ppc64", llvm::Triple::ppc64)
5828 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5829 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5830 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005831 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005832 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005833 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005834 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005835 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005836 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005837 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005838 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005839 .Case("nvptx", llvm::Triple::nvptx)
5840 .Case("nvptx64", llvm::Triple::nvptx64)
5841 .Case("amdil", llvm::Triple::amdil)
5842 .Case("spir", llvm::Triple::spir)
5843 .Default(llvm::Triple::UnknownArch);
5844}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005845
Tim Northover157d9112014-01-16 08:48:16 +00005846void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5847 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5848 T.setArch(Arch);
5849
5850 if (Str == "x86_64h")
5851 T.setArchName(Str);
5852 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5853 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005854 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005855 }
5856}
5857
Bob Wilsondecc03e2012-11-23 06:14:39 +00005858const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005859 const InputInfo &Input) {
5860 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005861}
5862
Bob Wilsondecc03e2012-11-23 06:14:39 +00005863const char *Clang::getBaseInputStem(const ArgList &Args,
5864 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005865 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005866
Chris Lattner906bb902011-01-16 08:14:11 +00005867 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005868 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005869
5870 return Str;
5871}
5872
Bob Wilsondecc03e2012-11-23 06:14:39 +00005873const char *Clang::getDependencyFileName(const ArgList &Args,
5874 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005875 // FIXME: Think about this more.
5876 std::string Res;
5877
5878 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005879 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005880 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005881 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005882 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005883 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005884 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005885}
5886
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005887void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5888 const InputInfo &Output,
5889 const InputInfoList &Inputs,
5890 const ArgList &Args,
5891 const char *LinkingOutput) const {
5892 const ToolChain &ToolChain = getToolChain();
5893 const Driver &D = ToolChain.getDriver();
5894 ArgStringList CmdArgs;
5895
5896 // Silence warning for "clang -g foo.o -o foo"
5897 Args.ClaimAllArgs(options::OPT_g_Group);
5898 // and "clang -emit-llvm foo.o -o foo"
5899 Args.ClaimAllArgs(options::OPT_emit_llvm);
5900 // and for "clang -w foo.o -o foo". Other warning options are already
5901 // handled somewhere else.
5902 Args.ClaimAllArgs(options::OPT_w);
5903
5904 if (!D.SysRoot.empty())
5905 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5906
5907 // CloudABI only supports static linkage.
5908 CmdArgs.push_back("-Bstatic");
5909 CmdArgs.push_back("--eh-frame-hdr");
5910 CmdArgs.push_back("--gc-sections");
5911
5912 if (Output.isFilename()) {
5913 CmdArgs.push_back("-o");
5914 CmdArgs.push_back(Output.getFilename());
5915 } else {
5916 assert(Output.isNothing() && "Invalid output.");
5917 }
5918
5919 if (!Args.hasArg(options::OPT_nostdlib) &&
5920 !Args.hasArg(options::OPT_nostartfiles)) {
5921 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5922 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5923 }
5924
5925 Args.AddAllArgs(CmdArgs, options::OPT_L);
5926 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5927 for (const auto &Path : Paths)
5928 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5929 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5930 Args.AddAllArgs(CmdArgs, options::OPT_e);
5931 Args.AddAllArgs(CmdArgs, options::OPT_s);
5932 Args.AddAllArgs(CmdArgs, options::OPT_t);
5933 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5934 Args.AddAllArgs(CmdArgs, options::OPT_r);
5935
5936 if (D.IsUsingLTO(ToolChain, Args))
5937 AddGoldPlugin(ToolChain, Args, CmdArgs);
5938
5939 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5940
5941 if (!Args.hasArg(options::OPT_nostdlib) &&
5942 !Args.hasArg(options::OPT_nodefaultlibs)) {
5943 if (D.CCCIsCXX())
5944 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5945 CmdArgs.push_back("-lc");
5946 CmdArgs.push_back("-lcompiler_rt");
5947 }
5948
5949 if (!Args.hasArg(options::OPT_nostdlib) &&
5950 !Args.hasArg(options::OPT_nostartfiles))
5951 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5952
5953 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5954 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5955}
5956
Daniel Dunbarbe220842009-03-20 16:06:39 +00005957void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005958 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005959 const InputInfoList &Inputs,
5960 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005961 const char *LinkingOutput) const {
5962 ArgStringList CmdArgs;
5963
5964 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5965 const InputInfo &Input = Inputs[0];
5966
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005967 // Determine the original source input.
5968 const Action *SourceAction = &JA;
5969 while (SourceAction->getKind() != Action::InputClass) {
5970 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5971 SourceAction = SourceAction->getInputs()[0];
5972 }
5973
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005974 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005975 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005976 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5977 // FIXME: at run-time detect assembler capabilities or rely on version
5978 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005979 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005980 const llvm::Triple &T(getToolChain().getTriple());
5981 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005982 CmdArgs.push_back("-Q");
5983 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005984
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005985 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005986 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005987 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005988 if (Args.hasArg(options::OPT_gstabs))
5989 CmdArgs.push_back("--gstabs");
5990 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005991 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005992 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005993
Daniel Dunbarbe220842009-03-20 16:06:39 +00005994 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005995 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005996
Daniel Dunbar6d484762010-07-22 01:47:22 +00005997 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005998 if (getToolChain().getArch() == llvm::Triple::x86 ||
5999 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006000 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6001 CmdArgs.push_back("-force_cpusubtype_ALL");
6002
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006003 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006004 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006005 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006006 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006007 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006008 CmdArgs.push_back("-static");
6009
Daniel Dunbarbe220842009-03-20 16:06:39 +00006010 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6011 options::OPT_Xassembler);
6012
6013 assert(Output.isFilename() && "Unexpected lipo output.");
6014 CmdArgs.push_back("-o");
6015 CmdArgs.push_back(Output.getFilename());
6016
Daniel Dunbarb440f562010-08-02 02:38:21 +00006017 assert(Input.isFilename() && "Invalid input.");
6018 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006019
6020 // asm_final spec is empty.
6021
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006022 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006023 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006024 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006025}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006026
Tim Northover157d9112014-01-16 08:48:16 +00006027void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006028
Tim Northover157d9112014-01-16 08:48:16 +00006029void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6030 ArgStringList &CmdArgs) const {
6031 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006032
Daniel Dunbarc1964212009-03-26 16:23:12 +00006033 // Derived from darwin_arch spec.
6034 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006035 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006036
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006037 // FIXME: Is this needed anymore?
6038 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006039 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006040}
6041
Bill Wendling3b2000f2012-10-02 18:02:50 +00006042bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
6043 // We only need to generate a temp path for LTO if we aren't compiling object
6044 // files. When compiling source files, we run 'dsymutil' after linking. We
6045 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006046 for (const auto &Input : Inputs)
6047 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006048 return true;
6049
6050 return false;
6051}
6052
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006053void darwin::Link::AddLinkArgs(Compilation &C,
6054 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006055 ArgStringList &CmdArgs,
6056 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006057 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006058 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006059
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006060 unsigned Version[3] = { 0, 0, 0 };
6061 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6062 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006063 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006064 Version[1], Version[2], HadExtra) ||
6065 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006066 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006067 << A->getAsString(Args);
6068 }
6069
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006070 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006071 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006072 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6073 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006074
Bob Wilson3d27dad2013-08-02 22:25:34 +00006075 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6076 CmdArgs.push_back("-export_dynamic");
6077
Bob Wilsonb111ec92015-03-02 19:01:14 +00006078 // If we are using App Extension restrictions, pass a flag to the linker
6079 // telling it that the compiled code has been audited.
6080 if (Args.hasFlag(options::OPT_fapplication_extension,
6081 options::OPT_fno_application_extension, false))
6082 CmdArgs.push_back("-application_extension");
6083
Bill Wendling313b6bf2012-11-16 23:03:00 +00006084 // If we are using LTO, then automatically create a temporary file path for
6085 // the linker to use, so that it's lifetime will extend past a possible
6086 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006087 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6088 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006089 const char *TmpPath = C.getArgs().MakeArgString(
6090 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6091 C.addTempFile(TmpPath);
6092 CmdArgs.push_back("-object_path_lto");
6093 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006094 }
6095
Daniel Dunbarc1964212009-03-26 16:23:12 +00006096 // Derived from the "link" spec.
6097 Args.AddAllArgs(CmdArgs, options::OPT_static);
6098 if (!Args.hasArg(options::OPT_static))
6099 CmdArgs.push_back("-dynamic");
6100 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6101 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6102 // here. How do we wish to handle such things?
6103 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006104
Daniel Dunbarc1964212009-03-26 16:23:12 +00006105 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006106 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006107 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006108 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006109
6110 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6111 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6112 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6113
6114 Arg *A;
6115 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6116 (A = Args.getLastArg(options::OPT_current__version)) ||
6117 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006118 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006119 << A->getAsString(Args) << "-dynamiclib";
6120
6121 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6122 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6123 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6124 } else {
6125 CmdArgs.push_back("-dylib");
6126
6127 Arg *A;
6128 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6129 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6130 (A = Args.getLastArg(options::OPT_client__name)) ||
6131 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6132 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6133 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006134 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006135 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006136
Daniel Dunbarc1964212009-03-26 16:23:12 +00006137 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6138 "-dylib_compatibility_version");
6139 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6140 "-dylib_current_version");
6141
Tim Northover157d9112014-01-16 08:48:16 +00006142 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006143
6144 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6145 "-dylib_install_name");
6146 }
6147
6148 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6149 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6150 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006151 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006152 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006153 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6154 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6155 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6156 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6157 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6158 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006159 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006160 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6161 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6162 Args.AddAllArgs(CmdArgs, options::OPT_init);
6163
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006164 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006165 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006166
Daniel Dunbarc1964212009-03-26 16:23:12 +00006167 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6168 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6169 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6170 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6171 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006172
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006173 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6174 options::OPT_fno_pie,
6175 options::OPT_fno_PIE)) {
6176 if (A->getOption().matches(options::OPT_fpie) ||
6177 A->getOption().matches(options::OPT_fPIE))
6178 CmdArgs.push_back("-pie");
6179 else
6180 CmdArgs.push_back("-no_pie");
6181 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006182
6183 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6184 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6185 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6186 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6187 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6188 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6189 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6190 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6191 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6192 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6193 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6194 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6195 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6196 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6197 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6198 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006199
Daniel Dunbar84384642011-05-02 21:03:47 +00006200 // Give --sysroot= preference, over the Apple specific behavior to also use
6201 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006202 StringRef sysroot = C.getSysRoot();
6203 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006204 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006205 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006206 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6207 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006208 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006209 }
6210
Daniel Dunbarc1964212009-03-26 16:23:12 +00006211 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6212 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6213 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6214 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6215 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006216 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006217 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6218 Args.AddAllArgs(CmdArgs, options::OPT_y);
6219 Args.AddLastArg(CmdArgs, options::OPT_w);
6220 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6221 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6222 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6223 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6224 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6225 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6226 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6227 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6228 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6229 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6230 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6231 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6232}
6233
Alexey Bataev186b28a2014-03-06 05:43:53 +00006234enum LibOpenMP {
6235 LibUnknown,
6236 LibGOMP,
6237 LibIOMP5
6238};
6239
Richard Smith31d1de22015-05-20 22:48:44 +00006240/// Map a -fopenmp=<blah> macro to the corresponding library.
6241static LibOpenMP getOpenMPLibByName(StringRef Name) {
6242 return llvm::StringSwitch<LibOpenMP>(Name).Case("libgomp", LibGOMP)
6243 .Case("libiomp5", LibIOMP5)
6244 .Default(LibUnknown);
6245}
6246
6247/// Get the default -l<blah> flag to use for -fopenmp, if no library is
6248/// specified. This can be overridden at configure time.
6249static const char *getDefaultOpenMPLibFlag() {
6250#ifndef OPENMP_DEFAULT_LIB
6251#define OPENMP_DEFAULT_LIB iomp5
6252#endif
6253
6254#define STR2(lib) #lib
6255#define STR(lib) STR2(lib)
6256 return "-l" STR(OPENMP_DEFAULT_LIB);
6257#undef STR
6258#undef STR2
6259}
6260
Daniel Dunbarc1964212009-03-26 16:23:12 +00006261void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006262 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006263 const InputInfoList &Inputs,
6264 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006265 const char *LinkingOutput) const {
6266 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006267
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006268 // If the number of arguments surpasses the system limits, we will encode the
6269 // input files in a separate file, shortening the command line. To this end,
6270 // build a list of input file names that can be passed via a file with the
6271 // -filelist linker option.
6272 llvm::opt::ArgStringList InputFileList;
6273
Daniel Dunbarc1964212009-03-26 16:23:12 +00006274 // The logic here is derived from gcc's behavior; most of which
6275 // comes from specs (starting with link_command). Consult gcc for
6276 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006277 ArgStringList CmdArgs;
6278
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006279 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6280 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6281 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006282 for (const auto &Arg : Args)
6283 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006284 const char *Exec =
6285 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6286 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006287 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006288 return;
6289 }
6290
Daniel Dunbarc1964212009-03-26 16:23:12 +00006291 // I'm not sure why this particular decomposition exists in gcc, but
6292 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006293 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006294
Daniel Dunbarc1964212009-03-26 16:23:12 +00006295 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6296 Args.AddAllArgs(CmdArgs, options::OPT_s);
6297 Args.AddAllArgs(CmdArgs, options::OPT_t);
6298 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6299 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006300 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006301 Args.AddAllArgs(CmdArgs, options::OPT_r);
6302
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006303 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6304 // members of static archive libraries which implement Objective-C classes or
6305 // categories.
6306 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6307 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006308
Daniel Dunbarc1964212009-03-26 16:23:12 +00006309 CmdArgs.push_back("-o");
6310 CmdArgs.push_back(Output.getFilename());
6311
Chad Rosier06fd3c62012-05-16 23:45:12 +00006312 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006313 !Args.hasArg(options::OPT_nostartfiles))
6314 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006315
6316 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006317
Alexey Bataevdb390212015-05-20 04:24:19 +00006318 if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
Richard Smith31d1de22015-05-20 22:48:44 +00006319 switch (getOpenMPLibByName(A->getValue())) {
6320 case LibGOMP:
6321 CmdArgs.push_back("-lgomp");
6322 break;
6323 case LibIOMP5:
6324 CmdArgs.push_back("-liomp5");
6325 break;
6326 case LibUnknown:
Alexey Bataev186b28a2014-03-06 05:43:53 +00006327 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6328 << A->getOption().getName() << A->getValue();
Richard Smith31d1de22015-05-20 22:48:44 +00006329 break;
6330 }
Alexey Bataevdb390212015-05-20 04:24:19 +00006331 } else if (Args.hasArg(options::OPT_fopenmp)) {
Richard Smith31d1de22015-05-20 22:48:44 +00006332 CmdArgs.push_back(getDefaultOpenMPLibFlag());
Alexey Bataev186b28a2014-03-06 05:43:53 +00006333 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006334
Douglas Gregor9295df02012-05-15 21:00:27 +00006335 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006336 // Build the input file for -filelist (list of linker input files) in case we
6337 // need it later
6338 for (const auto &II : Inputs) {
6339 if (!II.isFilename()) {
6340 // This is a linker input argument.
6341 // We cannot mix input arguments and file names in a -filelist input, thus
6342 // we prematurely stop our list (remaining files shall be passed as
6343 // arguments).
6344 if (InputFileList.size() > 0)
6345 break;
6346
6347 continue;
6348 }
6349
6350 InputFileList.push_back(II.getFilename());
6351 }
6352
Bob Wilson16d93952012-05-15 18:57:39 +00006353 if (isObjCRuntimeLinked(Args) &&
6354 !Args.hasArg(options::OPT_nostdlib) &&
6355 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006356 // We use arclite library for both ARC and subscripting support.
6357 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6358
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006359 CmdArgs.push_back("-framework");
6360 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006361 // Link libobj.
6362 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006363 }
John McCall31168b02011-06-15 23:02:42 +00006364
Daniel Dunbarc1964212009-03-26 16:23:12 +00006365 if (LinkingOutput) {
6366 CmdArgs.push_back("-arch_multiple");
6367 CmdArgs.push_back("-final_output");
6368 CmdArgs.push_back(LinkingOutput);
6369 }
6370
Daniel Dunbarc1964212009-03-26 16:23:12 +00006371 if (Args.hasArg(options::OPT_fnested_functions))
6372 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006373
Justin Bognerc7701242015-05-12 05:44:36 +00006374 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6375 // paths are different enough from other toolchains that this needs a fair
6376 // amount of refactoring done first.
6377 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6378
Daniel Dunbarc1964212009-03-26 16:23:12 +00006379 if (!Args.hasArg(options::OPT_nostdlib) &&
6380 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006381 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006382 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006383
Daniel Dunbarc1964212009-03-26 16:23:12 +00006384 // link_ssp spec is empty.
6385
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006386 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006387 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006388 }
6389
Chad Rosier06fd3c62012-05-16 23:45:12 +00006390 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006391 !Args.hasArg(options::OPT_nostartfiles)) {
6392 // endfile_spec is empty.
6393 }
6394
6395 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6396 Args.AddAllArgs(CmdArgs, options::OPT_F);
6397
Steven Wu3ffb61b2015-02-06 18:08:29 +00006398 // -iframework should be forwarded as -F.
6399 for (auto it = Args.filtered_begin(options::OPT_iframework),
6400 ie = Args.filtered_end(); it != ie; ++it)
6401 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6402 (*it)->getValue()));
6403
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006404 if (!Args.hasArg(options::OPT_nostdlib) &&
6405 !Args.hasArg(options::OPT_nodefaultlibs)) {
6406 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6407 if (A->getValue() == StringRef("Accelerate")) {
6408 CmdArgs.push_back("-framework");
6409 CmdArgs.push_back("Accelerate");
6410 }
6411 }
6412 }
6413
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006414 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006415 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006416 std::unique_ptr<Command> Cmd =
6417 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6418 Cmd->setInputFileList(std::move(InputFileList));
6419 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006420}
6421
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006422void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006423 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006424 const InputInfoList &Inputs,
6425 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006426 const char *LinkingOutput) const {
6427 ArgStringList CmdArgs;
6428
6429 CmdArgs.push_back("-create");
6430 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006431
6432 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006433 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006434
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006435 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006436 assert(II.isFilename() && "Unexpected lipo input.");
6437 CmdArgs.push_back(II.getFilename());
6438 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006439
6440 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006441 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006442}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006443
Daniel Dunbar88299622010-06-04 18:28:36 +00006444void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006445 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006446 const InputInfoList &Inputs,
6447 const ArgList &Args,
6448 const char *LinkingOutput) const {
6449 ArgStringList CmdArgs;
6450
Daniel Dunbareb86b042011-05-09 17:23:16 +00006451 CmdArgs.push_back("-o");
6452 CmdArgs.push_back(Output.getFilename());
6453
Daniel Dunbar88299622010-06-04 18:28:36 +00006454 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6455 const InputInfo &Input = Inputs[0];
6456 assert(Input.isFilename() && "Unexpected dsymutil input.");
6457 CmdArgs.push_back(Input.getFilename());
6458
Daniel Dunbar88299622010-06-04 18:28:36 +00006459 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006460 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006461 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006462}
6463
Eric Christopher551ef452011-08-23 17:56:55 +00006464void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006465 const InputInfo &Output,
6466 const InputInfoList &Inputs,
6467 const ArgList &Args,
6468 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006469 ArgStringList CmdArgs;
6470 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006471 CmdArgs.push_back("--debug-info");
6472 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006473 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006474
6475 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6476 const InputInfo &Input = Inputs[0];
6477 assert(Input.isFilename() && "Unexpected verify input");
6478
6479 // Grabbing the output of the earlier dsymutil run.
6480 CmdArgs.push_back(Input.getFilename());
6481
6482 const char *Exec =
6483 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006484 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006485}
6486
David Chisnallf571cde2012-02-15 13:39:01 +00006487void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6488 const InputInfo &Output,
6489 const InputInfoList &Inputs,
6490 const ArgList &Args,
6491 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006492 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006493 ArgStringList CmdArgs;
6494
6495 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6496 options::OPT_Xassembler);
6497
6498 CmdArgs.push_back("-o");
6499 CmdArgs.push_back(Output.getFilename());
6500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006501 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006502 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006504 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006505 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006506}
6507
David Chisnallf571cde2012-02-15 13:39:01 +00006508void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6509 const InputInfo &Output,
6510 const InputInfoList &Inputs,
6511 const ArgList &Args,
6512 const char *LinkingOutput) const {
6513 // FIXME: Find a real GCC, don't hard-code versions here
6514 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6515 const llvm::Triple &T = getToolChain().getTriple();
6516 std::string LibPath = "/usr/lib/";
6517 llvm::Triple::ArchType Arch = T.getArch();
6518 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006519 case llvm::Triple::x86:
6520 GCCLibPath +=
6521 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6522 break;
6523 case llvm::Triple::x86_64:
6524 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6525 GCCLibPath += "/4.5.2/amd64/";
6526 LibPath += "amd64/";
6527 break;
6528 default:
6529 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006530 }
6531
6532 ArgStringList CmdArgs;
6533
David Chisnall272a0712012-02-29 15:06:12 +00006534 // Demangle C++ names in errors
6535 CmdArgs.push_back("-C");
6536
David Chisnallf571cde2012-02-15 13:39:01 +00006537 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6538 (!Args.hasArg(options::OPT_shared))) {
6539 CmdArgs.push_back("-e");
6540 CmdArgs.push_back("_start");
6541 }
6542
6543 if (Args.hasArg(options::OPT_static)) {
6544 CmdArgs.push_back("-Bstatic");
6545 CmdArgs.push_back("-dn");
6546 } else {
6547 CmdArgs.push_back("-Bdynamic");
6548 if (Args.hasArg(options::OPT_shared)) {
6549 CmdArgs.push_back("-shared");
6550 } else {
6551 CmdArgs.push_back("--dynamic-linker");
6552 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6553 }
6554 }
6555
6556 if (Output.isFilename()) {
6557 CmdArgs.push_back("-o");
6558 CmdArgs.push_back(Output.getFilename());
6559 } else {
6560 assert(Output.isNothing() && "Invalid output.");
6561 }
6562
6563 if (!Args.hasArg(options::OPT_nostdlib) &&
6564 !Args.hasArg(options::OPT_nostartfiles)) {
6565 if (!Args.hasArg(options::OPT_shared)) {
6566 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6567 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006568 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006569 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6570 } else {
6571 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006572 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6573 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006574 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006575 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006576 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006577 }
6578
6579 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6580
6581 Args.AddAllArgs(CmdArgs, options::OPT_L);
6582 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6583 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006584 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006585
6586 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6587
6588 if (!Args.hasArg(options::OPT_nostdlib) &&
6589 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006590 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006591 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006592 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006593 if (!Args.hasArg(options::OPT_shared)) {
6594 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006595 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006596 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006597 }
David Chisnallf571cde2012-02-15 13:39:01 +00006598 }
6599
6600 if (!Args.hasArg(options::OPT_nostdlib) &&
6601 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006602 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006603 }
David Chisnall96de9932012-02-16 16:00:47 +00006604 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006605
Alexey Samsonov7811d192014-02-20 13:57:37 +00006606 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006607
6608 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006609 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006610 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006611}
6612
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006613void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006614 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006615 const InputInfoList &Inputs,
6616 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006617 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006618 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006619 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006620 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006621
Rafael Espindolacc126272014-02-28 01:55:21 +00006622 switch (getToolChain().getArch()) {
6623 case llvm::Triple::x86:
6624 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6625 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006626 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006627 break;
6628
6629 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006630 CmdArgs.push_back("-mppc");
6631 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006632 break;
6633
6634 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006635 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006636 CmdArgs.push_back("-32");
6637 NeedsKPIC = true;
6638 break;
6639
6640 case llvm::Triple::sparcv9:
6641 CmdArgs.push_back("-64");
6642 CmdArgs.push_back("-Av9a");
6643 NeedsKPIC = true;
6644 break;
6645
6646 case llvm::Triple::mips64:
6647 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006648 StringRef CPUName;
6649 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006650 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006651
6652 CmdArgs.push_back("-mabi");
6653 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6654
6655 if (getToolChain().getArch() == llvm::Triple::mips64)
6656 CmdArgs.push_back("-EB");
6657 else
6658 CmdArgs.push_back("-EL");
6659
Rafael Espindolacc126272014-02-28 01:55:21 +00006660 NeedsKPIC = true;
6661 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006662 }
6663
Rafael Espindolacc126272014-02-28 01:55:21 +00006664 default:
6665 break;
6666 }
6667
6668 if (NeedsKPIC)
6669 addAssemblerKPIC(Args, CmdArgs);
6670
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006671 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6672 options::OPT_Xassembler);
6673
6674 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006675 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006676
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006677 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006678 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006679
6680 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006681 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006682 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006683}
6684
6685void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006686 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006687 const InputInfoList &Inputs,
6688 const ArgList &Args,
6689 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006690 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006691 ArgStringList CmdArgs;
6692
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006693 // Silence warning for "clang -g foo.o -o foo"
6694 Args.ClaimAllArgs(options::OPT_g_Group);
6695 // and "clang -emit-llvm foo.o -o foo"
6696 Args.ClaimAllArgs(options::OPT_emit_llvm);
6697 // and for "clang -w foo.o -o foo". Other warning options are already
6698 // handled somewhere else.
6699 Args.ClaimAllArgs(options::OPT_w);
6700
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006701 if (getToolChain().getArch() == llvm::Triple::mips64)
6702 CmdArgs.push_back("-EB");
6703 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6704 CmdArgs.push_back("-EL");
6705
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006706 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006707 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006708 CmdArgs.push_back("-e");
6709 CmdArgs.push_back("__start");
6710 }
6711
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006712 if (Args.hasArg(options::OPT_static)) {
6713 CmdArgs.push_back("-Bstatic");
6714 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006715 if (Args.hasArg(options::OPT_rdynamic))
6716 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006717 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006718 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006719 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006720 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006721 } else {
6722 CmdArgs.push_back("-dynamic-linker");
6723 CmdArgs.push_back("/usr/libexec/ld.so");
6724 }
6725 }
6726
Rafael Espindola044f7832013-06-05 04:28:55 +00006727 if (Args.hasArg(options::OPT_nopie))
6728 CmdArgs.push_back("-nopie");
6729
Daniel Dunbarb440f562010-08-02 02:38:21 +00006730 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006731 CmdArgs.push_back("-o");
6732 CmdArgs.push_back(Output.getFilename());
6733 } else {
6734 assert(Output.isNothing() && "Invalid output.");
6735 }
6736
6737 if (!Args.hasArg(options::OPT_nostdlib) &&
6738 !Args.hasArg(options::OPT_nostartfiles)) {
6739 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006740 if (Args.hasArg(options::OPT_pg))
6741 CmdArgs.push_back(Args.MakeArgString(
6742 getToolChain().GetFilePath("gcrt0.o")));
6743 else
6744 CmdArgs.push_back(Args.MakeArgString(
6745 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006746 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006747 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006748 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006749 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006750 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006751 }
6752 }
6753
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006754 std::string Triple = getToolChain().getTripleString();
6755 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006756 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006757 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006758 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006759
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006760 Args.AddAllArgs(CmdArgs, options::OPT_L);
6761 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6762 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006763 Args.AddAllArgs(CmdArgs, options::OPT_s);
6764 Args.AddAllArgs(CmdArgs, options::OPT_t);
6765 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6766 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006767
Daniel Dunbar54423b22010-09-17 00:24:54 +00006768 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006769
6770 if (!Args.hasArg(options::OPT_nostdlib) &&
6771 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006772 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006773 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006774 if (Args.hasArg(options::OPT_pg))
6775 CmdArgs.push_back("-lm_p");
6776 else
6777 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006778 }
6779
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006780 // FIXME: For some reason GCC passes -lgcc before adding
6781 // the default system libraries. Just mimic this for now.
6782 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006783
Eric Christopher17674ec2012-09-13 06:32:34 +00006784 if (Args.hasArg(options::OPT_pthread)) {
6785 if (!Args.hasArg(options::OPT_shared) &&
6786 Args.hasArg(options::OPT_pg))
6787 CmdArgs.push_back("-lpthread_p");
6788 else
6789 CmdArgs.push_back("-lpthread");
6790 }
6791
Chandler Carruth45661652011-12-17 22:32:42 +00006792 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006793 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006794 CmdArgs.push_back("-lc_p");
6795 else
6796 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006797 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006798
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006799 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006800 }
6801
6802 if (!Args.hasArg(options::OPT_nostdlib) &&
6803 !Args.hasArg(options::OPT_nostartfiles)) {
6804 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006805 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006806 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006807 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006808 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006809 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006810 }
6811
6812 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006813 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006814 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006815}
Ed Schoutene33194b2009-04-02 19:13:12 +00006816
Eli Friedman9fa28852012-08-08 23:57:20 +00006817void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6818 const InputInfo &Output,
6819 const InputInfoList &Inputs,
6820 const ArgList &Args,
6821 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006822 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006823 ArgStringList CmdArgs;
6824
6825 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6826 options::OPT_Xassembler);
6827
6828 CmdArgs.push_back("-o");
6829 CmdArgs.push_back(Output.getFilename());
6830
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006831 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006832 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006833
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006834 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006835 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006836}
6837
6838void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6839 const InputInfo &Output,
6840 const InputInfoList &Inputs,
6841 const ArgList &Args,
6842 const char *LinkingOutput) const {
6843 const Driver &D = getToolChain().getDriver();
6844 ArgStringList CmdArgs;
6845
6846 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6847 (!Args.hasArg(options::OPT_shared))) {
6848 CmdArgs.push_back("-e");
6849 CmdArgs.push_back("__start");
6850 }
6851
6852 if (Args.hasArg(options::OPT_static)) {
6853 CmdArgs.push_back("-Bstatic");
6854 } else {
6855 if (Args.hasArg(options::OPT_rdynamic))
6856 CmdArgs.push_back("-export-dynamic");
6857 CmdArgs.push_back("--eh-frame-hdr");
6858 CmdArgs.push_back("-Bdynamic");
6859 if (Args.hasArg(options::OPT_shared)) {
6860 CmdArgs.push_back("-shared");
6861 } else {
6862 CmdArgs.push_back("-dynamic-linker");
6863 CmdArgs.push_back("/usr/libexec/ld.so");
6864 }
6865 }
6866
6867 if (Output.isFilename()) {
6868 CmdArgs.push_back("-o");
6869 CmdArgs.push_back(Output.getFilename());
6870 } else {
6871 assert(Output.isNothing() && "Invalid output.");
6872 }
6873
6874 if (!Args.hasArg(options::OPT_nostdlib) &&
6875 !Args.hasArg(options::OPT_nostartfiles)) {
6876 if (!Args.hasArg(options::OPT_shared)) {
6877 if (Args.hasArg(options::OPT_pg))
6878 CmdArgs.push_back(Args.MakeArgString(
6879 getToolChain().GetFilePath("gcrt0.o")));
6880 else
6881 CmdArgs.push_back(Args.MakeArgString(
6882 getToolChain().GetFilePath("crt0.o")));
6883 CmdArgs.push_back(Args.MakeArgString(
6884 getToolChain().GetFilePath("crtbegin.o")));
6885 } else {
6886 CmdArgs.push_back(Args.MakeArgString(
6887 getToolChain().GetFilePath("crtbeginS.o")));
6888 }
6889 }
6890
6891 Args.AddAllArgs(CmdArgs, options::OPT_L);
6892 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6893 Args.AddAllArgs(CmdArgs, options::OPT_e);
6894
6895 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6896
6897 if (!Args.hasArg(options::OPT_nostdlib) &&
6898 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006899 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006900 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6901 if (Args.hasArg(options::OPT_pg))
6902 CmdArgs.push_back("-lm_p");
6903 else
6904 CmdArgs.push_back("-lm");
6905 }
6906
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006907 if (Args.hasArg(options::OPT_pthread)) {
6908 if (!Args.hasArg(options::OPT_shared) &&
6909 Args.hasArg(options::OPT_pg))
6910 CmdArgs.push_back("-lpthread_p");
6911 else
6912 CmdArgs.push_back("-lpthread");
6913 }
6914
Eli Friedman9fa28852012-08-08 23:57:20 +00006915 if (!Args.hasArg(options::OPT_shared)) {
6916 if (Args.hasArg(options::OPT_pg))
6917 CmdArgs.push_back("-lc_p");
6918 else
6919 CmdArgs.push_back("-lc");
6920 }
6921
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006922 StringRef MyArch;
6923 switch (getToolChain().getTriple().getArch()) {
6924 case llvm::Triple::arm:
6925 MyArch = "arm";
6926 break;
6927 case llvm::Triple::x86:
6928 MyArch = "i386";
6929 break;
6930 case llvm::Triple::x86_64:
6931 MyArch = "amd64";
6932 break;
6933 default:
6934 llvm_unreachable("Unsupported architecture");
6935 }
6936 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006937 }
6938
6939 if (!Args.hasArg(options::OPT_nostdlib) &&
6940 !Args.hasArg(options::OPT_nostartfiles)) {
6941 if (!Args.hasArg(options::OPT_shared))
6942 CmdArgs.push_back(Args.MakeArgString(
6943 getToolChain().GetFilePath("crtend.o")));
6944 else
6945 CmdArgs.push_back(Args.MakeArgString(
6946 getToolChain().GetFilePath("crtendS.o")));
6947 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006948
6949 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006950 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006951 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006952}
6953
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006954void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006955 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006956 const InputInfoList &Inputs,
6957 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006958 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006959 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006960 ArgStringList CmdArgs;
6961
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006962 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6963 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006964 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006965 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006966 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006967 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006968 else if (getToolChain().getArch() == llvm::Triple::mips ||
6969 getToolChain().getArch() == llvm::Triple::mipsel ||
6970 getToolChain().getArch() == llvm::Triple::mips64 ||
6971 getToolChain().getArch() == llvm::Triple::mips64el) {
6972 StringRef CPUName;
6973 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006974 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006975
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006976 CmdArgs.push_back("-march");
6977 CmdArgs.push_back(CPUName.data());
6978
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006979 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006980 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006981
6982 if (getToolChain().getArch() == llvm::Triple::mips ||
6983 getToolChain().getArch() == llvm::Triple::mips64)
6984 CmdArgs.push_back("-EB");
6985 else
6986 CmdArgs.push_back("-EL");
6987
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006988 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006989 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006990 getToolChain().getArch() == llvm::Triple::armeb ||
6991 getToolChain().getArch() == llvm::Triple::thumb ||
6992 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006993 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006994 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006995 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6996
6997 if (FloatABI == "hard") {
6998 CmdArgs.push_back("-mfpu=vfp");
6999 } else {
7000 CmdArgs.push_back("-mfpu=softvfp");
7001 }
7002
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007003 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007004 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007005 case llvm::Triple::GNUEABI:
7006 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007007 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007008 break;
7009
7010 default:
7011 CmdArgs.push_back("-matpcs");
7012 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007013 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007014 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007015 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007016 if (getToolChain().getArch() == llvm::Triple::sparc)
7017 CmdArgs.push_back("-Av8plusa");
7018 else
7019 CmdArgs.push_back("-Av9a");
7020
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007021 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007022 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007023
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007024 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7025 options::OPT_Xassembler);
7026
7027 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007028 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007029
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007030 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007031 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007032
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007033 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007034 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007035}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007036
7037void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007038 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007039 const InputInfoList &Inputs,
7040 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00007041 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00007042 const toolchains::FreeBSD& ToolChain =
7043 static_cast<const toolchains::FreeBSD&>(getToolChain());
7044 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007045 const bool IsPIE =
7046 !Args.hasArg(options::OPT_shared) &&
7047 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007048 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007049
7050 // Silence warning for "clang -g foo.o -o foo"
7051 Args.ClaimAllArgs(options::OPT_g_Group);
7052 // and "clang -emit-llvm foo.o -o foo"
7053 Args.ClaimAllArgs(options::OPT_emit_llvm);
7054 // and for "clang -w foo.o -o foo". Other warning options are already
7055 // handled somewhere else.
7056 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007057
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007058 if (!D.SysRoot.empty())
7059 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7060
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007061 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007062 CmdArgs.push_back("-pie");
7063
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007064 if (Args.hasArg(options::OPT_static)) {
7065 CmdArgs.push_back("-Bstatic");
7066 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007067 if (Args.hasArg(options::OPT_rdynamic))
7068 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007069 CmdArgs.push_back("--eh-frame-hdr");
7070 if (Args.hasArg(options::OPT_shared)) {
7071 CmdArgs.push_back("-Bshareable");
7072 } else {
7073 CmdArgs.push_back("-dynamic-linker");
7074 CmdArgs.push_back("/libexec/ld-elf.so.1");
7075 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007076 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
7077 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00007078 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7079 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7080 CmdArgs.push_back("--hash-style=both");
7081 }
7082 }
7083 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007084 }
7085
7086 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7087 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007088 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007089 CmdArgs.push_back("-m");
7090 CmdArgs.push_back("elf_i386_fbsd");
7091 }
7092
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007093 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007094 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007095 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007096 }
7097
Daniel Dunbarb440f562010-08-02 02:38:21 +00007098 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007099 CmdArgs.push_back("-o");
7100 CmdArgs.push_back(Output.getFilename());
7101 } else {
7102 assert(Output.isNothing() && "Invalid output.");
7103 }
7104
7105 if (!Args.hasArg(options::OPT_nostdlib) &&
7106 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007107 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007108 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007109 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007110 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007111 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007112 crt1 = "Scrt1.o";
7113 else
7114 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007115 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007116 if (crt1)
7117 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7118
7119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7120
Craig Topper92fc2df2014-05-17 16:56:41 +00007121 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007122 if (Args.hasArg(options::OPT_static))
7123 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007124 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007125 crtbegin = "crtbeginS.o";
7126 else
7127 crtbegin = "crtbegin.o";
7128
7129 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007130 }
7131
7132 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007133 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007134 for (const auto &Path : Paths)
7135 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007136 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7137 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007138 Args.AddAllArgs(CmdArgs, options::OPT_s);
7139 Args.AddAllArgs(CmdArgs, options::OPT_t);
7140 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7141 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007142
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007143 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007144 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007145
Alexey Samsonov52550342014-09-15 19:58:40 +00007146 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007147 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007148
7149 if (!Args.hasArg(options::OPT_nostdlib) &&
7150 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007151 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007152 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007153 if (Args.hasArg(options::OPT_pg))
7154 CmdArgs.push_back("-lm_p");
7155 else
7156 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007157 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007158 if (NeedsSanitizerDeps)
7159 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007160 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7161 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007162 if (Args.hasArg(options::OPT_pg))
7163 CmdArgs.push_back("-lgcc_p");
7164 else
7165 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007166 if (Args.hasArg(options::OPT_static)) {
7167 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007168 } else if (Args.hasArg(options::OPT_pg)) {
7169 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007170 } else {
7171 CmdArgs.push_back("--as-needed");
7172 CmdArgs.push_back("-lgcc_s");
7173 CmdArgs.push_back("--no-as-needed");
7174 }
7175
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007176 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007177 if (Args.hasArg(options::OPT_pg))
7178 CmdArgs.push_back("-lpthread_p");
7179 else
7180 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007181 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007182
Roman Divacky66f22762011-02-10 16:59:40 +00007183 if (Args.hasArg(options::OPT_pg)) {
7184 if (Args.hasArg(options::OPT_shared))
7185 CmdArgs.push_back("-lc");
7186 else
7187 CmdArgs.push_back("-lc_p");
7188 CmdArgs.push_back("-lgcc_p");
7189 } else {
7190 CmdArgs.push_back("-lc");
7191 CmdArgs.push_back("-lgcc");
7192 }
7193
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007194 if (Args.hasArg(options::OPT_static)) {
7195 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007196 } else if (Args.hasArg(options::OPT_pg)) {
7197 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007198 } else {
7199 CmdArgs.push_back("--as-needed");
7200 CmdArgs.push_back("-lgcc_s");
7201 CmdArgs.push_back("--no-as-needed");
7202 }
7203 }
7204
7205 if (!Args.hasArg(options::OPT_nostdlib) &&
7206 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007207 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007208 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007209 else
7210 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007211 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007212 }
7213
Alexey Samsonov7811d192014-02-20 13:57:37 +00007214 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007215
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007216 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007217 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007218 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007219}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007220
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007221void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7222 const InputInfo &Output,
7223 const InputInfoList &Inputs,
7224 const ArgList &Args,
7225 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007226 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007227 ArgStringList CmdArgs;
7228
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007229 // GNU as needs different flags for creating the correct output format
7230 // on architectures with different ABIs or optional feature sets.
7231 switch (getToolChain().getArch()) {
7232 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007233 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007234 break;
7235 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007236 case llvm::Triple::armeb:
7237 case llvm::Triple::thumb:
7238 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007239 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007240 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007241 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007242 }
7243
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007244 case llvm::Triple::mips:
7245 case llvm::Triple::mipsel:
7246 case llvm::Triple::mips64:
7247 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007248 StringRef CPUName;
7249 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007250 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007251
7252 CmdArgs.push_back("-march");
7253 CmdArgs.push_back(CPUName.data());
7254
7255 CmdArgs.push_back("-mabi");
7256 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7257
7258 if (getToolChain().getArch() == llvm::Triple::mips ||
7259 getToolChain().getArch() == llvm::Triple::mips64)
7260 CmdArgs.push_back("-EB");
7261 else
7262 CmdArgs.push_back("-EL");
7263
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007264 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007265 break;
7266 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007267
7268 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007269 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007270 CmdArgs.push_back("-32");
7271 addAssemblerKPIC(Args, CmdArgs);
7272 break;
7273
7274 case llvm::Triple::sparcv9:
7275 CmdArgs.push_back("-64");
7276 CmdArgs.push_back("-Av9");
7277 addAssemblerKPIC(Args, CmdArgs);
7278 break;
7279
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007280 default:
7281 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007282 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007283
7284 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7285 options::OPT_Xassembler);
7286
7287 CmdArgs.push_back("-o");
7288 CmdArgs.push_back(Output.getFilename());
7289
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007290 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007291 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007292
David Chisnallddbd68f2011-09-27 22:03:18 +00007293 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007294 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007295}
7296
7297void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7298 const InputInfo &Output,
7299 const InputInfoList &Inputs,
7300 const ArgList &Args,
7301 const char *LinkingOutput) const {
7302 const Driver &D = getToolChain().getDriver();
7303 ArgStringList CmdArgs;
7304
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007305 if (!D.SysRoot.empty())
7306 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7307
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007308 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007309 if (Args.hasArg(options::OPT_static)) {
7310 CmdArgs.push_back("-Bstatic");
7311 } else {
7312 if (Args.hasArg(options::OPT_rdynamic))
7313 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007314 if (Args.hasArg(options::OPT_shared)) {
7315 CmdArgs.push_back("-Bshareable");
7316 } else {
7317 CmdArgs.push_back("-dynamic-linker");
7318 CmdArgs.push_back("/libexec/ld.elf_so");
7319 }
7320 }
7321
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007322 // Many NetBSD architectures support more than one ABI.
7323 // Determine the correct emulation for ld.
7324 switch (getToolChain().getArch()) {
7325 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007326 CmdArgs.push_back("-m");
7327 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007328 break;
7329 case llvm::Triple::arm:
7330 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007331 CmdArgs.push_back("-m");
7332 switch (getToolChain().getTriple().getEnvironment()) {
7333 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007334 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007335 CmdArgs.push_back("armelf_nbsd_eabi");
7336 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007337 case llvm::Triple::EABIHF:
7338 case llvm::Triple::GNUEABIHF:
7339 CmdArgs.push_back("armelf_nbsd_eabihf");
7340 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007341 default:
7342 CmdArgs.push_back("armelf_nbsd");
7343 break;
7344 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007345 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007346 case llvm::Triple::armeb:
7347 case llvm::Triple::thumbeb:
John Brawn94fd9632015-05-21 12:19:49 +00007348 arm::appendEBLinkFlags(Args, CmdArgs,
7349 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007350 CmdArgs.push_back("-m");
7351 switch (getToolChain().getTriple().getEnvironment()) {
7352 case llvm::Triple::EABI:
7353 case llvm::Triple::GNUEABI:
7354 CmdArgs.push_back("armelfb_nbsd_eabi");
7355 break;
7356 case llvm::Triple::EABIHF:
7357 case llvm::Triple::GNUEABIHF:
7358 CmdArgs.push_back("armelfb_nbsd_eabihf");
7359 break;
7360 default:
7361 CmdArgs.push_back("armelfb_nbsd");
7362 break;
7363 }
7364 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007365 case llvm::Triple::mips64:
7366 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007367 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007368 CmdArgs.push_back("-m");
7369 if (getToolChain().getArch() == llvm::Triple::mips64)
7370 CmdArgs.push_back("elf32btsmip");
7371 else
7372 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007373 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007374 CmdArgs.push_back("-m");
7375 if (getToolChain().getArch() == llvm::Triple::mips64)
7376 CmdArgs.push_back("elf64btsmip");
7377 else
7378 CmdArgs.push_back("elf64ltsmip");
7379 }
7380 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007381 case llvm::Triple::ppc:
7382 CmdArgs.push_back("-m");
7383 CmdArgs.push_back("elf32ppc_nbsd");
7384 break;
7385
7386 case llvm::Triple::ppc64:
7387 case llvm::Triple::ppc64le:
7388 CmdArgs.push_back("-m");
7389 CmdArgs.push_back("elf64ppc");
7390 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007391
7392 case llvm::Triple::sparc:
7393 CmdArgs.push_back("-m");
7394 CmdArgs.push_back("elf32_sparc");
7395 break;
7396
7397 case llvm::Triple::sparcv9:
7398 CmdArgs.push_back("-m");
7399 CmdArgs.push_back("elf64_sparc");
7400 break;
7401
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007402 default:
7403 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007404 }
7405
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007406 if (Output.isFilename()) {
7407 CmdArgs.push_back("-o");
7408 CmdArgs.push_back(Output.getFilename());
7409 } else {
7410 assert(Output.isNothing() && "Invalid output.");
7411 }
7412
7413 if (!Args.hasArg(options::OPT_nostdlib) &&
7414 !Args.hasArg(options::OPT_nostartfiles)) {
7415 if (!Args.hasArg(options::OPT_shared)) {
7416 CmdArgs.push_back(Args.MakeArgString(
7417 getToolChain().GetFilePath("crt0.o")));
7418 CmdArgs.push_back(Args.MakeArgString(
7419 getToolChain().GetFilePath("crti.o")));
7420 CmdArgs.push_back(Args.MakeArgString(
7421 getToolChain().GetFilePath("crtbegin.o")));
7422 } else {
7423 CmdArgs.push_back(Args.MakeArgString(
7424 getToolChain().GetFilePath("crti.o")));
7425 CmdArgs.push_back(Args.MakeArgString(
7426 getToolChain().GetFilePath("crtbeginS.o")));
7427 }
7428 }
7429
7430 Args.AddAllArgs(CmdArgs, options::OPT_L);
7431 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7432 Args.AddAllArgs(CmdArgs, options::OPT_e);
7433 Args.AddAllArgs(CmdArgs, options::OPT_s);
7434 Args.AddAllArgs(CmdArgs, options::OPT_t);
7435 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7436 Args.AddAllArgs(CmdArgs, options::OPT_r);
7437
7438 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7439
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007440 unsigned Major, Minor, Micro;
7441 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7442 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007443 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007444 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007445 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007446 case llvm::Triple::arm:
7447 case llvm::Triple::armeb:
7448 case llvm::Triple::thumb:
7449 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007450 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007451 case llvm::Triple::ppc64:
7452 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007453 case llvm::Triple::x86:
7454 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007455 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007456 break;
7457 default:
7458 break;
7459 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007460 }
7461
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007462 if (!Args.hasArg(options::OPT_nostdlib) &&
7463 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007464 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007465 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7466 CmdArgs.push_back("-lm");
7467 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007468 if (Args.hasArg(options::OPT_pthread))
7469 CmdArgs.push_back("-lpthread");
7470 CmdArgs.push_back("-lc");
7471
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007472 if (useLibgcc) {
7473 if (Args.hasArg(options::OPT_static)) {
7474 // libgcc_eh depends on libc, so resolve as much as possible,
7475 // pull in any new requirements from libc and then get the rest
7476 // of libgcc.
7477 CmdArgs.push_back("-lgcc_eh");
7478 CmdArgs.push_back("-lc");
7479 CmdArgs.push_back("-lgcc");
7480 } else {
7481 CmdArgs.push_back("-lgcc");
7482 CmdArgs.push_back("--as-needed");
7483 CmdArgs.push_back("-lgcc_s");
7484 CmdArgs.push_back("--no-as-needed");
7485 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007486 }
7487 }
7488
7489 if (!Args.hasArg(options::OPT_nostdlib) &&
7490 !Args.hasArg(options::OPT_nostartfiles)) {
7491 if (!Args.hasArg(options::OPT_shared))
7492 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7493 "crtend.o")));
7494 else
7495 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7496 "crtendS.o")));
7497 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7498 "crtn.o")));
7499 }
7500
Alexey Samsonov7811d192014-02-20 13:57:37 +00007501 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007502
Logan Chieneb9162f2014-06-26 14:23:45 +00007503 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007504 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007505}
7506
Thomas Schwinge4e555262013-03-28 19:04:25 +00007507void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7508 const InputInfo &Output,
7509 const InputInfoList &Inputs,
7510 const ArgList &Args,
7511 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007512 claimNoWarnArgs(Args);
7513
Rafael Espindola92b00932010-08-10 00:25:48 +00007514 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007515 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007516
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007517 switch (getToolChain().getArch()) {
7518 default:
7519 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007520 // Add --32/--64 to make sure we get the format we want.
7521 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007522 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007523 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007524 break;
7525 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007526 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7527 CmdArgs.push_back("--x32");
7528 else
7529 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007530 break;
7531 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007532 CmdArgs.push_back("-a32");
7533 CmdArgs.push_back("-mppc");
7534 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007535 break;
7536 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007537 CmdArgs.push_back("-a64");
7538 CmdArgs.push_back("-mppc64");
7539 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007540 break;
7541 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007542 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007543 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007544 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007545 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007546 break;
7547 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007548 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007549 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007550 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007551 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007552 break;
7553 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007554 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007555 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007556 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007557 break;
7558 case llvm::Triple::arm:
7559 case llvm::Triple::armeb:
7560 case llvm::Triple::thumb:
7561 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007562 const llvm::Triple &Triple = getToolChain().getTriple();
7563 switch (Triple.getSubArch()) {
7564 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007565 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007566 break;
7567 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007568 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007569 break;
7570 default:
7571 break;
7572 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007573
Tim Northover9c7e0352013-12-12 11:55:52 +00007574 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007575 getToolChain().getDriver(), Args,
7576 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007577 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007578
7579 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007580
7581 // FIXME: remove krait check when GNU tools support krait cpu
7582 // for now replace it with -march=armv7-a to avoid a lower
7583 // march from being picked in the absence of a cpu flag.
7584 Arg *A;
7585 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin4045f662015-05-08 15:44:36 +00007586 StringRef(A->getValue()) == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007587 CmdArgs.push_back("-march=armv7-a");
7588 else
7589 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007590 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007591 break;
7592 }
7593 case llvm::Triple::mips:
7594 case llvm::Triple::mipsel:
7595 case llvm::Triple::mips64:
7596 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007597 StringRef CPUName;
7598 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007599 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007600 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007601
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007602 CmdArgs.push_back("-march");
7603 CmdArgs.push_back(CPUName.data());
7604
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007605 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007606 CmdArgs.push_back(ABIName.data());
7607
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007608 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7609 // or -mshared (not implemented) is in effect.
7610 bool IsPicOrPie = false;
7611 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7612 options::OPT_fpic, options::OPT_fno_pic,
7613 options::OPT_fPIE, options::OPT_fno_PIE,
7614 options::OPT_fpie, options::OPT_fno_pie)) {
7615 if (A->getOption().matches(options::OPT_fPIC) ||
7616 A->getOption().matches(options::OPT_fpic) ||
7617 A->getOption().matches(options::OPT_fPIE) ||
7618 A->getOption().matches(options::OPT_fpie))
7619 IsPicOrPie = true;
7620 }
7621 if (!IsPicOrPie)
7622 CmdArgs.push_back("-mno-shared");
7623
Daniel Sanders379d44b2014-07-16 11:52:23 +00007624 // LLVM doesn't support -mplt yet and acts as if it is always given.
7625 // However, -mplt has no effect with the N64 ABI.
7626 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007627
7628 if (getToolChain().getArch() == llvm::Triple::mips ||
7629 getToolChain().getArch() == llvm::Triple::mips64)
7630 CmdArgs.push_back("-EB");
7631 else
7632 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007633
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007634 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7635 if (StringRef(A->getValue()) == "2008")
7636 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7637 }
7638
Daniel Sanders379d44b2014-07-16 11:52:23 +00007639 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7640 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7641 options::OPT_mfp64)) {
7642 A->claim();
7643 A->render(Args, CmdArgs);
7644 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7645 ABIName))
7646 CmdArgs.push_back("-mfpxx");
7647
7648 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7649 // -mno-mips16 is actually -no-mips16.
7650 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7651 options::OPT_mno_mips16)) {
7652 if (A->getOption().matches(options::OPT_mips16)) {
7653 A->claim();
7654 A->render(Args, CmdArgs);
7655 } else {
7656 A->claim();
7657 CmdArgs.push_back("-no-mips16");
7658 }
7659 }
7660
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007661 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7662 options::OPT_mno_micromips);
7663 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7664 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7665
Simon Atanasyanbd986632013-11-26 11:58:04 +00007666 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7667 // Do not use AddLastArg because not all versions of MIPS assembler
7668 // support -mmsa / -mno-msa options.
7669 if (A->getOption().matches(options::OPT_mmsa))
7670 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7671 }
7672
Daniel Sanders379d44b2014-07-16 11:52:23 +00007673 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7674 options::OPT_msoft_float);
7675
7676 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7677 options::OPT_mno_odd_spreg);
7678
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007679 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007680 break;
7681 }
7682 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007683 // Always pass an -march option, since our default of z10 is later
7684 // than the GNU assembler's default.
7685 StringRef CPUName = getSystemZTargetCPU(Args);
7686 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007687 break;
7688 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007689 }
7690
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007691 if (NeedsKPIC)
7692 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007693
7694 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7695 options::OPT_Xassembler);
7696
7697 CmdArgs.push_back("-o");
7698 CmdArgs.push_back(Output.getFilename());
7699
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007700 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007701 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007702
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007703 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007704 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007705
7706 // Handle the debug info splitting at object creation time if we're
7707 // creating an object.
7708 // TODO: Currently only works on linux with newer objcopy.
7709 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007710 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007711 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007712 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007713}
7714
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007715static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007716 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007717 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007718 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7719 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007720 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007721 CmdArgs.push_back("-lgcc");
7722
Logan Chien3d3373c2012-11-19 12:04:11 +00007723 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007724 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007725 CmdArgs.push_back("-lgcc");
7726 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007727 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007728 CmdArgs.push_back("--as-needed");
7729 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007730 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007731 CmdArgs.push_back("--no-as-needed");
7732 }
7733
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007734 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007735 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007736 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007737 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007738
7739 // According to Android ABI, we have to link with libdl if we are
7740 // linking with non-static libgcc.
7741 //
7742 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7743 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7744 if (isAndroid && !StaticLibgcc)
7745 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007746}
7747
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007748static std::string getLinuxDynamicLinker(const ArgList &Args,
7749 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007750 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7751 if (ToolChain.getTriple().isArch64Bit())
7752 return "/system/bin/linker64";
7753 else
7754 return "/system/bin/linker";
7755 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007756 ToolChain.getArch() == llvm::Triple::sparc ||
7757 ToolChain.getArch() == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007758 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007759 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007760 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007761 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007762 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007763 else if (ToolChain.getArch() == llvm::Triple::arm ||
7764 ToolChain.getArch() == llvm::Triple::thumb) {
7765 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7766 return "/lib/ld-linux-armhf.so.3";
7767 else
7768 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007769 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7770 ToolChain.getArch() == llvm::Triple::thumbeb) {
7771 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7772 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7773 else
7774 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007775 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007776 ToolChain.getArch() == llvm::Triple::mipsel ||
7777 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007778 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007779 StringRef CPUName;
7780 StringRef ABIName;
7781 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7782 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7783
7784 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7785 .Case("o32", "/lib")
7786 .Case("n32", "/lib32")
7787 .Case("n64", "/lib64")
7788 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007789 StringRef LibName;
7790 if (mips::isUCLibc(Args))
7791 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7792 else
7793 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007794
7795 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007796 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7797 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007798 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7799 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7800 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007801 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007802 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7803 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7804 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007805 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007806 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7807 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007808 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7809 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007810 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7811 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7812 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007813 else
7814 return "/lib64/ld-linux-x86-64.so.2";
7815}
7816
Renato Golinc4b49242014-02-13 10:01:16 +00007817static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007818 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007819 // Make use of compiler-rt if --rtlib option is used
7820 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7821
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007822 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007823 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007824 switch (TC.getTriple().getOS()) {
7825 default: llvm_unreachable("unsupported OS");
7826 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007827 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007828 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007829 break;
7830 }
Renato Golinc4b49242014-02-13 10:01:16 +00007831 break;
7832 case ToolChain::RLT_Libgcc:
7833 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7834 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007835 }
7836}
7837
Rafael Espindola1e085772014-08-15 17:14:35 +00007838static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7839 switch (T.getArch()) {
7840 case llvm::Triple::x86:
7841 return "elf_i386";
7842 case llvm::Triple::aarch64:
7843 return "aarch64linux";
7844 case llvm::Triple::aarch64_be:
7845 return "aarch64_be_linux";
7846 case llvm::Triple::arm:
7847 case llvm::Triple::thumb:
7848 return "armelf_linux_eabi";
7849 case llvm::Triple::armeb:
7850 case llvm::Triple::thumbeb:
7851 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7852 case llvm::Triple::ppc:
7853 return "elf32ppclinux";
7854 case llvm::Triple::ppc64:
7855 return "elf64ppc";
7856 case llvm::Triple::ppc64le:
7857 return "elf64lppc";
7858 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007859 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007860 return "elf32_sparc";
7861 case llvm::Triple::sparcv9:
7862 return "elf64_sparc";
7863 case llvm::Triple::mips:
7864 return "elf32btsmip";
7865 case llvm::Triple::mipsel:
7866 return "elf32ltsmip";
7867 case llvm::Triple::mips64:
7868 if (mips::hasMipsAbiArg(Args, "n32"))
7869 return "elf32btsmipn32";
7870 return "elf64btsmip";
7871 case llvm::Triple::mips64el:
7872 if (mips::hasMipsAbiArg(Args, "n32"))
7873 return "elf32ltsmipn32";
7874 return "elf64ltsmip";
7875 case llvm::Triple::systemz:
7876 return "elf64_s390";
7877 case llvm::Triple::x86_64:
7878 if (T.getEnvironment() == llvm::Triple::GNUX32)
7879 return "elf32_x86_64";
7880 return "elf_x86_64";
7881 default:
7882 llvm_unreachable("Unexpected arch");
7883 }
7884}
7885
Thomas Schwinge4e555262013-03-28 19:04:25 +00007886void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7887 const InputInfo &Output,
7888 const InputInfoList &Inputs,
7889 const ArgList &Args,
7890 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007891 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007892 static_cast<const toolchains::Linux&>(getToolChain());
7893 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007894 const bool isAndroid =
7895 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007896 const bool IsPIE =
7897 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007898 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007899 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007900
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007901 ArgStringList CmdArgs;
7902
Rafael Espindolad1002f62010-11-15 18:28:16 +00007903 // Silence warning for "clang -g foo.o -o foo"
7904 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007905 // and "clang -emit-llvm foo.o -o foo"
7906 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007907 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007908 // handled somewhere else.
7909 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007910
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007911 if (!D.SysRoot.empty())
7912 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007913
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007914 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007915 CmdArgs.push_back("-pie");
7916
Rafael Espindola1c76c592010-11-07 22:57:16 +00007917 if (Args.hasArg(options::OPT_rdynamic))
7918 CmdArgs.push_back("-export-dynamic");
7919
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007920 if (Args.hasArg(options::OPT_s))
7921 CmdArgs.push_back("-s");
7922
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007923 if (ToolChain.getArch() == llvm::Triple::armeb ||
7924 ToolChain.getArch() == llvm::Triple::thumbeb)
John Brawn94fd9632015-05-21 12:19:49 +00007925 arm::appendEBLinkFlags(Args, CmdArgs,
7926 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007927
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007928 for (const auto &Opt : ToolChain.ExtraOpts)
7929 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007930
7931 if (!Args.hasArg(options::OPT_static)) {
7932 CmdArgs.push_back("--eh-frame-hdr");
7933 }
7934
7935 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007936 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007937
7938 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007939 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007940 ToolChain.getArch() == llvm::Triple::armeb ||
7941 ToolChain.getArch() == llvm::Triple::thumb ||
7942 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007943 CmdArgs.push_back("-Bstatic");
7944 else
7945 CmdArgs.push_back("-static");
7946 } else if (Args.hasArg(options::OPT_shared)) {
7947 CmdArgs.push_back("-shared");
7948 }
7949
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007950 if (ToolChain.getArch() == llvm::Triple::arm ||
7951 ToolChain.getArch() == llvm::Triple::armeb ||
7952 ToolChain.getArch() == llvm::Triple::thumb ||
7953 ToolChain.getArch() == llvm::Triple::thumbeb ||
7954 (!Args.hasArg(options::OPT_static) &&
7955 !Args.hasArg(options::OPT_shared))) {
7956 CmdArgs.push_back("-dynamic-linker");
7957 CmdArgs.push_back(Args.MakeArgString(
7958 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7959 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007960
7961 CmdArgs.push_back("-o");
7962 CmdArgs.push_back(Output.getFilename());
7963
Rafael Espindola81937ec2010-12-01 01:52:43 +00007964 if (!Args.hasArg(options::OPT_nostdlib) &&
7965 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007966 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007967 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007968 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007969 if (Args.hasArg(options::OPT_pg))
7970 crt1 = "gcrt1.o";
7971 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007972 crt1 = "Scrt1.o";
7973 else
7974 crt1 = "crt1.o";
7975 }
7976 if (crt1)
7977 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007978
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007979 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7980 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007981
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007982 const char *crtbegin;
7983 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007984 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007985 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007986 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007987 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007988 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007989 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007990 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007991 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007992
7993 // Add crtfastmath.o if available and fast math is enabled.
7994 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007995 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007996
7997 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007998 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007999
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008000 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008001
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008002 for (const auto &Path : Paths)
8003 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008004
Peter Collingbournea4ccff32015-02-20 20:30:56 +00008005 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008006 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008007
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008008 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8009 CmdArgs.push_back("--no-demangle");
8010
Alexey Samsonov52550342014-09-15 19:58:40 +00008011 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008012 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008013 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008014 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008015
Hans Wennborg70850d82013-07-18 20:29:38 +00008016 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008017 !Args.hasArg(options::OPT_nostdlib) &&
8018 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008019 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8020 !Args.hasArg(options::OPT_static);
8021 if (OnlyLibstdcxxStatic)
8022 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008023 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008024 if (OnlyLibstdcxxStatic)
8025 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008026 CmdArgs.push_back("-lm");
8027 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008028 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8029 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008030
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008031 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008032 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8033 if (Args.hasArg(options::OPT_static))
8034 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008035
Alexey Samsonov52550342014-09-15 19:58:40 +00008036 if (NeedsSanitizerDeps)
8037 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8038
Richard Smith31d1de22015-05-20 22:48:44 +00008039 bool WantPthread = true;
Alexey Bataevdb390212015-05-20 04:24:19 +00008040 if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
Richard Smith31d1de22015-05-20 22:48:44 +00008041 switch (getOpenMPLibByName(A->getValue())) {
8042 case LibGOMP:
8043 CmdArgs.push_back("-lgomp");
8044
8045 // FIXME: Exclude this for platforms with libgomp that don't require
8046 // librt. Most modern Linux platforms require it, but some may not.
8047 CmdArgs.push_back("-lrt");
8048 break;
8049 case LibIOMP5:
8050 CmdArgs.push_back("-liomp5");
8051 break;
8052 case LibUnknown:
Alexey Bataev186b28a2014-03-06 05:43:53 +00008053 D.Diag(diag::err_drv_unsupported_option_argument)
Alexey Bataevdb390212015-05-20 04:24:19 +00008054 << A->getOption().getName() << A->getValue();
Richard Smith31d1de22015-05-20 22:48:44 +00008055 break;
8056 }
Alexey Bataevdb390212015-05-20 04:24:19 +00008057 } else if (Args.hasArg(options::OPT_fopenmp)) {
Richard Smith31d1de22015-05-20 22:48:44 +00008058 CmdArgs.push_back(getDefaultOpenMPLibFlag());
8059 } else {
8060 WantPthread = Args.hasArg(options::OPT_pthread) ||
8061 Args.hasArg(options::OPT_pthreads);
Chandler Carruth01538002013-01-17 13:19:29 +00008062 }
Renato Golinc4b49242014-02-13 10:01:16 +00008063 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008064
Richard Smith31d1de22015-05-20 22:48:44 +00008065 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008066 CmdArgs.push_back("-lpthread");
8067
8068 CmdArgs.push_back("-lc");
8069
8070 if (Args.hasArg(options::OPT_static))
8071 CmdArgs.push_back("--end-group");
8072 else
Renato Golinc4b49242014-02-13 10:01:16 +00008073 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008074 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008075
Rafael Espindola81937ec2010-12-01 01:52:43 +00008076 if (!Args.hasArg(options::OPT_nostartfiles)) {
8077 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008078 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008079 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008080 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008081 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008082 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008083 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008084
Rafael Espindola81937ec2010-12-01 01:52:43 +00008085 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008086 if (!isAndroid)
8087 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008088 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008089 }
8090
David Blaikiec11bf802014-09-04 16:04:28 +00008091 C.addCommand(
8092 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008093}
8094
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008095
8096// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8097// for the various SFI requirements like register masking. The assembly tool
8098// inserts the file containing the macros as an input into all the assembly
8099// jobs.
8100void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8101 const InputInfo &Output,
8102 const InputInfoList &Inputs,
8103 const ArgList &Args,
8104 const char *LinkingOutput) const {
8105 const toolchains::NaCl_TC& ToolChain =
8106 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8107 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8108 "nacl-arm-macros.s");
8109 InputInfoList NewInputs;
8110 NewInputs.push_back(NaClMacros);
8111 NewInputs.append(Inputs.begin(), Inputs.end());
8112 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8113 LinkingOutput);
8114}
8115
8116
8117// This is quite similar to gnutools::link::ConstructJob with changes that
8118// we use static by default, do not yet support sanitizers or LTO, and a few
8119// others. Eventually we can support more of that and hopefully migrate back
8120// to gnutools::link.
8121void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8122 const InputInfo &Output,
8123 const InputInfoList &Inputs,
8124 const ArgList &Args,
8125 const char *LinkingOutput) const {
8126
8127 const toolchains::NaCl_TC& ToolChain =
8128 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8129 const Driver &D = ToolChain.getDriver();
8130 const bool IsStatic =
8131 !Args.hasArg(options::OPT_dynamic) &&
8132 !Args.hasArg(options::OPT_shared);
8133
8134 ArgStringList CmdArgs;
8135
8136 // Silence warning for "clang -g foo.o -o foo"
8137 Args.ClaimAllArgs(options::OPT_g_Group);
8138 // and "clang -emit-llvm foo.o -o foo"
8139 Args.ClaimAllArgs(options::OPT_emit_llvm);
8140 // and for "clang -w foo.o -o foo". Other warning options are already
8141 // handled somewhere else.
8142 Args.ClaimAllArgs(options::OPT_w);
8143
8144 if (!D.SysRoot.empty())
8145 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8146
8147 if (Args.hasArg(options::OPT_rdynamic))
8148 CmdArgs.push_back("-export-dynamic");
8149
8150 if (Args.hasArg(options::OPT_s))
8151 CmdArgs.push_back("-s");
8152
8153 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8154 // there is --build-id, which we do want.
8155 CmdArgs.push_back("--build-id");
8156
8157 if (!IsStatic)
8158 CmdArgs.push_back("--eh-frame-hdr");
8159
8160 CmdArgs.push_back("-m");
8161 if (ToolChain.getArch() == llvm::Triple::x86)
8162 CmdArgs.push_back("elf_i386_nacl");
8163 else if (ToolChain.getArch() == llvm::Triple::arm)
8164 CmdArgs.push_back("armelf_nacl");
8165 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8166 CmdArgs.push_back("elf_x86_64_nacl");
8167 else
8168 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8169 "Native Client";
8170
8171
8172 if (IsStatic)
8173 CmdArgs.push_back("-static");
8174 else if (Args.hasArg(options::OPT_shared))
8175 CmdArgs.push_back("-shared");
8176
8177 CmdArgs.push_back("-o");
8178 CmdArgs.push_back(Output.getFilename());
8179 if (!Args.hasArg(options::OPT_nostdlib) &&
8180 !Args.hasArg(options::OPT_nostartfiles)) {
8181 if (!Args.hasArg(options::OPT_shared))
8182 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8183 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8184
8185 const char *crtbegin;
8186 if (IsStatic)
8187 crtbegin = "crtbeginT.o";
8188 else if (Args.hasArg(options::OPT_shared))
8189 crtbegin = "crtbeginS.o";
8190 else
8191 crtbegin = "crtbegin.o";
8192 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8193 }
8194
8195 Args.AddAllArgs(CmdArgs, options::OPT_L);
8196 Args.AddAllArgs(CmdArgs, options::OPT_u);
8197
8198 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8199
8200 for (const auto &Path : Paths)
8201 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8202
8203 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8204 CmdArgs.push_back("--no-demangle");
8205
8206 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8207
8208 if (D.CCCIsCXX() &&
8209 !Args.hasArg(options::OPT_nostdlib) &&
8210 !Args.hasArg(options::OPT_nodefaultlibs)) {
8211 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8212 !IsStatic;
8213 if (OnlyLibstdcxxStatic)
8214 CmdArgs.push_back("-Bstatic");
8215 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8216 if (OnlyLibstdcxxStatic)
8217 CmdArgs.push_back("-Bdynamic");
8218 CmdArgs.push_back("-lm");
8219 }
8220
8221 if (!Args.hasArg(options::OPT_nostdlib)) {
8222 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8223 // Always use groups, since it has no effect on dynamic libraries.
8224 CmdArgs.push_back("--start-group");
8225 CmdArgs.push_back("-lc");
8226 // NaCl's libc++ currently requires libpthread, so just always include it
8227 // in the group for C++.
8228 if (Args.hasArg(options::OPT_pthread) ||
8229 Args.hasArg(options::OPT_pthreads) ||
8230 D.CCCIsCXX()) {
8231 CmdArgs.push_back("-lpthread");
8232 }
8233
8234 CmdArgs.push_back("-lgcc");
8235 CmdArgs.push_back("--as-needed");
8236 if (IsStatic)
8237 CmdArgs.push_back("-lgcc_eh");
8238 else
8239 CmdArgs.push_back("-lgcc_s");
8240 CmdArgs.push_back("--no-as-needed");
8241 CmdArgs.push_back("--end-group");
8242 }
8243
8244 if (!Args.hasArg(options::OPT_nostartfiles)) {
8245 const char *crtend;
8246 if (Args.hasArg(options::OPT_shared))
8247 crtend = "crtendS.o";
8248 else
8249 crtend = "crtend.o";
8250
8251 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8252 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8253 }
8254 }
8255
8256 C.addCommand(llvm::make_unique<Command>(JA, *this,
8257 ToolChain.Linker.c_str(), CmdArgs));
8258}
8259
8260
Chris Lattner3e2ee142010-07-07 16:01:42 +00008261void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008262 const InputInfo &Output,
8263 const InputInfoList &Inputs,
8264 const ArgList &Args,
8265 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008266 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008267 ArgStringList CmdArgs;
8268
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008269 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008270
8271 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008272 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008273
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008274 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008275 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008276
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008277 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008279}
8280
8281void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008282 const InputInfo &Output,
8283 const InputInfoList &Inputs,
8284 const ArgList &Args,
8285 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008286 const Driver &D = getToolChain().getDriver();
8287 ArgStringList CmdArgs;
8288
Daniel Dunbarb440f562010-08-02 02:38:21 +00008289 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008290 CmdArgs.push_back("-o");
8291 CmdArgs.push_back(Output.getFilename());
8292 } else {
8293 assert(Output.isNothing() && "Invalid output.");
8294 }
8295
8296 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008297 !Args.hasArg(options::OPT_nostartfiles)) {
8298 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8299 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8300 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8301 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8302 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008303
8304 Args.AddAllArgs(CmdArgs, options::OPT_L);
8305 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8306 Args.AddAllArgs(CmdArgs, options::OPT_e);
8307
Daniel Dunbar54423b22010-09-17 00:24:54 +00008308 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008309
Alexey Samsonov7811d192014-02-20 13:57:37 +00008310 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008311
Chris Lattner3e2ee142010-07-07 16:01:42 +00008312 if (!Args.hasArg(options::OPT_nostdlib) &&
8313 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008314 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008315 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008316 CmdArgs.push_back("-lm");
8317 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008318 }
8319
8320 if (!Args.hasArg(options::OPT_nostdlib) &&
8321 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008322 if (Args.hasArg(options::OPT_pthread))
8323 CmdArgs.push_back("-lpthread");
8324 CmdArgs.push_back("-lc");
8325 CmdArgs.push_back("-lCompilerRT-Generic");
8326 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8327 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008328 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008329 }
8330
Logan Chieneb9162f2014-06-26 14:23:45 +00008331 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008332 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008333}
8334
Daniel Dunbarcc912342009-05-02 18:28:39 +00008335/// DragonFly Tools
8336
8337// For now, DragonFly Assemble does just about the same as for
8338// FreeBSD, but this may change soon.
8339void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008340 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008341 const InputInfoList &Inputs,
8342 const ArgList &Args,
8343 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008344 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008345 ArgStringList CmdArgs;
8346
8347 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8348 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008349 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008350 CmdArgs.push_back("--32");
8351
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008352 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008353
8354 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008355 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008356
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008357 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008358 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008359
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008360 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008361 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008362}
8363
8364void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008365 const InputInfo &Output,
8366 const InputInfoList &Inputs,
8367 const ArgList &Args,
8368 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008369 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008370 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008371 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008372
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008373 if (!D.SysRoot.empty())
8374 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8375
John McCall65b8da02013-04-11 22:55:55 +00008376 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008377 if (Args.hasArg(options::OPT_static)) {
8378 CmdArgs.push_back("-Bstatic");
8379 } else {
John McCall65b8da02013-04-11 22:55:55 +00008380 if (Args.hasArg(options::OPT_rdynamic))
8381 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008382 if (Args.hasArg(options::OPT_shared))
8383 CmdArgs.push_back("-Bshareable");
8384 else {
8385 CmdArgs.push_back("-dynamic-linker");
8386 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8387 }
John McCall65b8da02013-04-11 22:55:55 +00008388 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008389 }
8390
8391 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8392 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008393 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008394 CmdArgs.push_back("-m");
8395 CmdArgs.push_back("elf_i386");
8396 }
8397
Daniel Dunbarb440f562010-08-02 02:38:21 +00008398 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008399 CmdArgs.push_back("-o");
8400 CmdArgs.push_back(Output.getFilename());
8401 } else {
8402 assert(Output.isNothing() && "Invalid output.");
8403 }
8404
8405 if (!Args.hasArg(options::OPT_nostdlib) &&
8406 !Args.hasArg(options::OPT_nostartfiles)) {
8407 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008408 if (Args.hasArg(options::OPT_pg))
8409 CmdArgs.push_back(Args.MakeArgString(
8410 getToolChain().GetFilePath("gcrt1.o")));
8411 else {
8412 if (Args.hasArg(options::OPT_pie))
8413 CmdArgs.push_back(Args.MakeArgString(
8414 getToolChain().GetFilePath("Scrt1.o")));
8415 else
8416 CmdArgs.push_back(Args.MakeArgString(
8417 getToolChain().GetFilePath("crt1.o")));
8418 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008419 }
John McCall65b8da02013-04-11 22:55:55 +00008420 CmdArgs.push_back(Args.MakeArgString(
8421 getToolChain().GetFilePath("crti.o")));
8422 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8423 CmdArgs.push_back(Args.MakeArgString(
8424 getToolChain().GetFilePath("crtbeginS.o")));
8425 else
8426 CmdArgs.push_back(Args.MakeArgString(
8427 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008428 }
8429
8430 Args.AddAllArgs(CmdArgs, options::OPT_L);
8431 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8432 Args.AddAllArgs(CmdArgs, options::OPT_e);
8433
Daniel Dunbar54423b22010-09-17 00:24:54 +00008434 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008435
8436 if (!Args.hasArg(options::OPT_nostdlib) &&
8437 !Args.hasArg(options::OPT_nodefaultlibs)) {
8438 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8439 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008440 if (UseGCC47)
8441 CmdArgs.push_back("-L/usr/lib/gcc47");
8442 else
8443 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008444
8445 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008446 if (UseGCC47) {
8447 CmdArgs.push_back("-rpath");
8448 CmdArgs.push_back("/usr/lib/gcc47");
8449 } else {
8450 CmdArgs.push_back("-rpath");
8451 CmdArgs.push_back("/usr/lib/gcc44");
8452 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008453 }
8454
Hans Wennborg70850d82013-07-18 20:29:38 +00008455 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008456 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008457 CmdArgs.push_back("-lm");
8458 }
8459
Daniel Dunbarcc912342009-05-02 18:28:39 +00008460 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008461 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008462
8463 if (!Args.hasArg(options::OPT_nolibc)) {
8464 CmdArgs.push_back("-lc");
8465 }
8466
John McCall65b8da02013-04-11 22:55:55 +00008467 if (UseGCC47) {
8468 if (Args.hasArg(options::OPT_static) ||
8469 Args.hasArg(options::OPT_static_libgcc)) {
8470 CmdArgs.push_back("-lgcc");
8471 CmdArgs.push_back("-lgcc_eh");
8472 } else {
8473 if (Args.hasArg(options::OPT_shared_libgcc)) {
8474 CmdArgs.push_back("-lgcc_pic");
8475 if (!Args.hasArg(options::OPT_shared))
8476 CmdArgs.push_back("-lgcc");
8477 } else {
8478 CmdArgs.push_back("-lgcc");
8479 CmdArgs.push_back("--as-needed");
8480 CmdArgs.push_back("-lgcc_pic");
8481 CmdArgs.push_back("--no-as-needed");
8482 }
8483 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008484 } else {
John McCall65b8da02013-04-11 22:55:55 +00008485 if (Args.hasArg(options::OPT_shared)) {
8486 CmdArgs.push_back("-lgcc_pic");
8487 } else {
8488 CmdArgs.push_back("-lgcc");
8489 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008490 }
8491 }
8492
8493 if (!Args.hasArg(options::OPT_nostdlib) &&
8494 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008495 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008496 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008497 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008498 else
8499 CmdArgs.push_back(Args.MakeArgString(
8500 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008501 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008502 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008503 }
8504
Alexey Samsonov7811d192014-02-20 13:57:37 +00008505 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008506
Logan Chieneb9162f2014-06-26 14:23:45 +00008507 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008508 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008509}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008510
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008511// Try to find Exe from a Visual Studio distribution. This first tries to find
8512// an installed copy of Visual Studio and, failing that, looks in the PATH,
8513// making sure that whatever executable that's found is not a same-named exe
8514// from clang itself to prevent clang from falling back to itself.
8515static std::string FindVisualStudioExecutable(const ToolChain &TC,
8516 const char *Exe,
8517 const char *ClangProgramPath) {
8518 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8519 std::string visualStudioBinDir;
8520 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8521 visualStudioBinDir)) {
8522 SmallString<128> FilePath(visualStudioBinDir);
8523 llvm::sys::path::append(FilePath, Exe);
8524 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8525 return FilePath.str();
8526 }
8527
8528 return Exe;
8529}
8530
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008531void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8532 const InputInfo &Output,
8533 const InputInfoList &Inputs,
8534 const ArgList &Args,
8535 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008536 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008537 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008538
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008539 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8540 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008541 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8542 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008543
8544 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008545 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008546 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008547
Zachary Turner10d75b22014-10-22 20:40:43 +00008548 if (!llvm::sys::Process::GetEnv("LIB")) {
8549 // If the VC environment hasn't been configured (perhaps because the user
8550 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008551 // the environment variable is set however, assume the user knows what
8552 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008553 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008554 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008555 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8556 SmallString<128> LibDir(VisualStudioDir);
8557 llvm::sys::path::append(LibDir, "VC", "lib");
8558 switch (MSVC.getArch()) {
8559 case llvm::Triple::x86:
8560 // x86 just puts the libraries directly in lib
8561 break;
8562 case llvm::Triple::x86_64:
8563 llvm::sys::path::append(LibDir, "amd64");
8564 break;
8565 case llvm::Triple::arm:
8566 llvm::sys::path::append(LibDir, "arm");
8567 break;
8568 default:
8569 break;
8570 }
8571 CmdArgs.push_back(
8572 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8573 }
8574
8575 std::string WindowsSdkLibPath;
8576 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8577 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8578 WindowsSdkLibPath.c_str()));
8579 }
8580
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008581 CmdArgs.push_back("-nologo");
8582
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008583 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008584 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008585
Hans Wennborge4c47f22015-03-04 23:16:21 +00008586 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8587 options::OPT__SLASH_LDd,
8588 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008589 if (DLL) {
8590 CmdArgs.push_back(Args.MakeArgString("-dll"));
8591
8592 SmallString<128> ImplibName(Output.getFilename());
8593 llvm::sys::path::replace_extension(ImplibName, "lib");
8594 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008595 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008596 }
8597
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008598 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008599 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008600 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008601 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008602 static const char *CompilerRTComponents[] = {
8603 "asan_dynamic",
8604 "asan_dynamic_runtime_thunk",
8605 };
8606 for (const auto &Component : CompilerRTComponents)
8607 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008608 // Make sure the dynamic runtime thunk is not optimized out at link time
8609 // to ensure proper SEH handling.
8610 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008611 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008612 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008613 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008614 static const char *CompilerRTComponents[] = {
8615 "asan",
8616 "asan_cxx",
8617 };
8618 for (const auto &Component : CompilerRTComponents)
8619 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008620 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008621 }
8622
Hans Wennborg2e274592013-08-13 23:38:57 +00008623 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008624
Reid Kleckner337188f2014-09-16 19:22:00 +00008625 // Add filenames, libraries, and other linker inputs.
8626 for (const auto &Input : Inputs) {
8627 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008628 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008629 continue;
8630 }
8631
8632 const Arg &A = Input.getInputArg();
8633
8634 // Render -l options differently for the MSVC linker.
8635 if (A.getOption().matches(options::OPT_l)) {
8636 StringRef Lib = A.getValue();
8637 const char *LinkLibArg;
8638 if (Lib.endswith(".lib"))
8639 LinkLibArg = Args.MakeArgString(Lib);
8640 else
8641 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8642 CmdArgs.push_back(LinkLibArg);
8643 continue;
8644 }
8645
8646 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8647 // or -L. Render it, even if MSVC doesn't understand it.
8648 A.renderAsInput(Args, CmdArgs);
8649 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008650
Zachary Turner719f58c2014-12-01 23:06:47 +00008651 // We need to special case some linker paths. In the case of lld, we need to
8652 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8653 // linker, we need to use a special search algorithm.
8654 llvm::SmallString<128> linkPath;
8655 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8656 if (Linker.equals_lower("lld"))
8657 Linker = "lld-link";
8658
8659 if (Linker.equals_lower("link")) {
8660 // If we're using the MSVC linker, it's not sufficient to just use link
8661 // from the program PATH, because other environments like GnuWin32 install
8662 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008663 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008664 C.getDriver().getClangProgramPath());
8665 } else {
8666 linkPath = Linker;
8667 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008668 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008669 }
8670
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008671 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008672 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008673}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008674
8675void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8676 const InputInfo &Output,
8677 const InputInfoList &Inputs,
8678 const ArgList &Args,
8679 const char *LinkingOutput) const {
8680 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8681}
8682
David Blaikiec11bf802014-09-04 16:04:28 +00008683std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8684 Compilation &C, const JobAction &JA, const InputInfo &Output,
8685 const InputInfoList &Inputs, const ArgList &Args,
8686 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008687 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008688 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008689 CmdArgs.push_back("/c"); // Compile only.
8690 CmdArgs.push_back("/W0"); // No warnings.
8691
8692 // The goal is to be able to invoke this tool correctly based on
8693 // any flag accepted by clang-cl.
8694
8695 // These are spelled the same way in clang and cl.exe,.
8696 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8697 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008698
8699 // Optimization level.
8700 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8701 if (A->getOption().getID() == options::OPT_O0) {
8702 CmdArgs.push_back("/Od");
8703 } else {
8704 StringRef OptLevel = A->getValue();
8705 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8706 A->render(Args, CmdArgs);
8707 else if (OptLevel == "3")
8708 CmdArgs.push_back("/Ox");
8709 }
8710 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008711
Nico Weber3f8dafb2015-03-12 19:37:10 +00008712 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008713 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8714
David Majnemerf6072342014-07-01 22:24:56 +00008715 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8716 /*default=*/false))
8717 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008718 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8719 options::OPT_fno_function_sections))
8720 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8721 ? "/Gy"
8722 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008723 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8724 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008725 CmdArgs.push_back(
8726 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008727 if (Args.hasArg(options::OPT_fsyntax_only))
8728 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008729 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8730 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008731
Nico Weber3f8dafb2015-03-12 19:37:10 +00008732 std::vector<std::string> Includes =
8733 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008734 for (const auto &Include : Includes)
8735 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008736
Hans Wennborg87cfa712013-09-19 20:32:16 +00008737 // Flags that can simply be passed through.
8738 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8739 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008740 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008741
8742 // The order of these flags is relevant, so pick the last one.
8743 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8744 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8745 A->render(Args, CmdArgs);
8746
8747
8748 // Input filename.
8749 assert(Inputs.size() == 1);
8750 const InputInfo &II = Inputs[0];
8751 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8752 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8753 if (II.isFilename())
8754 CmdArgs.push_back(II.getFilename());
8755 else
8756 II.getInputArg().renderAsInput(Args, CmdArgs);
8757
8758 // Output filename.
8759 assert(Output.getType() == types::TY_Object);
8760 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8761 Output.getFilename());
8762 CmdArgs.push_back(Fo);
8763
Hans Wennborg188382e2013-09-20 18:16:35 +00008764 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008765 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8766 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008767 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8768 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008769}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008770
8771
8772/// XCore Tools
8773// We pass assemble and link construction to the xcc tool.
8774
8775void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8776 const InputInfo &Output,
8777 const InputInfoList &Inputs,
8778 const ArgList &Args,
8779 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008780 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008781 ArgStringList CmdArgs;
8782
8783 CmdArgs.push_back("-o");
8784 CmdArgs.push_back(Output.getFilename());
8785
8786 CmdArgs.push_back("-c");
8787
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008788 if (Args.hasArg(options::OPT_v))
8789 CmdArgs.push_back("-v");
8790
Robert Lytton894d25c2014-05-02 09:33:25 +00008791 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8792 if (!A->getOption().matches(options::OPT_g0))
8793 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008794
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008795 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8796 false))
8797 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008798
8799 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8800 options::OPT_Xassembler);
8801
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008802 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008803 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008804
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008805 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008806 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008807}
8808
8809void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8810 const InputInfo &Output,
8811 const InputInfoList &Inputs,
8812 const ArgList &Args,
8813 const char *LinkingOutput) const {
8814 ArgStringList CmdArgs;
8815
8816 if (Output.isFilename()) {
8817 CmdArgs.push_back("-o");
8818 CmdArgs.push_back(Output.getFilename());
8819 } else {
8820 assert(Output.isNothing() && "Invalid output.");
8821 }
8822
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008823 if (Args.hasArg(options::OPT_v))
8824 CmdArgs.push_back("-v");
8825
David Majnemer8de68642014-12-05 08:11:58 +00008826 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008827 CmdArgs.push_back("-fexceptions");
8828
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008829 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8830
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008831 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008832 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008833}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008834
8835void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8836 const InputInfo &Output,
8837 const InputInfoList &Inputs,
8838 const ArgList &Args,
8839 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008840 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008841 const auto &TC =
8842 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8843 ArgStringList CmdArgs;
8844 const char *Exec;
8845
8846 switch (TC.getArch()) {
8847 default: llvm_unreachable("unsupported architecture");
8848 case llvm::Triple::arm:
8849 case llvm::Triple::thumb:
8850 break;
8851 case llvm::Triple::x86:
8852 CmdArgs.push_back("--32");
8853 break;
8854 case llvm::Triple::x86_64:
8855 CmdArgs.push_back("--64");
8856 break;
8857 }
8858
8859 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8860
8861 CmdArgs.push_back("-o");
8862 CmdArgs.push_back(Output.getFilename());
8863
8864 for (const auto &Input : Inputs)
8865 CmdArgs.push_back(Input.getFilename());
8866
8867 const std::string Assembler = TC.GetProgramPath("as");
8868 Exec = Args.MakeArgString(Assembler);
8869
8870 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8871}
8872
8873void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8874 const InputInfo &Output,
8875 const InputInfoList &Inputs,
8876 const ArgList &Args,
8877 const char *LinkingOutput) const {
8878 const auto &TC =
8879 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8880 const llvm::Triple &T = TC.getTriple();
8881 const Driver &D = TC.getDriver();
8882 SmallString<128> EntryPoint;
8883 ArgStringList CmdArgs;
8884 const char *Exec;
8885
8886 // Silence warning for "clang -g foo.o -o foo"
8887 Args.ClaimAllArgs(options::OPT_g_Group);
8888 // and "clang -emit-llvm foo.o -o foo"
8889 Args.ClaimAllArgs(options::OPT_emit_llvm);
8890 // and for "clang -w foo.o -o foo"
8891 Args.ClaimAllArgs(options::OPT_w);
8892 // Other warning options are already handled somewhere else.
8893
8894 if (!D.SysRoot.empty())
8895 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8896
8897 if (Args.hasArg(options::OPT_pie))
8898 CmdArgs.push_back("-pie");
8899 if (Args.hasArg(options::OPT_rdynamic))
8900 CmdArgs.push_back("-export-dynamic");
8901 if (Args.hasArg(options::OPT_s))
8902 CmdArgs.push_back("--strip-all");
8903
8904 CmdArgs.push_back("-m");
8905 switch (TC.getArch()) {
8906 default: llvm_unreachable("unsupported architecture");
8907 case llvm::Triple::arm:
8908 case llvm::Triple::thumb:
8909 // FIXME: this is incorrect for WinCE
8910 CmdArgs.push_back("thumb2pe");
8911 break;
8912 case llvm::Triple::x86:
8913 CmdArgs.push_back("i386pe");
8914 EntryPoint.append("_");
8915 break;
8916 case llvm::Triple::x86_64:
8917 CmdArgs.push_back("i386pep");
8918 break;
8919 }
8920
8921 if (Args.hasArg(options::OPT_shared)) {
8922 switch (T.getArch()) {
8923 default: llvm_unreachable("unsupported architecture");
8924 case llvm::Triple::arm:
8925 case llvm::Triple::thumb:
8926 case llvm::Triple::x86_64:
8927 EntryPoint.append("_DllMainCRTStartup");
8928 break;
8929 case llvm::Triple::x86:
8930 EntryPoint.append("_DllMainCRTStartup@12");
8931 break;
8932 }
8933
8934 CmdArgs.push_back("-shared");
8935 CmdArgs.push_back("-Bdynamic");
8936
8937 CmdArgs.push_back("--enable-auto-image-base");
8938
8939 CmdArgs.push_back("--entry");
8940 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8941 } else {
8942 EntryPoint.append("mainCRTStartup");
8943
8944 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8945 : "-Bdynamic");
8946
8947 if (!Args.hasArg(options::OPT_nostdlib) &&
8948 !Args.hasArg(options::OPT_nostartfiles)) {
8949 CmdArgs.push_back("--entry");
8950 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8951 }
8952
8953 // FIXME: handle subsystem
8954 }
8955
8956 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008957 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008958
8959 CmdArgs.push_back("-o");
8960 CmdArgs.push_back(Output.getFilename());
8961
8962 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8963 SmallString<261> ImpLib(Output.getFilename());
8964 llvm::sys::path::replace_extension(ImpLib, ".lib");
8965
8966 CmdArgs.push_back("--out-implib");
8967 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8968 }
8969
8970 if (!Args.hasArg(options::OPT_nostdlib) &&
8971 !Args.hasArg(options::OPT_nostartfiles)) {
8972 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8973 const char *CRTBegin;
8974
8975 CRTBegin =
8976 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8977 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8978 }
8979
8980 Args.AddAllArgs(CmdArgs, options::OPT_L);
8981
8982 const auto &Paths = TC.getFilePaths();
8983 for (const auto &Path : Paths)
8984 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8985
8986 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8987
8988 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8989 !Args.hasArg(options::OPT_nodefaultlibs)) {
8990 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8991 !Args.hasArg(options::OPT_static);
8992 if (StaticCXX)
8993 CmdArgs.push_back("-Bstatic");
8994 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8995 if (StaticCXX)
8996 CmdArgs.push_back("-Bdynamic");
8997 }
8998
8999 if (!Args.hasArg(options::OPT_nostdlib)) {
9000 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9001 // TODO handle /MT[d] /MD[d]
9002 CmdArgs.push_back("-lmsvcrt");
9003 AddRunTimeLibs(TC, D, CmdArgs, Args);
9004 }
9005 }
9006
9007 const std::string Linker = TC.GetProgramPath("ld");
9008 Exec = Args.MakeArgString(Linker);
9009
9010 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9011}