blob: a53cfa22660a08ed8a34702032e93d4d6a694c82 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
87 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
88 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000090 << A->getAsString(Args) << "-static";
91}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
98 for ( ; *Arg; ++Arg) {
99 switch (*Arg) {
100 default: break;
101 case ' ':
102 case '\\':
103 Res.push_back('\\');
104 break;
105 }
106 Res.push_back(*Arg);
107 }
108}
109
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000110// Quote target names for inclusion in GNU Make dependency files.
111// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112static void QuoteTarget(StringRef Target,
113 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Bill Wendlingc0938f32012-03-12 22:10:06 +0000139static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000140 ArgStringList &CmdArgs,
141 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000142 const char *EnvVar) {
143 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 bool CombinedArg = false;
145
Bill Wendling281ca292012-03-12 21:22:35 +0000146 if (!DirList)
147 return; // Nothing to do.
148
Chad Rosier616e8a52012-10-30 21:42:09 +0000149 StringRef Name(ArgName);
150 if (Name.equals("-I") || Name.equals("-L"))
151 CombinedArg = true;
152
Bill Wendling281ca292012-03-12 21:22:35 +0000153 StringRef Dirs(DirList);
154 if (Dirs.empty()) // Empty string should not add '.'.
155 return;
156
157 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000158 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000159 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000160 if (CombinedArg) {
161 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
162 } else {
163 CmdArgs.push_back(ArgName);
164 CmdArgs.push_back(".");
165 }
Bill Wendling281ca292012-03-12 21:22:35 +0000166 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000167 if (CombinedArg) {
168 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
169 } else {
170 CmdArgs.push_back(ArgName);
171 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
172 }
Bill Wendling281ca292012-03-12 21:22:35 +0000173 }
Nico Weber89355782012-03-19 15:00:03 +0000174 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000175 }
176
177 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000178 if (CombinedArg) {
179 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
180 } else {
181 CmdArgs.push_back(ArgName);
182 CmdArgs.push_back(".");
183 }
Bill Wendling281ca292012-03-12 21:22:35 +0000184 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000185 if (CombinedArg) {
186 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
187 } else {
188 CmdArgs.push_back(ArgName);
189 CmdArgs.push_back(Args.MakeArgString(Dirs));
190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191 }
192}
193
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194static void AddLinkerInputs(const ToolChain &TC,
195 const InputInfoList &Inputs, const ArgList &Args,
196 ArgStringList &CmdArgs) {
197 const Driver &D = TC.getDriver();
198
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000199 // Add extra linker input arguments which are not treated as inputs
200 // (constructed via -Xarch_).
201 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
202
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000203 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000204 if (!TC.HasNativeLLVMSupport()) {
205 // Don't try to pass LLVM inputs unless we have native support.
206 if (II.getType() == types::TY_LLVM_IR ||
207 II.getType() == types::TY_LTO_IR ||
208 II.getType() == types::TY_LLVM_BC ||
209 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000210 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 << TC.getTripleString();
212 }
213
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000214 // Add filenames immediately.
215 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000216 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000217 continue;
218 }
219
220 // Otherwise, this is a linker input argument.
221 const Arg &A = II.getInputArg();
222
223 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000224 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000225 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000226 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000227 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000228 else if (A.getOption().matches(options::OPT_z)) {
229 // Pass -z prefix for gcc linker compatibility.
230 A.claim();
231 A.render(Args, CmdArgs);
232 } else {
233 A.renderAsInput(Args, CmdArgs);
234 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000235 }
Bill Wendling281ca292012-03-12 21:22:35 +0000236
237 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000238 // and only supported on native toolchains.
239 if (!TC.isCrossCompiling())
240 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000241}
242
John McCall31168b02011-06-15 23:02:42 +0000243/// \brief Determine whether Objective-C automated reference counting is
244/// enabled.
245static bool isObjCAutoRefCount(const ArgList &Args) {
246 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
247}
248
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249/// \brief Determine whether we are linking the ObjC runtime.
250static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000251 if (isObjCAutoRefCount(Args)) {
252 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000253 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000254 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000255 return Args.hasArg(options::OPT_fobjc_link_runtime);
256}
257
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000258static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000259 // Don't forward inputs from the original command line. They are added from
260 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000261 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000262 !O.hasFlag(options::DriverOption) &&
263 !O.hasFlag(options::LinkerInput);
264}
265
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000266void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000268 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000269 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000270 ArgStringList &CmdArgs,
271 const InputInfo &Output,
272 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000274
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000275 CheckPreprocessingOptions(D, Args);
276
277 Args.AddLastArg(CmdArgs, options::OPT_C);
278 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000279
280 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000281 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 (A = Args.getLastArg(options::OPT_MD)) ||
283 (A = Args.getLastArg(options::OPT_MMD))) {
284 // Determine the output location.
285 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000286 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000287 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000288 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000289 } else if (Output.getType() == types::TY_Dependencies) {
290 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000291 } else if (A->getOption().matches(options::OPT_M) ||
292 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 DepFile = "-";
294 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000295 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000296 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 }
298 CmdArgs.push_back("-dependency-file");
299 CmdArgs.push_back(DepFile);
300
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000301 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
303 const char *DepTarget;
304
305 // If user provided -o, that is the dependency target, except
306 // when we are only generating a dependency file.
307 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
308 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000309 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 } else {
311 // Otherwise derive from the base input.
312 //
313 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000315 llvm::sys::path::replace_extension(P, "o");
316 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 }
318
319 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 QuoteTarget(DepTarget, Quoted);
322 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000325 if (A->getOption().matches(options::OPT_M) ||
326 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000328 if ((isa<PrecompileJobAction>(JA) &&
329 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
330 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000331 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332 }
333
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000334 if (Args.hasArg(options::OPT_MG)) {
335 if (!A || A->getOption().matches(options::OPT_MD) ||
336 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000337 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000338 CmdArgs.push_back("-MG");
339 }
340
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000342 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000343
344 // Convert all -MQ <target> args to -MT <quoted target>
345 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
346 options::OPT_MQ),
347 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 const Arg *A = *it;
349 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350
Daniel Dunbara442fd52010-06-11 22:00:13 +0000351 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000353 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000354 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back(Args.MakeArgString(Quoted));
356
357 // -MT flag - no change
358 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000359 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000360 }
361 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 // Add -i* options, and automatically translate to
364 // -include-pch/-include-pth for transparent PCH support. It's
365 // wonky, but we include looking for .gch so we can support seamless
366 // replacement into a build system already set up to be generating
367 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000368 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000369 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
370 ie = Args.filtered_end(); it != ie; ++it) {
371 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372
373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
428 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000429 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
430 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
432 // Add -Wp, and -Xassembler if using the preprocessor.
433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000470 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000471 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000472 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000473
474 // Add system include arguments.
475 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000476}
477
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478// FIXME: Move to target hook.
479static bool isSignedCharDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return true;
483
Tim Northover9bb857a2013-01-31 12:13:10 +0000484 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000485 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000487 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000488 case llvm::Triple::thumb:
489 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000490 if (Triple.isOSDarwin() || Triple.isOSWindows())
491 return true;
492 return false;
493
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 case llvm::Triple::ppc:
495 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000496 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000497 return true;
498 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000499
David Majnemerdcecd932015-05-23 19:23:55 +0000500 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000501 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000502 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000503 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000504 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000505 }
506}
507
Robert Lytton0e076492013-08-13 09:43:10 +0000508static bool isNoCommonDefault(const llvm::Triple &Triple) {
509 switch (Triple.getArch()) {
510 default:
511 return false;
512
513 case llvm::Triple::xcore:
514 return true;
515 }
516}
517
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000518// Handle -mhwdiv=.
519static void getARMHWDivFeatures(const Driver &D, const Arg *A,
520 const ArgList &Args,
521 std::vector<const char *> &Features) {
522 StringRef HWDiv = A->getValue();
523 if (HWDiv == "arm") {
524 Features.push_back("+hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else if (HWDiv == "thumb") {
527 Features.push_back("-hwdiv-arm");
528 Features.push_back("+hwdiv");
529 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
530 Features.push_back("+hwdiv-arm");
531 Features.push_back("+hwdiv");
532 } else if (HWDiv == "none") {
533 Features.push_back("-hwdiv-arm");
534 Features.push_back("-hwdiv");
535 } else
536 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
537}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000538
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000540static void getARMFPUFeatures(const Driver &D, const Arg *A,
541 const ArgList &Args,
542 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000543 StringRef FPU = A->getValue();
John Brawn5a589ad2015-06-05 13:34:11 +0000544 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
545 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000546 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
547}
548
John Brawn94fd9632015-05-21 12:19:49 +0000549static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000550 llvm::StringRef Arch = Triple.getArchName();
551 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000552}
553
John Brawn94fd9632015-05-21 12:19:49 +0000554static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000555 llvm::StringRef Arch = Triple.getArchName();
556 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
557 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000558}
559
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000560// Select the float ABI as determined by -msoft-float, -mhard-float, and
561// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000562StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000563 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000564 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000565 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
566 options::OPT_mhard_float,
567 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000568 if (A->getOption().matches(options::OPT_msoft_float))
569 FloatABI = "soft";
570 else if (A->getOption().matches(options::OPT_mhard_float))
571 FloatABI = "hard";
572 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000573 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000574 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000575 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000576 << A->getAsString(Args);
577 FloatABI = "soft";
578 }
579 }
580 }
581
582 // If unspecified, choose the default based on the platform.
583 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000584 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000585 case llvm::Triple::Darwin:
586 case llvm::Triple::MacOSX:
587 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000588 // Darwin defaults to "softfp" for v6 and v7.
589 //
John Brawn94fd9632015-05-21 12:19:49 +0000590 if (getARMSubArchVersionNumber(Triple) == 6 ||
591 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000592 FloatABI = "softfp";
593 else
594 FloatABI = "soft";
595 break;
596 }
597
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000598 // FIXME: this is invalid for WindowsCE
599 case llvm::Triple::Win32:
600 FloatABI = "hard";
601 break;
602
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000603 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000604 switch(Triple.getEnvironment()) {
605 case llvm::Triple::GNUEABIHF:
606 FloatABI = "hard";
607 break;
608 default:
609 // FreeBSD defaults to soft float
610 FloatABI = "soft";
611 break;
612 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000613 break;
614
Daniel Dunbar78485922009-09-10 23:00:09 +0000615 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000616 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000617 case llvm::Triple::GNUEABIHF:
618 FloatABI = "hard";
619 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000620 case llvm::Triple::GNUEABI:
621 FloatABI = "softfp";
622 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000623 case llvm::Triple::EABIHF:
624 FloatABI = "hard";
625 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000626 case llvm::Triple::EABI:
627 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
628 FloatABI = "softfp";
629 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000630 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000631 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000632 FloatABI = "softfp";
633 else
634 FloatABI = "soft";
635 break;
636 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000637 default:
638 // Assume "soft", but warn the user we are guessing.
639 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000640 if (Triple.getOS() != llvm::Triple::UnknownOS ||
641 !Triple.isOSBinFormatMachO())
642 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000643 break;
644 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 }
646 }
647
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000648 return FloatABI;
649}
650
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000651static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
652 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000653 std::vector<const char *> &Features,
654 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000655 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
656 if (!ForAS) {
657 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
658 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
659 // stripped out by the ARM target. We should probably pass this a new
660 // -target-option, which is handled by the -cc1/-cc1as invocation.
661 //
662 // FIXME2: For consistency, it would be ideal if we set up the target
663 // machine state the same when using the frontend or the assembler. We don't
664 // currently do that for the assembler, we pass the options directly to the
665 // backend and never even instantiate the frontend TargetInfo. If we did,
666 // and used its handleTargetFeatures hook, then we could ensure the
667 // assembler and the frontend behave the same.
668
669 // Use software floating point operations?
670 if (FloatABI == "soft")
671 Features.push_back("+soft-float");
672
673 // Use software floating point argument passing?
674 if (FloatABI != "hard")
675 Features.push_back("+soft-float-abi");
676 }
677
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000678 // Honor -mfpu=.
679 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000680 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000681 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
682 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000683
John Brawna8f82342015-05-29 13:10:44 +0000684 // Check if -march is valid by checking if it can be canonicalised and parsed.
685 // getARMArch is used here instead of just checking the -march value in order
686 // to handle -march=native correctly.
John Brawn94fd9632015-05-21 12:19:49 +0000687 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
688 StringRef Arch = arm::getARMArch(Args, Triple);
John Brawna8f82342015-05-29 13:10:44 +0000689 if (llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_INVALID)
John Brawna95c1a82015-05-08 12:52:18 +0000690 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000691 }
692
693 // We do a similar thing with -mcpu, but here things are complicated because
694 // the only function we have to check if a cpu is valid is
695 // getLLVMArchSuffixForARM which also needs an architecture.
696 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000697 std::string CPU = arm::getARMTargetCPU(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000698 StringRef Arch = arm::getARMArch(Args, Triple);
699 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
700 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
701 }
John Brawna95c1a82015-05-08 12:52:18 +0000702
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000703 // Setting -msoft-float effectively disables NEON because of the GCC
704 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000705 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000706 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000707 // Also need to explicitly disable features which imply NEON.
708 Features.push_back("-crypto");
709 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000710
Eric Christopher269c2a22015-04-04 03:34:43 +0000711 // En/disable crc code generation.
712 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000713 if (A->getOption().matches(options::OPT_mcrc))
714 Features.push_back("+crc");
715 else
716 Features.push_back("-crc");
717 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000718
719 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
720 Features.insert(Features.begin(), "+v8.1a");
721 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000722}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000723
724void Clang::AddARMTargetArgs(const ArgList &Args,
725 ArgStringList &CmdArgs,
726 bool KernelOrKext) const {
727 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000728 // Get the effective triple, which takes into account the deployment target.
729 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
730 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000731
732 // Select the ABI to use.
733 //
734 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000735 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000736 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000738 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000739 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000740 // The backend is hardwired to assume AAPCS for M-class processors, ensure
741 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000742 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000743 Triple.getOS() == llvm::Triple::UnknownOS ||
John Brawn94fd9632015-05-21 12:19:49 +0000744 isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000745 ABIName = "aapcs";
746 } else {
747 ABIName = "apcs-gnu";
748 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000749 } else if (Triple.isOSWindows()) {
750 // FIXME: this is invalid for WindowsCE
751 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752 } else {
753 // Select the default based on the platform.
754 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000755 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000756 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000757 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000758 ABIName = "aapcs-linux";
759 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000760 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000761 case llvm::Triple::EABI:
762 ABIName = "aapcs";
763 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000764 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000765 if (Triple.getOS() == llvm::Triple::NetBSD)
766 ABIName = "apcs-gnu";
767 else
768 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000769 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770 }
771 }
772 CmdArgs.push_back("-target-abi");
773 CmdArgs.push_back(ABIName);
774
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000775 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000776 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000777 if (FloatABI == "soft") {
778 // Floating point operations and argument passing are soft.
779 //
780 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000781 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000782 CmdArgs.push_back("-mfloat-abi");
783 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000784 } else if (FloatABI == "softfp") {
785 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000786 CmdArgs.push_back("-mfloat-abi");
787 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000788 } else {
789 // Floating point operations and argument passing are hard.
790 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000791 CmdArgs.push_back("-mfloat-abi");
792 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000793 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000794
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000795 // Kernel code has more strict alignment requirements.
796 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000797 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000798 CmdArgs.push_back("-backend-option");
799 CmdArgs.push_back("-arm-long-calls");
800 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000801
Daniel Dunbar12100e22011-03-22 16:48:17 +0000802 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000803 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000804
805 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000806 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000807 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000808 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000809
Bob Wilson0874e532014-07-29 00:23:18 +0000810 // -mkernel implies -mstrict-align; don't add the redundant option.
811 if (!KernelOrKext) {
812 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
813 options::OPT_munaligned_access)) {
814 CmdArgs.push_back("-backend-option");
815 if (A->getOption().matches(options::OPT_mno_unaligned_access))
816 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000817 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000818 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000819 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000820 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000821 }
Bob Wilson0874e532014-07-29 00:23:18 +0000822 }
823 }
824
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000825 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000826 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
827 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000828 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000829 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000830 CmdArgs.push_back("-arm-global-merge=false");
831 else
832 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000833 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000834
Bob Wilson9c8af452013-04-11 18:53:25 +0000835 if (!Args.hasFlag(options::OPT_mimplicit_float,
836 options::OPT_mno_implicit_float,
837 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000838 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000839
Logan Chien749763e2014-04-03 13:12:44 +0000840 // llvm does not support reserving registers in general. There is support
841 // for reserving r9 on ARM though (defined as a platform-specific register
842 // in ARM EABI).
843 if (Args.hasArg(options::OPT_ffixed_r9)) {
844 CmdArgs.push_back("-backend-option");
845 CmdArgs.push_back("-arm-reserve-r9");
846 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000847}
848
Tim Northover573cbee2014-05-24 12:52:07 +0000849/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
850/// targeting.
851static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000852 Arg *A;
853 std::string CPU;
854 // If we have -mtune or -mcpu, use that.
855 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
856 CPU = A->getValue();
857 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000858 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000859 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000860 }
861
Kevin Qin110db6f2014-07-18 07:03:22 +0000862 // Handle CPU name is 'native'.
863 if (CPU == "native")
864 return llvm::sys::getHostCPUName();
865 else if (CPU.size())
866 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000867
James Molloy9b1586b2014-04-17 12:51:17 +0000868 // Make sure we pick "cyclone" if -arch is used.
869 // FIXME: Should this be picked by checking the target triple instead?
870 if (Args.getLastArg(options::OPT_arch))
871 return "cyclone";
872
873 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000874}
875
Tim Northover573cbee2014-05-24 12:52:07 +0000876void Clang::AddAArch64TargetArgs(const ArgList &Args,
877 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000878 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
879 llvm::Triple Triple(TripleStr);
880
881 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
882 Args.hasArg(options::OPT_mkernel) ||
883 Args.hasArg(options::OPT_fapple_kext))
884 CmdArgs.push_back("-disable-red-zone");
885
886 if (!Args.hasFlag(options::OPT_mimplicit_float,
887 options::OPT_mno_implicit_float, true))
888 CmdArgs.push_back("-no-implicit-float");
889
Craig Topper92fc2df2014-05-17 16:56:41 +0000890 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000891 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
892 ABIName = A->getValue();
893 else if (Triple.isOSDarwin())
894 ABIName = "darwinpcs";
895 else
896 ABIName = "aapcs";
897
898 CmdArgs.push_back("-target-abi");
899 CmdArgs.push_back(ABIName);
900
Bob Wilson0874e532014-07-29 00:23:18 +0000901 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000903 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000904 if (A->getOption().matches(options::OPT_mno_unaligned_access))
905 CmdArgs.push_back("-aarch64-strict-align");
906 else
907 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000908 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000909
Bradley Smith9ff64332014-10-13 10:16:06 +0000910 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
911 options::OPT_mno_fix_cortex_a53_835769)) {
912 CmdArgs.push_back("-backend-option");
913 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
914 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
915 else
916 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000917 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
918 // Enabled A53 errata (835769) workaround by default on android
919 CmdArgs.push_back("-backend-option");
920 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000921 }
922
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000923 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000924 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
925 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000926 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000927 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000928 CmdArgs.push_back("-aarch64-global-merge=false");
929 else
930 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000931 }
Renato Golinb625f482015-01-25 23:17:48 +0000932
933 if (Args.hasArg(options::OPT_ffixed_x18)) {
934 CmdArgs.push_back("-backend-option");
935 CmdArgs.push_back("-aarch64-reserve-x18");
936 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000937}
938
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000939// Get CPU and ABI names. They are not independent
940// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000941void mips::getMipsCPUAndABI(const ArgList &Args,
942 const llvm::Triple &Triple,
943 StringRef &CPUName,
944 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000945 const char *DefMips32CPU = "mips32r2";
946 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000947
Daniel Sanders2bf13662014-07-10 14:40:57 +0000948 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
949 // default for mips64(el)?-img-linux-gnu.
950 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
951 Triple.getEnvironment() == llvm::Triple::GNU) {
952 DefMips32CPU = "mips32r6";
953 DefMips64CPU = "mips64r6";
954 }
955
Brad Smithba26f582015-01-06 02:53:17 +0000956 // MIPS3 is the default for mips64*-unknown-openbsd.
957 if (Triple.getOS() == llvm::Triple::OpenBSD)
958 DefMips64CPU = "mips3";
959
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000960 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000961 options::OPT_mcpu_EQ))
962 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000963
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000964 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000965 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000966 // Convert a GNU style Mips ABI name to the name
967 // accepted by LLVM Mips backend.
968 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
969 .Case("32", "o32")
970 .Case("64", "n64")
971 .Default(ABIName);
972 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000973
974 // Setup default CPU and ABI names.
975 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000976 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000977 default:
978 llvm_unreachable("Unexpected triple arch name");
979 case llvm::Triple::mips:
980 case llvm::Triple::mipsel:
981 CPUName = DefMips32CPU;
982 break;
983 case llvm::Triple::mips64:
984 case llvm::Triple::mips64el:
985 CPUName = DefMips64CPU;
986 break;
987 }
988 }
989
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000990 if (ABIName.empty()) {
991 // Deduce ABI name from the target triple.
992 if (Triple.getArch() == llvm::Triple::mips ||
993 Triple.getArch() == llvm::Triple::mipsel)
994 ABIName = "o32";
995 else
996 ABIName = "n64";
997 }
998
999 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001000 // Deduce CPU name from ABI name.
1001 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001002 .Cases("o32", "eabi", DefMips32CPU)
1003 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001004 .Default("");
1005 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001006
1007 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001008}
1009
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001010// Convert ABI name to the GNU tools acceptable variant.
1011static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1012 return llvm::StringSwitch<llvm::StringRef>(ABI)
1013 .Case("o32", "32")
1014 .Case("n64", "64")
1015 .Default(ABI);
1016}
1017
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001018// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1019// and -mfloat-abi=.
1020static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001021 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001022 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001023 options::OPT_mhard_float,
1024 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001025 if (A->getOption().matches(options::OPT_msoft_float))
1026 FloatABI = "soft";
1027 else if (A->getOption().matches(options::OPT_mhard_float))
1028 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001029 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001030 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001031 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001032 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001033 FloatABI = "hard";
1034 }
1035 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001036 }
1037
1038 // If unspecified, choose the default based on the platform.
1039 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001040 // Assume "hard", because it's a default value used by gcc.
1041 // When we start to recognize specific target MIPS processors,
1042 // we will be able to select the default more correctly.
1043 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001044 }
1045
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001046 return FloatABI;
1047}
1048
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001049static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001050 std::vector<const char *> &Features,
1051 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001052 StringRef FeatureName) {
1053 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001054 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001055 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001056 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001057 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001058 }
1059}
1060
Daniel Sanders379d44b2014-07-16 11:52:23 +00001061static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1062 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001063 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001064 StringRef CPUName;
1065 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001066 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001067 ABIName = getGnuCompatibleMipsABIName(ABIName);
1068
Daniel Sandersfeb61302014-08-08 15:47:17 +00001069 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1070 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001071
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001072 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001073 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001074 // FIXME: Note, this is a hack. We need to pass the selected float
1075 // mode to the MipsTargetInfoBase to define appropriate macros there.
1076 // Now it is the only method.
1077 Features.push_back("+soft-float");
1078 }
1079
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001080 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001081 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001082 if (Val == "2008") {
1083 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1084 Features.push_back("+nan2008");
1085 else {
1086 Features.push_back("-nan2008");
1087 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1088 }
1089 } else if (Val == "legacy") {
1090 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1091 Features.push_back("-nan2008");
1092 else {
1093 Features.push_back("+nan2008");
1094 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1095 }
1096 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001097 D.Diag(diag::err_drv_unsupported_option_argument)
1098 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001099 }
1100
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001101 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1102 options::OPT_mdouble_float, "single-float");
1103 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1104 "mips16");
1105 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1106 options::OPT_mno_micromips, "micromips");
1107 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1108 "dsp");
1109 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1110 "dspr2");
1111 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1112 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001113
1114 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1115 // pass -mfpxx
1116 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1117 options::OPT_mfp64)) {
1118 if (A->getOption().matches(options::OPT_mfp32))
1119 Features.push_back(Args.MakeArgString("-fp64"));
1120 else if (A->getOption().matches(options::OPT_mfpxx)) {
1121 Features.push_back(Args.MakeArgString("+fpxx"));
1122 Features.push_back(Args.MakeArgString("+nooddspreg"));
1123 } else
1124 Features.push_back(Args.MakeArgString("+fp64"));
1125 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001126 Features.push_back(Args.MakeArgString("+fpxx"));
1127 Features.push_back(Args.MakeArgString("+nooddspreg"));
1128 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001129
Daniel Sanders28e5d392014-07-10 10:39:51 +00001130 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1131 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001132}
1133
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001134void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001135 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001136 const Driver &D = getToolChain().getDriver();
1137 StringRef CPUName;
1138 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001139 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001140 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001141
1142 CmdArgs.push_back("-target-abi");
1143 CmdArgs.push_back(ABIName.data());
1144
1145 StringRef FloatABI = getMipsFloatABI(D, Args);
1146
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001147 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001148 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001149 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001150 CmdArgs.push_back("-mfloat-abi");
1151 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001152 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001153 else {
1154 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001155 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001156 CmdArgs.push_back("-mfloat-abi");
1157 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001158 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001159
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1161 if (A->getOption().matches(options::OPT_mxgot)) {
1162 CmdArgs.push_back("-mllvm");
1163 CmdArgs.push_back("-mxgot");
1164 }
1165 }
1166
Simon Atanasyanc580b322013-05-11 06:33:44 +00001167 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1168 options::OPT_mno_ldc1_sdc1)) {
1169 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1170 CmdArgs.push_back("-mllvm");
1171 CmdArgs.push_back("-mno-ldc1-sdc1");
1172 }
1173 }
1174
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001175 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1176 options::OPT_mno_check_zero_division)) {
1177 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1178 CmdArgs.push_back("-mllvm");
1179 CmdArgs.push_back("-mno-check-zero-division");
1180 }
1181 }
1182
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001183 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001184 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001185 CmdArgs.push_back("-mllvm");
1186 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1187 A->claim();
1188 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001189}
1190
Hal Finkel8eb59282012-06-11 22:35:19 +00001191/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1192static std::string getPPCTargetCPU(const ArgList &Args) {
1193 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001194 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001195
1196 if (CPUName == "native") {
1197 std::string CPU = llvm::sys::getHostCPUName();
1198 if (!CPU.empty() && CPU != "generic")
1199 return CPU;
1200 else
1201 return "";
1202 }
1203
1204 return llvm::StringSwitch<const char *>(CPUName)
1205 .Case("common", "generic")
1206 .Case("440", "440")
1207 .Case("440fp", "440")
1208 .Case("450", "450")
1209 .Case("601", "601")
1210 .Case("602", "602")
1211 .Case("603", "603")
1212 .Case("603e", "603e")
1213 .Case("603ev", "603ev")
1214 .Case("604", "604")
1215 .Case("604e", "604e")
1216 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001217 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001218 .Case("G3", "g3")
1219 .Case("7400", "7400")
1220 .Case("G4", "g4")
1221 .Case("7450", "7450")
1222 .Case("G4+", "g4+")
1223 .Case("750", "750")
1224 .Case("970", "970")
1225 .Case("G5", "g5")
1226 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001227 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001228 .Case("e500mc", "e500mc")
1229 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001230 .Case("power3", "pwr3")
1231 .Case("power4", "pwr4")
1232 .Case("power5", "pwr5")
1233 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001234 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001235 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001236 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001237 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001238 .Case("pwr3", "pwr3")
1239 .Case("pwr4", "pwr4")
1240 .Case("pwr5", "pwr5")
1241 .Case("pwr5x", "pwr5x")
1242 .Case("pwr6", "pwr6")
1243 .Case("pwr6x", "pwr6x")
1244 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001245 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001246 .Case("powerpc", "ppc")
1247 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001248 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001249 .Default("");
1250 }
1251
1252 return "";
1253}
1254
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001255static void getPPCTargetFeatures(const ArgList &Args,
1256 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001257 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1258 ie = Args.filtered_end();
1259 it != ie; ++it) {
1260 StringRef Name = (*it)->getOption().getName();
1261 (*it)->claim();
1262
1263 // Skip over "-m".
1264 assert(Name.startswith("m") && "Invalid feature name.");
1265 Name = Name.substr(1);
1266
1267 bool IsNegative = Name.startswith("no-");
1268 if (IsNegative)
1269 Name = Name.substr(3);
1270
1271 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1272 // pass the correct option to the backend while calling the frontend
1273 // option the same.
1274 // TODO: Change the LLVM backend option maybe?
1275 if (Name == "mfcrf")
1276 Name = "mfocrf";
1277
1278 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1279 }
1280
1281 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001282 AddTargetFeature(Args, Features, options::OPT_faltivec,
1283 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001284}
1285
Ulrich Weigand8afad612014-07-28 13:17:52 +00001286void Clang::AddPPCTargetArgs(const ArgList &Args,
1287 ArgStringList &CmdArgs) const {
1288 // Select the ABI to use.
1289 const char *ABIName = nullptr;
1290 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1291 ABIName = A->getValue();
1292 } else if (getToolChain().getTriple().isOSLinux())
1293 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001294 case llvm::Triple::ppc64: {
1295 // When targeting a processor that supports QPX, or if QPX is
1296 // specifically enabled, default to using the ABI that supports QPX (so
1297 // long as it is not specifically disabled).
1298 bool HasQPX = false;
1299 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1300 HasQPX = A->getValue() == StringRef("a2q");
1301 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1302 if (HasQPX) {
1303 ABIName = "elfv1-qpx";
1304 break;
1305 }
1306
Ulrich Weigand8afad612014-07-28 13:17:52 +00001307 ABIName = "elfv1";
1308 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001309 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001310 case llvm::Triple::ppc64le:
1311 ABIName = "elfv2";
1312 break;
1313 default:
1314 break;
1315 }
1316
1317 if (ABIName) {
1318 CmdArgs.push_back("-target-abi");
1319 CmdArgs.push_back(ABIName);
1320 }
1321}
1322
1323bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1324 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1325 return A && (A->getValue() == StringRef(Value));
1326}
1327
Tom Stellard6674c702013-04-01 20:56:53 +00001328/// Get the (LLVM) name of the R600 gpu we are targeting.
1329static std::string getR600TargetGPU(const ArgList &Args) {
1330 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001331 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001332 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001333 .Cases("rv630", "rv635", "r600")
1334 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001335 .Case("rv740", "rv770")
1336 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001337 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001338 .Case("hemlock", "cypress")
1339 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001340 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001341 }
1342 return "";
1343}
1344
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001345static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001346 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001347 bool SoftFloatABI = true;
1348 if (Arg *A =
1349 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1350 if (A->getOption().matches(options::OPT_mhard_float))
1351 SoftFloatABI = false;
1352 }
1353 if (SoftFloatABI)
1354 Features.push_back("+soft-float");
1355}
1356
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001357void Clang::AddSparcTargetArgs(const ArgList &Args,
1358 ArgStringList &CmdArgs) const {
1359 const Driver &D = getToolChain().getDriver();
1360
Brad Smith10cd0f42014-07-11 20:12:08 +00001361 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001362 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001363 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1364 options::OPT_mhard_float)) {
1365 if (A->getOption().matches(options::OPT_msoft_float))
1366 FloatABI = "soft";
1367 else if (A->getOption().matches(options::OPT_mhard_float))
1368 FloatABI = "hard";
1369 }
1370
1371 // If unspecified, choose the default based on the platform.
1372 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001373 // Assume "soft", but warn the user we are guessing.
1374 FloatABI = "soft";
1375 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001376 }
1377
1378 if (FloatABI == "soft") {
1379 // Floating point operations and argument passing are soft.
1380 //
1381 // FIXME: This changes CPP defines, we need -target-soft-float.
1382 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001383 } else {
1384 assert(FloatABI == "hard" && "Invalid float abi!");
1385 CmdArgs.push_back("-mhard-float");
1386 }
1387}
1388
Richard Sandiford4652d892013-07-19 16:51:51 +00001389static const char *getSystemZTargetCPU(const ArgList &Args) {
1390 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1391 return A->getValue();
1392 return "z10";
1393}
1394
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001395static void getSystemZTargetFeatures(const ArgList &Args,
1396 std::vector<const char *> &Features) {
1397 // -m(no-)htm overrides use of the transactional-execution facility.
1398 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1399 options::OPT_mno_htm)) {
1400 if (A->getOption().matches(options::OPT_mhtm))
1401 Features.push_back("+transactional-execution");
1402 else
1403 Features.push_back("-transactional-execution");
1404 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001405 // -m(no-)vx overrides use of the vector facility.
1406 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1407 options::OPT_mno_vx)) {
1408 if (A->getOption().matches(options::OPT_mvx))
1409 Features.push_back("+vector");
1410 else
1411 Features.push_back("-vector");
1412 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001413}
1414
Chandler Carruth953fb082013-01-13 11:46:33 +00001415static const char *getX86TargetCPU(const ArgList &Args,
1416 const llvm::Triple &Triple) {
1417 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001418 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001419 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001420 return "core-avx2";
1421
Chandler Carruth953fb082013-01-13 11:46:33 +00001422 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001423 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001424
1425 // FIXME: Reject attempts to use -march=native unless the target matches
1426 // the host.
1427 //
1428 // FIXME: We should also incorporate the detected target features for use
1429 // with -native.
1430 std::string CPU = llvm::sys::getHostCPUName();
1431 if (!CPU.empty() && CPU != "generic")
1432 return Args.MakeArgString(CPU);
1433 }
1434
1435 // Select the default CPU if none was given (or detection failed).
1436
1437 if (Triple.getArch() != llvm::Triple::x86_64 &&
1438 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001439 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001440
1441 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1442
1443 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001444 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001445 if (Triple.getArchName() == "x86_64h")
1446 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001447 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001448 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001449
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001450 // Set up default CPU name for PS4 compilers.
1451 if (Triple.isPS4CPU())
1452 return "btver2";
1453
Alexey Bataev286d1b92014-01-31 04:07:13 +00001454 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001455 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001456 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001457
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001458 // Everything else goes to x86-64 in 64-bit mode.
1459 if (Is64Bit)
1460 return "x86-64";
1461
1462 switch (Triple.getOS()) {
1463 case llvm::Triple::FreeBSD:
1464 case llvm::Triple::NetBSD:
1465 case llvm::Triple::OpenBSD:
1466 return "i486";
1467 case llvm::Triple::Haiku:
1468 return "i586";
1469 case llvm::Triple::Bitrig:
1470 return "i686";
1471 default:
1472 // Fallback to p4.
1473 return "pentium4";
1474 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001475}
1476
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001477static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1478 switch(T.getArch()) {
1479 default:
1480 return "";
1481
Amara Emerson703da2e2013-10-31 09:32:33 +00001482 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001483 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001484 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001485
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001487 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001488 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001489 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001490 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001491
1492 case llvm::Triple::mips:
1493 case llvm::Triple::mipsel:
1494 case llvm::Triple::mips64:
1495 case llvm::Triple::mips64el: {
1496 StringRef CPUName;
1497 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001498 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001499 return CPUName;
1500 }
1501
1502 case llvm::Triple::ppc:
1503 case llvm::Triple::ppc64:
1504 case llvm::Triple::ppc64le: {
1505 std::string TargetCPUName = getPPCTargetCPU(Args);
1506 // LLVM may default to generating code for the native CPU,
1507 // but, like gcc, we default to a more generic option for
1508 // each architecture. (except on Darwin)
1509 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1510 if (T.getArch() == llvm::Triple::ppc64)
1511 TargetCPUName = "ppc64";
1512 else if (T.getArch() == llvm::Triple::ppc64le)
1513 TargetCPUName = "ppc64le";
1514 else
1515 TargetCPUName = "ppc";
1516 }
1517 return TargetCPUName;
1518 }
1519
1520 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001521 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001522 case llvm::Triple::sparcv9:
1523 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001524 return A->getValue();
1525 return "";
1526
1527 case llvm::Triple::x86:
1528 case llvm::Triple::x86_64:
1529 return getX86TargetCPU(Args, T);
1530
1531 case llvm::Triple::hexagon:
1532 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1533
1534 case llvm::Triple::systemz:
1535 return getSystemZTargetCPU(Args);
1536
1537 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001538 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001539 return getR600TargetGPU(Args);
1540 }
1541}
1542
Alp Tokerce365ca2013-12-02 12:43:03 +00001543static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1544 ArgStringList &CmdArgs) {
1545 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1546 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1547 // forward.
1548 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001549 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001550 CmdArgs.push_back(Args.MakeArgString(Plugin));
1551
1552 // Try to pass driver level flags relevant to LTO code generation down to
1553 // the plugin.
1554
1555 // Handle flags for selecting CPU variants.
1556 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1557 if (!CPU.empty())
1558 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1559}
1560
Eric Christopherc54920a2015-03-23 19:26:05 +00001561static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001562 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001563 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001564 // If -march=native, autodetect the feature list.
1565 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1566 if (StringRef(A->getValue()) == "native") {
1567 llvm::StringMap<bool> HostFeatures;
1568 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1569 for (auto &F : HostFeatures)
1570 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1571 F.first()));
1572 }
1573 }
1574
Jim Grosbach82eee262013-11-16 00:53:35 +00001575 if (Triple.getArchName() == "x86_64h") {
1576 // x86_64h implies quite a few of the more modern subtarget features
1577 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1578 Features.push_back("-rdrnd");
1579 Features.push_back("-aes");
1580 Features.push_back("-pclmul");
1581 Features.push_back("-rtm");
1582 Features.push_back("-hle");
1583 Features.push_back("-fsgsbase");
1584 }
1585
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001586 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001587 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001588 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001589 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001590 Features.push_back("+sse4.2");
1591 Features.push_back("+popcnt");
1592 } else
1593 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001594 }
1595
Eric Christopherc54920a2015-03-23 19:26:05 +00001596 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001597 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1598 StringRef Arch = A->getValue();
1599 bool ArchUsed = false;
1600 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001601 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001602 if (Arch == "AVX" || Arch == "AVX2") {
1603 ArchUsed = true;
1604 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1605 }
1606 }
1607 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001608 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001609 if (Arch == "IA32") {
1610 ArchUsed = true;
1611 } else if (Arch == "SSE" || Arch == "SSE2") {
1612 ArchUsed = true;
1613 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1614 }
1615 }
1616 if (!ArchUsed)
1617 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1618 }
1619
Jim Grosbach82eee262013-11-16 00:53:35 +00001620 // Now add any that the user explicitly requested on the command line,
1621 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001622 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1623 ie = Args.filtered_end();
1624 it != ie; ++it) {
1625 StringRef Name = (*it)->getOption().getName();
1626 (*it)->claim();
1627
1628 // Skip over "-m".
1629 assert(Name.startswith("m") && "Invalid feature name.");
1630 Name = Name.substr(1);
1631
1632 bool IsNegative = Name.startswith("no-");
1633 if (IsNegative)
1634 Name = Name.substr(3);
1635
1636 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1637 }
1638}
1639
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001640void Clang::AddX86TargetArgs(const ArgList &Args,
1641 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001642 if (!Args.hasFlag(options::OPT_mred_zone,
1643 options::OPT_mno_red_zone,
1644 true) ||
1645 Args.hasArg(options::OPT_mkernel) ||
1646 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001647 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001648
Bob Wilson2616e2e2013-02-10 16:01:41 +00001649 // Default to avoid implicit floating-point for kernel/kext code, but allow
1650 // that to be overridden with -mno-soft-float.
1651 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1652 Args.hasArg(options::OPT_fapple_kext));
1653 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1654 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001655 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001656 options::OPT_mno_implicit_float)) {
1657 const Option &O = A->getOption();
1658 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1659 O.matches(options::OPT_msoft_float));
1660 }
1661 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001662 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001663
1664 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1665 StringRef Value = A->getValue();
1666 if (Value == "intel" || Value == "att") {
1667 CmdArgs.push_back("-mllvm");
1668 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1669 } else {
1670 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1671 << A->getOption().getName() << Value;
1672 }
1673 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001674}
1675
Tony Linthicum76329bf2011-12-12 21:14:55 +00001676void Clang::AddHexagonTargetArgs(const ArgList &Args,
1677 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001678 CmdArgs.push_back("-mqdsp6-compat");
1679 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001680
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001681 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1682 std::string SmallDataThreshold="-hexagon-small-data-threshold=";
1683 SmallDataThreshold += v;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001684 CmdArgs.push_back ("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001685 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001686 }
1687
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001688 if (!Args.hasArg(options::OPT_fno_short_enums))
1689 CmdArgs.push_back("-fshort-enums");
1690 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1691 CmdArgs.push_back ("-mllvm");
1692 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1693 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001694 CmdArgs.push_back ("-mllvm");
1695 CmdArgs.push_back ("-machine-sink-split=0");
1696}
1697
Kevin Qin110db6f2014-07-18 07:03:22 +00001698// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001699static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001700 std::vector<const char *> &Features) {
1701 SmallVector<StringRef, 8> Split;
1702 text.split(Split, StringRef("+"), -1, false);
1703
1704 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1705 const char *result = llvm::StringSwitch<const char *>(Split[I])
1706 .Case("fp", "+fp-armv8")
1707 .Case("simd", "+neon")
1708 .Case("crc", "+crc")
1709 .Case("crypto", "+crypto")
1710 .Case("nofp", "-fp-armv8")
1711 .Case("nosimd", "-neon")
1712 .Case("nocrc", "-crc")
1713 .Case("nocrypto", "-crypto")
1714 .Default(nullptr);
1715 if (result)
1716 Features.push_back(result);
1717 else if (Split[I] == "neon" || Split[I] == "noneon")
1718 D.Diag(diag::err_drv_no_neon_modifier);
1719 else
1720 return false;
1721 }
1722 return true;
1723}
1724
1725// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1726// decode CPU and feature.
1727static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1728 std::vector<const char *> &Features) {
1729 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1730 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001731 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001732 Features.push_back("+neon");
1733 Features.push_back("+crc");
1734 Features.push_back("+crypto");
1735 } else if (CPU == "generic") {
1736 Features.push_back("+neon");
1737 } else {
1738 return false;
1739 }
1740
1741 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1742 return false;
1743
1744 return true;
1745}
1746
1747static bool
1748getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1749 const ArgList &Args,
1750 std::vector<const char *> &Features) {
1751 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001752
1753 if (Split.first == "armv8-a" ||
1754 Split.first == "armv8a") {
1755 // ok, no additional features.
1756 } else if (
1757 Split.first == "armv8.1-a" ||
1758 Split.first == "armv8.1a" ) {
1759 Features.push_back("+v8.1a");
1760 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001761 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001762 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001763
1764 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1765 return false;
1766
1767 return true;
1768}
1769
1770static bool
1771getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1772 const ArgList &Args,
1773 std::vector<const char *> &Features) {
1774 StringRef CPU;
1775 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1776 return false;
1777
1778 return true;
1779}
1780
1781static bool
1782getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1783 const ArgList &Args,
1784 std::vector<const char *> &Features) {
1785 // Handle CPU name is 'native'.
1786 if (Mtune == "native")
1787 Mtune = llvm::sys::getHostCPUName();
1788 if (Mtune == "cyclone") {
1789 Features.push_back("+zcm");
1790 Features.push_back("+zcz");
1791 }
1792 return true;
1793}
1794
1795static bool
1796getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1797 const ArgList &Args,
1798 std::vector<const char *> &Features) {
1799 StringRef CPU;
1800 std::vector<const char *> DecodedFeature;
1801 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1802 return false;
1803
1804 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1805}
1806
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001807static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1808 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001809 Arg *A;
1810 bool success = true;
1811 // Enable NEON by default.
1812 Features.push_back("+neon");
1813 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1814 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1815 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1816 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001817 else if (Args.hasArg(options::OPT_arch))
1818 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1819 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001820
1821 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1822 success =
1823 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1824 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1825 success =
1826 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001827 else if (Args.hasArg(options::OPT_arch))
1828 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1829 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001830
1831 if (!success)
1832 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001833
1834 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1835 Features.push_back("-fp-armv8");
1836 Features.push_back("-crypto");
1837 Features.push_back("-neon");
1838 }
Bradley Smith418c5932014-05-02 15:17:51 +00001839
1840 // En/disable crc
1841 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1842 options::OPT_mnocrc)) {
1843 if (A->getOption().matches(options::OPT_mcrc))
1844 Features.push_back("+crc");
1845 else
1846 Features.push_back("-crc");
1847 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001848}
1849
1850static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001851 const ArgList &Args, ArgStringList &CmdArgs,
1852 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001853 std::vector<const char *> Features;
1854 switch (Triple.getArch()) {
1855 default:
1856 break;
1857 case llvm::Triple::mips:
1858 case llvm::Triple::mipsel:
1859 case llvm::Triple::mips64:
1860 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001861 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001862 break;
1863
1864 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001865 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001866 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001867 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001868 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001869 break;
1870
1871 case llvm::Triple::ppc:
1872 case llvm::Triple::ppc64:
1873 case llvm::Triple::ppc64le:
1874 getPPCTargetFeatures(Args, Features);
1875 break;
1876 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001877 case llvm::Triple::sparcel:
Brad Smithf436e9e2014-08-19 21:50:15 +00001878 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001879 getSparcTargetFeatures(Args, Features);
1880 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001881 case llvm::Triple::systemz:
1882 getSystemZTargetFeatures(Args, Features);
1883 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001884 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001885 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001886 getAArch64TargetFeatures(D, Args, Features);
1887 break;
1888 case llvm::Triple::x86:
1889 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001890 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001891 break;
1892 }
Rafael Espindola43964802013-08-21 17:34:32 +00001893
1894 // Find the last of each feature.
1895 llvm::StringMap<unsigned> LastOpt;
1896 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1897 const char *Name = Features[I];
1898 assert(Name[0] == '-' || Name[0] == '+');
1899 LastOpt[Name + 1] = I;
1900 }
1901
1902 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1903 // If this feature was overridden, ignore it.
1904 const char *Name = Features[I];
1905 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1906 assert(LastI != LastOpt.end());
1907 unsigned Last = LastI->second;
1908 if (Last != I)
1909 continue;
1910
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001911 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001912 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001913 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001914}
1915
David Majnemerae394812014-12-09 00:12:30 +00001916static bool
1917shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1918 const llvm::Triple &Triple) {
1919 // We use the zero-cost exception tables for Objective-C if the non-fragile
1920 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1921 // later.
1922 if (runtime.isNonFragile())
1923 return true;
1924
1925 if (!Triple.isMacOSX())
1926 return false;
1927
1928 return (!Triple.isMacOSXVersionLT(10,5) &&
1929 (Triple.getArch() == llvm::Triple::x86_64 ||
1930 Triple.getArch() == llvm::Triple::arm));
1931}
1932
Nico Webere8e53112014-05-11 01:04:02 +00001933// exceptionSettings() exists to share the logic between -cc1 and linker
1934// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001935static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001936 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001937 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001938 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001939 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001940
David Majnemer8de68642014-12-05 08:11:58 +00001941 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001942}
1943
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001944/// Adds exception related arguments to the driver command arguments. There's a
1945/// master flag, -fexceptions and also language specific flags to enable/disable
1946/// C++ and Objective-C exceptions. This makes it possible to for example
1947/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00001948static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001949 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001950 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001951 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001952 const Driver &D = TC.getDriver();
1953 const llvm::Triple &Triple = TC.getTriple();
1954
Chad Rosier4fab82c2012-03-26 22:04:46 +00001955 if (KernelOrKext) {
1956 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1957 // arguments now to avoid warnings about unused arguments.
1958 Args.ClaimAllArgs(options::OPT_fexceptions);
1959 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1960 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1961 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1962 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1963 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001964 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001965 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001966
David Majnemer8de68642014-12-05 08:11:58 +00001967 // Gather the exception settings from the command line arguments.
1968 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001969
David Majnemerae394812014-12-09 00:12:30 +00001970 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1971 // is not necessarily sensible, but follows GCC.
1972 if (types::isObjC(InputType) &&
1973 Args.hasFlag(options::OPT_fobjc_exceptions,
1974 options::OPT_fno_objc_exceptions,
1975 true)) {
1976 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001977
David Majnemerae394812014-12-09 00:12:30 +00001978 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001979 }
1980
1981 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001982 bool CXXExceptionsEnabled =
1983 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001984 Arg *ExceptionArg = Args.getLastArg(
1985 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
1986 options::OPT_fexceptions, options::OPT_fno_exceptions);
1987 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00001988 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001989 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
1990 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001991
1992 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00001993 if (Triple.isPS4CPU()) {
1994 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
1995 assert(ExceptionArg &&
1996 "On the PS4 exceptions should only be enabled if passing "
1997 "an argument");
1998 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
1999 const Arg *RTTIArg = TC.getRTTIArg();
2000 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2001 D.Diag(diag::err_drv_argument_not_allowed_with)
2002 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2003 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2004 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2005 } else
2006 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2007
Anders Carlssone96ab552011-02-28 02:27:16 +00002008 CmdArgs.push_back("-fcxx-exceptions");
2009
David Majnemer8de68642014-12-05 08:11:58 +00002010 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002011 }
2012 }
2013
David Majnemer8de68642014-12-05 08:11:58 +00002014 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002015 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002016}
2017
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002018static bool ShouldDisableAutolink(const ArgList &Args,
2019 const ToolChain &TC) {
2020 bool Default = true;
2021 if (TC.getTriple().isOSDarwin()) {
2022 // The native darwin assembler doesn't support the linker_option directives,
2023 // so we disable them if we think the .s file will be passed to it.
2024 Default = TC.useIntegratedAs();
2025 }
2026 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2027 Default);
2028}
2029
Ted Kremenek62093662013-03-12 17:02:12 +00002030static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2031 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002032 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2033 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002034 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002035 return !UseDwarfDirectory;
2036}
2037
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002038/// \brief Check whether the given input tree contains any compilation actions.
2039static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002040 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002041 return true;
2042
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002043 for (const auto &Act : *A)
2044 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002045 return true;
2046
2047 return false;
2048}
2049
2050/// \brief Check if -relax-all should be passed to the internal assembler.
2051/// This is done by default when compiling non-assembler source with -O0.
2052static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2053 bool RelaxDefault = true;
2054
2055 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2056 RelaxDefault = A->getOption().matches(options::OPT_O0);
2057
2058 if (RelaxDefault) {
2059 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002060 for (const auto &Act : C.getActions()) {
2061 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002062 RelaxDefault = true;
2063 break;
2064 }
2065 }
2066 }
2067
2068 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2069 RelaxDefault);
2070}
2071
David Blaikie9260ed62013-07-25 21:19:01 +00002072static void CollectArgsForIntegratedAssembler(Compilation &C,
2073 const ArgList &Args,
2074 ArgStringList &CmdArgs,
2075 const Driver &D) {
2076 if (UseRelaxAll(C, Args))
2077 CmdArgs.push_back("-mrelax-all");
2078
David Peixottodfb66142013-11-14 22:52:58 +00002079 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002080 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002081 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2082 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2083 // arg after parsing the '-I' arg.
2084 bool TakeNextArg = false;
2085
David Blaikie9260ed62013-07-25 21:19:01 +00002086 // When using an integrated assembler, translate -Wa, and -Xassembler
2087 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002088 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002089 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2090 options::OPT_Xassembler),
2091 ie = Args.filtered_end(); it != ie; ++it) {
2092 const Arg *A = *it;
2093 A->claim();
2094
2095 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2096 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002097 if (TakeNextArg) {
2098 CmdArgs.push_back(Value.data());
2099 TakeNextArg = false;
2100 continue;
2101 }
David Blaikie9260ed62013-07-25 21:19:01 +00002102
2103 if (Value == "-force_cpusubtype_ALL") {
2104 // Do nothing, this is the default and we don't support anything else.
2105 } else if (Value == "-L") {
2106 CmdArgs.push_back("-msave-temp-labels");
2107 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002108 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002109 } else if (Value == "--noexecstack") {
2110 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002111 } else if (Value == "-compress-debug-sections" ||
2112 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002113 CompressDebugSections = true;
2114 } else if (Value == "-nocompress-debug-sections" ||
2115 Value == "--nocompress-debug-sections") {
2116 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002117 } else if (Value.startswith("-I")) {
2118 CmdArgs.push_back(Value.data());
2119 // We need to consume the next argument if the current arg is a plain
2120 // -I. The next arg will be the include directory.
2121 if (Value == "-I")
2122 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002123 } else if (Value.startswith("-gdwarf-")) {
2124 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002125 } else {
2126 D.Diag(diag::err_drv_unsupported_option_argument)
2127 << A->getOption().getName() << Value;
2128 }
2129 }
2130 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002131 if (CompressDebugSections) {
2132 if (llvm::zlib::isAvailable())
2133 CmdArgs.push_back("-compress-debug-sections");
2134 else
2135 D.Diag(diag::warn_debug_compression_unavailable);
2136 }
David Blaikie9260ed62013-07-25 21:19:01 +00002137}
2138
Renato Goline807c122014-01-31 11:47:28 +00002139// Until ARM libraries are build separately, we have them all in one library
2140static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002141 // FIXME: handle 64-bit
2142 if (TC.getTriple().isOSWindows() &&
2143 !TC.getTriple().isWindowsItaniumEnvironment())
2144 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002145 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002146 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002147 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002148}
2149
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002150static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2151 // The runtimes are located in the OS-specific resource directory.
2152 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002153 const llvm::Triple &Triple = TC.getTriple();
2154 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002155 StringRef OSLibName =
2156 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002157 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002158 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002159}
2160
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002161static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002162 bool Shared = false) {
2163 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2164 ? "-android"
2165 : "";
2166
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002167 bool IsOSWindows = TC.getTriple().isOSWindows();
2168 StringRef Arch = getArchNameForCompilerRTLib(TC);
2169 const char *Prefix = IsOSWindows ? "" : "lib";
2170 const char *Suffix =
2171 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2172
2173 SmallString<128> Path = getCompilerRTLibDir(TC);
2174 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2175 Arch + Env + Suffix);
2176
2177 return Path;
2178}
2179
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002180// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002181// FIXME: Make sure we can also emit shared objects if they're requested
2182// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002183static void addClangRT(const ToolChain &TC, const ArgList &Args,
2184 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002185 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002186
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002187 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002188 // FIXME: why do we link against gcc when we are using compiler-rt?
2189 CmdArgs.push_back("-lgcc_s");
2190 if (TC.getDriver().CCCIsCXX())
2191 CmdArgs.push_back("-lgcc_eh");
2192 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002193}
2194
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002195static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2196 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002197 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2198 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002199 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002200 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002201 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002202 Args.hasArg(options::OPT_fcreate_profile) ||
2203 Args.hasArg(options::OPT_coverage)))
2204 return;
2205
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002206 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002207}
2208
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002209namespace {
2210enum OpenMPRuntimeKind {
2211 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2212 /// without knowing what runtime to target.
2213 OMPRT_Unknown,
2214
2215 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2216 /// the default for Clang.
2217 OMPRT_OMP,
2218
2219 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2220 /// this runtime but can swallow the pragmas, and find and link against the
2221 /// runtime library itself.
2222 OMPRT_GOMP,
2223
Chandler Carruthc6625c62015-05-28 21:10:31 +00002224 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002225 /// OpenMP runtime. We support this mode for users with existing dependencies
2226 /// on this runtime library name.
2227 OMPRT_IOMP5
2228};
2229}
2230
2231/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002232static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2233 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002234 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2235
2236 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2237 if (A)
2238 RuntimeName = A->getValue();
2239
2240 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
2241 .Case("libomp", OMPRT_OMP)
2242 .Case("libgomp", OMPRT_GOMP)
2243 .Case("libiomp5", OMPRT_IOMP5)
2244 .Default(OMPRT_Unknown);
2245
2246 if (RT == OMPRT_Unknown) {
2247 if (A)
2248 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
2249 << A->getOption().getName() << A->getValue();
2250 else
2251 // FIXME: We could use a nicer diagnostic here.
2252 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2253 }
2254
2255 return RT;
2256}
2257
Alexey Samsonov52550342014-09-15 19:58:40 +00002258static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2259 ArgStringList &CmdArgs, StringRef Sanitizer,
2260 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002261 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002262 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002263 if (!IsShared)
2264 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002265 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002266 if (!IsShared)
2267 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002268}
2269
Alexey Samsonov52550342014-09-15 19:58:40 +00002270// Tries to use a file with the list of dynamic symbols that need to be exported
2271// from the runtime library. Returns true if the file was found.
2272static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2273 ArgStringList &CmdArgs,
2274 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002275 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2276 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2277 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002278 return true;
2279 }
2280 return false;
2281}
2282
2283static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2284 ArgStringList &CmdArgs) {
2285 // Force linking against the system libraries sanitizers depends on
2286 // (see PR15823 why this is necessary).
2287 CmdArgs.push_back("--no-as-needed");
2288 CmdArgs.push_back("-lpthread");
2289 CmdArgs.push_back("-lrt");
2290 CmdArgs.push_back("-lm");
2291 // There's no libdl on FreeBSD.
2292 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2293 CmdArgs.push_back("-ldl");
2294}
2295
2296static void
2297collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2298 SmallVectorImpl<StringRef> &SharedRuntimes,
2299 SmallVectorImpl<StringRef> &StaticRuntimes,
2300 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2301 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2302 // Collect shared runtimes.
2303 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2304 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002305 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002306
Alexey Samsonov52550342014-09-15 19:58:40 +00002307 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002308 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002309 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2310 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002311 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002312 }
2313 if (SanArgs.needsAsanRt()) {
2314 if (SanArgs.needsSharedAsanRt()) {
2315 HelperStaticRuntimes.push_back("asan-preinit");
2316 } else {
2317 StaticRuntimes.push_back("asan");
2318 if (SanArgs.linkCXXRuntimes())
2319 StaticRuntimes.push_back("asan_cxx");
2320 }
2321 }
2322 if (SanArgs.needsDfsanRt())
2323 StaticRuntimes.push_back("dfsan");
2324 if (SanArgs.needsLsanRt())
2325 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002326 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002327 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002328 if (SanArgs.linkCXXRuntimes())
2329 StaticRuntimes.push_back("msan_cxx");
2330 }
2331 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002332 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002333 if (SanArgs.linkCXXRuntimes())
2334 StaticRuntimes.push_back("tsan_cxx");
2335 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002336 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002337 StaticRuntimes.push_back("ubsan_standalone");
2338 if (SanArgs.linkCXXRuntimes())
2339 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002340 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002341}
2342
Alexey Samsonov52550342014-09-15 19:58:40 +00002343// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2344// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2345static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002346 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002347 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2348 HelperStaticRuntimes;
2349 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2350 HelperStaticRuntimes);
2351 for (auto RT : SharedRuntimes)
2352 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2353 for (auto RT : HelperStaticRuntimes)
2354 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2355 bool AddExportDynamic = false;
2356 for (auto RT : StaticRuntimes) {
2357 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2358 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2359 }
2360 // If there is a static runtime with no dynamic list, force all the symbols
2361 // to be dynamic to be sure we export sanitizer interface functions.
2362 if (AddExportDynamic)
2363 CmdArgs.push_back("-export-dynamic");
2364 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002365}
2366
Reid Kleckner86ea7702015-02-04 23:45:07 +00002367static bool areOptimizationsEnabled(const ArgList &Args) {
2368 // Find the last -O arg and see if it is non-zero.
2369 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2370 return !A->getOption().matches(options::OPT_O0);
2371 // Defaults to -O0.
2372 return false;
2373}
2374
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002375static bool shouldUseFramePointerForTarget(const ArgList &Args,
2376 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002377 // XCore never wants frame pointers, regardless of OS.
2378 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002379 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002380 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002381
2382 if (Triple.isOSLinux()) {
2383 switch (Triple.getArch()) {
2384 // Don't use a frame pointer on linux if optimizing for certain targets.
2385 case llvm::Triple::mips64:
2386 case llvm::Triple::mips64el:
2387 case llvm::Triple::mips:
2388 case llvm::Triple::mipsel:
2389 case llvm::Triple::systemz:
2390 case llvm::Triple::x86:
2391 case llvm::Triple::x86_64:
2392 return !areOptimizationsEnabled(Args);
2393 default:
2394 return true;
2395 }
2396 }
2397
2398 if (Triple.isOSWindows()) {
2399 switch (Triple.getArch()) {
2400 case llvm::Triple::x86:
2401 return !areOptimizationsEnabled(Args);
2402 default:
2403 // All other supported Windows ISAs use xdata unwind information, so frame
2404 // pointers are not generally useful.
2405 return false;
2406 }
2407 }
2408
2409 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002410}
2411
Rafael Espindola224dd632011-12-14 21:02:23 +00002412static bool shouldUseFramePointer(const ArgList &Args,
2413 const llvm::Triple &Triple) {
2414 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2415 options::OPT_fomit_frame_pointer))
2416 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2417
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002418 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002419}
2420
Eric Christopherb7d97e92013-04-03 01:58:53 +00002421static bool shouldUseLeafFramePointer(const ArgList &Args,
2422 const llvm::Triple &Triple) {
2423 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2424 options::OPT_momit_leaf_frame_pointer))
2425 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2426
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002427 if (Triple.isPS4CPU())
2428 return false;
2429
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002430 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002431}
2432
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002433/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002434static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002435 SmallString<128> cwd;
2436 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002437 CmdArgs.push_back("-fdebug-compilation-dir");
2438 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002439 }
2440}
2441
Eric Christopherd3804002013-02-22 20:12:52 +00002442static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002443 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002444 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2445 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2446 SmallString<128> T(FinalOutput->getValue());
2447 llvm::sys::path::replace_extension(T, "dwo");
2448 return Args.MakeArgString(T);
2449 } else {
2450 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002451 SmallString<128> T(
2452 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002453 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002454 llvm::sys::path::replace_extension(F, "dwo");
2455 T += F;
2456 return Args.MakeArgString(F);
2457 }
2458}
2459
2460static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2461 const Tool &T, const JobAction &JA,
2462 const ArgList &Args, const InputInfo &Output,
2463 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002464 ArgStringList ExtractArgs;
2465 ExtractArgs.push_back("--extract-dwo");
2466
2467 ArgStringList StripArgs;
2468 StripArgs.push_back("--strip-dwo");
2469
2470 // Grabbing the output of the earlier compile step.
2471 StripArgs.push_back(Output.getFilename());
2472 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002473 ExtractArgs.push_back(OutFile);
2474
2475 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002476 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002477
2478 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002479 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002480
2481 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002482 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002483}
2484
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002485/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002486/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2487static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002488 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002489 if (A->getOption().matches(options::OPT_O4) ||
2490 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002491 return true;
2492
2493 if (A->getOption().matches(options::OPT_O0))
2494 return false;
2495
2496 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2497
Rafael Espindola91780de2013-08-26 14:05:41 +00002498 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002499 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002500 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002501 return true;
2502
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002503 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002504 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002505 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002506
2507 unsigned OptLevel = 0;
2508 if (S.getAsInteger(10, OptLevel))
2509 return false;
2510
2511 return OptLevel > 1;
2512 }
2513
2514 return false;
2515}
2516
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002517/// Add -x lang to \p CmdArgs for \p Input.
2518static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2519 ArgStringList &CmdArgs) {
2520 // When using -verify-pch, we don't want to provide the type
2521 // 'precompiled-header' if it was inferred from the file extension
2522 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2523 return;
2524
2525 CmdArgs.push_back("-x");
2526 if (Args.hasArg(options::OPT_rewrite_objc))
2527 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2528 else
2529 CmdArgs.push_back(types::getTypeName(Input.getType()));
2530}
2531
David Majnemerc371ff02015-03-22 08:39:22 +00002532static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002533 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002534 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002535
2536 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002537 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002538
2539 unsigned Build = 0, Factor = 1;
2540 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2541 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002542 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002543}
2544
Rafael Espindola577637a2015-01-03 00:06:04 +00002545// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002546// options that build systems might add but are unused when assembling or only
2547// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002548static void claimNoWarnArgs(const ArgList &Args) {
2549 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002550 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002551 Args.ClaimAllArgs(options::OPT_flto);
2552 Args.ClaimAllArgs(options::OPT_fno_lto);
2553}
2554
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002555static void appendUserToPath(SmallVectorImpl<char> &Result) {
2556#ifdef LLVM_ON_UNIX
2557 const char *Username = getenv("LOGNAME");
2558#else
2559 const char *Username = getenv("USERNAME");
2560#endif
2561 if (Username) {
2562 // Validate that LoginName can be used in a path, and get its length.
2563 size_t Len = 0;
2564 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002565 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002566 Username = nullptr;
2567 break;
2568 }
2569 }
2570
2571 if (Username && Len > 0) {
2572 Result.append(Username, Username + Len);
2573 return;
2574 }
2575 }
2576
2577 // Fallback to user id.
2578#ifdef LLVM_ON_UNIX
2579 std::string UID = llvm::utostr(getuid());
2580#else
2581 // FIXME: Windows seems to have an 'SID' that might work.
2582 std::string UID = "9999";
2583#endif
2584 Result.append(UID.begin(), UID.end());
2585}
2586
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002587void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002588 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002589 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002590 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002591 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002592 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2593 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002594 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002595 ArgStringList CmdArgs;
2596
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002597 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002598 bool IsWindowsCygnus =
2599 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002600 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2601
Daniel Dunbare521a892009-03-31 20:53:55 +00002602 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002603 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002604
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002605 // Invoke ourselves in -cc1 mode.
2606 //
2607 // FIXME: Implement custom jobs for internal actions.
2608 CmdArgs.push_back("-cc1");
2609
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002610 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002611 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002612 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002613 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002614
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002615 const llvm::Triple TT(TripleStr);
2616 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2617 TT.getArch() == llvm::Triple::thumb)) {
2618 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2619 unsigned Version;
2620 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2621 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002622 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2623 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002624 }
2625
Tim Northover336f1892014-03-29 13:16:12 +00002626 // Push all default warning arguments that are specific to
2627 // the given target. These come before user provided warning options
2628 // are provided.
2629 getToolChain().addClangWarningOptions(CmdArgs);
2630
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002631 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002632 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002633
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002634 if (isa<AnalyzeJobAction>(JA)) {
2635 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2636 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002637 } else if (isa<MigrateJobAction>(JA)) {
2638 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002639 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002640 if (Output.getType() == types::TY_Dependencies)
2641 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002642 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002643 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002644 if (Args.hasArg(options::OPT_rewrite_objc) &&
2645 !Args.hasArg(options::OPT_g_Group))
2646 CmdArgs.push_back("-P");
2647 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002648 } else if (isa<AssembleJobAction>(JA)) {
2649 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002650
David Blaikie9260ed62013-07-25 21:19:01 +00002651 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002652
2653 // Also ignore explicit -force_cpusubtype_ALL option.
2654 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002655 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002656 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002657 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002658
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002659 if (JA.getType() == types::TY_Nothing)
2660 CmdArgs.push_back("-fsyntax-only");
2661 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002662 CmdArgs.push_back("-emit-pch");
2663 else
2664 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002665 } else if (isa<VerifyPCHJobAction>(JA)) {
2666 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002667 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002668 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2669 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002670
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002671 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002672 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002673 } else if (JA.getType() == types::TY_LLVM_IR ||
2674 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002675 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002676 } else if (JA.getType() == types::TY_LLVM_BC ||
2677 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002678 CmdArgs.push_back("-emit-llvm-bc");
2679 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002680 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002681 } else if (JA.getType() == types::TY_AST) {
2682 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002683 } else if (JA.getType() == types::TY_ModuleFile) {
2684 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002685 } else if (JA.getType() == types::TY_RewrittenObjC) {
2686 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002687 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002688 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2689 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002690 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002691 } else {
2692 assert(JA.getType() == types::TY_PP_Asm &&
2693 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002694 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002695
2696 // Preserve use-list order by default when emitting bitcode, so that
2697 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2698 // same result as running passes here. For LTO, we don't need to preserve
2699 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002700 if (JA.getType() == types::TY_LLVM_BC)
2701 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002702 }
2703
Justin Bognera88f0122014-06-20 22:59:50 +00002704 // We normally speed up the clang process a bit by skipping destructors at
2705 // exit, but when we're generating diagnostics we can rely on some of the
2706 // cleanup.
2707 if (!C.isForDiagnostics())
2708 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002709
John McCallbb79b5f2010-02-13 03:50:24 +00002710 // Disable the verification pass in -asserts builds.
2711#ifdef NDEBUG
2712 CmdArgs.push_back("-disable-llvm-verifier");
2713#endif
2714
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002715 // Set the main file name, so that debug info works even with
2716 // -save-temps.
2717 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002718 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002719
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002720 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002721 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002722 if (Args.hasArg(options::OPT_static))
2723 CmdArgs.push_back("-static-define");
2724
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002725 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002726 // Enable region store model by default.
2727 CmdArgs.push_back("-analyzer-store=region");
2728
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002729 // Treat blocks as analysis entry points.
2730 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2731
Ted Kremenek49c79792011-03-24 00:28:47 +00002732 CmdArgs.push_back("-analyzer-eagerly-assume");
2733
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002734 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002735 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002736 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002737
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002738 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002739 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002740
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002741 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002742 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002743
2744 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002745
Artem Belevichba558952015-05-06 18:20:23 +00002746 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002747 CmdArgs.push_back("-analyzer-checker=cplusplus");
2748
Nico Webere8e53112014-05-11 01:04:02 +00002749 // Enable the following experimental checkers for testing.
2750 CmdArgs.push_back(
2751 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002752 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2753 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2754 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2755 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2756 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002757 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002758
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002759 // Set the output format. The default is plist, for (lame) historical
2760 // reasons.
2761 CmdArgs.push_back("-analyzer-output");
2762 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002763 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002764 else
2765 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002766
Ted Kremenekfe449a22010-03-22 22:32:05 +00002767 // Disable the presentation of standard compiler warnings when
2768 // using --analyze. We only want to show static analyzer diagnostics
2769 // or frontend errors.
2770 CmdArgs.push_back("-w");
2771
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002772 // Add -Xanalyzer arguments when running as analyzer.
2773 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002774 }
2775
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002776 CheckCodeGenerationOptions(D, Args);
2777
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002778 bool PIE = getToolChain().isPIEDefault();
2779 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002780 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002781
Alexey Bataev40e75222014-01-28 06:30:35 +00002782 // Android-specific defaults for PIC/PIE
2783 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002784 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00002785 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002786 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002787 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002788 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002789 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002790 case llvm::Triple::mips:
2791 case llvm::Triple::mipsel:
2792 case llvm::Triple::mips64:
2793 case llvm::Triple::mips64el:
2794 PIC = true; // "-fpic"
2795 break;
2796
2797 case llvm::Triple::x86:
2798 case llvm::Triple::x86_64:
2799 PIC = true; // "-fPIC"
2800 IsPICLevelTwo = true;
2801 break;
2802
2803 default:
2804 break;
2805 }
2806 }
2807
Brad Smith5b05db82014-06-24 19:51:29 +00002808 // OpenBSD-specific defaults for PIE
2809 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002810 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00002811 case llvm::Triple::mips64:
2812 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002813 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002814 case llvm::Triple::x86:
2815 case llvm::Triple::x86_64:
2816 IsPICLevelTwo = false; // "-fpie"
2817 break;
2818
2819 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00002820 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00002821 case llvm::Triple::sparcv9:
2822 IsPICLevelTwo = true; // "-fPIE"
2823 break;
2824
2825 default:
2826 break;
2827 }
2828 }
2829
Alexey Samsonov090301e2013-04-09 12:28:19 +00002830 // For the PIC and PIE flag options, this logic is different from the
2831 // legacy logic in very old versions of GCC, as that logic was just
2832 // a bug no one had ever fixed. This logic is both more rational and
2833 // consistent with GCC's new logic now that the bugs are fixed. The last
2834 // argument relating to either PIC or PIE wins, and no other argument is
2835 // used. If the last argument is any flavor of the '-fno-...' arguments,
2836 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2837 // at the same level.
2838 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2839 options::OPT_fpic, options::OPT_fno_pic,
2840 options::OPT_fPIE, options::OPT_fno_PIE,
2841 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002842 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2843 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002844 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002845 if (LastPICArg) {
2846 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002847 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2848 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2849 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2850 PIC = PIE || O.matches(options::OPT_fPIC) ||
2851 O.matches(options::OPT_fpic);
2852 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2853 O.matches(options::OPT_fPIC);
2854 } else {
2855 PIE = PIC = false;
2856 }
2857 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002858 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002859
Nick Lewycky609dd662013-10-11 03:33:53 +00002860 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002861 // specified while enabling PIC enabled level 1 PIC, just force it back to
2862 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2863 // informal testing).
2864 if (PIC && getToolChain().getTriple().isOSDarwin())
2865 IsPICLevelTwo |= getToolChain().isPICDefault();
2866
Chandler Carruthc0c04552012-04-08 16:40:35 +00002867 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2868 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002869 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002870 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002871 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002872 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002873 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002874
Chandler Carruth76a943b2012-11-19 03:52:03 +00002875 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2876 // This is a very special mode. It trumps the other modes, almost no one
2877 // uses it, and it isn't even valid on any OS but Darwin.
2878 if (!getToolChain().getTriple().isOSDarwin())
2879 D.Diag(diag::err_drv_unsupported_opt_for_target)
2880 << A->getSpelling() << getToolChain().getTriple().str();
2881
2882 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2883
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002884 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002885 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002886
Chandler Carruth76a943b2012-11-19 03:52:03 +00002887 // Only a forced PIC mode can cause the actual compile to have PIC defines
2888 // etc., no flags are sufficient. This behavior was selected to closely
2889 // match that of llvm-gcc and Apple GCC before that.
2890 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2891 CmdArgs.push_back("-pic-level");
2892 CmdArgs.push_back("2");
2893 }
2894 } else {
2895 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2896 // handled in Clang's IRGen by the -pie-level flag.
2897 CmdArgs.push_back("-mrelocation-model");
2898 CmdArgs.push_back(PIC ? "pic" : "static");
2899
2900 if (PIC) {
2901 CmdArgs.push_back("-pic-level");
2902 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2903 if (PIE) {
2904 CmdArgs.push_back("-pie-level");
2905 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2906 }
2907 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002908 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002909
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002910 CmdArgs.push_back("-mthread-model");
2911 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2912 CmdArgs.push_back(A->getValue());
2913 else
2914 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2915
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002916 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2917
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002918 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2919 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002920 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002921
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002922 // LLVM Code Generator Options.
2923
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002924 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2925 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2926 for (arg_iterator
2927 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2928 options::OPT_frewrite_map_file_EQ),
2929 MFE = Args.filtered_end();
2930 MFI != MFE; ++MFI) {
2931 CmdArgs.push_back("-frewrite-map-file");
2932 CmdArgs.push_back((*MFI)->getValue());
2933 (*MFI)->claim();
2934 }
2935 }
2936
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002937 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2938 StringRef v = A->getValue();
2939 CmdArgs.push_back("-mllvm");
2940 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2941 A->claim();
2942 }
2943
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002944 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2945 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002946 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002947 }
2948
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002949 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2950 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002951 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002952 D.Diag(diag::err_drv_unsupported_opt_for_target)
2953 << A->getSpelling() << getToolChain().getTriple().str();
2954 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2955 CmdArgs.push_back("-fpcc-struct-return");
2956 } else {
2957 assert(A->getOption().matches(options::OPT_freg_struct_return));
2958 CmdArgs.push_back("-freg-struct-return");
2959 }
2960 }
2961
Roman Divacky65b88cd2011-03-01 17:40:53 +00002962 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2963 CmdArgs.push_back("-mrtd");
2964
Rafael Espindola224dd632011-12-14 21:02:23 +00002965 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002966 CmdArgs.push_back("-mdisable-fp-elim");
2967 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2968 options::OPT_fno_zero_initialized_in_bss))
2969 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002970
2971 bool OFastEnabled = isOptimizationLevelFast(Args);
2972 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2973 // enabled. This alias option is being used to simplify the hasFlag logic.
2974 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2975 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002976 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2977 // doesn't do any TBAA.
2978 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002979 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002980 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002981 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002982 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2983 options::OPT_fno_struct_path_tbaa))
2984 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002985 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2986 false))
2987 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002988 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2989 options::OPT_fno_optimize_sibling_calls))
2990 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002991
Eric Christopher006208c2013-04-04 06:29:47 +00002992 // Handle segmented stacks.
2993 if (Args.hasArg(options::OPT_fsplit_stack))
2994 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002995
2996 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2997 // This alias option is being used to simplify the getLastArg logic.
2998 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2999 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003000
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003001 // Handle various floating point optimization flags, mapping them to the
3002 // appropriate LLVM code generation flags. The pattern for all of these is to
3003 // default off the codegen optimizations, and if any flag enables them and no
3004 // flag disables them after the flag enabling them, enable the codegen
3005 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003006 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003007 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003008 options::OPT_ffinite_math_only,
3009 options::OPT_fno_finite_math_only,
3010 options::OPT_fhonor_infinities,
3011 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003012 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3013 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003014 A->getOption().getID() != options::OPT_fhonor_infinities)
3015 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003016 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003017 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003018 options::OPT_ffinite_math_only,
3019 options::OPT_fno_finite_math_only,
3020 options::OPT_fhonor_nans,
3021 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003022 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3023 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003024 A->getOption().getID() != options::OPT_fhonor_nans)
3025 CmdArgs.push_back("-menable-no-nans");
3026
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003027 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3028 bool MathErrno = getToolChain().IsMathErrnoDefault();
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_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003032 options::OPT_fno_math_errno)) {
3033 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3034 // However, turning *off* -ffast_math merely restores the toolchain default
3035 // (which may be false).
3036 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3037 A->getOption().getID() == options::OPT_ffast_math ||
3038 A->getOption().getID() == options::OPT_Ofast)
3039 MathErrno = false;
3040 else if (A->getOption().getID() == options::OPT_fmath_errno)
3041 MathErrno = true;
3042 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003043 if (MathErrno)
3044 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003045
3046 // There are several flags which require disabling very specific
3047 // optimizations. Any of these being disabled forces us to turn off the
3048 // entire set of LLVM optimizations, so collect them through all the flag
3049 // madness.
3050 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003051 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003052 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003053 options::OPT_funsafe_math_optimizations,
3054 options::OPT_fno_unsafe_math_optimizations,
3055 options::OPT_fassociative_math,
3056 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003057 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3058 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003059 A->getOption().getID() != options::OPT_fno_associative_math)
3060 AssociativeMath = true;
3061 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003062 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003063 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003064 options::OPT_funsafe_math_optimizations,
3065 options::OPT_fno_unsafe_math_optimizations,
3066 options::OPT_freciprocal_math,
3067 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003068 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3069 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003070 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3071 ReciprocalMath = true;
3072 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003073 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003074 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003075 options::OPT_funsafe_math_optimizations,
3076 options::OPT_fno_unsafe_math_optimizations,
3077 options::OPT_fsigned_zeros,
3078 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003079 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3080 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003081 A->getOption().getID() != options::OPT_fsigned_zeros)
3082 SignedZeros = false;
3083 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003084 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003085 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003086 options::OPT_funsafe_math_optimizations,
3087 options::OPT_fno_unsafe_math_optimizations,
3088 options::OPT_ftrapping_math,
3089 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003090 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3091 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003092 A->getOption().getID() != options::OPT_ftrapping_math)
3093 TrappingMath = false;
3094 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3095 !TrappingMath)
3096 CmdArgs.push_back("-menable-unsafe-fp-math");
3097
Sanjay Patel76c9e092015-01-23 16:40:50 +00003098 if (!SignedZeros)
3099 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003100
Sanjay Patel359b1052015-04-09 15:03:23 +00003101 if (ReciprocalMath)
3102 CmdArgs.push_back("-freciprocal-math");
3103
Lang Hamesaa53b932012-07-06 00:59:19 +00003104 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003105 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003106 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003107 options::OPT_ffp_contract)) {
3108 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003109 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003110 if (Val == "fast" || Val == "on" || Val == "off") {
3111 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3112 } else {
3113 D.Diag(diag::err_drv_unsupported_option_argument)
3114 << A->getOption().getName() << Val;
3115 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003116 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3117 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003118 // If fast-math is set then set the fp-contract mode to fast.
3119 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3120 }
3121 }
3122
Bob Wilson6a039162012-07-19 03:52:53 +00003123 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3124 // and if we find them, tell the frontend to provide the appropriate
3125 // preprocessor macros. This is distinct from enabling any optimizations as
3126 // these options induce language changes which must survive serialization
3127 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003128 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3129 options::OPT_fno_fast_math))
3130 if (!A->getOption().matches(options::OPT_fno_fast_math))
3131 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003132 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3133 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003134 if (A->getOption().matches(options::OPT_ffinite_math_only))
3135 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003136
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003137 // Decide whether to use verbose asm. Verbose assembly is the default on
3138 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003139 bool IsIntegratedAssemblerDefault =
3140 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003141 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003142 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003143 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003144 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003145
Rafael Espindolab8a12932015-05-22 20:44:03 +00003146 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3147 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003148 CmdArgs.push_back("-no-integrated-as");
3149
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003150 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3151 CmdArgs.push_back("-mdebug-pass");
3152 CmdArgs.push_back("Structure");
3153 }
3154 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3155 CmdArgs.push_back("-mdebug-pass");
3156 CmdArgs.push_back("Arguments");
3157 }
3158
John McCall8517abc2010-02-19 02:45:38 +00003159 // Enable -mconstructor-aliases except on darwin, where we have to
3160 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003161 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003162 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003163
John McCall7ef5cb32011-03-18 02:56:14 +00003164 // Darwin's kernel doesn't support guard variables; just die if we
3165 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003166 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003167 CmdArgs.push_back("-fforbid-guard-variables");
3168
Douglas Gregordbe39272011-02-01 15:15:22 +00003169 if (Args.hasArg(options::OPT_mms_bitfields)) {
3170 CmdArgs.push_back("-mms-bitfields");
3171 }
John McCall8517abc2010-02-19 02:45:38 +00003172
Daniel Dunbar306945d2009-09-16 06:17:29 +00003173 // This is a coarse approximation of what llvm-gcc actually does, both
3174 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3175 // complicated ways.
3176 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003177 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3178 options::OPT_fno_asynchronous_unwind_tables,
3179 (getToolChain().IsUnwindTablesDefault() ||
3180 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3181 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003182 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3183 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003184 CmdArgs.push_back("-munwind-tables");
3185
Chandler Carruth05fb5852012-11-21 23:40:23 +00003186 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003187
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003188 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3189 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003190 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003191 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003192
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003193 // FIXME: Handle -mtune=.
3194 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003195
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003196 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003197 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003198 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003199 }
3200
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003201 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003202 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003203 if (!CPU.empty()) {
3204 CmdArgs.push_back("-target-cpu");
3205 CmdArgs.push_back(Args.MakeArgString(CPU));
3206 }
3207
Rafael Espindolaeb265472013-08-21 21:59:03 +00003208 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3209 CmdArgs.push_back("-mfpmath");
3210 CmdArgs.push_back(A->getValue());
3211 }
3212
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003213 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003214 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003215
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003216 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003217 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003218 default:
3219 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003220
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003221 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003222 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003223 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003224 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003225 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003226 break;
3227
Tim Northover573cbee2014-05-24 12:52:07 +00003228 case llvm::Triple::aarch64:
3229 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003230 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003231 break;
3232
Eric Christopher0b26a612010-03-02 02:41:08 +00003233 case llvm::Triple::mips:
3234 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003235 case llvm::Triple::mips64:
3236 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003237 AddMIPSTargetArgs(Args, CmdArgs);
3238 break;
3239
Ulrich Weigand8afad612014-07-28 13:17:52 +00003240 case llvm::Triple::ppc:
3241 case llvm::Triple::ppc64:
3242 case llvm::Triple::ppc64le:
3243 AddPPCTargetArgs(Args, CmdArgs);
3244 break;
3245
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003246 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003247 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003248 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003249 AddSparcTargetArgs(Args, CmdArgs);
3250 break;
3251
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003252 case llvm::Triple::x86:
3253 case llvm::Triple::x86_64:
3254 AddX86TargetArgs(Args, CmdArgs);
3255 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003256
3257 case llvm::Triple::hexagon:
3258 AddHexagonTargetArgs(Args, CmdArgs);
3259 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003260 }
3261
Hans Wennborg75958c42013-08-08 00:17:41 +00003262 // Add clang-cl arguments.
3263 if (getToolChain().getDriver().IsCLMode())
3264 AddClangCLArgs(Args, CmdArgs);
3265
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003266 // Pass the linker version in use.
3267 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3268 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003269 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003270 }
3271
Eric Christopherb7d97e92013-04-03 01:58:53 +00003272 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003273 CmdArgs.push_back("-momit-leaf-frame-pointer");
3274
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003275 // Explicitly error on some things we know we don't support and can't just
3276 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003277 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003278 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3279 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003280 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003281 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003282 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003283 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3284 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003285 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003286 << Unsupported->getOption().getName();
3287 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003288 }
3289
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003290 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003291 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003292 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003293 CmdArgs.push_back("-header-include-file");
3294 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3295 D.CCPrintHeadersFilename : "-");
3296 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003297 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003298 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003299
Chad Rosierbe10f982011-08-02 17:58:04 +00003300 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003301 CmdArgs.push_back("-diagnostic-log-file");
3302 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3303 D.CCLogDiagnosticsFilename : "-");
3304 }
3305
Manman Ren17bdb0f2013-11-20 20:22:14 +00003306 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3307 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003308 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003309 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003310 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3311 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003312 // FIXME: we should support specifying dwarf version with
3313 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003314 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003315 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003316 const llvm::Triple &Triple = getToolChain().getTriple();
3317 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003318 Triple.getOS() == llvm::Triple::FreeBSD ||
3319 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003320 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003321 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003322 CmdArgs.push_back("-gdwarf-2");
3323 else if (A->getOption().matches(options::OPT_gdwarf_3))
3324 CmdArgs.push_back("-gdwarf-3");
3325 else if (A->getOption().matches(options::OPT_gdwarf_4))
3326 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003327 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003328 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003329 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003330 const llvm::Triple &Triple = getToolChain().getTriple();
3331 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003332 Triple.getOS() == llvm::Triple::FreeBSD ||
3333 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003334 CmdArgs.push_back("-gdwarf-2");
3335 else
3336 CmdArgs.push_back("-g");
3337 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003338 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003339
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003340 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3341 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003342 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3343 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003344 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003345
Eric Christopher138c32b2013-09-13 22:37:55 +00003346 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003347 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3348 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003349 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003350 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003351 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003352 CmdArgs.push_back("-g");
3353 CmdArgs.push_back("-backend-option");
3354 CmdArgs.push_back("-split-dwarf=Enable");
3355 }
3356
Eric Christopher138c32b2013-09-13 22:37:55 +00003357 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3358 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3359 CmdArgs.push_back("-backend-option");
3360 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3361 }
Eric Christophereec89c22013-06-18 00:03:50 +00003362
Eric Christopher0d403d22014-02-14 01:27:03 +00003363 // -gdwarf-aranges turns on the emission of the aranges section in the
3364 // backend.
3365 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3366 CmdArgs.push_back("-backend-option");
3367 CmdArgs.push_back("-generate-arange-section");
3368 }
3369
David Blaikief36d9ba2014-01-27 18:52:43 +00003370 if (Args.hasFlag(options::OPT_fdebug_types_section,
3371 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003372 CmdArgs.push_back("-backend-option");
3373 CmdArgs.push_back("-generate-type-units");
3374 }
Eric Christophereec89c22013-06-18 00:03:50 +00003375
Ed Schouten6e576152015-03-26 17:50:28 +00003376 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3377 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3378
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003379 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003380 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003381 CmdArgs.push_back("-ffunction-sections");
3382 }
3383
3384 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003385 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003386 CmdArgs.push_back("-fdata-sections");
3387 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003388
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003389 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003390 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003391 CmdArgs.push_back("-fno-unique-section-names");
3392
Chris Lattner3c77a352010-06-22 00:03:40 +00003393 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3394
Justin Bognera71e6812015-04-30 23:49:42 +00003395 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3396 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003397 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3398 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3399 D.Diag(diag::err_drv_argument_not_allowed_with)
3400 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3401
Justin Bognera71e6812015-04-30 23:49:42 +00003402 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3403 A->render(Args, CmdArgs);
3404 else
3405 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003406
3407 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3408 A->render(Args, CmdArgs);
3409 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3410 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3411
Nick Lewycky207bce32011-04-21 23:44:07 +00003412 if (Args.hasArg(options::OPT_ftest_coverage) ||
3413 Args.hasArg(options::OPT_coverage))
3414 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003415 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3416 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003417 Args.hasArg(options::OPT_coverage))
3418 CmdArgs.push_back("-femit-coverage-data");
3419
Alex Lorenzee024992014-08-04 18:41:51 +00003420 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003421 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3422 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003423 D.Diag(diag::err_drv_argument_only_allowed_with)
3424 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3425
3426 if (Args.hasArg(options::OPT_fcoverage_mapping))
3427 CmdArgs.push_back("-fcoverage-mapping");
3428
Nick Lewycky480cb992011-05-04 20:46:58 +00003429 if (C.getArgs().hasArg(options::OPT_c) ||
3430 C.getArgs().hasArg(options::OPT_S)) {
3431 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003432 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003433 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003434 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003435 CoverageFilename = FinalOutput->getValue();
3436 } else {
3437 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3438 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003439 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003440 SmallString<128> Pwd;
3441 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003442 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003443 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003444 }
3445 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003446 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003447 }
3448 }
3449
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003450 // Pass options for controlling the default header search paths.
3451 if (Args.hasArg(options::OPT_nostdinc)) {
3452 CmdArgs.push_back("-nostdsysteminc");
3453 CmdArgs.push_back("-nobuiltininc");
3454 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003455 if (Args.hasArg(options::OPT_nostdlibinc))
3456 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003457 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3458 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3459 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003460
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003461 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003462 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003463 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003464
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003465 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3466
Ted Kremenekf7639e12012-03-06 20:06:33 +00003467 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003468 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003469 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003470 options::OPT_ccc_arcmt_modify,
3471 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003472 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003473 switch (A->getOption().getID()) {
3474 default:
3475 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003476 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003477 CmdArgs.push_back("-arcmt-check");
3478 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003479 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003480 CmdArgs.push_back("-arcmt-modify");
3481 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003482 case options::OPT_ccc_arcmt_migrate:
3483 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003484 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003485 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003486
3487 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3488 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003489 break;
John McCalld70fb982011-06-15 23:25:17 +00003490 }
3491 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003492 } else {
3493 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3494 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3495 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003496 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003497
Ted Kremenekf7639e12012-03-06 20:06:33 +00003498 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3499 if (ARCMTEnabled) {
3500 D.Diag(diag::err_drv_argument_not_allowed_with)
3501 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3502 }
3503 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003504 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003505
3506 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003507 options::OPT_objcmt_migrate_subscripting,
3508 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003509 // None specified, means enable them all.
3510 CmdArgs.push_back("-objcmt-migrate-literals");
3511 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003512 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003513 } else {
3514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003517 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003518 } else {
3519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3523 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3524 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3528 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3529 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003533 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003534 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003535 }
3536
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003537 // Add preprocessing options like -I, -D, etc. if we are using the
3538 // preprocessor.
3539 //
3540 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003541 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003542 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003543
Rafael Espindolaa7431922011-07-21 23:40:37 +00003544 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3545 // that "The compiler can only warn and ignore the option if not recognized".
3546 // When building with ccache, it will pass -D options to clang even on
3547 // preprocessed inputs and configure concludes that -fPIC is not supported.
3548 Args.ClaimAllArgs(options::OPT_D);
3549
Alp Toker7874bdc2013-11-15 20:40:58 +00003550 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003551 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3552 if (A->getOption().matches(options::OPT_O4)) {
3553 CmdArgs.push_back("-O3");
3554 D.Diag(diag::warn_O4_is_O3);
3555 } else {
3556 A->render(Args, CmdArgs);
3557 }
3558 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003559
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003560 // Warn about ignored options to clang.
3561 for (arg_iterator it = Args.filtered_begin(
3562 options::OPT_clang_ignored_gcc_optimization_f_Group),
3563 ie = Args.filtered_end(); it != ie; ++it) {
3564 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3565 }
3566
Rafael Espindola577637a2015-01-03 00:06:04 +00003567 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003568
Richard Smith3be1cb22014-08-07 00:24:21 +00003569 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003570 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003571 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3572 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003573 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003574 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003575
3576 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003577 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003578 //
3579 // If a std is supplied, only add -trigraphs if it follows the
3580 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003581 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003582 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3583 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003584 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003585 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003586 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003587 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003588 else
3589 Std->render(Args, CmdArgs);
3590
Nico Weber00721502014-12-23 22:32:37 +00003591 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003592 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003593 options::OPT_ftrigraphs,
3594 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003595 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003596 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003597 } else {
3598 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003599 //
3600 // FIXME: Clang doesn't correctly handle -std= when the input language
3601 // doesn't match. For the time being just ignore this for C++ inputs;
3602 // eventually we want to do all the standard defaulting here instead of
3603 // splitting it between the driver and clang -cc1.
3604 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003605 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3606 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003607 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003608 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003609
Nico Weber00721502014-12-23 22:32:37 +00003610 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3611 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003612 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003613
Richard Smith282b4492013-09-04 22:50:31 +00003614 // GCC's behavior for -Wwrite-strings is a bit strange:
3615 // * In C, this "warning flag" changes the types of string literals from
3616 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3617 // for the discarded qualifier.
3618 // * In C++, this is just a normal warning flag.
3619 //
3620 // Implementing this warning correctly in C is hard, so we follow GCC's
3621 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3622 // a non-const char* in C, rather than using this crude hack.
3623 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003624 // FIXME: This should behave just like a warning flag, and thus should also
3625 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3626 Arg *WriteStrings =
3627 Args.getLastArg(options::OPT_Wwrite_strings,
3628 options::OPT_Wno_write_strings, options::OPT_w);
3629 if (WriteStrings &&
3630 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003631 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003632 }
3633
Chandler Carruth61fbf622011-04-23 09:27:53 +00003634 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003635 // during C++ compilation, which it is by default. GCC keeps this define even
3636 // in the presence of '-w', match this behavior bug-for-bug.
3637 if (types::isCXX(InputType) &&
3638 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3639 true)) {
3640 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003641 }
3642
Chandler Carruthe0391482010-05-22 02:21:53 +00003643 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3644 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3645 if (Asm->getOption().matches(options::OPT_fasm))
3646 CmdArgs.push_back("-fgnu-keywords");
3647 else
3648 CmdArgs.push_back("-fno-gnu-keywords");
3649 }
3650
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003651 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3652 CmdArgs.push_back("-fno-dwarf-directory-asm");
3653
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003654 if (ShouldDisableAutolink(Args, getToolChain()))
3655 CmdArgs.push_back("-fno-autolink");
3656
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003657 // Add in -fdebug-compilation-dir if necessary.
3658 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003659
Richard Smith9a568822011-11-21 19:36:32 +00003660 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3661 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003662 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003663 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003664 }
3665
Richard Smith79c927b2013-11-06 19:31:51 +00003666 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3667 CmdArgs.push_back("-foperator-arrow-depth");
3668 CmdArgs.push_back(A->getValue());
3669 }
3670
Richard Smith9a568822011-11-21 19:36:32 +00003671 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3672 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003673 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003674 }
3675
Richard Smitha3d3bd22013-05-08 02:12:03 +00003676 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3677 CmdArgs.push_back("-fconstexpr-steps");
3678 CmdArgs.push_back(A->getValue());
3679 }
3680
Richard Smithb3a14522013-02-22 01:59:51 +00003681 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3682 CmdArgs.push_back("-fbracket-depth");
3683 CmdArgs.push_back(A->getValue());
3684 }
3685
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003686 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3687 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003688 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003689 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003690 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3691 } else
3692 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003693 }
3694
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003695
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003696 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003697 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003698
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003699 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3700 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003701 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003702 }
David Chisnall5778fce2009-08-31 16:41:57 +00003703
Chris Lattnere23003d2010-01-09 21:54:33 +00003704 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3705 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003706 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003707 }
3708
Chris Lattnerb35583d2010-04-07 20:49:23 +00003709 CmdArgs.push_back("-ferror-limit");
3710 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003711 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003712 else
3713 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003714
Chandler Carrutha77a7272010-05-06 04:55:18 +00003715 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3716 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003717 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003718 }
3719
3720 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3721 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003722 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003723 }
3724
Richard Smithf6f003a2011-12-16 19:06:07 +00003725 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3726 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003728 }
3729
Nick Lewycky24653262014-12-16 21:39:02 +00003730 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3731 CmdArgs.push_back("-fspell-checking-limit");
3732 CmdArgs.push_back(A->getValue());
3733 }
3734
Daniel Dunbar2c978472009-11-04 06:24:47 +00003735 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003736 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003737 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003738 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003739 } else {
3740 // If -fmessage-length=N was not specified, determine whether this is a
3741 // terminal and, if so, implicitly define -fmessage-length appropriately.
3742 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003743 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003744 }
3745
John McCallb4a99d32013-02-19 01:57:35 +00003746 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3747 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3748 options::OPT_fvisibility_ms_compat)) {
3749 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3750 CmdArgs.push_back("-fvisibility");
3751 CmdArgs.push_back(A->getValue());
3752 } else {
3753 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3754 CmdArgs.push_back("-fvisibility");
3755 CmdArgs.push_back("hidden");
3756 CmdArgs.push_back("-ftype-visibility");
3757 CmdArgs.push_back("default");
3758 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003759 }
3760
Douglas Gregor08329632010-06-15 17:05:35 +00003761 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003762
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003763 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3764
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003765 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003766 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3767 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003768 CmdArgs.push_back("-ffreestanding");
3769
Daniel Dunbare357d562009-12-03 18:42:11 +00003770 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003771 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003772 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003773 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3774 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003775 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003776 // AltiVec language extensions aren't relevant for assembling.
3777 if (!isa<PreprocessJobAction>(JA) ||
3778 Output.getType() != types::TY_PP_Asm)
3779 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003780 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3781 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003782
Alexey Bataevdb390212015-05-20 04:24:19 +00003783 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003784 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3785 options::OPT_fno_openmp, false))
3786 switch (getOpenMPRuntime(getToolChain(), Args)) {
3787 case OMPRT_OMP:
3788 case OMPRT_IOMP5:
3789 // Clang can generate useful OpenMP code for these two runtime libraries.
3790 CmdArgs.push_back("-fopenmp");
3791 break;
3792 default:
3793 // By default, if Clang doesn't know how to generate useful OpenMP code
3794 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3795 // down to the actual compilation.
3796 // FIXME: It would be better to have a mode which *only* omits IR
3797 // generation based on the OpenMP support so that we get consistent
3798 // semantic analysis, etc.
3799 break;
3800 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003801
Peter Collingbourne32701642013-11-01 18:16:25 +00003802 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3803 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003804
Eric Christopher459d2712013-02-19 06:16:53 +00003805 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003806 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3807 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3808 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3809 Arch == llvm::Triple::ppc64le))
3810 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3811 << "ppc/ppc64/ppc64le";
3812 }
Chad Rosier864dfe12012-03-13 23:45:51 +00003813
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003814 if (getToolChain().SupportsProfiling())
3815 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003816
3817 // -flax-vector-conversions is default.
3818 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3819 options::OPT_fno_lax_vector_conversions))
3820 CmdArgs.push_back("-fno-lax-vector-conversions");
3821
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003822 if (Args.getLastArg(options::OPT_fapple_kext))
3823 CmdArgs.push_back("-fapple-kext");
3824
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003825 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003826 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003827 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003828 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3829 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003830
3831 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3832 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003833 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003834 }
3835
Bob Wilson14adb362012-02-03 06:27:22 +00003836 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003837
Chandler Carruth6e501032011-03-27 00:04:55 +00003838 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3839 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3840 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3841 options::OPT_fno_wrapv)) {
3842 if (A->getOption().matches(options::OPT_fwrapv))
3843 CmdArgs.push_back("-fwrapv");
3844 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3845 options::OPT_fno_strict_overflow)) {
3846 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3847 CmdArgs.push_back("-fwrapv");
3848 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003849
3850 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3851 options::OPT_fno_reroll_loops))
3852 if (A->getOption().matches(options::OPT_freroll_loops))
3853 CmdArgs.push_back("-freroll-loops");
3854
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003855 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003856 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3857 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003858
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003859 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3860
Mahesha S6a682be42012-10-27 07:47:56 +00003861
Daniel Dunbar4930e332009-11-17 08:07:36 +00003862 // -stack-protector=0 is default.
3863 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003864 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3865 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003866 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003867 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003868 if (A->getOption().matches(options::OPT_fstack_protector)) {
3869 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3870 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3871 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003872 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003873 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003874 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003875 } else {
3876 StackProtectorLevel =
3877 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3878 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003879 if (StackProtectorLevel) {
3880 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003881 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003882 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003883
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003884 // --param ssp-buffer-size=
3885 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3886 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003887 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003888 if (Str.startswith("ssp-buffer-size=")) {
3889 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003890 CmdArgs.push_back("-stack-protector-buffer-size");
3891 // FIXME: Verify the argument is a valid integer.
3892 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003893 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003894 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003895 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003896 }
3897
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003898 // Translate -mstackrealign
3899 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3900 false)) {
3901 CmdArgs.push_back("-backend-option");
3902 CmdArgs.push_back("-force-align-stack");
3903 }
3904 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3905 false)) {
3906 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3907 }
3908
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003909 if (Args.hasArg(options::OPT_mstack_alignment)) {
3910 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3911 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003912 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003913
Hans Wennborg77dc2362015-01-20 19:45:50 +00003914 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3915 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3916
3917 if (!Size.empty())
3918 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3919 else
3920 CmdArgs.push_back("-mstack-probe-size=0");
3921 }
3922
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003923 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
3924 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003925 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3926
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003927 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3928 options::OPT_mno_restrict_it)) {
3929 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3930 CmdArgs.push_back("-backend-option");
3931 CmdArgs.push_back("-arm-restrict-it");
3932 } else {
3933 CmdArgs.push_back("-backend-option");
3934 CmdArgs.push_back("-arm-no-restrict-it");
3935 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003936 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3937 TT.getArch() == llvm::Triple::thumb)) {
3938 // Windows on ARM expects restricted IT blocks
3939 CmdArgs.push_back("-backend-option");
3940 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003941 }
3942
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003943 if (TT.getArch() == llvm::Triple::arm ||
3944 TT.getArch() == llvm::Triple::thumb) {
3945 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3946 options::OPT_mno_long_calls)) {
3947 if (A->getOption().matches(options::OPT_mlong_calls)) {
3948 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003949 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003950 }
3951 }
3952 }
3953
Daniel Dunbard18049a2009-04-07 21:16:11 +00003954 // Forward -f options with positive and negative forms; we translate
3955 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003956 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3957 StringRef fname = A->getValue();
3958 if (!llvm::sys::fs::exists(fname))
3959 D.Diag(diag::err_drv_no_such_file) << fname;
3960 else
3961 A->render(Args, CmdArgs);
3962 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003963
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003964 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003965 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003966 CmdArgs.push_back("-fapple-kext");
3967 if (!Args.hasArg(options::OPT_fbuiltin))
3968 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003969 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003970 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003971 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003972 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003973 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003974
Nuno Lopes13c88c72009-12-16 16:59:22 +00003975 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3976 options::OPT_fno_assume_sane_operator_new))
3977 CmdArgs.push_back("-fno-assume-sane-operator-new");
3978
Daniel Dunbar4930e332009-11-17 08:07:36 +00003979 // -fblocks=0 is default.
3980 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003981 getToolChain().IsBlocksDefault()) ||
3982 (Args.hasArg(options::OPT_fgnu_runtime) &&
3983 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3984 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003985 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003986
3987 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3988 !getToolChain().hasBlocksRuntime())
3989 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003990 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003991
Richard Smithffb65082014-09-30 23:10:19 +00003992 // -fmodules enables modules (off by default).
3993 // Users can pass -fno-cxx-modules to turn off modules support for
3994 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003995 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003996 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3997 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3998 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003999 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004000 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004001 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004002 HaveModules = true;
4003 }
4004 }
4005
Daniel Jasper07e6c402013-08-05 20:26:17 +00004006 // -fmodule-maps enables module map processing (off by default) for header
4007 // checking. It is implied by -fmodules.
4008 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4009 false)) {
4010 CmdArgs.push_back("-fmodule-maps");
4011 }
4012
Daniel Jasperac42b752013-10-21 06:34:34 +00004013 // -fmodules-decluse checks that modules used are declared so (off by
4014 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004015 if (Args.hasFlag(options::OPT_fmodules_decluse,
4016 options::OPT_fno_modules_decluse,
4017 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004018 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004019 }
4020
Daniel Jasper962b38e2014-04-11 11:47:45 +00004021 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4022 // all #included headers are part of modules.
4023 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4024 options::OPT_fno_modules_strict_decluse,
4025 false)) {
4026 CmdArgs.push_back("-fmodules-strict-decluse");
4027 }
4028
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004029 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4030 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4031 options::OPT_fno_implicit_modules)) {
4032 CmdArgs.push_back("-fno-implicit-modules");
4033 }
4034
Daniel Jasperac42b752013-10-21 06:34:34 +00004035 // -fmodule-name specifies the module that is currently being built (or
4036 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004037 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004038
Richard Smith9887d792014-10-17 01:42:53 +00004039 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004040 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004041 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004042
Richard Smithe842a472014-10-22 02:05:46 +00004043 // -fmodule-file can be used to specify files containing precompiled modules.
4044 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4045
4046 // -fmodule-cache-path specifies where our implicitly-built module files
4047 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004048 SmallString<128> ModuleCachePath;
4049 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4050 ModuleCachePath = A->getValue();
4051 if (HaveModules) {
4052 if (C.isForDiagnostics()) {
4053 // When generating crash reports, we want to emit the modules along with
4054 // the reproduction sources, so we ignore any provided module path.
4055 ModuleCachePath = Output.getFilename();
4056 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4057 llvm::sys::path::append(ModuleCachePath, "modules");
4058 } else if (ModuleCachePath.empty()) {
4059 // No module path was provided: use the default.
4060 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4061 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004062 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4063 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004064 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4065 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004066 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004067 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4068 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4069 }
4070
4071 // When building modules and generating crashdumps, we need to dump a module
4072 // dependency VFS alongside the output.
4073 if (HaveModules && C.isForDiagnostics()) {
4074 SmallString<128> VFSDir(Output.getFilename());
4075 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004076 // Add the cache directory as a temp so the crash diagnostics pick it up.
4077 C.addTempFile(Args.MakeArgString(VFSDir));
4078
Justin Bognera88f0122014-06-20 22:59:50 +00004079 llvm::sys::path::append(VFSDir, "vfs");
4080 CmdArgs.push_back("-module-dependency-dir");
4081 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004082 }
4083
Richard Smith9887d792014-10-17 01:42:53 +00004084 if (HaveModules)
4085 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004086
Douglas Gregor35b04d62013-02-07 19:01:24 +00004087 // Pass through all -fmodules-ignore-macro arguments.
4088 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004089 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4090 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004091
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004092 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4093
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004094 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4095 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4096 D.Diag(diag::err_drv_argument_not_allowed_with)
4097 << A->getAsString(Args) << "-fbuild-session-timestamp";
4098
4099 llvm::sys::fs::file_status Status;
4100 if (llvm::sys::fs::status(A->getValue(), Status))
4101 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004102 CmdArgs.push_back(Args.MakeArgString(
4103 "-fbuild-session-timestamp=" +
4104 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004105 }
4106
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004107 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004108 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4109 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004110 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4111
4112 Args.AddLastArg(CmdArgs,
4113 options::OPT_fmodules_validate_once_per_build_session);
4114 }
4115
Ben Langmuirdcf73862014-03-12 00:06:17 +00004116 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4117
John McCalldfea9982010-04-09 19:12:06 +00004118 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004119 if (Args.hasFlag(options::OPT_fno_access_control,
4120 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004121 false))
John McCall3155f572010-04-09 19:03:51 +00004122 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004123
Anders Carlssond470fef2010-11-21 00:09:52 +00004124 // -felide-constructors is the default.
4125 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4126 options::OPT_felide_constructors,
4127 false))
4128 CmdArgs.push_back("-fno-elide-constructors");
4129
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004130 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004131
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004132 if (KernelOrKext || (types::isCXX(InputType) &&
4133 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4134 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004135 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004136
Tony Linthicum76329bf2011-12-12 21:14:55 +00004137 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004138 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004139 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004140 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004141 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004142 CmdArgs.push_back("-fshort-enums");
4143
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004144 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004145 if (Arg *A = Args.getLastArg(
4146 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4147 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4148 if (A->getOption().matches(options::OPT_funsigned_char) ||
4149 A->getOption().matches(options::OPT_fno_signed_char)) {
4150 CmdArgs.push_back("-fno-signed-char");
4151 }
4152 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004153 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004154 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004155
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004156 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004157 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4158 options::OPT_fno_use_cxa_atexit,
4159 !IsWindowsCygnus && !IsWindowsGNU &&
4160 getToolChain().getArch() != llvm::Triple::hexagon &&
4161 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004162 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004163 CmdArgs.push_back("-fno-use-cxa-atexit");
4164
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004165 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004166 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004167 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004168 CmdArgs.push_back("-fms-extensions");
4169
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004170 // -fno-use-line-directives is default.
4171 if (Args.hasFlag(options::OPT_fuse_line_directives,
4172 options::OPT_fno_use_line_directives, false))
4173 CmdArgs.push_back("-fuse-line-directives");
4174
Francois Pichet1b4f1632011-09-17 04:32:15 +00004175 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004176 if (Args.hasFlag(options::OPT_fms_compatibility,
4177 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004178 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4179 options::OPT_fno_ms_extensions,
4180 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004181 CmdArgs.push_back("-fms-compatibility");
4182
David Majnemerc371ff02015-03-22 08:39:22 +00004183 // -fms-compatibility-version=18.00 is default.
4184 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004185 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004186 IsWindowsMSVC) ||
4187 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004188 Args.hasArg(options::OPT_fms_compatibility_version)) {
4189 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4190 const Arg *MSCompatibilityVersion =
4191 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004192
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004193 if (MSCVersion && MSCompatibilityVersion)
4194 D.Diag(diag::err_drv_argument_not_allowed_with)
4195 << MSCVersion->getAsString(Args)
4196 << MSCompatibilityVersion->getAsString(Args);
4197
David Majnemerc371ff02015-03-22 08:39:22 +00004198 if (MSCompatibilityVersion) {
4199 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4200 D.Diag(diag::err_drv_invalid_value)
4201 << MSCompatibilityVersion->getAsString(Args)
4202 << MSCompatibilityVersion->getValue();
4203 } else if (MSCVersion) {
4204 unsigned Version = 0;
4205 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4206 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4207 << MSCVersion->getValue();
4208 MSVT = getMSCompatibilityVersion(Version);
4209 } else {
4210 MSVT = VersionTuple(18);
4211 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004212
David Majnemerc371ff02015-03-22 08:39:22 +00004213 CmdArgs.push_back(
4214 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004215 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004216
David Majnemer8db91762015-05-18 04:49:30 +00004217 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4218 if (ImplyVCPPCXXVer) {
4219 if (IsMSVC2015Compatible)
4220 CmdArgs.push_back("-std=c++14");
4221 else
4222 CmdArgs.push_back("-std=c++11");
4223 }
4224
Eric Christopher5ecce122013-02-18 00:38:31 +00004225 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004226 if (Args.hasFlag(options::OPT_fborland_extensions,
4227 options::OPT_fno_borland_extensions, false))
4228 CmdArgs.push_back("-fborland-extensions");
4229
David Majnemerc371ff02015-03-22 08:39:22 +00004230 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4231 // than 19.
4232 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4233 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004234 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004235 CmdArgs.push_back("-fno-threadsafe-statics");
4236
Francois Pichet02744872011-09-01 16:38:08 +00004237 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4238 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004239 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004240 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004241 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004242
Chandler Carruthe03aa552010-04-17 20:17:31 +00004243 // -fgnu-keywords default varies depending on language; only pass if
4244 // specified.
4245 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004246 options::OPT_fno_gnu_keywords))
4247 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004248
Rafael Espindola922a6242011-06-02 17:30:53 +00004249 if (Args.hasFlag(options::OPT_fgnu89_inline,
4250 options::OPT_fno_gnu89_inline,
4251 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004252 CmdArgs.push_back("-fgnu89-inline");
4253
Chad Rosier9c76d242012-03-15 22:31:42 +00004254 if (Args.hasArg(options::OPT_fno_inline))
4255 CmdArgs.push_back("-fno-inline");
4256
Chad Rosier64d6be92012-03-06 21:17:19 +00004257 if (Args.hasArg(options::OPT_fno_inline_functions))
4258 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004259
John McCall5fb5df92012-06-20 06:18:46 +00004260 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004261
John McCall5fb5df92012-06-20 06:18:46 +00004262 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004263 // legacy is the default. Except for deployment taget of 10.5,
4264 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4265 // gets ignored silently.
4266 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004267 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4268 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004269 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004270 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004271 if (getToolChain().UseObjCMixedDispatch())
4272 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4273 else
4274 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4275 }
4276 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004277
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004278 // When ObjectiveC legacy runtime is in effect on MacOSX,
4279 // turn on the option to do Array/Dictionary subscripting
4280 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004281 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004282 getToolChain().getTriple().isMacOSX() &&
4283 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4284 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004285 objcRuntime.isNeXTFamily())
4286 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4287
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004288 // -fencode-extended-block-signature=1 is default.
4289 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4290 CmdArgs.push_back("-fencode-extended-block-signature");
4291 }
4292
John McCall24fc0de2011-07-06 00:26:06 +00004293 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4294 // NOTE: This logic is duplicated in ToolChains.cpp.
4295 bool ARC = isObjCAutoRefCount(Args);
4296 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004297 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004298
John McCall24fc0de2011-07-06 00:26:06 +00004299 CmdArgs.push_back("-fobjc-arc");
4300
Chandler Carruth491db322011-11-04 07:34:47 +00004301 // FIXME: It seems like this entire block, and several around it should be
4302 // wrapped in isObjC, but for now we just use it here as this is where it
4303 // was being used previously.
4304 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4305 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4306 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4307 else
4308 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4309 }
4310
John McCall24fc0de2011-07-06 00:26:06 +00004311 // Allow the user to enable full exceptions code emission.
4312 // We define off for Objective-CC, on for Objective-C++.
4313 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4314 options::OPT_fno_objc_arc_exceptions,
4315 /*default*/ types::isCXX(InputType)))
4316 CmdArgs.push_back("-fobjc-arc-exceptions");
4317 }
4318
4319 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4320 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004321 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004322 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004323
John McCall24fc0de2011-07-06 00:26:06 +00004324 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4325 // takes precedence.
4326 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4327 if (!GCArg)
4328 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4329 if (GCArg) {
4330 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004331 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004332 << GCArg->getAsString(Args);
4333 } else if (getToolChain().SupportsObjCGC()) {
4334 GCArg->render(Args, CmdArgs);
4335 } else {
4336 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004337 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004338 << GCArg->getAsString(Args);
4339 }
4340 }
4341
Bob Wilsonb111ec92015-03-02 19:01:14 +00004342 if (Args.hasFlag(options::OPT_fapplication_extension,
4343 options::OPT_fno_application_extension, false))
4344 CmdArgs.push_back("-fapplication-extension");
4345
Reid Klecknerc542d372014-06-27 17:02:02 +00004346 // Handle GCC-style exception args.
4347 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004348 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004349 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004350
4351 if (getToolChain().UseSjLjExceptions())
4352 CmdArgs.push_back("-fsjlj-exceptions");
4353
4354 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004355 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4356 options::OPT_fno_assume_sane_operator_new))
4357 CmdArgs.push_back("-fno-assume-sane-operator-new");
4358
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004359 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4360 // most platforms.
4361 if (Args.hasFlag(options::OPT_fsized_deallocation,
4362 options::OPT_fno_sized_deallocation, false))
4363 CmdArgs.push_back("-fsized-deallocation");
4364
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004365 // -fconstant-cfstrings is default, and may be subject to argument translation
4366 // on Darwin.
4367 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4368 options::OPT_fno_constant_cfstrings) ||
4369 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4370 options::OPT_mno_constant_cfstrings))
4371 CmdArgs.push_back("-fno-constant-cfstrings");
4372
John Thompsoned4e2952009-11-05 20:14:16 +00004373 // -fshort-wchar default varies depending on platform; only
4374 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004375 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4376 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004377 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004378
Hans Wennborg28c96312013-07-31 23:39:13 +00004379 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004380 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004381 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004382 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004383 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004384
Daniel Dunbar096ed292011-10-05 21:04:55 +00004385 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4386 // -fno-pack-struct doesn't apply to -fpack-struct=.
4387 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004388 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004389 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004390 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004391 } else if (Args.hasFlag(options::OPT_fpack_struct,
4392 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004393 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004394 }
4395
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004396 // Handle -fmax-type-align=N and -fno-type-align
4397 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4398 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4399 if (!SkipMaxTypeAlign) {
4400 std::string MaxTypeAlignStr = "-fmax-type-align=";
4401 MaxTypeAlignStr += A->getValue();
4402 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4403 }
4404 } else if (getToolChain().getTriple().isOSDarwin()) {
4405 if (!SkipMaxTypeAlign) {
4406 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4407 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4408 }
4409 }
4410
Robert Lytton0e076492013-08-13 09:43:10 +00004411 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004412 if (!Args.hasArg(options::OPT_fcommon))
4413 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004414 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004415 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004416
Daniel Dunbard18049a2009-04-07 21:16:11 +00004417 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004418 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004419 CmdArgs.push_back("-fno-common");
4420
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004421 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004422 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004423 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004424 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004425 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004426 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4427
Daniel Dunbar6358d682010-10-15 22:30:42 +00004428 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4429 if (!Args.hasFlag(options::OPT_ffor_scope,
4430 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004431 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004432 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4433
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004434 // -finput_charset=UTF-8 is default. Reject others
4435 if (Arg *inputCharset = Args.getLastArg(
4436 options::OPT_finput_charset_EQ)) {
4437 StringRef value = inputCharset->getValue();
4438 if (value != "UTF-8")
4439 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4440 }
4441
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004442 // -fexec_charset=UTF-8 is default. Reject others
4443 if (Arg *execCharset = Args.getLastArg(
4444 options::OPT_fexec_charset_EQ)) {
4445 StringRef value = execCharset->getValue();
4446 if (value != "UTF-8")
4447 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4448 }
4449
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004450 // -fcaret-diagnostics is default.
4451 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4452 options::OPT_fno_caret_diagnostics, true))
4453 CmdArgs.push_back("-fno-caret-diagnostics");
4454
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004455 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004456 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004457 options::OPT_fno_diagnostics_fixit_info))
4458 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004459
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004460 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004461 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004462 options::OPT_fno_diagnostics_show_option))
4463 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004464
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004465 if (const Arg *A =
4466 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4467 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004468 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004469 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004470
Douglas Gregor643c9222011-05-21 17:07:29 +00004471 if (const Arg *A =
4472 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4473 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004474 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004475 }
4476
Chandler Carruthb6766f02011-03-27 01:50:55 +00004477 if (Arg *A = Args.getLastArg(
4478 options::OPT_fdiagnostics_show_note_include_stack,
4479 options::OPT_fno_diagnostics_show_note_include_stack)) {
4480 if (A->getOption().matches(
4481 options::OPT_fdiagnostics_show_note_include_stack))
4482 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4483 else
4484 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4485 }
4486
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004487 // Color diagnostics are the default, unless the terminal doesn't support
4488 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004489 // Support both clang's -f[no-]color-diagnostics and gcc's
4490 // -f[no-]diagnostics-colors[=never|always|auto].
4491 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004492 for (const auto &Arg : Args) {
4493 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004494 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4495 !O.matches(options::OPT_fdiagnostics_color) &&
4496 !O.matches(options::OPT_fno_color_diagnostics) &&
4497 !O.matches(options::OPT_fno_diagnostics_color) &&
4498 !O.matches(options::OPT_fdiagnostics_color_EQ))
4499 continue;
4500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004501 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004502 if (O.matches(options::OPT_fcolor_diagnostics) ||
4503 O.matches(options::OPT_fdiagnostics_color)) {
4504 ShowColors = Colors_On;
4505 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4506 O.matches(options::OPT_fno_diagnostics_color)) {
4507 ShowColors = Colors_Off;
4508 } else {
4509 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004510 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004511 if (value == "always")
4512 ShowColors = Colors_On;
4513 else if (value == "never")
4514 ShowColors = Colors_Off;
4515 else if (value == "auto")
4516 ShowColors = Colors_Auto;
4517 else
4518 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4519 << ("-fdiagnostics-color=" + value).str();
4520 }
4521 }
4522 if (ShowColors == Colors_On ||
4523 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004524 CmdArgs.push_back("-fcolor-diagnostics");
4525
Nico Rieck7857d462013-09-11 00:38:02 +00004526 if (Args.hasArg(options::OPT_fansi_escape_codes))
4527 CmdArgs.push_back("-fansi-escape-codes");
4528
Daniel Dunbardb097022009-06-08 21:13:54 +00004529 if (!Args.hasFlag(options::OPT_fshow_source_location,
4530 options::OPT_fno_show_source_location))
4531 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004532
Douglas Gregor643c9222011-05-21 17:07:29 +00004533 if (!Args.hasFlag(options::OPT_fshow_column,
4534 options::OPT_fno_show_column,
4535 true))
4536 CmdArgs.push_back("-fno-show-column");
4537
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004538 if (!Args.hasFlag(options::OPT_fspell_checking,
4539 options::OPT_fno_spell_checking))
4540 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004541
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004542
Chad Rosierc8e56e82012-12-05 21:08:21 +00004543 // -fno-asm-blocks is default.
4544 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4545 false))
4546 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004547
Steven Wucb0d13f2015-01-16 23:05:28 +00004548 // -fgnu-inline-asm is default.
4549 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4550 options::OPT_fno_gnu_inline_asm, true))
4551 CmdArgs.push_back("-fno-gnu-inline-asm");
4552
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004553 // Enable vectorization per default according to the optimization level
4554 // selected. For optimization levels that want vectorization we use the alias
4555 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004556 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004557 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004558 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004559 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004560 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004561 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004562
Chad Rosier136d67d2014-04-28 19:30:57 +00004563 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004564 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4565 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004566 options::OPT_fslp_vectorize;
4567 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004568 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004569 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004570
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004571 // -fno-slp-vectorize-aggressive is default.
4572 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004573 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004574 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004575
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004576 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4577 A->render(Args, CmdArgs);
4578
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004579 // -fdollars-in-identifiers default varies depending on platform and
4580 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004581 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004582 options::OPT_fno_dollars_in_identifiers)) {
4583 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004584 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004585 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004586 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004587 }
4588
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004589 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4590 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004591 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004592 options::OPT_fno_unit_at_a_time)) {
4593 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004594 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004595 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004596
Eli Friedman055c9702011-11-02 01:53:16 +00004597 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4598 options::OPT_fno_apple_pragma_pack, false))
4599 CmdArgs.push_back("-fapple-pragma-pack");
4600
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004601 // le32-specific flags:
4602 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4603 // by default.
4604 if (getToolChain().getArch() == llvm::Triple::le32) {
4605 CmdArgs.push_back("-fno-math-builtin");
4606 }
4607
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004608 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004609 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004610 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004611#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004612 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004613 (getToolChain().getArch() == llvm::Triple::arm ||
4614 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004615 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4616 CmdArgs.push_back("-fno-builtin-strcat");
4617 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4618 CmdArgs.push_back("-fno-builtin-strcpy");
4619 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004620#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004621
Justin Bognera88f0122014-06-20 22:59:50 +00004622 // Enable rewrite includes if the user's asked for it or if we're generating
4623 // diagnostics.
4624 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4625 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004626 if (Args.hasFlag(options::OPT_frewrite_includes,
4627 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004628 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004629 CmdArgs.push_back("-frewrite-includes");
4630
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004631 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004632 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004633 options::OPT_traditional_cpp)) {
4634 if (isa<PreprocessJobAction>(JA))
4635 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004636 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004637 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004638 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004639
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004640 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004641 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004642
4643 // Handle serialized diagnostics.
4644 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4645 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004646 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004647 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004648
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004649 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4650 CmdArgs.push_back("-fretain-comments-from-system-headers");
4651
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004652 // Forward -fcomment-block-commands to -cc1.
4653 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004654 // Forward -fparse-all-comments to -cc1.
4655 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004656
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004657 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4658 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004659 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004660 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004661 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4662 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004663 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004664
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004665 // We translate this by hand to the -cc1 argument, since nightly test uses
4666 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004667 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004668 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004669 OptDisabled = true;
4670 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004671 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004672 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004673
Bob Wilson23a55f12014-12-21 07:00:00 +00004674 // With -save-temps, we want to save the unoptimized bitcode output from the
4675 // CompileJobAction, so disable optimizations if they are not already
4676 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004677 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004678 isa<CompileJobAction>(JA))
4679 CmdArgs.push_back("-disable-llvm-optzns");
4680
Daniel Dunbard67a3222009-03-30 06:36:42 +00004681 if (Output.getType() == types::TY_Dependencies) {
4682 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004683 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004684 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004685 CmdArgs.push_back(Output.getFilename());
4686 } else {
4687 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004688 }
4689
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004690 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004691 addDashXForInput(Args, II, CmdArgs);
4692
Daniel Dunbarb440f562010-08-02 02:38:21 +00004693 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004694 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004695 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004696 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004697 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004698
Chris Lattnere9d7d782009-11-03 19:50:27 +00004699 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4700
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004701 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004702
4703 // Optionally embed the -cc1 level arguments into the debug info, for build
4704 // analysis.
4705 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004706 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004707 for (const auto &Arg : Args)
4708 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004709
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004710 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004711 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004712 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004713 SmallString<128> EscapedArg;
4714 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004715 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004716 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004717 }
4718 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004719 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004720 }
4721
Eric Christopherd3804002013-02-22 20:12:52 +00004722 // Add the split debug info name to the command lines here so we
4723 // can propagate it to the backend.
4724 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004725 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004726 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4727 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004728 const char *SplitDwarfOut;
4729 if (SplitDwarf) {
4730 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004731 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004732 CmdArgs.push_back(SplitDwarfOut);
4733 }
4734
4735 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004736 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004737 Output.getType() == types::TY_Object &&
4738 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004739 auto CLCommand =
4740 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4741 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4742 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004743 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004744 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004745 }
4746
Daniel Dunbar17731772009-03-23 19:03:36 +00004747
Eric Christopherf1545832013-02-22 23:50:16 +00004748 // Handle the debug info splitting at object creation time if we're
4749 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004750 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004751 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004752 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004753
Roman Divacky178e01602011-02-10 16:52:03 +00004754 if (Arg *A = Args.getLastArg(options::OPT_pg))
4755 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004756 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004757 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004758
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004759 // Claim some arguments which clang supports automatically.
4760
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004761 // -fpch-preprocess is used with gcc to add a special marker in the output to
4762 // include the PCH file. Clang's PTH solution is completely transparent, so we
4763 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004764 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004765
Daniel Dunbar17731772009-03-23 19:03:36 +00004766 // Claim some arguments which clang doesn't support, but we don't
4767 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004768 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4769 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004770
Rafael Espindolab0092d72013-09-04 19:37:35 +00004771 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004772 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004773}
4774
John McCall5fb5df92012-06-20 06:18:46 +00004775/// Add options related to the Objective-C runtime/ABI.
4776///
4777/// Returns true if the runtime is non-fragile.
4778ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4779 ArgStringList &cmdArgs,
4780 RewriteKind rewriteKind) const {
4781 // Look for the controlling runtime option.
4782 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4783 options::OPT_fgnu_runtime,
4784 options::OPT_fobjc_runtime_EQ);
4785
4786 // Just forward -fobjc-runtime= to the frontend. This supercedes
4787 // options about fragility.
4788 if (runtimeArg &&
4789 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4790 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004791 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004792 if (runtime.tryParse(value)) {
4793 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4794 << value;
4795 }
4796
4797 runtimeArg->render(args, cmdArgs);
4798 return runtime;
4799 }
4800
4801 // Otherwise, we'll need the ABI "version". Version numbers are
4802 // slightly confusing for historical reasons:
4803 // 1 - Traditional "fragile" ABI
4804 // 2 - Non-fragile ABI, version 1
4805 // 3 - Non-fragile ABI, version 2
4806 unsigned objcABIVersion = 1;
4807 // If -fobjc-abi-version= is present, use that to set the version.
4808 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004809 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004810 if (value == "1")
4811 objcABIVersion = 1;
4812 else if (value == "2")
4813 objcABIVersion = 2;
4814 else if (value == "3")
4815 objcABIVersion = 3;
4816 else
4817 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4818 << value;
4819 } else {
4820 // Otherwise, determine if we are using the non-fragile ABI.
4821 bool nonFragileABIIsDefault =
4822 (rewriteKind == RK_NonFragile ||
4823 (rewriteKind == RK_None &&
4824 getToolChain().IsObjCNonFragileABIDefault()));
4825 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4826 options::OPT_fno_objc_nonfragile_abi,
4827 nonFragileABIIsDefault)) {
4828 // Determine the non-fragile ABI version to use.
4829#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4830 unsigned nonFragileABIVersion = 1;
4831#else
4832 unsigned nonFragileABIVersion = 2;
4833#endif
4834
4835 if (Arg *abiArg = args.getLastArg(
4836 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004837 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004838 if (value == "1")
4839 nonFragileABIVersion = 1;
4840 else if (value == "2")
4841 nonFragileABIVersion = 2;
4842 else
4843 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4844 << value;
4845 }
4846
4847 objcABIVersion = 1 + nonFragileABIVersion;
4848 } else {
4849 objcABIVersion = 1;
4850 }
4851 }
4852
4853 // We don't actually care about the ABI version other than whether
4854 // it's non-fragile.
4855 bool isNonFragile = objcABIVersion != 1;
4856
4857 // If we have no runtime argument, ask the toolchain for its default runtime.
4858 // However, the rewriter only really supports the Mac runtime, so assume that.
4859 ObjCRuntime runtime;
4860 if (!runtimeArg) {
4861 switch (rewriteKind) {
4862 case RK_None:
4863 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4864 break;
4865 case RK_Fragile:
4866 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4867 break;
4868 case RK_NonFragile:
4869 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4870 break;
4871 }
4872
4873 // -fnext-runtime
4874 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4875 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004876 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004877 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4878
4879 // Otherwise, build for a generic macosx port.
4880 } else {
4881 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4882 }
4883
4884 // -fgnu-runtime
4885 } else {
4886 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004887 // Legacy behaviour is to target the gnustep runtime if we are i
4888 // non-fragile mode or the GCC runtime in fragile mode.
4889 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004890 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004891 else
4892 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004893 }
4894
4895 cmdArgs.push_back(args.MakeArgString(
4896 "-fobjc-runtime=" + runtime.getAsString()));
4897 return runtime;
4898}
4899
Reid Klecknerc542d372014-06-27 17:02:02 +00004900static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4901 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4902 I += HaveDash;
4903 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004904}
Reid Klecknerc542d372014-06-27 17:02:02 +00004905
4906struct EHFlags {
4907 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4908 bool Synch;
4909 bool Asynch;
4910 bool NoExceptC;
4911};
4912
4913/// /EH controls whether to run destructor cleanups when exceptions are
4914/// thrown. There are three modifiers:
4915/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4916/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4917/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4918/// - c: Assume that extern "C" functions are implicitly noexcept. This
4919/// modifier is an optimization, so we ignore it for now.
4920/// The default is /EHs-c-, meaning cleanups are disabled.
4921static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4922 EHFlags EH;
4923 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4924 for (auto EHVal : EHArgs) {
4925 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4926 switch (EHVal[I]) {
4927 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4928 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4929 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4930 default: break;
4931 }
4932 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4933 break;
4934 }
4935 }
4936 return EH;
4937}
4938
Hans Wennborg75958c42013-08-08 00:17:41 +00004939void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4940 unsigned RTOptionID = options::OPT__SLASH_MT;
4941
Hans Wennborgf1a74252013-09-10 20:18:04 +00004942 if (Args.hasArg(options::OPT__SLASH_LDd))
4943 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4944 // but defining _DEBUG is sticky.
4945 RTOptionID = options::OPT__SLASH_MTd;
4946
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004947 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004948 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004949
Hans Wennborg75958c42013-08-08 00:17:41 +00004950 switch(RTOptionID) {
4951 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004952 if (Args.hasArg(options::OPT__SLASH_LDd))
4953 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004954 CmdArgs.push_back("-D_MT");
4955 CmdArgs.push_back("-D_DLL");
4956 CmdArgs.push_back("--dependent-lib=msvcrt");
4957 break;
4958 case options::OPT__SLASH_MDd:
4959 CmdArgs.push_back("-D_DEBUG");
4960 CmdArgs.push_back("-D_MT");
4961 CmdArgs.push_back("-D_DLL");
4962 CmdArgs.push_back("--dependent-lib=msvcrtd");
4963 break;
4964 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004965 if (Args.hasArg(options::OPT__SLASH_LDd))
4966 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004967 CmdArgs.push_back("-D_MT");
4968 CmdArgs.push_back("--dependent-lib=libcmt");
4969 break;
4970 case options::OPT__SLASH_MTd:
4971 CmdArgs.push_back("-D_DEBUG");
4972 CmdArgs.push_back("-D_MT");
4973 CmdArgs.push_back("--dependent-lib=libcmtd");
4974 break;
4975 default:
4976 llvm_unreachable("Unexpected option ID.");
4977 }
4978
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004979 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4980 // users want. The /Za flag to cl.exe turns this off, but it's not
4981 // implemented in clang.
4982 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004983
Hans Wennborg8858a032014-07-21 23:42:07 +00004984 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4985 // would produce interleaved output, so ignore /showIncludes in such cases.
4986 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4987 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4988 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004989
David Majnemerf6072342014-07-01 22:24:56 +00004990 // This controls whether or not we emit RTTI data for polymorphic types.
4991 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4992 /*default=*/false))
4993 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004994
Reid Klecknerc542d372014-06-27 17:02:02 +00004995 const Driver &D = getToolChain().getDriver();
4996 EHFlags EH = parseClangCLEHFlags(D, Args);
4997 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00004998 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00004999 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005000 CmdArgs.push_back("-fexceptions");
5001 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005002
Hans Wennborge50cec32014-06-13 20:59:54 +00005003 // /EP should expand to -E -P.
5004 if (Args.hasArg(options::OPT__SLASH_EP)) {
5005 CmdArgs.push_back("-E");
5006 CmdArgs.push_back("-P");
5007 }
5008
David Majnemera5b195a2015-02-14 01:35:12 +00005009 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005010 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5011 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005012 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5013 else
5014 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5015
5016 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5017 VolatileOptionID = A->getOption().getID();
5018
5019 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5020 CmdArgs.push_back("-fms-volatile");
5021
David Majnemer86c318f2014-02-11 21:05:00 +00005022 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5023 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5024 if (MostGeneralArg && BestCaseArg)
5025 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5026 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5027
5028 if (MostGeneralArg) {
5029 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5030 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5031 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5032
5033 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5034 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5035 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5036 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5037 << FirstConflict->getAsString(Args)
5038 << SecondConflict->getAsString(Args);
5039
5040 if (SingleArg)
5041 CmdArgs.push_back("-fms-memptr-rep=single");
5042 else if (MultipleArg)
5043 CmdArgs.push_back("-fms-memptr-rep=multiple");
5044 else
5045 CmdArgs.push_back("-fms-memptr-rep=virtual");
5046 }
5047
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005048 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5049 A->render(Args, CmdArgs);
5050
Hans Wennborg81f74482013-09-10 01:07:07 +00005051 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5052 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005053 if (Args.hasArg(options::OPT__SLASH_fallback))
5054 CmdArgs.push_back("msvc-fallback");
5055 else
5056 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005057 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005058}
5059
Hans Wennborg1da044a2014-06-26 19:59:02 +00005060visualstudio::Compile *Clang::getCLFallback() const {
5061 if (!CLFallback)
5062 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5063 return CLFallback.get();
5064}
5065
Daniel Sanders7f933f42015-01-30 17:35:23 +00005066void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5067 ArgStringList &CmdArgs) const {
5068 StringRef CPUName;
5069 StringRef ABIName;
5070 const llvm::Triple &Triple = getToolChain().getTriple();
5071 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5072
5073 CmdArgs.push_back("-target-abi");
5074 CmdArgs.push_back(ABIName.data());
5075}
5076
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005077void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005078 const InputInfo &Output,
5079 const InputInfoList &Inputs,
5080 const ArgList &Args,
5081 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005082 ArgStringList CmdArgs;
5083
5084 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5085 const InputInfo &Input = Inputs[0];
5086
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005087 // Don't warn about "clang -w -c foo.s"
5088 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005089 // and "clang -emit-llvm -c foo.s"
5090 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005091
Rafael Espindola577637a2015-01-03 00:06:04 +00005092 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005093
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005094 // Invoke ourselves in -cc1as mode.
5095 //
5096 // FIXME: Implement custom jobs for internal actions.
5097 CmdArgs.push_back("-cc1as");
5098
5099 // Add the "effective" target triple.
5100 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005101 std::string TripleStr =
5102 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005103 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5104
5105 // Set the output mode, we currently only expect to be used as a real
5106 // assembler.
5107 CmdArgs.push_back("-filetype");
5108 CmdArgs.push_back("obj");
5109
Eric Christopher45f2e712012-12-18 00:31:10 +00005110 // Set the main file name, so that debug info works even with
5111 // -save-temps or preprocessed assembly.
5112 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005113 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005114
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005115 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005116 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005117 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005118 if (!CPU.empty()) {
5119 CmdArgs.push_back("-target-cpu");
5120 CmdArgs.push_back(Args.MakeArgString(CPU));
5121 }
5122
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005123 // Add the target features
5124 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005125 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005126
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005127 // Ignore explicit -force_cpusubtype_ALL option.
5128 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005129
Eric Christopherfc3ee562012-01-10 00:38:01 +00005130 // Determine the original source input.
5131 const Action *SourceAction = &JA;
5132 while (SourceAction->getKind() != Action::InputClass) {
5133 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5134 SourceAction = SourceAction->getInputs()[0];
5135 }
5136
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005137 // Forward -g and handle debug info related flags, assuming we are dealing
5138 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005139 if (SourceAction->getType() == types::TY_Asm ||
5140 SourceAction->getType() == types::TY_PP_Asm) {
5141 Args.ClaimAllArgs(options::OPT_g_Group);
5142 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5143 if (!A->getOption().matches(options::OPT_g0))
5144 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005145
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005146 if (Args.hasArg(options::OPT_gdwarf_2))
5147 CmdArgs.push_back("-gdwarf-2");
5148 if (Args.hasArg(options::OPT_gdwarf_3))
5149 CmdArgs.push_back("-gdwarf-3");
5150 if (Args.hasArg(options::OPT_gdwarf_4))
5151 CmdArgs.push_back("-gdwarf-4");
5152
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005153 // Add the -fdebug-compilation-dir flag if needed.
5154 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005155
5156 // Set the AT_producer to the clang version when using the integrated
5157 // assembler on assembly source files.
5158 CmdArgs.push_back("-dwarf-debug-producer");
5159 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005160 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005161
5162 // Optionally embed the -cc1as level arguments into the debug info, for build
5163 // analysis.
5164 if (getToolChain().UseDwarfDebugFlags()) {
5165 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005166 for (const auto &Arg : Args)
5167 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005168
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005169 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005170 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5171 Flags += Exec;
5172 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005173 SmallString<128> EscapedArg;
5174 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005175 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005176 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005177 }
5178 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005179 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005180 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005181
5182 // FIXME: Add -static support, once we have it.
5183
Daniel Sanders7f933f42015-01-30 17:35:23 +00005184 // Add target specific flags.
5185 switch(getToolChain().getArch()) {
5186 default:
5187 break;
5188
5189 case llvm::Triple::mips:
5190 case llvm::Triple::mipsel:
5191 case llvm::Triple::mips64:
5192 case llvm::Triple::mips64el:
5193 AddMIPSTargetArgs(Args, CmdArgs);
5194 break;
5195 }
5196
David Blaikie372d9502014-01-17 03:17:40 +00005197 // Consume all the warning flags. Usually this would be handled more
5198 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5199 // doesn't handle that so rather than warning about unused flags that are
5200 // actually used, we'll lie by omission instead.
5201 // FIXME: Stop lying and consume only the appropriate driver flags
5202 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5203 ie = Args.filtered_end();
5204 it != ie; ++it)
5205 (*it)->claim();
5206
David Blaikie9260ed62013-07-25 21:19:01 +00005207 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5208 getToolChain().getDriver());
5209
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005210 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005211
5212 assert(Output.isFilename() && "Unexpected lipo output.");
5213 CmdArgs.push_back("-o");
5214 CmdArgs.push_back(Output.getFilename());
5215
Daniel Dunbarb440f562010-08-02 02:38:21 +00005216 assert(Input.isFilename() && "Invalid input.");
5217 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005218
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005219 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005221
5222 // Handle the debug info splitting at object creation time if we're
5223 // creating an object.
5224 // TODO: Currently only works on linux with newer objcopy.
5225 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005226 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005227 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005228 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005229}
5230
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005231void GnuTool::anchor() {}
5232
Daniel Dunbara3246a02009-03-18 08:07:30 +00005233void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005234 const InputInfo &Output,
5235 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005236 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005237 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005238 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005239 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005240
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005241 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005242 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005243 // Don't forward any -g arguments to assembly steps.
5244 if (isa<AssembleJobAction>(JA) &&
5245 A->getOption().matches(options::OPT_g_Group))
5246 continue;
5247
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005248 // Don't forward any -W arguments to assembly and link steps.
5249 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5250 A->getOption().matches(options::OPT_W_Group))
5251 continue;
5252
Daniel Dunbar2da02722009-03-19 07:55:12 +00005253 // It is unfortunate that we have to claim here, as this means
5254 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005255 // platforms using a generic gcc, even if we are just using gcc
5256 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005257 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005258 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005259 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005260 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005261
Daniel Dunbar4e295052010-01-25 22:35:08 +00005262 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005263
5264 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005265 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005266 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005267 CmdArgs.push_back(
5268 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005269 }
5270
Daniel Dunbar5716d872009-05-02 21:41:52 +00005271 // Try to force gcc to match the tool chain we want, if we recognize
5272 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005273 //
5274 // FIXME: The triple class should directly provide the information we want
5275 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005276 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005277 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005278 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005279 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5280 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005281 CmdArgs.push_back("-m64");
5282
Daniel Dunbarb440f562010-08-02 02:38:21 +00005283 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005284 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005285 CmdArgs.push_back(Output.getFilename());
5286 } else {
5287 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005288 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005289 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005290
Tony Linthicum76329bf2011-12-12 21:14:55 +00005291 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5292 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005293
5294 // Only pass -x if gcc will understand it; otherwise hope gcc
5295 // understands the suffix correctly. The main use case this would go
5296 // wrong in is for linker inputs if they happened to have an odd
5297 // suffix; really the only way to get this to happen is a command
5298 // like '-x foobar a.c' which will treat a.c like a linker input.
5299 //
5300 // FIXME: For the linker case specifically, can we safely convert
5301 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005302 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005303 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005304 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5305 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005306 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005307 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005308 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005309 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005310 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005311 else if (II.getType() == types::TY_ModuleFile)
5312 D.Diag(diag::err_drv_no_module_support)
5313 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005314
Daniel Dunbara3246a02009-03-18 08:07:30 +00005315 if (types::canTypeBeUserSpecified(II.getType())) {
5316 CmdArgs.push_back("-x");
5317 CmdArgs.push_back(types::getTypeName(II.getType()));
5318 }
5319
Daniel Dunbarb440f562010-08-02 02:38:21 +00005320 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005321 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005322 else {
5323 const Arg &A = II.getInputArg();
5324
5325 // Reverse translate some rewritten options.
5326 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5327 CmdArgs.push_back("-lstdc++");
5328 continue;
5329 }
5330
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005331 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005332 A.render(Args, CmdArgs);
5333 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005334 }
5335
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005336 const std::string customGCCName = D.getCCCGenericGCCName();
5337 const char *GCCName;
5338 if (!customGCCName.empty())
5339 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005340 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005341 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005342 } else
5343 GCCName = "gcc";
5344
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005345 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005346 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005347 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005348}
5349
Daniel Dunbar4e295052010-01-25 22:35:08 +00005350void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5351 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005352 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005353}
5354
Daniel Dunbar4e295052010-01-25 22:35:08 +00005355void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5356 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005357 const Driver &D = getToolChain().getDriver();
5358
Eric Christophercc7ff502015-01-29 00:56:17 +00005359 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005360 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005361 case types::TY_LLVM_IR:
5362 case types::TY_LTO_IR:
5363 case types::TY_LLVM_BC:
5364 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005365 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005366 break;
5367 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005368 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005369 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005370 case types::TY_Nothing:
5371 CmdArgs.push_back("-fsyntax-only");
5372 break;
5373 default:
5374 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005375 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005376}
5377
Daniel Dunbar4e295052010-01-25 22:35:08 +00005378void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5379 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005380 // The types are (hopefully) good enough.
5381}
5382
Tony Linthicum76329bf2011-12-12 21:14:55 +00005383// Hexagon tools start.
5384void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5385 ArgStringList &CmdArgs) const {
5386
5387}
5388void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5389 const InputInfo &Output,
5390 const InputInfoList &Inputs,
5391 const ArgList &Args,
5392 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005393 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005394
5395 const Driver &D = getToolChain().getDriver();
5396 ArgStringList CmdArgs;
5397
5398 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005399 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005400 CmdArgs.push_back(Args.MakeArgString(MarchString));
5401
5402 RenderExtraToolArgs(JA, CmdArgs);
5403
5404 if (Output.isFilename()) {
5405 CmdArgs.push_back("-o");
5406 CmdArgs.push_back(Output.getFilename());
5407 } else {
5408 assert(Output.isNothing() && "Unexpected output");
5409 CmdArgs.push_back("-fsyntax-only");
5410 }
5411
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005412 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
5413 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005414
Matthew Curtise5df3812012-12-07 17:23:04 +00005415 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5416 options::OPT_Xassembler);
5417
Tony Linthicum76329bf2011-12-12 21:14:55 +00005418 // Only pass -x if gcc will understand it; otherwise hope gcc
5419 // understands the suffix correctly. The main use case this would go
5420 // wrong in is for linker inputs if they happened to have an odd
5421 // suffix; really the only way to get this to happen is a command
5422 // like '-x foobar a.c' which will treat a.c like a linker input.
5423 //
5424 // FIXME: For the linker case specifically, can we safely convert
5425 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005426 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005427 // Don't try to pass LLVM or AST inputs to a generic gcc.
5428 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5429 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5430 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5431 << getToolChain().getTripleString();
5432 else if (II.getType() == types::TY_AST)
5433 D.Diag(clang::diag::err_drv_no_ast_support)
5434 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005435 else if (II.getType() == types::TY_ModuleFile)
5436 D.Diag(diag::err_drv_no_module_support)
5437 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005438
5439 if (II.isFilename())
5440 CmdArgs.push_back(II.getFilename());
5441 else
5442 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5443 II.getInputArg().render(Args, CmdArgs);
5444 }
5445
5446 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005447 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005448 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005449}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005450
Tony Linthicum76329bf2011-12-12 21:14:55 +00005451void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5452 ArgStringList &CmdArgs) const {
5453 // The types are (hopefully) good enough.
5454}
5455
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005456static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5457 const toolchains::Hexagon_TC& ToolChain,
5458 const InputInfo &Output,
5459 const InputInfoList &Inputs,
5460 const ArgList &Args,
5461 ArgStringList &CmdArgs,
5462 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005463
Matthew Curtise689b052012-12-06 15:46:07 +00005464 const Driver &D = ToolChain.getDriver();
5465
Tony Linthicum76329bf2011-12-12 21:14:55 +00005466
Matthew Curtise689b052012-12-06 15:46:07 +00005467 //----------------------------------------------------------------------------
5468 //
5469 //----------------------------------------------------------------------------
5470 bool hasStaticArg = Args.hasArg(options::OPT_static);
5471 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005472 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005473 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5474 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5475 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005476 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005477 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005478
Matthew Curtise689b052012-12-06 15:46:07 +00005479 //----------------------------------------------------------------------------
5480 // Silence warnings for various options
5481 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005482
Matthew Curtise689b052012-12-06 15:46:07 +00005483 Args.ClaimAllArgs(options::OPT_g_Group);
5484 Args.ClaimAllArgs(options::OPT_emit_llvm);
5485 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5486 // handled somewhere else.
5487 Args.ClaimAllArgs(options::OPT_static_libgcc);
5488
5489 //----------------------------------------------------------------------------
5490 //
5491 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005492 for (const auto &Opt : ToolChain.ExtraOpts)
5493 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005494
Matthew Curtisf10a5952012-12-06 14:16:43 +00005495 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5496 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005497
Matthew Curtise689b052012-12-06 15:46:07 +00005498 if (buildingLib) {
5499 CmdArgs.push_back("-shared");
5500 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5501 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005502 }
5503
Matthew Curtise689b052012-12-06 15:46:07 +00005504 if (hasStaticArg)
5505 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005506
Matthew Curtise8f80a12012-12-06 17:49:03 +00005507 if (buildPIE && !buildingLib)
5508 CmdArgs.push_back("-pie");
5509
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005510 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
5511 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5512 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005513 }
5514
Matthew Curtise689b052012-12-06 15:46:07 +00005515 //----------------------------------------------------------------------------
5516 //
5517 //----------------------------------------------------------------------------
5518 CmdArgs.push_back("-o");
5519 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005520
Matthew Curtise689b052012-12-06 15:46:07 +00005521 const std::string MarchSuffix = "/" + MarchString;
5522 const std::string G0Suffix = "/G0";
5523 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005524 const std::string RootDir =
5525 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005526 const std::string StartFilesDir = RootDir
5527 + "hexagon/lib"
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005528 + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005529
5530 //----------------------------------------------------------------------------
5531 // moslib
5532 //----------------------------------------------------------------------------
5533 std::vector<std::string> oslibs;
5534 bool hasStandalone= false;
5535
5536 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5537 ie = Args.filtered_end(); it != ie; ++it) {
5538 (*it)->claim();
Benjamin Kramer3204b152015-05-29 19:42:19 +00005539 oslibs.emplace_back((*it)->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005540 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005541 }
Matthew Curtise689b052012-12-06 15:46:07 +00005542 if (oslibs.empty()) {
5543 oslibs.push_back("standalone");
5544 hasStandalone = true;
5545 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005546
Matthew Curtise689b052012-12-06 15:46:07 +00005547 //----------------------------------------------------------------------------
5548 // Start Files
5549 //----------------------------------------------------------------------------
5550 if (incStdLib && incStartFiles) {
5551
5552 if (!buildingLib) {
5553 if (hasStandalone) {
5554 CmdArgs.push_back(
5555 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5556 }
5557 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5558 }
5559 std::string initObj = useShared ? "/initS.o" : "/init.o";
5560 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5561 }
5562
5563 //----------------------------------------------------------------------------
5564 // Library Search Paths
5565 //----------------------------------------------------------------------------
5566 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005567 for (const auto &LibPath : LibPaths)
5568 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005569
5570 //----------------------------------------------------------------------------
5571 //
5572 //----------------------------------------------------------------------------
5573 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5574 Args.AddAllArgs(CmdArgs, options::OPT_e);
5575 Args.AddAllArgs(CmdArgs, options::OPT_s);
5576 Args.AddAllArgs(CmdArgs, options::OPT_t);
5577 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5578
5579 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5580
5581 //----------------------------------------------------------------------------
5582 // Libraries
5583 //----------------------------------------------------------------------------
5584 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005585 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005586 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5587 CmdArgs.push_back("-lm");
5588 }
5589
5590 CmdArgs.push_back("--start-group");
5591
5592 if (!buildingLib) {
5593 for(std::vector<std::string>::iterator i = oslibs.begin(),
5594 e = oslibs.end(); i != e; ++i)
5595 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5596 CmdArgs.push_back("-lc");
5597 }
5598 CmdArgs.push_back("-lgcc");
5599
5600 CmdArgs.push_back("--end-group");
5601 }
5602
5603 //----------------------------------------------------------------------------
5604 // End files
5605 //----------------------------------------------------------------------------
5606 if (incStdLib && incStartFiles) {
5607 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5608 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5609 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005610}
5611
5612void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5613 const InputInfo &Output,
5614 const InputInfoList &Inputs,
5615 const ArgList &Args,
5616 const char *LinkingOutput) const {
5617
5618 const toolchains::Hexagon_TC& ToolChain =
5619 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5620
5621 ArgStringList CmdArgs;
5622 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5623 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005624
5625 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005626 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5627 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005628}
5629// Hexagon tools end.
5630
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005631const StringRef arm::getARMArch(const ArgList &Args,
5632 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005633 StringRef MArch;
5634 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5635 // Otherwise, if we have -march= choose the base CPU for that arch.
5636 MArch = A->getValue();
5637 } else {
5638 // Otherwise, use the Arch from the triple.
5639 MArch = Triple.getArchName();
5640 }
John Brawn94fd9632015-05-21 12:19:49 +00005641
5642 // Handle -march=native.
5643 if (MArch == "native") {
5644 std::string CPU = llvm::sys::getHostCPUName();
5645 if (CPU != "generic") {
5646 // Translate the native cpu into the architecture suffix for that CPU.
5647 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5648 // If there is no valid architecture suffix for this CPU we don't know how
5649 // to handle it, so return no architecture.
5650 if (strcmp(Suffix,"") == 0)
5651 MArch = "";
5652 else
5653 MArch = std::string("arm") + Suffix;
5654 }
5655 }
5656
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005657 return MArch;
5658}
5659/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5660const char *arm::getARMCPUForMArch(const ArgList &Args,
5661 const llvm::Triple &Triple) {
5662 StringRef MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005663 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5664 // here means an -march=native that we can't handle, so instead return no CPU.
5665 if (MArch.empty())
5666 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005667
John Brawna95c1a82015-05-08 12:52:18 +00005668 // We need to return an empty string here on invalid MArch values as the
5669 // various places that call this function can't cope with a null result.
5670 const char *result = Triple.getARMCPUForArch(MArch);
5671 if (result)
5672 return result;
5673 else
5674 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005675}
5676
5677/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Gabor Ballabas208826c2015-06-04 17:56:32 +00005678std::string arm::getARMTargetCPU(const ArgList &Args,
Rafael Espindola80d333b2013-12-12 15:48:19 +00005679 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005680 // FIXME: Warn on inconsistent use of -mcpu and -march.
5681 // If we have -mcpu=, use that.
5682 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +00005683 std::string MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005684 // Handle -mcpu=native.
5685 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005686 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005687 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005688 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005689 }
5690
5691 return getARMCPUForMArch(Args, Triple);
5692}
5693
5694/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005695/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005696// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005697const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005698 if (CPU == "generic" &&
5699 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5700 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005701
Renato Golin3c007252015-05-28 15:05:53 +00005702 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5703 if (ArchKind == llvm::ARM::AK_INVALID)
5704 return "";
5705 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005706}
5707
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005708void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
5709 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005710 if (Args.hasArg(options::OPT_r))
5711 return;
5712
John Brawn94fd9632015-05-21 12:19:49 +00005713 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5714 // to generate BE-8 executables.
5715 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5716 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005717}
5718
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005719mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5720 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5721 .Case("mips1", NanLegacy)
5722 .Case("mips2", NanLegacy)
5723 .Case("mips3", NanLegacy)
5724 .Case("mips4", NanLegacy)
5725 .Case("mips5", NanLegacy)
5726 .Case("mips32", NanLegacy)
5727 .Case("mips32r2", NanLegacy)
5728 .Case("mips32r3", NanLegacy | Nan2008)
5729 .Case("mips32r5", NanLegacy | Nan2008)
5730 .Case("mips32r6", Nan2008)
5731 .Case("mips64", NanLegacy)
5732 .Case("mips64r2", NanLegacy)
5733 .Case("mips64r3", NanLegacy | Nan2008)
5734 .Case("mips64r5", NanLegacy | Nan2008)
5735 .Case("mips64r6", Nan2008)
5736 .Default(NanLegacy);
5737}
5738
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005739bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5740 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5741 return A && (A->getValue() == StringRef(Value));
5742}
5743
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005744bool mips::isUCLibc(const ArgList &Args) {
5745 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005746 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005747}
5748
Daniel Sanders2bf13662014-07-10 14:40:57 +00005749bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005750 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5751 return llvm::StringSwitch<bool>(NaNArg->getValue())
5752 .Case("2008", true)
5753 .Case("legacy", false)
5754 .Default(false);
5755
5756 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005757 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5758 .Cases("mips32r6", "mips64r6", true)
5759 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005760
5761 return false;
5762}
5763
Daniel Sanders379d44b2014-07-16 11:52:23 +00005764bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5765 StringRef ABIName) {
5766 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005767 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005768 return false;
5769
5770 if (ABIName != "32")
5771 return false;
5772
5773 return llvm::StringSwitch<bool>(CPUName)
5774 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005775 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5776 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005777 .Default(false);
5778}
5779
Tim Northover157d9112014-01-16 08:48:16 +00005780llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005781 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5782 // archs which Darwin doesn't use.
5783
5784 // The matching this routine does is fairly pointless, since it is neither the
5785 // complete architecture list, nor a reasonable subset. The problem is that
5786 // historically the driver driver accepts this and also ties its -march=
5787 // handling to the architecture name, so we need to be careful before removing
5788 // support for it.
5789
5790 // This code must be kept in sync with Clang's Darwin specific argument
5791 // translation.
5792
5793 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5794 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5795 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5796 .Case("ppc64", llvm::Triple::ppc64)
5797 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5798 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5799 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005800 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005801 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005802 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005803 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005804 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005805 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005806 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005807 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005808 .Case("nvptx", llvm::Triple::nvptx)
5809 .Case("nvptx64", llvm::Triple::nvptx64)
5810 .Case("amdil", llvm::Triple::amdil)
5811 .Case("spir", llvm::Triple::spir)
5812 .Default(llvm::Triple::UnknownArch);
5813}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005814
Tim Northover157d9112014-01-16 08:48:16 +00005815void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005816 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00005817 T.setArch(Arch);
5818
5819 if (Str == "x86_64h")
5820 T.setArchName(Str);
5821 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5822 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005823 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005824 }
5825}
5826
Bob Wilsondecc03e2012-11-23 06:14:39 +00005827const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005828 const InputInfo &Input) {
5829 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005830}
5831
Bob Wilsondecc03e2012-11-23 06:14:39 +00005832const char *Clang::getBaseInputStem(const ArgList &Args,
5833 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005834 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005835
Chris Lattner906bb902011-01-16 08:14:11 +00005836 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005837 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005838
5839 return Str;
5840}
5841
Bob Wilsondecc03e2012-11-23 06:14:39 +00005842const char *Clang::getDependencyFileName(const ArgList &Args,
5843 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005844 // FIXME: Think about this more.
5845 std::string Res;
5846
5847 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005848 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005849 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005850 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005851 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005852 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005853 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005854}
5855
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005856void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5857 const InputInfo &Output,
5858 const InputInfoList &Inputs,
5859 const ArgList &Args,
5860 const char *LinkingOutput) const {
5861 const ToolChain &ToolChain = getToolChain();
5862 const Driver &D = ToolChain.getDriver();
5863 ArgStringList CmdArgs;
5864
5865 // Silence warning for "clang -g foo.o -o foo"
5866 Args.ClaimAllArgs(options::OPT_g_Group);
5867 // and "clang -emit-llvm foo.o -o foo"
5868 Args.ClaimAllArgs(options::OPT_emit_llvm);
5869 // and for "clang -w foo.o -o foo". Other warning options are already
5870 // handled somewhere else.
5871 Args.ClaimAllArgs(options::OPT_w);
5872
5873 if (!D.SysRoot.empty())
5874 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5875
5876 // CloudABI only supports static linkage.
5877 CmdArgs.push_back("-Bstatic");
5878 CmdArgs.push_back("--eh-frame-hdr");
5879 CmdArgs.push_back("--gc-sections");
5880
5881 if (Output.isFilename()) {
5882 CmdArgs.push_back("-o");
5883 CmdArgs.push_back(Output.getFilename());
5884 } else {
5885 assert(Output.isNothing() && "Invalid output.");
5886 }
5887
5888 if (!Args.hasArg(options::OPT_nostdlib) &&
5889 !Args.hasArg(options::OPT_nostartfiles)) {
5890 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5891 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5892 }
5893
5894 Args.AddAllArgs(CmdArgs, options::OPT_L);
5895 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5896 for (const auto &Path : Paths)
5897 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5898 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5899 Args.AddAllArgs(CmdArgs, options::OPT_e);
5900 Args.AddAllArgs(CmdArgs, options::OPT_s);
5901 Args.AddAllArgs(CmdArgs, options::OPT_t);
5902 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5903 Args.AddAllArgs(CmdArgs, options::OPT_r);
5904
5905 if (D.IsUsingLTO(ToolChain, Args))
5906 AddGoldPlugin(ToolChain, Args, CmdArgs);
5907
5908 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5909
5910 if (!Args.hasArg(options::OPT_nostdlib) &&
5911 !Args.hasArg(options::OPT_nodefaultlibs)) {
5912 if (D.CCCIsCXX())
5913 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5914 CmdArgs.push_back("-lc");
5915 CmdArgs.push_back("-lcompiler_rt");
5916 }
5917
5918 if (!Args.hasArg(options::OPT_nostdlib) &&
5919 !Args.hasArg(options::OPT_nostartfiles))
5920 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5921
5922 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
5923 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
5924}
5925
Daniel Dunbarbe220842009-03-20 16:06:39 +00005926void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005927 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005928 const InputInfoList &Inputs,
5929 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005930 const char *LinkingOutput) const {
5931 ArgStringList CmdArgs;
5932
5933 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5934 const InputInfo &Input = Inputs[0];
5935
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005936 // Determine the original source input.
5937 const Action *SourceAction = &JA;
5938 while (SourceAction->getKind() != Action::InputClass) {
5939 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5940 SourceAction = SourceAction->getInputs()[0];
5941 }
5942
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005943 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005944 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005945 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5946 // FIXME: at run-time detect assembler capabilities or rely on version
5947 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005948 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005949 const llvm::Triple &T(getToolChain().getTriple());
5950 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005951 CmdArgs.push_back("-Q");
5952 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005953
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005954 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005955 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005956 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005957 if (Args.hasArg(options::OPT_gstabs))
5958 CmdArgs.push_back("--gstabs");
5959 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005960 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005961 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005962
Daniel Dunbarbe220842009-03-20 16:06:39 +00005963 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005964 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005965
Daniel Dunbar6d484762010-07-22 01:47:22 +00005966 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005967 if (getToolChain().getArch() == llvm::Triple::x86 ||
5968 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005969 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5970 CmdArgs.push_back("-force_cpusubtype_ALL");
5971
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005972 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005973 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005974 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005975 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005976 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005977 CmdArgs.push_back("-static");
5978
Daniel Dunbarbe220842009-03-20 16:06:39 +00005979 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5980 options::OPT_Xassembler);
5981
5982 assert(Output.isFilename() && "Unexpected lipo output.");
5983 CmdArgs.push_back("-o");
5984 CmdArgs.push_back(Output.getFilename());
5985
Daniel Dunbarb440f562010-08-02 02:38:21 +00005986 assert(Input.isFilename() && "Invalid input.");
5987 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005988
5989 // asm_final spec is empty.
5990
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005991 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005992 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005993 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005994}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005995
Tim Northover157d9112014-01-16 08:48:16 +00005996void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005997
Tim Northover157d9112014-01-16 08:48:16 +00005998void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5999 ArgStringList &CmdArgs) const {
6000 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006001
Daniel Dunbarc1964212009-03-26 16:23:12 +00006002 // Derived from darwin_arch spec.
6003 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006004 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006005
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006006 // FIXME: Is this needed anymore?
6007 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006008 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006009}
6010
Bill Wendling3b2000f2012-10-02 18:02:50 +00006011bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
6012 // We only need to generate a temp path for LTO if we aren't compiling object
6013 // files. When compiling source files, we run 'dsymutil' after linking. We
6014 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006015 for (const auto &Input : Inputs)
6016 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006017 return true;
6018
6019 return false;
6020}
6021
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006022void darwin::Link::AddLinkArgs(Compilation &C,
6023 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006024 ArgStringList &CmdArgs,
6025 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006026 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006027 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006028
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006029 unsigned Version[3] = { 0, 0, 0 };
6030 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6031 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006032 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006033 Version[1], Version[2], HadExtra) ||
6034 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006035 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006036 << A->getAsString(Args);
6037 }
6038
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006039 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006040 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006041 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6042 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006043
Bob Wilson3d27dad2013-08-02 22:25:34 +00006044 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6045 CmdArgs.push_back("-export_dynamic");
6046
Bob Wilsonb111ec92015-03-02 19:01:14 +00006047 // If we are using App Extension restrictions, pass a flag to the linker
6048 // telling it that the compiled code has been audited.
6049 if (Args.hasFlag(options::OPT_fapplication_extension,
6050 options::OPT_fno_application_extension, false))
6051 CmdArgs.push_back("-application_extension");
6052
Bill Wendling313b6bf2012-11-16 23:03:00 +00006053 // If we are using LTO, then automatically create a temporary file path for
6054 // the linker to use, so that it's lifetime will extend past a possible
6055 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006056 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6057 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006058 const char *TmpPath = C.getArgs().MakeArgString(
6059 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6060 C.addTempFile(TmpPath);
6061 CmdArgs.push_back("-object_path_lto");
6062 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006063 }
6064
Daniel Dunbarc1964212009-03-26 16:23:12 +00006065 // Derived from the "link" spec.
6066 Args.AddAllArgs(CmdArgs, options::OPT_static);
6067 if (!Args.hasArg(options::OPT_static))
6068 CmdArgs.push_back("-dynamic");
6069 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6070 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6071 // here. How do we wish to handle such things?
6072 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006073
Daniel Dunbarc1964212009-03-26 16:23:12 +00006074 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006075 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006076 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006077 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006078
6079 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6080 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6081 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6082
6083 Arg *A;
6084 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6085 (A = Args.getLastArg(options::OPT_current__version)) ||
6086 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006087 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006088 << A->getAsString(Args) << "-dynamiclib";
6089
6090 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6091 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6092 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6093 } else {
6094 CmdArgs.push_back("-dylib");
6095
6096 Arg *A;
6097 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6098 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6099 (A = Args.getLastArg(options::OPT_client__name)) ||
6100 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6101 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6102 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006103 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006104 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006105
Daniel Dunbarc1964212009-03-26 16:23:12 +00006106 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6107 "-dylib_compatibility_version");
6108 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6109 "-dylib_current_version");
6110
Tim Northover157d9112014-01-16 08:48:16 +00006111 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006112
6113 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6114 "-dylib_install_name");
6115 }
6116
6117 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6118 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6119 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006120 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006121 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006122 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6123 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6124 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6125 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6126 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6127 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006128 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006129 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6130 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6131 Args.AddAllArgs(CmdArgs, options::OPT_init);
6132
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006133 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006134 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006135
Daniel Dunbarc1964212009-03-26 16:23:12 +00006136 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6137 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6138 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6139 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6140 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006141
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006142 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6143 options::OPT_fno_pie,
6144 options::OPT_fno_PIE)) {
6145 if (A->getOption().matches(options::OPT_fpie) ||
6146 A->getOption().matches(options::OPT_fPIE))
6147 CmdArgs.push_back("-pie");
6148 else
6149 CmdArgs.push_back("-no_pie");
6150 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006151
6152 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6153 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6154 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6155 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6156 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6157 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6158 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6159 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6160 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6161 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6162 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6163 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6164 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6165 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6166 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6167 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006168
Daniel Dunbar84384642011-05-02 21:03:47 +00006169 // Give --sysroot= preference, over the Apple specific behavior to also use
6170 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006171 StringRef sysroot = C.getSysRoot();
6172 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006173 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006174 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006175 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6176 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006177 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006178 }
6179
Daniel Dunbarc1964212009-03-26 16:23:12 +00006180 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6181 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6182 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6183 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6184 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006185 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006186 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6187 Args.AddAllArgs(CmdArgs, options::OPT_y);
6188 Args.AddLastArg(CmdArgs, options::OPT_w);
6189 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6190 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6191 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6192 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6193 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6194 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6195 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6196 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6197 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6198 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6199 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6200 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6201}
6202
6203void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006204 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006205 const InputInfoList &Inputs,
6206 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006207 const char *LinkingOutput) const {
6208 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006209
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006210 // If the number of arguments surpasses the system limits, we will encode the
6211 // input files in a separate file, shortening the command line. To this end,
6212 // build a list of input file names that can be passed via a file with the
6213 // -filelist linker option.
6214 llvm::opt::ArgStringList InputFileList;
6215
Daniel Dunbarc1964212009-03-26 16:23:12 +00006216 // The logic here is derived from gcc's behavior; most of which
6217 // comes from specs (starting with link_command). Consult gcc for
6218 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006219 ArgStringList CmdArgs;
6220
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006221 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6222 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6223 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006224 for (const auto &Arg : Args)
6225 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006226 const char *Exec =
6227 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6228 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006229 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006230 return;
6231 }
6232
Daniel Dunbarc1964212009-03-26 16:23:12 +00006233 // I'm not sure why this particular decomposition exists in gcc, but
6234 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006235 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006236
Daniel Dunbarc1964212009-03-26 16:23:12 +00006237 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6238 Args.AddAllArgs(CmdArgs, options::OPT_s);
6239 Args.AddAllArgs(CmdArgs, options::OPT_t);
6240 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6241 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006242 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006243 Args.AddAllArgs(CmdArgs, options::OPT_r);
6244
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006245 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6246 // members of static archive libraries which implement Objective-C classes or
6247 // categories.
6248 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6249 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006250
Daniel Dunbarc1964212009-03-26 16:23:12 +00006251 CmdArgs.push_back("-o");
6252 CmdArgs.push_back(Output.getFilename());
6253
Chad Rosier06fd3c62012-05-16 23:45:12 +00006254 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006255 !Args.hasArg(options::OPT_nostartfiles))
6256 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006257
6258 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006259
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006260 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6261 options::OPT_fno_openmp, false)) {
6262 switch (getOpenMPRuntime(getToolChain(), Args)) {
6263 case OMPRT_OMP:
6264 CmdArgs.push_back("-lomp");
6265 break;
6266 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006267 CmdArgs.push_back("-lgomp");
6268 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006269 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006270 CmdArgs.push_back("-liomp5");
6271 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006272 case OMPRT_Unknown:
6273 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006274 break;
6275 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006276 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006277
Douglas Gregor9295df02012-05-15 21:00:27 +00006278 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006279 // Build the input file for -filelist (list of linker input files) in case we
6280 // need it later
6281 for (const auto &II : Inputs) {
6282 if (!II.isFilename()) {
6283 // This is a linker input argument.
6284 // We cannot mix input arguments and file names in a -filelist input, thus
6285 // we prematurely stop our list (remaining files shall be passed as
6286 // arguments).
6287 if (InputFileList.size() > 0)
6288 break;
6289
6290 continue;
6291 }
6292
6293 InputFileList.push_back(II.getFilename());
6294 }
6295
Bob Wilson16d93952012-05-15 18:57:39 +00006296 if (isObjCRuntimeLinked(Args) &&
6297 !Args.hasArg(options::OPT_nostdlib) &&
6298 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006299 // We use arclite library for both ARC and subscripting support.
6300 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6301
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006302 CmdArgs.push_back("-framework");
6303 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006304 // Link libobj.
6305 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006306 }
John McCall31168b02011-06-15 23:02:42 +00006307
Daniel Dunbarc1964212009-03-26 16:23:12 +00006308 if (LinkingOutput) {
6309 CmdArgs.push_back("-arch_multiple");
6310 CmdArgs.push_back("-final_output");
6311 CmdArgs.push_back(LinkingOutput);
6312 }
6313
Daniel Dunbarc1964212009-03-26 16:23:12 +00006314 if (Args.hasArg(options::OPT_fnested_functions))
6315 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006316
Justin Bognerc7701242015-05-12 05:44:36 +00006317 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6318 // paths are different enough from other toolchains that this needs a fair
6319 // amount of refactoring done first.
6320 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6321
Daniel Dunbarc1964212009-03-26 16:23:12 +00006322 if (!Args.hasArg(options::OPT_nostdlib) &&
6323 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006324 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006325 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006326
Daniel Dunbarc1964212009-03-26 16:23:12 +00006327 // link_ssp spec is empty.
6328
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006329 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006330 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006331 }
6332
Chad Rosier06fd3c62012-05-16 23:45:12 +00006333 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006334 !Args.hasArg(options::OPT_nostartfiles)) {
6335 // endfile_spec is empty.
6336 }
6337
6338 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6339 Args.AddAllArgs(CmdArgs, options::OPT_F);
6340
Steven Wu3ffb61b2015-02-06 18:08:29 +00006341 // -iframework should be forwarded as -F.
6342 for (auto it = Args.filtered_begin(options::OPT_iframework),
6343 ie = Args.filtered_end(); it != ie; ++it)
6344 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6345 (*it)->getValue()));
6346
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006347 if (!Args.hasArg(options::OPT_nostdlib) &&
6348 !Args.hasArg(options::OPT_nodefaultlibs)) {
6349 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6350 if (A->getValue() == StringRef("Accelerate")) {
6351 CmdArgs.push_back("-framework");
6352 CmdArgs.push_back("Accelerate");
6353 }
6354 }
6355 }
6356
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006357 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006358 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006359 std::unique_ptr<Command> Cmd =
6360 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6361 Cmd->setInputFileList(std::move(InputFileList));
6362 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006363}
6364
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006365void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006366 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006367 const InputInfoList &Inputs,
6368 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006369 const char *LinkingOutput) const {
6370 ArgStringList CmdArgs;
6371
6372 CmdArgs.push_back("-create");
6373 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006374
6375 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006376 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006377
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006378 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006379 assert(II.isFilename() && "Unexpected lipo input.");
6380 CmdArgs.push_back(II.getFilename());
6381 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006382
6383 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006384 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006385}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006386
Daniel Dunbar88299622010-06-04 18:28:36 +00006387void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006388 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006389 const InputInfoList &Inputs,
6390 const ArgList &Args,
6391 const char *LinkingOutput) const {
6392 ArgStringList CmdArgs;
6393
Daniel Dunbareb86b042011-05-09 17:23:16 +00006394 CmdArgs.push_back("-o");
6395 CmdArgs.push_back(Output.getFilename());
6396
Daniel Dunbar88299622010-06-04 18:28:36 +00006397 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6398 const InputInfo &Input = Inputs[0];
6399 assert(Input.isFilename() && "Unexpected dsymutil input.");
6400 CmdArgs.push_back(Input.getFilename());
6401
Daniel Dunbar88299622010-06-04 18:28:36 +00006402 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006403 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006404 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006405}
6406
Eric Christopher551ef452011-08-23 17:56:55 +00006407void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006408 const InputInfo &Output,
6409 const InputInfoList &Inputs,
6410 const ArgList &Args,
6411 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006412 ArgStringList CmdArgs;
6413 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006414 CmdArgs.push_back("--debug-info");
6415 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006416 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006417
6418 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6419 const InputInfo &Input = Inputs[0];
6420 assert(Input.isFilename() && "Unexpected verify input");
6421
6422 // Grabbing the output of the earlier dsymutil run.
6423 CmdArgs.push_back(Input.getFilename());
6424
6425 const char *Exec =
6426 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006427 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006428}
6429
David Chisnallf571cde2012-02-15 13:39:01 +00006430void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6431 const InputInfo &Output,
6432 const InputInfoList &Inputs,
6433 const ArgList &Args,
6434 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006435 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006436 ArgStringList CmdArgs;
6437
6438 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6439 options::OPT_Xassembler);
6440
6441 CmdArgs.push_back("-o");
6442 CmdArgs.push_back(Output.getFilename());
6443
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006444 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006445 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006446
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006447 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006448 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006449}
6450
David Chisnallf571cde2012-02-15 13:39:01 +00006451void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6452 const InputInfo &Output,
6453 const InputInfoList &Inputs,
6454 const ArgList &Args,
6455 const char *LinkingOutput) const {
6456 // FIXME: Find a real GCC, don't hard-code versions here
6457 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6458 const llvm::Triple &T = getToolChain().getTriple();
6459 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006460 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006461 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006462 case llvm::Triple::x86:
6463 GCCLibPath +=
6464 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6465 break;
6466 case llvm::Triple::x86_64:
6467 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6468 GCCLibPath += "/4.5.2/amd64/";
6469 LibPath += "amd64/";
6470 break;
6471 default:
6472 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006473 }
6474
6475 ArgStringList CmdArgs;
6476
David Chisnall272a0712012-02-29 15:06:12 +00006477 // Demangle C++ names in errors
6478 CmdArgs.push_back("-C");
6479
David Chisnallf571cde2012-02-15 13:39:01 +00006480 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6481 (!Args.hasArg(options::OPT_shared))) {
6482 CmdArgs.push_back("-e");
6483 CmdArgs.push_back("_start");
6484 }
6485
6486 if (Args.hasArg(options::OPT_static)) {
6487 CmdArgs.push_back("-Bstatic");
6488 CmdArgs.push_back("-dn");
6489 } else {
6490 CmdArgs.push_back("-Bdynamic");
6491 if (Args.hasArg(options::OPT_shared)) {
6492 CmdArgs.push_back("-shared");
6493 } else {
6494 CmdArgs.push_back("--dynamic-linker");
6495 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6496 }
6497 }
6498
6499 if (Output.isFilename()) {
6500 CmdArgs.push_back("-o");
6501 CmdArgs.push_back(Output.getFilename());
6502 } else {
6503 assert(Output.isNothing() && "Invalid output.");
6504 }
6505
6506 if (!Args.hasArg(options::OPT_nostdlib) &&
6507 !Args.hasArg(options::OPT_nostartfiles)) {
6508 if (!Args.hasArg(options::OPT_shared)) {
6509 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6510 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006511 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006512 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6513 } else {
6514 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006515 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6516 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006517 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006518 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006519 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006520 }
6521
6522 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6523
6524 Args.AddAllArgs(CmdArgs, options::OPT_L);
6525 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6526 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006527 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006528
6529 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6530
6531 if (!Args.hasArg(options::OPT_nostdlib) &&
6532 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006533 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006534 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006535 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006536 if (!Args.hasArg(options::OPT_shared)) {
6537 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006538 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006539 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006540 }
David Chisnallf571cde2012-02-15 13:39:01 +00006541 }
6542
6543 if (!Args.hasArg(options::OPT_nostdlib) &&
6544 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006545 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006546 }
David Chisnall96de9932012-02-16 16:00:47 +00006547 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006548
Alexey Samsonov7811d192014-02-20 13:57:37 +00006549 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006550
6551 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006552 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006553 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006554}
6555
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006556void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006557 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006558 const InputInfoList &Inputs,
6559 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006560 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006561 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006562 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006563 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006564
Rafael Espindolacc126272014-02-28 01:55:21 +00006565 switch (getToolChain().getArch()) {
6566 case llvm::Triple::x86:
6567 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6568 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006569 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006570 break;
6571
6572 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006573 CmdArgs.push_back("-mppc");
6574 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006575 break;
6576
6577 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006578 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006579 CmdArgs.push_back("-32");
6580 NeedsKPIC = true;
6581 break;
6582
6583 case llvm::Triple::sparcv9:
6584 CmdArgs.push_back("-64");
6585 CmdArgs.push_back("-Av9a");
6586 NeedsKPIC = true;
6587 break;
6588
6589 case llvm::Triple::mips64:
6590 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006591 StringRef CPUName;
6592 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006593 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006594
6595 CmdArgs.push_back("-mabi");
6596 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6597
6598 if (getToolChain().getArch() == llvm::Triple::mips64)
6599 CmdArgs.push_back("-EB");
6600 else
6601 CmdArgs.push_back("-EL");
6602
Rafael Espindolacc126272014-02-28 01:55:21 +00006603 NeedsKPIC = true;
6604 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006605 }
6606
Rafael Espindolacc126272014-02-28 01:55:21 +00006607 default:
6608 break;
6609 }
6610
6611 if (NeedsKPIC)
6612 addAssemblerKPIC(Args, CmdArgs);
6613
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006614 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6615 options::OPT_Xassembler);
6616
6617 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006618 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006619
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006620 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006621 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006622
6623 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006624 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006625 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006626}
6627
6628void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006629 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006630 const InputInfoList &Inputs,
6631 const ArgList &Args,
6632 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006633 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006634 ArgStringList CmdArgs;
6635
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006636 // Silence warning for "clang -g foo.o -o foo"
6637 Args.ClaimAllArgs(options::OPT_g_Group);
6638 // and "clang -emit-llvm foo.o -o foo"
6639 Args.ClaimAllArgs(options::OPT_emit_llvm);
6640 // and for "clang -w foo.o -o foo". Other warning options are already
6641 // handled somewhere else.
6642 Args.ClaimAllArgs(options::OPT_w);
6643
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006644 if (getToolChain().getArch() == llvm::Triple::mips64)
6645 CmdArgs.push_back("-EB");
6646 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6647 CmdArgs.push_back("-EL");
6648
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006649 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006650 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006651 CmdArgs.push_back("-e");
6652 CmdArgs.push_back("__start");
6653 }
6654
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006655 if (Args.hasArg(options::OPT_static)) {
6656 CmdArgs.push_back("-Bstatic");
6657 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006658 if (Args.hasArg(options::OPT_rdynamic))
6659 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006660 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006661 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006662 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006663 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006664 } else {
6665 CmdArgs.push_back("-dynamic-linker");
6666 CmdArgs.push_back("/usr/libexec/ld.so");
6667 }
6668 }
6669
Rafael Espindola044f7832013-06-05 04:28:55 +00006670 if (Args.hasArg(options::OPT_nopie))
6671 CmdArgs.push_back("-nopie");
6672
Daniel Dunbarb440f562010-08-02 02:38:21 +00006673 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006674 CmdArgs.push_back("-o");
6675 CmdArgs.push_back(Output.getFilename());
6676 } else {
6677 assert(Output.isNothing() && "Invalid output.");
6678 }
6679
6680 if (!Args.hasArg(options::OPT_nostdlib) &&
6681 !Args.hasArg(options::OPT_nostartfiles)) {
6682 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006683 if (Args.hasArg(options::OPT_pg))
6684 CmdArgs.push_back(Args.MakeArgString(
6685 getToolChain().GetFilePath("gcrt0.o")));
6686 else
6687 CmdArgs.push_back(Args.MakeArgString(
6688 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006689 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006690 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006691 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006692 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006693 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006694 }
6695 }
6696
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006697 std::string Triple = getToolChain().getTripleString();
6698 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006699 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006700 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006701 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006702
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006703 Args.AddAllArgs(CmdArgs, options::OPT_L);
6704 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6705 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006706 Args.AddAllArgs(CmdArgs, options::OPT_s);
6707 Args.AddAllArgs(CmdArgs, options::OPT_t);
6708 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6709 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006710
Daniel Dunbar54423b22010-09-17 00:24:54 +00006711 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006712
6713 if (!Args.hasArg(options::OPT_nostdlib) &&
6714 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006715 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006716 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006717 if (Args.hasArg(options::OPT_pg))
6718 CmdArgs.push_back("-lm_p");
6719 else
6720 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006721 }
6722
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006723 // FIXME: For some reason GCC passes -lgcc before adding
6724 // the default system libraries. Just mimic this for now.
6725 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006726
Eric Christopher17674ec2012-09-13 06:32:34 +00006727 if (Args.hasArg(options::OPT_pthread)) {
6728 if (!Args.hasArg(options::OPT_shared) &&
6729 Args.hasArg(options::OPT_pg))
6730 CmdArgs.push_back("-lpthread_p");
6731 else
6732 CmdArgs.push_back("-lpthread");
6733 }
6734
Chandler Carruth45661652011-12-17 22:32:42 +00006735 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006736 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006737 CmdArgs.push_back("-lc_p");
6738 else
6739 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006740 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006741
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006742 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006743 }
6744
6745 if (!Args.hasArg(options::OPT_nostdlib) &&
6746 !Args.hasArg(options::OPT_nostartfiles)) {
6747 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006748 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006749 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006750 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006751 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006752 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006753 }
6754
6755 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006756 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006757 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006758}
Ed Schoutene33194b2009-04-02 19:13:12 +00006759
Eli Friedman9fa28852012-08-08 23:57:20 +00006760void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6761 const InputInfo &Output,
6762 const InputInfoList &Inputs,
6763 const ArgList &Args,
6764 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006765 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006766 ArgStringList CmdArgs;
6767
6768 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6769 options::OPT_Xassembler);
6770
6771 CmdArgs.push_back("-o");
6772 CmdArgs.push_back(Output.getFilename());
6773
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006774 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006775 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006776
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006777 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006778 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006779}
6780
6781void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6782 const InputInfo &Output,
6783 const InputInfoList &Inputs,
6784 const ArgList &Args,
6785 const char *LinkingOutput) const {
6786 const Driver &D = getToolChain().getDriver();
6787 ArgStringList CmdArgs;
6788
6789 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6790 (!Args.hasArg(options::OPT_shared))) {
6791 CmdArgs.push_back("-e");
6792 CmdArgs.push_back("__start");
6793 }
6794
6795 if (Args.hasArg(options::OPT_static)) {
6796 CmdArgs.push_back("-Bstatic");
6797 } else {
6798 if (Args.hasArg(options::OPT_rdynamic))
6799 CmdArgs.push_back("-export-dynamic");
6800 CmdArgs.push_back("--eh-frame-hdr");
6801 CmdArgs.push_back("-Bdynamic");
6802 if (Args.hasArg(options::OPT_shared)) {
6803 CmdArgs.push_back("-shared");
6804 } else {
6805 CmdArgs.push_back("-dynamic-linker");
6806 CmdArgs.push_back("/usr/libexec/ld.so");
6807 }
6808 }
6809
6810 if (Output.isFilename()) {
6811 CmdArgs.push_back("-o");
6812 CmdArgs.push_back(Output.getFilename());
6813 } else {
6814 assert(Output.isNothing() && "Invalid output.");
6815 }
6816
6817 if (!Args.hasArg(options::OPT_nostdlib) &&
6818 !Args.hasArg(options::OPT_nostartfiles)) {
6819 if (!Args.hasArg(options::OPT_shared)) {
6820 if (Args.hasArg(options::OPT_pg))
6821 CmdArgs.push_back(Args.MakeArgString(
6822 getToolChain().GetFilePath("gcrt0.o")));
6823 else
6824 CmdArgs.push_back(Args.MakeArgString(
6825 getToolChain().GetFilePath("crt0.o")));
6826 CmdArgs.push_back(Args.MakeArgString(
6827 getToolChain().GetFilePath("crtbegin.o")));
6828 } else {
6829 CmdArgs.push_back(Args.MakeArgString(
6830 getToolChain().GetFilePath("crtbeginS.o")));
6831 }
6832 }
6833
6834 Args.AddAllArgs(CmdArgs, options::OPT_L);
6835 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6836 Args.AddAllArgs(CmdArgs, options::OPT_e);
6837
6838 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6839
6840 if (!Args.hasArg(options::OPT_nostdlib) &&
6841 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006842 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006843 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6844 if (Args.hasArg(options::OPT_pg))
6845 CmdArgs.push_back("-lm_p");
6846 else
6847 CmdArgs.push_back("-lm");
6848 }
6849
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006850 if (Args.hasArg(options::OPT_pthread)) {
6851 if (!Args.hasArg(options::OPT_shared) &&
6852 Args.hasArg(options::OPT_pg))
6853 CmdArgs.push_back("-lpthread_p");
6854 else
6855 CmdArgs.push_back("-lpthread");
6856 }
6857
Eli Friedman9fa28852012-08-08 23:57:20 +00006858 if (!Args.hasArg(options::OPT_shared)) {
6859 if (Args.hasArg(options::OPT_pg))
6860 CmdArgs.push_back("-lc_p");
6861 else
6862 CmdArgs.push_back("-lc");
6863 }
6864
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006865 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006866 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006867 case llvm::Triple::arm:
6868 MyArch = "arm";
6869 break;
6870 case llvm::Triple::x86:
6871 MyArch = "i386";
6872 break;
6873 case llvm::Triple::x86_64:
6874 MyArch = "amd64";
6875 break;
6876 default:
6877 llvm_unreachable("Unsupported architecture");
6878 }
6879 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006880 }
6881
6882 if (!Args.hasArg(options::OPT_nostdlib) &&
6883 !Args.hasArg(options::OPT_nostartfiles)) {
6884 if (!Args.hasArg(options::OPT_shared))
6885 CmdArgs.push_back(Args.MakeArgString(
6886 getToolChain().GetFilePath("crtend.o")));
6887 else
6888 CmdArgs.push_back(Args.MakeArgString(
6889 getToolChain().GetFilePath("crtendS.o")));
6890 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006891
6892 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006893 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006894 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006895}
6896
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006897void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006898 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006899 const InputInfoList &Inputs,
6900 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006901 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006902 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006903 ArgStringList CmdArgs;
6904
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006905 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6906 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006907 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006908 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006909 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006910 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006911 else if (getToolChain().getArch() == llvm::Triple::mips ||
6912 getToolChain().getArch() == llvm::Triple::mipsel ||
6913 getToolChain().getArch() == llvm::Triple::mips64 ||
6914 getToolChain().getArch() == llvm::Triple::mips64el) {
6915 StringRef CPUName;
6916 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006917 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006918
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006919 CmdArgs.push_back("-march");
6920 CmdArgs.push_back(CPUName.data());
6921
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006922 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006923 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006924
6925 if (getToolChain().getArch() == llvm::Triple::mips ||
6926 getToolChain().getArch() == llvm::Triple::mips64)
6927 CmdArgs.push_back("-EB");
6928 else
6929 CmdArgs.push_back("-EL");
6930
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006931 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006932 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006933 getToolChain().getArch() == llvm::Triple::armeb ||
6934 getToolChain().getArch() == llvm::Triple::thumb ||
6935 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006936 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006937 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006938 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6939
6940 if (FloatABI == "hard") {
6941 CmdArgs.push_back("-mfpu=vfp");
6942 } else {
6943 CmdArgs.push_back("-mfpu=softvfp");
6944 }
6945
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006946 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006947 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006948 case llvm::Triple::GNUEABI:
6949 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006950 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006951 break;
6952
6953 default:
6954 CmdArgs.push_back("-matpcs");
6955 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006956 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006957 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006958 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006959 if (getToolChain().getArch() == llvm::Triple::sparc)
6960 CmdArgs.push_back("-Av8plusa");
6961 else
6962 CmdArgs.push_back("-Av9a");
6963
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006964 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006965 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006966
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006967 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6968 options::OPT_Xassembler);
6969
6970 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006971 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006972
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006973 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006974 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006975
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006976 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006977 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006978}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006979
6980void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006981 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006982 const InputInfoList &Inputs,
6983 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006984 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006985 const toolchains::FreeBSD &ToolChain =
6986 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00006987 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006988 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006989 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006990 !Args.hasArg(options::OPT_shared) &&
6991 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006992 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006993
6994 // Silence warning for "clang -g foo.o -o foo"
6995 Args.ClaimAllArgs(options::OPT_g_Group);
6996 // and "clang -emit-llvm foo.o -o foo"
6997 Args.ClaimAllArgs(options::OPT_emit_llvm);
6998 // and for "clang -w foo.o -o foo". Other warning options are already
6999 // handled somewhere else.
7000 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007001
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007002 if (!D.SysRoot.empty())
7003 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7004
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007005 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007006 CmdArgs.push_back("-pie");
7007
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007008 if (Args.hasArg(options::OPT_static)) {
7009 CmdArgs.push_back("-Bstatic");
7010 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007011 if (Args.hasArg(options::OPT_rdynamic))
7012 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007013 CmdArgs.push_back("--eh-frame-hdr");
7014 if (Args.hasArg(options::OPT_shared)) {
7015 CmdArgs.push_back("-Bshareable");
7016 } else {
7017 CmdArgs.push_back("-dynamic-linker");
7018 CmdArgs.push_back("/libexec/ld-elf.so.1");
7019 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007020 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007021 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7022 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7023 CmdArgs.push_back("--hash-style=both");
7024 }
7025 }
7026 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007027 }
7028
7029 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7030 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007031 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007032 CmdArgs.push_back("-m");
7033 CmdArgs.push_back("elf_i386_fbsd");
7034 }
7035
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007036 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007037 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007038 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007039 }
7040
Daniel Dunbarb440f562010-08-02 02:38:21 +00007041 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007042 CmdArgs.push_back("-o");
7043 CmdArgs.push_back(Output.getFilename());
7044 } else {
7045 assert(Output.isNothing() && "Invalid output.");
7046 }
7047
7048 if (!Args.hasArg(options::OPT_nostdlib) &&
7049 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007050 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007051 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007052 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007053 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007054 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007055 crt1 = "Scrt1.o";
7056 else
7057 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007058 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007059 if (crt1)
7060 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7061
7062 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7063
Craig Topper92fc2df2014-05-17 16:56:41 +00007064 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007065 if (Args.hasArg(options::OPT_static))
7066 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007067 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007068 crtbegin = "crtbeginS.o";
7069 else
7070 crtbegin = "crtbegin.o";
7071
7072 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007073 }
7074
7075 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007076 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007077 for (const auto &Path : Paths)
7078 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007079 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7080 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007081 Args.AddAllArgs(CmdArgs, options::OPT_s);
7082 Args.AddAllArgs(CmdArgs, options::OPT_t);
7083 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7084 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007085
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007086 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007087 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007088
Alexey Samsonov52550342014-09-15 19:58:40 +00007089 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007090 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007091
7092 if (!Args.hasArg(options::OPT_nostdlib) &&
7093 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007094 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007095 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007096 if (Args.hasArg(options::OPT_pg))
7097 CmdArgs.push_back("-lm_p");
7098 else
7099 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007100 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007101 if (NeedsSanitizerDeps)
7102 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007103 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7104 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007105 if (Args.hasArg(options::OPT_pg))
7106 CmdArgs.push_back("-lgcc_p");
7107 else
7108 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007109 if (Args.hasArg(options::OPT_static)) {
7110 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007111 } else if (Args.hasArg(options::OPT_pg)) {
7112 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007113 } else {
7114 CmdArgs.push_back("--as-needed");
7115 CmdArgs.push_back("-lgcc_s");
7116 CmdArgs.push_back("--no-as-needed");
7117 }
7118
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007119 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007120 if (Args.hasArg(options::OPT_pg))
7121 CmdArgs.push_back("-lpthread_p");
7122 else
7123 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007124 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007125
Roman Divacky66f22762011-02-10 16:59:40 +00007126 if (Args.hasArg(options::OPT_pg)) {
7127 if (Args.hasArg(options::OPT_shared))
7128 CmdArgs.push_back("-lc");
7129 else
7130 CmdArgs.push_back("-lc_p");
7131 CmdArgs.push_back("-lgcc_p");
7132 } else {
7133 CmdArgs.push_back("-lc");
7134 CmdArgs.push_back("-lgcc");
7135 }
7136
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007137 if (Args.hasArg(options::OPT_static)) {
7138 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007139 } else if (Args.hasArg(options::OPT_pg)) {
7140 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007141 } else {
7142 CmdArgs.push_back("--as-needed");
7143 CmdArgs.push_back("-lgcc_s");
7144 CmdArgs.push_back("--no-as-needed");
7145 }
7146 }
7147
7148 if (!Args.hasArg(options::OPT_nostdlib) &&
7149 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007150 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007151 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007152 else
7153 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007154 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007155 }
7156
Alexey Samsonov7811d192014-02-20 13:57:37 +00007157 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007158
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007159 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007160 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007161 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007162}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007163
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007164void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7165 const InputInfo &Output,
7166 const InputInfoList &Inputs,
7167 const ArgList &Args,
7168 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007169 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007170 ArgStringList CmdArgs;
7171
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007172 // GNU as needs different flags for creating the correct output format
7173 // on architectures with different ABIs or optional feature sets.
7174 switch (getToolChain().getArch()) {
7175 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007176 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007177 break;
7178 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007179 case llvm::Triple::armeb:
7180 case llvm::Triple::thumb:
7181 case llvm::Triple::thumbeb: {
Gabor Ballabas208826c2015-06-04 17:56:32 +00007182 std::string MArch = arm::getARMTargetCPU(Args, getToolChain().getTriple());
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007183 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007184 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007185 }
7186
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007187 case llvm::Triple::mips:
7188 case llvm::Triple::mipsel:
7189 case llvm::Triple::mips64:
7190 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007191 StringRef CPUName;
7192 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007193 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007194
7195 CmdArgs.push_back("-march");
7196 CmdArgs.push_back(CPUName.data());
7197
7198 CmdArgs.push_back("-mabi");
7199 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7200
7201 if (getToolChain().getArch() == llvm::Triple::mips ||
7202 getToolChain().getArch() == llvm::Triple::mips64)
7203 CmdArgs.push_back("-EB");
7204 else
7205 CmdArgs.push_back("-EL");
7206
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007207 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007208 break;
7209 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007210
7211 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007212 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007213 CmdArgs.push_back("-32");
7214 addAssemblerKPIC(Args, CmdArgs);
7215 break;
7216
7217 case llvm::Triple::sparcv9:
7218 CmdArgs.push_back("-64");
7219 CmdArgs.push_back("-Av9");
7220 addAssemblerKPIC(Args, CmdArgs);
7221 break;
7222
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007223 default:
7224 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007225 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007226
7227 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7228 options::OPT_Xassembler);
7229
7230 CmdArgs.push_back("-o");
7231 CmdArgs.push_back(Output.getFilename());
7232
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007233 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007234 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007235
David Chisnallddbd68f2011-09-27 22:03:18 +00007236 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007237 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007238}
7239
7240void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7241 const InputInfo &Output,
7242 const InputInfoList &Inputs,
7243 const ArgList &Args,
7244 const char *LinkingOutput) const {
7245 const Driver &D = getToolChain().getDriver();
7246 ArgStringList CmdArgs;
7247
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007248 if (!D.SysRoot.empty())
7249 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7250
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007251 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007252 if (Args.hasArg(options::OPT_static)) {
7253 CmdArgs.push_back("-Bstatic");
7254 } else {
7255 if (Args.hasArg(options::OPT_rdynamic))
7256 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007257 if (Args.hasArg(options::OPT_shared)) {
7258 CmdArgs.push_back("-Bshareable");
7259 } else {
7260 CmdArgs.push_back("-dynamic-linker");
7261 CmdArgs.push_back("/libexec/ld.elf_so");
7262 }
7263 }
7264
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007265 // Many NetBSD architectures support more than one ABI.
7266 // Determine the correct emulation for ld.
7267 switch (getToolChain().getArch()) {
7268 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007269 CmdArgs.push_back("-m");
7270 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007271 break;
7272 case llvm::Triple::arm:
7273 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007274 CmdArgs.push_back("-m");
7275 switch (getToolChain().getTriple().getEnvironment()) {
7276 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007277 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007278 CmdArgs.push_back("armelf_nbsd_eabi");
7279 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007280 case llvm::Triple::EABIHF:
7281 case llvm::Triple::GNUEABIHF:
7282 CmdArgs.push_back("armelf_nbsd_eabihf");
7283 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007284 default:
7285 CmdArgs.push_back("armelf_nbsd");
7286 break;
7287 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007288 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007289 case llvm::Triple::armeb:
7290 case llvm::Triple::thumbeb:
John Brawn94fd9632015-05-21 12:19:49 +00007291 arm::appendEBLinkFlags(Args, CmdArgs,
7292 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007293 CmdArgs.push_back("-m");
7294 switch (getToolChain().getTriple().getEnvironment()) {
7295 case llvm::Triple::EABI:
7296 case llvm::Triple::GNUEABI:
7297 CmdArgs.push_back("armelfb_nbsd_eabi");
7298 break;
7299 case llvm::Triple::EABIHF:
7300 case llvm::Triple::GNUEABIHF:
7301 CmdArgs.push_back("armelfb_nbsd_eabihf");
7302 break;
7303 default:
7304 CmdArgs.push_back("armelfb_nbsd");
7305 break;
7306 }
7307 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007308 case llvm::Triple::mips64:
7309 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007310 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007311 CmdArgs.push_back("-m");
7312 if (getToolChain().getArch() == llvm::Triple::mips64)
7313 CmdArgs.push_back("elf32btsmip");
7314 else
7315 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007316 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007317 CmdArgs.push_back("-m");
7318 if (getToolChain().getArch() == llvm::Triple::mips64)
7319 CmdArgs.push_back("elf64btsmip");
7320 else
7321 CmdArgs.push_back("elf64ltsmip");
7322 }
7323 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007324 case llvm::Triple::ppc:
7325 CmdArgs.push_back("-m");
7326 CmdArgs.push_back("elf32ppc_nbsd");
7327 break;
7328
7329 case llvm::Triple::ppc64:
7330 case llvm::Triple::ppc64le:
7331 CmdArgs.push_back("-m");
7332 CmdArgs.push_back("elf64ppc");
7333 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007334
7335 case llvm::Triple::sparc:
7336 CmdArgs.push_back("-m");
7337 CmdArgs.push_back("elf32_sparc");
7338 break;
7339
7340 case llvm::Triple::sparcv9:
7341 CmdArgs.push_back("-m");
7342 CmdArgs.push_back("elf64_sparc");
7343 break;
7344
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007345 default:
7346 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007347 }
7348
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007349 if (Output.isFilename()) {
7350 CmdArgs.push_back("-o");
7351 CmdArgs.push_back(Output.getFilename());
7352 } else {
7353 assert(Output.isNothing() && "Invalid output.");
7354 }
7355
7356 if (!Args.hasArg(options::OPT_nostdlib) &&
7357 !Args.hasArg(options::OPT_nostartfiles)) {
7358 if (!Args.hasArg(options::OPT_shared)) {
7359 CmdArgs.push_back(Args.MakeArgString(
7360 getToolChain().GetFilePath("crt0.o")));
7361 CmdArgs.push_back(Args.MakeArgString(
7362 getToolChain().GetFilePath("crti.o")));
7363 CmdArgs.push_back(Args.MakeArgString(
7364 getToolChain().GetFilePath("crtbegin.o")));
7365 } else {
7366 CmdArgs.push_back(Args.MakeArgString(
7367 getToolChain().GetFilePath("crti.o")));
7368 CmdArgs.push_back(Args.MakeArgString(
7369 getToolChain().GetFilePath("crtbeginS.o")));
7370 }
7371 }
7372
7373 Args.AddAllArgs(CmdArgs, options::OPT_L);
7374 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7375 Args.AddAllArgs(CmdArgs, options::OPT_e);
7376 Args.AddAllArgs(CmdArgs, options::OPT_s);
7377 Args.AddAllArgs(CmdArgs, options::OPT_t);
7378 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7379 Args.AddAllArgs(CmdArgs, options::OPT_r);
7380
7381 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7382
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007383 unsigned Major, Minor, Micro;
7384 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7385 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007386 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007387 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007388 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007389 case llvm::Triple::arm:
7390 case llvm::Triple::armeb:
7391 case llvm::Triple::thumb:
7392 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007393 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007394 case llvm::Triple::ppc64:
7395 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007396 case llvm::Triple::x86:
7397 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007398 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007399 break;
7400 default:
7401 break;
7402 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007403 }
7404
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007405 if (!Args.hasArg(options::OPT_nostdlib) &&
7406 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007407 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007408 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7409 CmdArgs.push_back("-lm");
7410 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007411 if (Args.hasArg(options::OPT_pthread))
7412 CmdArgs.push_back("-lpthread");
7413 CmdArgs.push_back("-lc");
7414
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007415 if (useLibgcc) {
7416 if (Args.hasArg(options::OPT_static)) {
7417 // libgcc_eh depends on libc, so resolve as much as possible,
7418 // pull in any new requirements from libc and then get the rest
7419 // of libgcc.
7420 CmdArgs.push_back("-lgcc_eh");
7421 CmdArgs.push_back("-lc");
7422 CmdArgs.push_back("-lgcc");
7423 } else {
7424 CmdArgs.push_back("-lgcc");
7425 CmdArgs.push_back("--as-needed");
7426 CmdArgs.push_back("-lgcc_s");
7427 CmdArgs.push_back("--no-as-needed");
7428 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007429 }
7430 }
7431
7432 if (!Args.hasArg(options::OPT_nostdlib) &&
7433 !Args.hasArg(options::OPT_nostartfiles)) {
7434 if (!Args.hasArg(options::OPT_shared))
7435 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7436 "crtend.o")));
7437 else
7438 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7439 "crtendS.o")));
7440 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7441 "crtn.o")));
7442 }
7443
Alexey Samsonov7811d192014-02-20 13:57:37 +00007444 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007445
Logan Chieneb9162f2014-06-26 14:23:45 +00007446 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007447 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007448}
7449
Thomas Schwinge4e555262013-03-28 19:04:25 +00007450void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7451 const InputInfo &Output,
7452 const InputInfoList &Inputs,
7453 const ArgList &Args,
7454 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007455 claimNoWarnArgs(Args);
7456
Rafael Espindola92b00932010-08-10 00:25:48 +00007457 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007458 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007459
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007460 switch (getToolChain().getArch()) {
7461 default:
7462 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007463 // Add --32/--64 to make sure we get the format we want.
7464 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007465 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007466 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007467 break;
7468 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007469 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7470 CmdArgs.push_back("--x32");
7471 else
7472 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007473 break;
7474 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007475 CmdArgs.push_back("-a32");
7476 CmdArgs.push_back("-mppc");
7477 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007478 break;
7479 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007480 CmdArgs.push_back("-a64");
7481 CmdArgs.push_back("-mppc64");
7482 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007483 break;
7484 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007485 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007486 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007487 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007488 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007489 break;
7490 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007491 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007492 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007493 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007494 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007495 break;
7496 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007497 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007498 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007499 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007500 break;
7501 case llvm::Triple::arm:
7502 case llvm::Triple::armeb:
7503 case llvm::Triple::thumb:
7504 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007505 const llvm::Triple &Triple = getToolChain().getTriple();
7506 switch (Triple.getSubArch()) {
7507 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007508 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007509 break;
7510 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007511 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007512 break;
7513 default:
7514 break;
7515 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007516
Tim Northover9c7e0352013-12-12 11:55:52 +00007517 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007518 getToolChain().getDriver(), Args,
7519 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007520 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007521
7522 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007523
7524 // FIXME: remove krait check when GNU tools support krait cpu
7525 // for now replace it with -march=armv7-a to avoid a lower
7526 // march from being picked in the absence of a cpu flag.
7527 Arg *A;
7528 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Gabor Ballabas208826c2015-06-04 17:56:32 +00007529 StringRef(A->getValue()).lower() == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007530 CmdArgs.push_back("-march=armv7-a");
7531 else
7532 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007533 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007534 break;
7535 }
7536 case llvm::Triple::mips:
7537 case llvm::Triple::mipsel:
7538 case llvm::Triple::mips64:
7539 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007540 StringRef CPUName;
7541 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007542 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007543 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007544
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007545 CmdArgs.push_back("-march");
7546 CmdArgs.push_back(CPUName.data());
7547
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007548 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007549 CmdArgs.push_back(ABIName.data());
7550
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007551 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7552 // or -mshared (not implemented) is in effect.
7553 bool IsPicOrPie = false;
7554 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7555 options::OPT_fpic, options::OPT_fno_pic,
7556 options::OPT_fPIE, options::OPT_fno_PIE,
7557 options::OPT_fpie, options::OPT_fno_pie)) {
7558 if (A->getOption().matches(options::OPT_fPIC) ||
7559 A->getOption().matches(options::OPT_fpic) ||
7560 A->getOption().matches(options::OPT_fPIE) ||
7561 A->getOption().matches(options::OPT_fpie))
7562 IsPicOrPie = true;
7563 }
7564 if (!IsPicOrPie)
7565 CmdArgs.push_back("-mno-shared");
7566
Daniel Sanders379d44b2014-07-16 11:52:23 +00007567 // LLVM doesn't support -mplt yet and acts as if it is always given.
7568 // However, -mplt has no effect with the N64 ABI.
7569 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007570
7571 if (getToolChain().getArch() == llvm::Triple::mips ||
7572 getToolChain().getArch() == llvm::Triple::mips64)
7573 CmdArgs.push_back("-EB");
7574 else
7575 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007576
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007577 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7578 if (StringRef(A->getValue()) == "2008")
7579 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7580 }
7581
Daniel Sanders379d44b2014-07-16 11:52:23 +00007582 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7583 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7584 options::OPT_mfp64)) {
7585 A->claim();
7586 A->render(Args, CmdArgs);
7587 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7588 ABIName))
7589 CmdArgs.push_back("-mfpxx");
7590
7591 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7592 // -mno-mips16 is actually -no-mips16.
7593 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7594 options::OPT_mno_mips16)) {
7595 if (A->getOption().matches(options::OPT_mips16)) {
7596 A->claim();
7597 A->render(Args, CmdArgs);
7598 } else {
7599 A->claim();
7600 CmdArgs.push_back("-no-mips16");
7601 }
7602 }
7603
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007604 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7605 options::OPT_mno_micromips);
7606 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7607 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7608
Simon Atanasyanbd986632013-11-26 11:58:04 +00007609 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7610 // Do not use AddLastArg because not all versions of MIPS assembler
7611 // support -mmsa / -mno-msa options.
7612 if (A->getOption().matches(options::OPT_mmsa))
7613 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7614 }
7615
Daniel Sanders379d44b2014-07-16 11:52:23 +00007616 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7617 options::OPT_msoft_float);
7618
7619 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7620 options::OPT_mno_odd_spreg);
7621
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007622 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007623 break;
7624 }
7625 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007626 // Always pass an -march option, since our default of z10 is later
7627 // than the GNU assembler's default.
7628 StringRef CPUName = getSystemZTargetCPU(Args);
7629 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007630 break;
7631 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007632 }
7633
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007634 if (NeedsKPIC)
7635 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007636
7637 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7638 options::OPT_Xassembler);
7639
7640 CmdArgs.push_back("-o");
7641 CmdArgs.push_back(Output.getFilename());
7642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007643 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007644 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007645
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007646 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007648
7649 // Handle the debug info splitting at object creation time if we're
7650 // creating an object.
7651 // TODO: Currently only works on linux with newer objcopy.
7652 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007653 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007655 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007656}
7657
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007658static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007659 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007660 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007661 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7662 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007663 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007664 CmdArgs.push_back("-lgcc");
7665
Logan Chien3d3373c2012-11-19 12:04:11 +00007666 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007667 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007668 CmdArgs.push_back("-lgcc");
7669 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007670 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007671 CmdArgs.push_back("--as-needed");
7672 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007673 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007674 CmdArgs.push_back("--no-as-needed");
7675 }
7676
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007677 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007678 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007679 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007680 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007681
7682 // According to Android ABI, we have to link with libdl if we are
7683 // linking with non-static libgcc.
7684 //
7685 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7686 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7687 if (isAndroid && !StaticLibgcc)
7688 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007689}
7690
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007691static std::string getLinuxDynamicLinker(const ArgList &Args,
7692 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007693 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7694
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007695 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7696 if (ToolChain.getTriple().isArch64Bit())
7697 return "/system/bin/linker64";
7698 else
7699 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007700 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7701 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007702 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007703 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007704 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007705 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007706 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007707 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007708 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7709 return "/lib/ld-linux-armhf.so.3";
7710 else
7711 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007712 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7713 // TODO: check which dynamic linker name.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007714 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007715 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007716 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007717 return "/lib/ld-linux.so.3";
7718 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7719 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007720 StringRef CPUName;
7721 StringRef ABIName;
7722 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7723 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7724
7725 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7726 .Case("o32", "/lib")
7727 .Case("n32", "/lib32")
7728 .Case("n64", "/lib64")
7729 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007730 StringRef LibName;
7731 if (mips::isUCLibc(Args))
7732 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7733 else
7734 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007735
7736 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007737 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007738 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007739 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007740 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7741 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007742 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007743 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007744 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7745 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007746 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007747 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007748 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007749 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007750 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007751 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007752 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7753 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007754 else
7755 return "/lib64/ld-linux-x86-64.so.2";
7756}
7757
Renato Golinc4b49242014-02-13 10:01:16 +00007758static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007759 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007760 // Make use of compiler-rt if --rtlib option is used
7761 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7762
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007763 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007764 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007765 switch (TC.getTriple().getOS()) {
7766 default: llvm_unreachable("unsupported OS");
7767 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007768 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007769 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007770 break;
7771 }
Renato Golinc4b49242014-02-13 10:01:16 +00007772 break;
7773 case ToolChain::RLT_Libgcc:
7774 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7775 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007776 }
7777}
7778
Rafael Espindola1e085772014-08-15 17:14:35 +00007779static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7780 switch (T.getArch()) {
7781 case llvm::Triple::x86:
7782 return "elf_i386";
7783 case llvm::Triple::aarch64:
7784 return "aarch64linux";
7785 case llvm::Triple::aarch64_be:
7786 return "aarch64_be_linux";
7787 case llvm::Triple::arm:
7788 case llvm::Triple::thumb:
7789 return "armelf_linux_eabi";
7790 case llvm::Triple::armeb:
7791 case llvm::Triple::thumbeb:
7792 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7793 case llvm::Triple::ppc:
7794 return "elf32ppclinux";
7795 case llvm::Triple::ppc64:
7796 return "elf64ppc";
7797 case llvm::Triple::ppc64le:
7798 return "elf64lppc";
7799 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007800 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007801 return "elf32_sparc";
7802 case llvm::Triple::sparcv9:
7803 return "elf64_sparc";
7804 case llvm::Triple::mips:
7805 return "elf32btsmip";
7806 case llvm::Triple::mipsel:
7807 return "elf32ltsmip";
7808 case llvm::Triple::mips64:
7809 if (mips::hasMipsAbiArg(Args, "n32"))
7810 return "elf32btsmipn32";
7811 return "elf64btsmip";
7812 case llvm::Triple::mips64el:
7813 if (mips::hasMipsAbiArg(Args, "n32"))
7814 return "elf32ltsmipn32";
7815 return "elf64ltsmip";
7816 case llvm::Triple::systemz:
7817 return "elf64_s390";
7818 case llvm::Triple::x86_64:
7819 if (T.getEnvironment() == llvm::Triple::GNUX32)
7820 return "elf32_x86_64";
7821 return "elf_x86_64";
7822 default:
7823 llvm_unreachable("Unexpected arch");
7824 }
7825}
7826
Thomas Schwinge4e555262013-03-28 19:04:25 +00007827void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7828 const InputInfo &Output,
7829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007832 const toolchains::Linux &ToolChain =
7833 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007834 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007835 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007836 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007837 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007838 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007839 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
7840 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007841
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007842 ArgStringList CmdArgs;
7843
Rafael Espindolad1002f62010-11-15 18:28:16 +00007844 // Silence warning for "clang -g foo.o -o foo"
7845 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007846 // and "clang -emit-llvm foo.o -o foo"
7847 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007848 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007849 // handled somewhere else.
7850 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007851
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007852 if (!D.SysRoot.empty())
7853 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007854
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007855 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007856 CmdArgs.push_back("-pie");
7857
Rafael Espindola1c76c592010-11-07 22:57:16 +00007858 if (Args.hasArg(options::OPT_rdynamic))
7859 CmdArgs.push_back("-export-dynamic");
7860
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007861 if (Args.hasArg(options::OPT_s))
7862 CmdArgs.push_back("-s");
7863
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007864 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
7865 arm::appendEBLinkFlags(
7866 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007867 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007868
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007869 for (const auto &Opt : ToolChain.ExtraOpts)
7870 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007871
7872 if (!Args.hasArg(options::OPT_static)) {
7873 CmdArgs.push_back("--eh-frame-hdr");
7874 }
7875
7876 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007877 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007878
7879 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007880 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7881 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007882 CmdArgs.push_back("-Bstatic");
7883 else
7884 CmdArgs.push_back("-static");
7885 } else if (Args.hasArg(options::OPT_shared)) {
7886 CmdArgs.push_back("-shared");
7887 }
7888
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007889 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7890 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007891 (!Args.hasArg(options::OPT_static) &&
7892 !Args.hasArg(options::OPT_shared))) {
7893 CmdArgs.push_back("-dynamic-linker");
7894 CmdArgs.push_back(Args.MakeArgString(
7895 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7896 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007897
7898 CmdArgs.push_back("-o");
7899 CmdArgs.push_back(Output.getFilename());
7900
Rafael Espindola81937ec2010-12-01 01:52:43 +00007901 if (!Args.hasArg(options::OPT_nostdlib) &&
7902 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007903 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007904 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007905 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007906 if (Args.hasArg(options::OPT_pg))
7907 crt1 = "gcrt1.o";
7908 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007909 crt1 = "Scrt1.o";
7910 else
7911 crt1 = "crt1.o";
7912 }
7913 if (crt1)
7914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007915
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007916 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7917 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007918
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007919 const char *crtbegin;
7920 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007921 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007922 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007923 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007924 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007925 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007926 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007927 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007928 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007929
7930 // Add crtfastmath.o if available and fast math is enabled.
7931 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007932 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007933
7934 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007935 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007936
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007937 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007938
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007939 for (const auto &Path : Paths)
7940 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007941
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007942 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007943 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007944
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007945 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7946 CmdArgs.push_back("--no-demangle");
7947
Alexey Samsonov52550342014-09-15 19:58:40 +00007948 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007949 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007950 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007951 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007952
Hans Wennborg70850d82013-07-18 20:29:38 +00007953 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007954 !Args.hasArg(options::OPT_nostdlib) &&
7955 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007956 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7957 !Args.hasArg(options::OPT_static);
7958 if (OnlyLibstdcxxStatic)
7959 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007960 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007961 if (OnlyLibstdcxxStatic)
7962 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007963 CmdArgs.push_back("-lm");
7964 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00007965 // Silence warnings when linking C code with a C++ '-stdlib' argument.
7966 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007967
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007968 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007969 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7970 if (Args.hasArg(options::OPT_static))
7971 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007972
Alexey Samsonov52550342014-09-15 19:58:40 +00007973 if (NeedsSanitizerDeps)
7974 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7975
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00007976 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
7977 Args.hasArg(options::OPT_pthreads);
7978
7979 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
7980 options::OPT_fno_openmp, false)) {
7981 // OpenMP runtimes implies pthreads when using the GNU toolchain.
7982 // FIXME: Does this really make sense for all GNU toolchains?
7983 WantPthread = true;
7984
7985 // Also link the particular OpenMP runtimes.
7986 switch (getOpenMPRuntime(ToolChain, Args)) {
7987 case OMPRT_OMP:
7988 CmdArgs.push_back("-lomp");
7989 break;
7990 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00007991 CmdArgs.push_back("-lgomp");
7992
7993 // FIXME: Exclude this for platforms with libgomp that don't require
7994 // librt. Most modern Linux platforms require it, but some may not.
7995 CmdArgs.push_back("-lrt");
7996 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00007997 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00007998 CmdArgs.push_back("-liomp5");
7999 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008000 case OMPRT_Unknown:
8001 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008002 break;
8003 }
Chandler Carruth01538002013-01-17 13:19:29 +00008004 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008005
Renato Golinc4b49242014-02-13 10:01:16 +00008006 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008007
Richard Smith31d1de22015-05-20 22:48:44 +00008008 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008009 CmdArgs.push_back("-lpthread");
8010
8011 CmdArgs.push_back("-lc");
8012
8013 if (Args.hasArg(options::OPT_static))
8014 CmdArgs.push_back("--end-group");
8015 else
Renato Golinc4b49242014-02-13 10:01:16 +00008016 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008017 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008018
Rafael Espindola81937ec2010-12-01 01:52:43 +00008019 if (!Args.hasArg(options::OPT_nostartfiles)) {
8020 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008021 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008022 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008023 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008024 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008025 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008026 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008027
Rafael Espindola81937ec2010-12-01 01:52:43 +00008028 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008029 if (!isAndroid)
8030 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008031 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008032 }
8033
David Blaikiec11bf802014-09-04 16:04:28 +00008034 C.addCommand(
8035 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008036}
8037
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008038
8039// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8040// for the various SFI requirements like register masking. The assembly tool
8041// inserts the file containing the macros as an input into all the assembly
8042// jobs.
8043void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8044 const InputInfo &Output,
8045 const InputInfoList &Inputs,
8046 const ArgList &Args,
8047 const char *LinkingOutput) const {
8048 const toolchains::NaCl_TC& ToolChain =
8049 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8050 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8051 "nacl-arm-macros.s");
8052 InputInfoList NewInputs;
8053 NewInputs.push_back(NaClMacros);
8054 NewInputs.append(Inputs.begin(), Inputs.end());
8055 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8056 LinkingOutput);
8057}
8058
8059
8060// This is quite similar to gnutools::link::ConstructJob with changes that
8061// we use static by default, do not yet support sanitizers or LTO, and a few
8062// others. Eventually we can support more of that and hopefully migrate back
8063// to gnutools::link.
8064void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008065 const InputInfo &Output,
8066 const InputInfoList &Inputs,
8067 const ArgList &Args,
8068 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008069
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008070 const toolchains::NaCl_TC &ToolChain =
8071 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008072 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008073 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008074 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008075 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008076
8077 ArgStringList CmdArgs;
8078
8079 // Silence warning for "clang -g foo.o -o foo"
8080 Args.ClaimAllArgs(options::OPT_g_Group);
8081 // and "clang -emit-llvm foo.o -o foo"
8082 Args.ClaimAllArgs(options::OPT_emit_llvm);
8083 // and for "clang -w foo.o -o foo". Other warning options are already
8084 // handled somewhere else.
8085 Args.ClaimAllArgs(options::OPT_w);
8086
8087 if (!D.SysRoot.empty())
8088 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8089
8090 if (Args.hasArg(options::OPT_rdynamic))
8091 CmdArgs.push_back("-export-dynamic");
8092
8093 if (Args.hasArg(options::OPT_s))
8094 CmdArgs.push_back("-s");
8095
8096 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8097 // there is --build-id, which we do want.
8098 CmdArgs.push_back("--build-id");
8099
8100 if (!IsStatic)
8101 CmdArgs.push_back("--eh-frame-hdr");
8102
8103 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008104 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008105 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008106 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008107 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008108 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008109 CmdArgs.push_back("elf_x86_64_nacl");
8110 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008111 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8112 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008113
8114 if (IsStatic)
8115 CmdArgs.push_back("-static");
8116 else if (Args.hasArg(options::OPT_shared))
8117 CmdArgs.push_back("-shared");
8118
8119 CmdArgs.push_back("-o");
8120 CmdArgs.push_back(Output.getFilename());
8121 if (!Args.hasArg(options::OPT_nostdlib) &&
8122 !Args.hasArg(options::OPT_nostartfiles)) {
8123 if (!Args.hasArg(options::OPT_shared))
8124 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8125 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8126
8127 const char *crtbegin;
8128 if (IsStatic)
8129 crtbegin = "crtbeginT.o";
8130 else if (Args.hasArg(options::OPT_shared))
8131 crtbegin = "crtbeginS.o";
8132 else
8133 crtbegin = "crtbegin.o";
8134 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8135 }
8136
8137 Args.AddAllArgs(CmdArgs, options::OPT_L);
8138 Args.AddAllArgs(CmdArgs, options::OPT_u);
8139
8140 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8141
8142 for (const auto &Path : Paths)
8143 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8144
8145 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8146 CmdArgs.push_back("--no-demangle");
8147
8148 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8149
8150 if (D.CCCIsCXX() &&
8151 !Args.hasArg(options::OPT_nostdlib) &&
8152 !Args.hasArg(options::OPT_nodefaultlibs)) {
8153 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8154 !IsStatic;
8155 if (OnlyLibstdcxxStatic)
8156 CmdArgs.push_back("-Bstatic");
8157 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8158 if (OnlyLibstdcxxStatic)
8159 CmdArgs.push_back("-Bdynamic");
8160 CmdArgs.push_back("-lm");
8161 }
8162
8163 if (!Args.hasArg(options::OPT_nostdlib)) {
8164 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8165 // Always use groups, since it has no effect on dynamic libraries.
8166 CmdArgs.push_back("--start-group");
8167 CmdArgs.push_back("-lc");
8168 // NaCl's libc++ currently requires libpthread, so just always include it
8169 // in the group for C++.
8170 if (Args.hasArg(options::OPT_pthread) ||
8171 Args.hasArg(options::OPT_pthreads) ||
8172 D.CCCIsCXX()) {
8173 CmdArgs.push_back("-lpthread");
8174 }
8175
8176 CmdArgs.push_back("-lgcc");
8177 CmdArgs.push_back("--as-needed");
8178 if (IsStatic)
8179 CmdArgs.push_back("-lgcc_eh");
8180 else
8181 CmdArgs.push_back("-lgcc_s");
8182 CmdArgs.push_back("--no-as-needed");
8183 CmdArgs.push_back("--end-group");
8184 }
8185
8186 if (!Args.hasArg(options::OPT_nostartfiles)) {
8187 const char *crtend;
8188 if (Args.hasArg(options::OPT_shared))
8189 crtend = "crtendS.o";
8190 else
8191 crtend = "crtend.o";
8192
8193 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8195 }
8196 }
8197
8198 C.addCommand(llvm::make_unique<Command>(JA, *this,
8199 ToolChain.Linker.c_str(), CmdArgs));
8200}
8201
8202
Chris Lattner3e2ee142010-07-07 16:01:42 +00008203void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008204 const InputInfo &Output,
8205 const InputInfoList &Inputs,
8206 const ArgList &Args,
8207 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008208 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008209 ArgStringList CmdArgs;
8210
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008211 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008212
8213 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008214 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008215
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008216 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008217 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008218
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008219 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008221}
8222
8223void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008224 const InputInfo &Output,
8225 const InputInfoList &Inputs,
8226 const ArgList &Args,
8227 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008228 const Driver &D = getToolChain().getDriver();
8229 ArgStringList CmdArgs;
8230
Daniel Dunbarb440f562010-08-02 02:38:21 +00008231 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008232 CmdArgs.push_back("-o");
8233 CmdArgs.push_back(Output.getFilename());
8234 } else {
8235 assert(Output.isNothing() && "Invalid output.");
8236 }
8237
8238 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008239 !Args.hasArg(options::OPT_nostartfiles)) {
8240 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8241 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8242 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8243 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8244 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008245
8246 Args.AddAllArgs(CmdArgs, options::OPT_L);
8247 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8248 Args.AddAllArgs(CmdArgs, options::OPT_e);
8249
Daniel Dunbar54423b22010-09-17 00:24:54 +00008250 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008251
Alexey Samsonov7811d192014-02-20 13:57:37 +00008252 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008253
Chris Lattner3e2ee142010-07-07 16:01:42 +00008254 if (!Args.hasArg(options::OPT_nostdlib) &&
8255 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008256 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008257 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008258 CmdArgs.push_back("-lm");
8259 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008260 }
8261
8262 if (!Args.hasArg(options::OPT_nostdlib) &&
8263 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008264 if (Args.hasArg(options::OPT_pthread))
8265 CmdArgs.push_back("-lpthread");
8266 CmdArgs.push_back("-lc");
8267 CmdArgs.push_back("-lCompilerRT-Generic");
8268 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8269 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008270 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008271 }
8272
Logan Chieneb9162f2014-06-26 14:23:45 +00008273 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008275}
8276
Daniel Dunbarcc912342009-05-02 18:28:39 +00008277/// DragonFly Tools
8278
8279// For now, DragonFly Assemble does just about the same as for
8280// FreeBSD, but this may change soon.
8281void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008282 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008283 const InputInfoList &Inputs,
8284 const ArgList &Args,
8285 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008286 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008287 ArgStringList CmdArgs;
8288
8289 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8290 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008291 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008292 CmdArgs.push_back("--32");
8293
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008294 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008295
8296 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008297 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008298
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008299 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008300 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008301
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008302 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008303 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008304}
8305
8306void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008307 const InputInfo &Output,
8308 const InputInfoList &Inputs,
8309 const ArgList &Args,
8310 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008311 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008312 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008313 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008314
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008315 if (!D.SysRoot.empty())
8316 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8317
John McCall65b8da02013-04-11 22:55:55 +00008318 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008319 if (Args.hasArg(options::OPT_static)) {
8320 CmdArgs.push_back("-Bstatic");
8321 } else {
John McCall65b8da02013-04-11 22:55:55 +00008322 if (Args.hasArg(options::OPT_rdynamic))
8323 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008324 if (Args.hasArg(options::OPT_shared))
8325 CmdArgs.push_back("-Bshareable");
8326 else {
8327 CmdArgs.push_back("-dynamic-linker");
8328 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8329 }
John McCall65b8da02013-04-11 22:55:55 +00008330 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008331 }
8332
8333 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8334 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008335 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008336 CmdArgs.push_back("-m");
8337 CmdArgs.push_back("elf_i386");
8338 }
8339
Daniel Dunbarb440f562010-08-02 02:38:21 +00008340 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008341 CmdArgs.push_back("-o");
8342 CmdArgs.push_back(Output.getFilename());
8343 } else {
8344 assert(Output.isNothing() && "Invalid output.");
8345 }
8346
8347 if (!Args.hasArg(options::OPT_nostdlib) &&
8348 !Args.hasArg(options::OPT_nostartfiles)) {
8349 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008350 if (Args.hasArg(options::OPT_pg))
8351 CmdArgs.push_back(Args.MakeArgString(
8352 getToolChain().GetFilePath("gcrt1.o")));
8353 else {
8354 if (Args.hasArg(options::OPT_pie))
8355 CmdArgs.push_back(Args.MakeArgString(
8356 getToolChain().GetFilePath("Scrt1.o")));
8357 else
8358 CmdArgs.push_back(Args.MakeArgString(
8359 getToolChain().GetFilePath("crt1.o")));
8360 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008361 }
John McCall65b8da02013-04-11 22:55:55 +00008362 CmdArgs.push_back(Args.MakeArgString(
8363 getToolChain().GetFilePath("crti.o")));
8364 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8365 CmdArgs.push_back(Args.MakeArgString(
8366 getToolChain().GetFilePath("crtbeginS.o")));
8367 else
8368 CmdArgs.push_back(Args.MakeArgString(
8369 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008370 }
8371
8372 Args.AddAllArgs(CmdArgs, options::OPT_L);
8373 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8374 Args.AddAllArgs(CmdArgs, options::OPT_e);
8375
Daniel Dunbar54423b22010-09-17 00:24:54 +00008376 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008377
8378 if (!Args.hasArg(options::OPT_nostdlib) &&
8379 !Args.hasArg(options::OPT_nodefaultlibs)) {
8380 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8381 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008382 if (UseGCC47)
8383 CmdArgs.push_back("-L/usr/lib/gcc47");
8384 else
8385 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008386
8387 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008388 if (UseGCC47) {
8389 CmdArgs.push_back("-rpath");
8390 CmdArgs.push_back("/usr/lib/gcc47");
8391 } else {
8392 CmdArgs.push_back("-rpath");
8393 CmdArgs.push_back("/usr/lib/gcc44");
8394 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008395 }
8396
Hans Wennborg70850d82013-07-18 20:29:38 +00008397 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008398 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008399 CmdArgs.push_back("-lm");
8400 }
8401
Daniel Dunbarcc912342009-05-02 18:28:39 +00008402 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008403 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008404
8405 if (!Args.hasArg(options::OPT_nolibc)) {
8406 CmdArgs.push_back("-lc");
8407 }
8408
John McCall65b8da02013-04-11 22:55:55 +00008409 if (UseGCC47) {
8410 if (Args.hasArg(options::OPT_static) ||
8411 Args.hasArg(options::OPT_static_libgcc)) {
8412 CmdArgs.push_back("-lgcc");
8413 CmdArgs.push_back("-lgcc_eh");
8414 } else {
8415 if (Args.hasArg(options::OPT_shared_libgcc)) {
8416 CmdArgs.push_back("-lgcc_pic");
8417 if (!Args.hasArg(options::OPT_shared))
8418 CmdArgs.push_back("-lgcc");
8419 } else {
8420 CmdArgs.push_back("-lgcc");
8421 CmdArgs.push_back("--as-needed");
8422 CmdArgs.push_back("-lgcc_pic");
8423 CmdArgs.push_back("--no-as-needed");
8424 }
8425 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008426 } else {
John McCall65b8da02013-04-11 22:55:55 +00008427 if (Args.hasArg(options::OPT_shared)) {
8428 CmdArgs.push_back("-lgcc_pic");
8429 } else {
8430 CmdArgs.push_back("-lgcc");
8431 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008432 }
8433 }
8434
8435 if (!Args.hasArg(options::OPT_nostdlib) &&
8436 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008437 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008438 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008439 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008440 else
8441 CmdArgs.push_back(Args.MakeArgString(
8442 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008443 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008444 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008445 }
8446
Alexey Samsonov7811d192014-02-20 13:57:37 +00008447 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008448
Logan Chieneb9162f2014-06-26 14:23:45 +00008449 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008450 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008451}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008452
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008453// Try to find Exe from a Visual Studio distribution. This first tries to find
8454// an installed copy of Visual Studio and, failing that, looks in the PATH,
8455// making sure that whatever executable that's found is not a same-named exe
8456// from clang itself to prevent clang from falling back to itself.
8457static std::string FindVisualStudioExecutable(const ToolChain &TC,
8458 const char *Exe,
8459 const char *ClangProgramPath) {
8460 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8461 std::string visualStudioBinDir;
8462 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8463 visualStudioBinDir)) {
8464 SmallString<128> FilePath(visualStudioBinDir);
8465 llvm::sys::path::append(FilePath, Exe);
8466 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8467 return FilePath.str();
8468 }
8469
8470 return Exe;
8471}
8472
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008473void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8474 const InputInfo &Output,
8475 const InputInfoList &Inputs,
8476 const ArgList &Args,
8477 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008478 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008479 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008480
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008481 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8482 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008483 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8484 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008485
8486 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008487 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008488 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008489
Zachary Turner10d75b22014-10-22 20:40:43 +00008490 if (!llvm::sys::Process::GetEnv("LIB")) {
8491 // If the VC environment hasn't been configured (perhaps because the user
8492 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008493 // the environment variable is set however, assume the user knows what
8494 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008495 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008496 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008497 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8498 SmallString<128> LibDir(VisualStudioDir);
8499 llvm::sys::path::append(LibDir, "VC", "lib");
8500 switch (MSVC.getArch()) {
8501 case llvm::Triple::x86:
8502 // x86 just puts the libraries directly in lib
8503 break;
8504 case llvm::Triple::x86_64:
8505 llvm::sys::path::append(LibDir, "amd64");
8506 break;
8507 case llvm::Triple::arm:
8508 llvm::sys::path::append(LibDir, "arm");
8509 break;
8510 default:
8511 break;
8512 }
8513 CmdArgs.push_back(
8514 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8515 }
8516
8517 std::string WindowsSdkLibPath;
8518 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8519 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8520 WindowsSdkLibPath.c_str()));
8521 }
8522
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008523 CmdArgs.push_back("-nologo");
8524
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008525 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008526 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008527
Hans Wennborge4c47f22015-03-04 23:16:21 +00008528 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8529 options::OPT__SLASH_LDd,
8530 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008531 if (DLL) {
8532 CmdArgs.push_back(Args.MakeArgString("-dll"));
8533
8534 SmallString<128> ImplibName(Output.getFilename());
8535 llvm::sys::path::replace_extension(ImplibName, "lib");
8536 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008537 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008538 }
8539
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008540 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008541 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008542 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008543 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008544 static const char *CompilerRTComponents[] = {
8545 "asan_dynamic",
8546 "asan_dynamic_runtime_thunk",
8547 };
8548 for (const auto &Component : CompilerRTComponents)
8549 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008550 // Make sure the dynamic runtime thunk is not optimized out at link time
8551 // to ensure proper SEH handling.
8552 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008553 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008554 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008555 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008556 static const char *CompilerRTComponents[] = {
8557 "asan",
8558 "asan_cxx",
8559 };
8560 for (const auto &Component : CompilerRTComponents)
8561 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008562 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008563 }
8564
Hans Wennborg2e274592013-08-13 23:38:57 +00008565 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008566
Reid Kleckner337188f2014-09-16 19:22:00 +00008567 // Add filenames, libraries, and other linker inputs.
8568 for (const auto &Input : Inputs) {
8569 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008570 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008571 continue;
8572 }
8573
8574 const Arg &A = Input.getInputArg();
8575
8576 // Render -l options differently for the MSVC linker.
8577 if (A.getOption().matches(options::OPT_l)) {
8578 StringRef Lib = A.getValue();
8579 const char *LinkLibArg;
8580 if (Lib.endswith(".lib"))
8581 LinkLibArg = Args.MakeArgString(Lib);
8582 else
8583 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8584 CmdArgs.push_back(LinkLibArg);
8585 continue;
8586 }
8587
8588 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8589 // or -L. Render it, even if MSVC doesn't understand it.
8590 A.renderAsInput(Args, CmdArgs);
8591 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008592
Zachary Turner719f58c2014-12-01 23:06:47 +00008593 // We need to special case some linker paths. In the case of lld, we need to
8594 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8595 // linker, we need to use a special search algorithm.
8596 llvm::SmallString<128> linkPath;
8597 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8598 if (Linker.equals_lower("lld"))
8599 Linker = "lld-link";
8600
8601 if (Linker.equals_lower("link")) {
8602 // If we're using the MSVC linker, it's not sufficient to just use link
8603 // from the program PATH, because other environments like GnuWin32 install
8604 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008605 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008606 C.getDriver().getClangProgramPath());
8607 } else {
8608 linkPath = Linker;
8609 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008610 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008611 }
8612
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008613 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008614 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008615}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008616
8617void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8618 const InputInfo &Output,
8619 const InputInfoList &Inputs,
8620 const ArgList &Args,
8621 const char *LinkingOutput) const {
8622 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8623}
8624
David Blaikiec11bf802014-09-04 16:04:28 +00008625std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8626 Compilation &C, const JobAction &JA, const InputInfo &Output,
8627 const InputInfoList &Inputs, const ArgList &Args,
8628 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008629 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008630 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008631 CmdArgs.push_back("/c"); // Compile only.
8632 CmdArgs.push_back("/W0"); // No warnings.
8633
8634 // The goal is to be able to invoke this tool correctly based on
8635 // any flag accepted by clang-cl.
8636
8637 // These are spelled the same way in clang and cl.exe,.
8638 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8639 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008640
8641 // Optimization level.
8642 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8643 if (A->getOption().getID() == options::OPT_O0) {
8644 CmdArgs.push_back("/Od");
8645 } else {
8646 StringRef OptLevel = A->getValue();
8647 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8648 A->render(Args, CmdArgs);
8649 else if (OptLevel == "3")
8650 CmdArgs.push_back("/Ox");
8651 }
8652 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008653
Nico Weber3f8dafb2015-03-12 19:37:10 +00008654 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008655 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8656
David Majnemerf6072342014-07-01 22:24:56 +00008657 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8658 /*default=*/false))
8659 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008660 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8661 options::OPT_fno_function_sections))
8662 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8663 ? "/Gy"
8664 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008665 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8666 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008667 CmdArgs.push_back(
8668 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008669 if (Args.hasArg(options::OPT_fsyntax_only))
8670 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008671 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8672 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008673
Nico Weber3f8dafb2015-03-12 19:37:10 +00008674 std::vector<std::string> Includes =
8675 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008676 for (const auto &Include : Includes)
8677 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008678
Hans Wennborg87cfa712013-09-19 20:32:16 +00008679 // Flags that can simply be passed through.
8680 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8681 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008682 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008683
8684 // The order of these flags is relevant, so pick the last one.
8685 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8686 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8687 A->render(Args, CmdArgs);
8688
8689
8690 // Input filename.
8691 assert(Inputs.size() == 1);
8692 const InputInfo &II = Inputs[0];
8693 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8694 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8695 if (II.isFilename())
8696 CmdArgs.push_back(II.getFilename());
8697 else
8698 II.getInputArg().renderAsInput(Args, CmdArgs);
8699
8700 // Output filename.
8701 assert(Output.getType() == types::TY_Object);
8702 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8703 Output.getFilename());
8704 CmdArgs.push_back(Fo);
8705
Hans Wennborg188382e2013-09-20 18:16:35 +00008706 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008707 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8708 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008709 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8710 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008711}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008712
8713
8714/// XCore Tools
8715// We pass assemble and link construction to the xcc tool.
8716
8717void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8718 const InputInfo &Output,
8719 const InputInfoList &Inputs,
8720 const ArgList &Args,
8721 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008722 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008723 ArgStringList CmdArgs;
8724
8725 CmdArgs.push_back("-o");
8726 CmdArgs.push_back(Output.getFilename());
8727
8728 CmdArgs.push_back("-c");
8729
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008730 if (Args.hasArg(options::OPT_v))
8731 CmdArgs.push_back("-v");
8732
Robert Lytton894d25c2014-05-02 09:33:25 +00008733 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8734 if (!A->getOption().matches(options::OPT_g0))
8735 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008736
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008737 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8738 false))
8739 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008740
8741 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8742 options::OPT_Xassembler);
8743
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008744 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008745 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008746
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008747 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008748 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008749}
8750
8751void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8752 const InputInfo &Output,
8753 const InputInfoList &Inputs,
8754 const ArgList &Args,
8755 const char *LinkingOutput) const {
8756 ArgStringList CmdArgs;
8757
8758 if (Output.isFilename()) {
8759 CmdArgs.push_back("-o");
8760 CmdArgs.push_back(Output.getFilename());
8761 } else {
8762 assert(Output.isNothing() && "Invalid output.");
8763 }
8764
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008765 if (Args.hasArg(options::OPT_v))
8766 CmdArgs.push_back("-v");
8767
David Majnemer8de68642014-12-05 08:11:58 +00008768 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008769 CmdArgs.push_back("-fexceptions");
8770
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008771 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8772
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008773 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008774 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008775}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008776
8777void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8778 const InputInfo &Output,
8779 const InputInfoList &Inputs,
8780 const ArgList &Args,
8781 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008782 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008783 const auto &TC =
8784 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8785 ArgStringList CmdArgs;
8786 const char *Exec;
8787
8788 switch (TC.getArch()) {
8789 default: llvm_unreachable("unsupported architecture");
8790 case llvm::Triple::arm:
8791 case llvm::Triple::thumb:
8792 break;
8793 case llvm::Triple::x86:
8794 CmdArgs.push_back("--32");
8795 break;
8796 case llvm::Triple::x86_64:
8797 CmdArgs.push_back("--64");
8798 break;
8799 }
8800
8801 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8802
8803 CmdArgs.push_back("-o");
8804 CmdArgs.push_back(Output.getFilename());
8805
8806 for (const auto &Input : Inputs)
8807 CmdArgs.push_back(Input.getFilename());
8808
8809 const std::string Assembler = TC.GetProgramPath("as");
8810 Exec = Args.MakeArgString(Assembler);
8811
8812 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8813}
8814
8815void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8816 const InputInfo &Output,
8817 const InputInfoList &Inputs,
8818 const ArgList &Args,
8819 const char *LinkingOutput) const {
8820 const auto &TC =
8821 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8822 const llvm::Triple &T = TC.getTriple();
8823 const Driver &D = TC.getDriver();
8824 SmallString<128> EntryPoint;
8825 ArgStringList CmdArgs;
8826 const char *Exec;
8827
8828 // Silence warning for "clang -g foo.o -o foo"
8829 Args.ClaimAllArgs(options::OPT_g_Group);
8830 // and "clang -emit-llvm foo.o -o foo"
8831 Args.ClaimAllArgs(options::OPT_emit_llvm);
8832 // and for "clang -w foo.o -o foo"
8833 Args.ClaimAllArgs(options::OPT_w);
8834 // Other warning options are already handled somewhere else.
8835
8836 if (!D.SysRoot.empty())
8837 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8838
8839 if (Args.hasArg(options::OPT_pie))
8840 CmdArgs.push_back("-pie");
8841 if (Args.hasArg(options::OPT_rdynamic))
8842 CmdArgs.push_back("-export-dynamic");
8843 if (Args.hasArg(options::OPT_s))
8844 CmdArgs.push_back("--strip-all");
8845
8846 CmdArgs.push_back("-m");
8847 switch (TC.getArch()) {
8848 default: llvm_unreachable("unsupported architecture");
8849 case llvm::Triple::arm:
8850 case llvm::Triple::thumb:
8851 // FIXME: this is incorrect for WinCE
8852 CmdArgs.push_back("thumb2pe");
8853 break;
8854 case llvm::Triple::x86:
8855 CmdArgs.push_back("i386pe");
8856 EntryPoint.append("_");
8857 break;
8858 case llvm::Triple::x86_64:
8859 CmdArgs.push_back("i386pep");
8860 break;
8861 }
8862
8863 if (Args.hasArg(options::OPT_shared)) {
8864 switch (T.getArch()) {
8865 default: llvm_unreachable("unsupported architecture");
8866 case llvm::Triple::arm:
8867 case llvm::Triple::thumb:
8868 case llvm::Triple::x86_64:
8869 EntryPoint.append("_DllMainCRTStartup");
8870 break;
8871 case llvm::Triple::x86:
8872 EntryPoint.append("_DllMainCRTStartup@12");
8873 break;
8874 }
8875
8876 CmdArgs.push_back("-shared");
8877 CmdArgs.push_back("-Bdynamic");
8878
8879 CmdArgs.push_back("--enable-auto-image-base");
8880
8881 CmdArgs.push_back("--entry");
8882 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8883 } else {
8884 EntryPoint.append("mainCRTStartup");
8885
8886 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8887 : "-Bdynamic");
8888
8889 if (!Args.hasArg(options::OPT_nostdlib) &&
8890 !Args.hasArg(options::OPT_nostartfiles)) {
8891 CmdArgs.push_back("--entry");
8892 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8893 }
8894
8895 // FIXME: handle subsystem
8896 }
8897
8898 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008899 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008900
8901 CmdArgs.push_back("-o");
8902 CmdArgs.push_back(Output.getFilename());
8903
8904 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8905 SmallString<261> ImpLib(Output.getFilename());
8906 llvm::sys::path::replace_extension(ImpLib, ".lib");
8907
8908 CmdArgs.push_back("--out-implib");
8909 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8910 }
8911
8912 if (!Args.hasArg(options::OPT_nostdlib) &&
8913 !Args.hasArg(options::OPT_nostartfiles)) {
8914 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8915 const char *CRTBegin;
8916
8917 CRTBegin =
8918 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8919 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8920 }
8921
8922 Args.AddAllArgs(CmdArgs, options::OPT_L);
8923
8924 const auto &Paths = TC.getFilePaths();
8925 for (const auto &Path : Paths)
8926 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8927
8928 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8929
8930 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8931 !Args.hasArg(options::OPT_nodefaultlibs)) {
8932 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8933 !Args.hasArg(options::OPT_static);
8934 if (StaticCXX)
8935 CmdArgs.push_back("-Bstatic");
8936 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8937 if (StaticCXX)
8938 CmdArgs.push_back("-Bdynamic");
8939 }
8940
8941 if (!Args.hasArg(options::OPT_nostdlib)) {
8942 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8943 // TODO handle /MT[d] /MD[d]
8944 CmdArgs.push_back("-lmsvcrt");
8945 AddRunTimeLibs(TC, D, CmdArgs, Args);
8946 }
8947 }
8948
8949 const std::string Linker = TC.GetProgramPath("ld");
8950 Exec = Args.MakeArgString(Linker);
8951
8952 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8953}