blob: 893f204274435f7a4647ea0062538470a109be0e [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
87 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
88 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000090 << A->getAsString(Args) << "-static";
91}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
98 for ( ; *Arg; ++Arg) {
99 switch (*Arg) {
100 default: break;
101 case ' ':
102 case '\\':
103 Res.push_back('\\');
104 break;
105 }
106 Res.push_back(*Arg);
107 }
108}
109
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000110// Quote target names for inclusion in GNU Make dependency files.
111// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112static void QuoteTarget(StringRef Target,
113 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Bill Wendlingc0938f32012-03-12 22:10:06 +0000139static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000140 ArgStringList &CmdArgs,
141 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000142 const char *EnvVar) {
143 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 bool CombinedArg = false;
145
Bill Wendling281ca292012-03-12 21:22:35 +0000146 if (!DirList)
147 return; // Nothing to do.
148
Chad Rosier616e8a52012-10-30 21:42:09 +0000149 StringRef Name(ArgName);
150 if (Name.equals("-I") || Name.equals("-L"))
151 CombinedArg = true;
152
Bill Wendling281ca292012-03-12 21:22:35 +0000153 StringRef Dirs(DirList);
154 if (Dirs.empty()) // Empty string should not add '.'.
155 return;
156
157 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000158 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000159 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000160 if (CombinedArg) {
161 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
162 } else {
163 CmdArgs.push_back(ArgName);
164 CmdArgs.push_back(".");
165 }
Bill Wendling281ca292012-03-12 21:22:35 +0000166 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000167 if (CombinedArg) {
168 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
169 } else {
170 CmdArgs.push_back(ArgName);
171 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
172 }
Bill Wendling281ca292012-03-12 21:22:35 +0000173 }
Nico Weber89355782012-03-19 15:00:03 +0000174 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000175 }
176
177 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000178 if (CombinedArg) {
179 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
180 } else {
181 CmdArgs.push_back(ArgName);
182 CmdArgs.push_back(".");
183 }
Bill Wendling281ca292012-03-12 21:22:35 +0000184 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000185 if (CombinedArg) {
186 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
187 } else {
188 CmdArgs.push_back(ArgName);
189 CmdArgs.push_back(Args.MakeArgString(Dirs));
190 }
Bill Wendling281ca292012-03-12 21:22:35 +0000191 }
192}
193
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194static void AddLinkerInputs(const ToolChain &TC,
195 const InputInfoList &Inputs, const ArgList &Args,
196 ArgStringList &CmdArgs) {
197 const Driver &D = TC.getDriver();
198
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000199 // Add extra linker input arguments which are not treated as inputs
200 // (constructed via -Xarch_).
201 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
202
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000203 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000204 if (!TC.HasNativeLLVMSupport()) {
205 // Don't try to pass LLVM inputs unless we have native support.
206 if (II.getType() == types::TY_LLVM_IR ||
207 II.getType() == types::TY_LTO_IR ||
208 II.getType() == types::TY_LLVM_BC ||
209 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000210 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 << TC.getTripleString();
212 }
213
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000214 // Add filenames immediately.
215 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000216 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000217 continue;
218 }
219
220 // Otherwise, this is a linker input argument.
221 const Arg &A = II.getInputArg();
222
223 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000224 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000225 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000226 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000227 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000228 else if (A.getOption().matches(options::OPT_z)) {
229 // Pass -z prefix for gcc linker compatibility.
230 A.claim();
231 A.render(Args, CmdArgs);
232 } else {
233 A.renderAsInput(Args, CmdArgs);
234 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000235 }
Bill Wendling281ca292012-03-12 21:22:35 +0000236
237 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000238 // and only supported on native toolchains.
239 if (!TC.isCrossCompiling())
240 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000241}
242
John McCall31168b02011-06-15 23:02:42 +0000243/// \brief Determine whether Objective-C automated reference counting is
244/// enabled.
245static bool isObjCAutoRefCount(const ArgList &Args) {
246 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
247}
248
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249/// \brief Determine whether we are linking the ObjC runtime.
250static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000251 if (isObjCAutoRefCount(Args)) {
252 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000253 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000254 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000255 return Args.hasArg(options::OPT_fobjc_link_runtime);
256}
257
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000258static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000259 // Don't forward inputs from the original command line. They are added from
260 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000261 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000262 !O.hasFlag(options::DriverOption) &&
263 !O.hasFlag(options::LinkerInput);
264}
265
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000266void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000268 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000269 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000270 ArgStringList &CmdArgs,
271 const InputInfo &Output,
272 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000274
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000275 CheckPreprocessingOptions(D, Args);
276
277 Args.AddLastArg(CmdArgs, options::OPT_C);
278 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000279
280 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000281 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 (A = Args.getLastArg(options::OPT_MD)) ||
283 (A = Args.getLastArg(options::OPT_MMD))) {
284 // Determine the output location.
285 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000286 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000287 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000288 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000289 } else if (Output.getType() == types::TY_Dependencies) {
290 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000291 } else if (A->getOption().matches(options::OPT_M) ||
292 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 DepFile = "-";
294 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000295 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000296 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 }
298 CmdArgs.push_back("-dependency-file");
299 CmdArgs.push_back(DepFile);
300
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000301 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
303 const char *DepTarget;
304
305 // If user provided -o, that is the dependency target, except
306 // when we are only generating a dependency file.
307 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
308 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000309 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 } else {
311 // Otherwise derive from the base input.
312 //
313 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000315 llvm::sys::path::replace_extension(P, "o");
316 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 }
318
319 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 QuoteTarget(DepTarget, Quoted);
322 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000325 if (A->getOption().matches(options::OPT_M) ||
326 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000328 if ((isa<PrecompileJobAction>(JA) &&
329 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
330 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000331 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332 }
333
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000334 if (Args.hasArg(options::OPT_MG)) {
335 if (!A || A->getOption().matches(options::OPT_MD) ||
336 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000337 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000338 CmdArgs.push_back("-MG");
339 }
340
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000342 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000343
344 // Convert all -MQ <target> args to -MT <quoted target>
345 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
346 options::OPT_MQ),
347 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 const Arg *A = *it;
349 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350
Daniel Dunbara442fd52010-06-11 22:00:13 +0000351 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000353 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000354 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back(Args.MakeArgString(Quoted));
356
357 // -MT flag - no change
358 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000359 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000360 }
361 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 // Add -i* options, and automatically translate to
364 // -include-pch/-include-pth for transparent PCH support. It's
365 // wonky, but we include looking for .gch so we can support seamless
366 // replacement into a build system already set up to be generating
367 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000368 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000369 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
370 ie = Args.filtered_end(); it != ie; ++it) {
371 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372
373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
428 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000429 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
430 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
432 // Add -Wp, and -Xassembler if using the preprocessor.
433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000470 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000471 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000472 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000473
474 // Add system include arguments.
475 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000476}
477
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478// FIXME: Move to target hook.
479static bool isSignedCharDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return true;
483
Tim Northover9bb857a2013-01-31 12:13:10 +0000484 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000485 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000487 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000488 case llvm::Triple::thumb:
489 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000490 if (Triple.isOSDarwin() || Triple.isOSWindows())
491 return true;
492 return false;
493
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000494 case llvm::Triple::ppc:
495 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000496 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000497 return true;
498 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000499
David Majnemerdcecd932015-05-23 19:23:55 +0000500 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000501 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000502 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000503 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000504 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000505 }
506}
507
Robert Lytton0e076492013-08-13 09:43:10 +0000508static bool isNoCommonDefault(const llvm::Triple &Triple) {
509 switch (Triple.getArch()) {
510 default:
511 return false;
512
513 case llvm::Triple::xcore:
514 return true;
515 }
516}
517
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000518// Handle -mhwdiv=.
519static void getARMHWDivFeatures(const Driver &D, const Arg *A,
520 const ArgList &Args,
521 std::vector<const char *> &Features) {
522 StringRef HWDiv = A->getValue();
523 if (HWDiv == "arm") {
524 Features.push_back("+hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else if (HWDiv == "thumb") {
527 Features.push_back("-hwdiv-arm");
528 Features.push_back("+hwdiv");
529 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
530 Features.push_back("+hwdiv-arm");
531 Features.push_back("+hwdiv");
532 } else if (HWDiv == "none") {
533 Features.push_back("-hwdiv-arm");
534 Features.push_back("-hwdiv");
535 } else
536 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
537}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000538
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539// Handle -mfpu=.
540//
541// FIXME: Centralize feature selection, defaulting shouldn't be also in the
542// frontend target.
543static void getARMFPUFeatures(const Driver &D, const Arg *A,
544 const ArgList &Args,
545 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000546 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000547
Renato Golin0600e1e2015-05-08 21:04:50 +0000548 // FIXME: Why does "none" disable more than "invalid"?
549 if (FPU == "none") {
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000550 Features.push_back("-vfp2");
551 Features.push_back("-vfp3");
552 Features.push_back("-vfp4");
553 Features.push_back("-fp-armv8");
554 Features.push_back("-crypto");
555 Features.push_back("-neon");
Renato Golin0600e1e2015-05-08 21:04:50 +0000556 return;
557 }
558
559 // FIXME: Make sure we differentiate sp-only.
560 if (FPU.find("-sp-") != StringRef::npos) {
561 Features.push_back("+fp-only-sp");
562 }
563
564 // All other FPU types, valid or invalid.
565 switch(llvm::ARMTargetParser::parseFPU(FPU)) {
Renato Golincb3b0c62015-05-12 10:34:10 +0000566 case llvm::ARM::FK_INVALID:
567 case llvm::ARM::FK_SOFTVFP:
Renato Golin0600e1e2015-05-08 21:04:50 +0000568 Features.push_back("-vfp2");
569 Features.push_back("-vfp3");
570 Features.push_back("-neon");
571 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000572 case llvm::ARM::FK_VFP:
573 case llvm::ARM::FK_VFPV2:
Renato Golin0600e1e2015-05-08 21:04:50 +0000574 Features.push_back("+vfp2");
575 Features.push_back("-neon");
576 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000577 case llvm::ARM::FK_VFPV3_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000578 Features.push_back("+d16");
579 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000580 case llvm::ARM::FK_VFPV3:
Renato Golin0600e1e2015-05-08 21:04:50 +0000581 Features.push_back("+vfp3");
582 Features.push_back("-neon");
583 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000584 case llvm::ARM::FK_VFPV4_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000585 Features.push_back("+d16");
586 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000587 case llvm::ARM::FK_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000588 Features.push_back("+vfp4");
589 Features.push_back("-neon");
590 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000591 case llvm::ARM::FK_FPV5_D16:
Renato Golin0600e1e2015-05-08 21:04:50 +0000592 Features.push_back("+d16");
593 // fall-through
Renato Golincb3b0c62015-05-12 10:34:10 +0000594 case llvm::ARM::FK_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000595 Features.push_back("+fp-armv8");
596 Features.push_back("-neon");
597 Features.push_back("-crypto");
598 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000599 case llvm::ARM::FK_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000600 Features.push_back("+fp-armv8");
601 Features.push_back("+neon");
602 Features.push_back("-crypto");
603 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000604 case llvm::ARM::FK_CRYPTO_NEON_FP_ARMV8:
Renato Golin0600e1e2015-05-08 21:04:50 +0000605 Features.push_back("+fp-armv8");
606 Features.push_back("+neon");
607 Features.push_back("+crypto");
608 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000609 case llvm::ARM::FK_NEON:
Renato Golin0600e1e2015-05-08 21:04:50 +0000610 Features.push_back("+neon");
611 break;
Renato Golincb3b0c62015-05-12 10:34:10 +0000612 case llvm::ARM::FK_NEON_VFPV4:
Renato Golin0600e1e2015-05-08 21:04:50 +0000613 Features.push_back("+neon");
614 Features.push_back("+vfp4");
615 break;
616 default:
Chad Rosiercfbfc582012-04-04 20:51:35 +0000617 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Renato Golin0600e1e2015-05-08 21:04:50 +0000618 }
Chad Rosiercfbfc582012-04-04 20:51:35 +0000619}
620
John Brawn94fd9632015-05-21 12:19:49 +0000621static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000622 llvm::StringRef Arch = Triple.getArchName();
623 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000624}
625
John Brawn94fd9632015-05-21 12:19:49 +0000626static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000627 llvm::StringRef Arch = Triple.getArchName();
628 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
629 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000630}
631
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000632// Select the float ABI as determined by -msoft-float, -mhard-float, and
633// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000634StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000635 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000636 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000637 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
638 options::OPT_mhard_float,
639 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000640 if (A->getOption().matches(options::OPT_msoft_float))
641 FloatABI = "soft";
642 else if (A->getOption().matches(options::OPT_mhard_float))
643 FloatABI = "hard";
644 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000645 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000646 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000647 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000648 << A->getAsString(Args);
649 FloatABI = "soft";
650 }
651 }
652 }
653
654 // If unspecified, choose the default based on the platform.
655 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000656 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000657 case llvm::Triple::Darwin:
658 case llvm::Triple::MacOSX:
659 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000660 // Darwin defaults to "softfp" for v6 and v7.
661 //
John Brawn94fd9632015-05-21 12:19:49 +0000662 if (getARMSubArchVersionNumber(Triple) == 6 ||
663 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 FloatABI = "softfp";
665 else
666 FloatABI = "soft";
667 break;
668 }
669
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000670 // FIXME: this is invalid for WindowsCE
671 case llvm::Triple::Win32:
672 FloatABI = "hard";
673 break;
674
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000675 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000676 switch(Triple.getEnvironment()) {
677 case llvm::Triple::GNUEABIHF:
678 FloatABI = "hard";
679 break;
680 default:
681 // FreeBSD defaults to soft float
682 FloatABI = "soft";
683 break;
684 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000685 break;
686
Daniel Dunbar78485922009-09-10 23:00:09 +0000687 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000688 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000689 case llvm::Triple::GNUEABIHF:
690 FloatABI = "hard";
691 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000692 case llvm::Triple::GNUEABI:
693 FloatABI = "softfp";
694 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000695 case llvm::Triple::EABIHF:
696 FloatABI = "hard";
697 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000698 case llvm::Triple::EABI:
699 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
700 FloatABI = "softfp";
701 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000702 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000703 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000704 FloatABI = "softfp";
705 else
706 FloatABI = "soft";
707 break;
708 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000709 default:
710 // Assume "soft", but warn the user we are guessing.
711 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000712 if (Triple.getOS() != llvm::Triple::UnknownOS ||
713 !Triple.isOSBinFormatMachO())
714 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000715 break;
716 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000717 }
718 }
719
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000720 return FloatABI;
721}
722
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000723static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
724 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000725 std::vector<const char *> &Features,
726 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000727 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
728 if (!ForAS) {
729 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
730 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
731 // stripped out by the ARM target. We should probably pass this a new
732 // -target-option, which is handled by the -cc1/-cc1as invocation.
733 //
734 // FIXME2: For consistency, it would be ideal if we set up the target
735 // machine state the same when using the frontend or the assembler. We don't
736 // currently do that for the assembler, we pass the options directly to the
737 // backend and never even instantiate the frontend TargetInfo. If we did,
738 // and used its handleTargetFeatures hook, then we could ensure the
739 // assembler and the frontend behave the same.
740
741 // Use software floating point operations?
742 if (FloatABI == "soft")
743 Features.push_back("+soft-float");
744
745 // Use software floating point argument passing?
746 if (FloatABI != "hard")
747 Features.push_back("+soft-float-abi");
748 }
749
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000750 // Honor -mfpu=.
751 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000752 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000753 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
754 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755
John Brawn94fd9632015-05-21 12:19:49 +0000756 // Check if -march is valid by checking if it can be canonicalised. getARMArch
757 // is used here instead of just checking the -march value in order to handle
758 // -march=native correctly.
759 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
760 StringRef Arch = arm::getARMArch(Args, Triple);
761 if (llvm::ARMTargetParser::getCanonicalArchName(Arch).empty())
John Brawna95c1a82015-05-08 12:52:18 +0000762 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000763 }
764
765 // We do a similar thing with -mcpu, but here things are complicated because
766 // the only function we have to check if a cpu is valid is
767 // getLLVMArchSuffixForARM which also needs an architecture.
768 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
769 StringRef CPU = arm::getARMTargetCPU(Args, Triple);
770 StringRef Arch = arm::getARMArch(Args, Triple);
771 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
772 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
773 }
John Brawna95c1a82015-05-08 12:52:18 +0000774
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000775 // Setting -msoft-float effectively disables NEON because of the GCC
776 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000777 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000778 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000779 // Also need to explicitly disable features which imply NEON.
780 Features.push_back("-crypto");
781 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000782
Eric Christopher269c2a22015-04-04 03:34:43 +0000783 // En/disable crc code generation.
784 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000785 if (A->getOption().matches(options::OPT_mcrc))
786 Features.push_back("+crc");
787 else
788 Features.push_back("-crc");
789 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000790
791 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
792 Features.insert(Features.begin(), "+v8.1a");
793 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000794}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000795
796void Clang::AddARMTargetArgs(const ArgList &Args,
797 ArgStringList &CmdArgs,
798 bool KernelOrKext) const {
799 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000800 // Get the effective triple, which takes into account the deployment target.
801 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
802 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000803
804 // Select the ABI to use.
805 //
806 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000807 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000808 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000809 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000810 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000811 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000812 // The backend is hardwired to assume AAPCS for M-class processors, ensure
813 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000814 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000815 Triple.getOS() == llvm::Triple::UnknownOS ||
John Brawn94fd9632015-05-21 12:19:49 +0000816 isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000817 ABIName = "aapcs";
818 } else {
819 ABIName = "apcs-gnu";
820 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000821 } else if (Triple.isOSWindows()) {
822 // FIXME: this is invalid for WindowsCE
823 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000824 } else {
825 // Select the default based on the platform.
826 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000827 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000828 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000829 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000830 ABIName = "aapcs-linux";
831 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000832 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000833 case llvm::Triple::EABI:
834 ABIName = "aapcs";
835 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000836 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000837 if (Triple.getOS() == llvm::Triple::NetBSD)
838 ABIName = "apcs-gnu";
839 else
840 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000841 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000842 }
843 }
844 CmdArgs.push_back("-target-abi");
845 CmdArgs.push_back(ABIName);
846
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000847 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000848 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000849 if (FloatABI == "soft") {
850 // Floating point operations and argument passing are soft.
851 //
852 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000853 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000854 CmdArgs.push_back("-mfloat-abi");
855 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000856 } else if (FloatABI == "softfp") {
857 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000858 CmdArgs.push_back("-mfloat-abi");
859 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000860 } else {
861 // Floating point operations and argument passing are hard.
862 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000863 CmdArgs.push_back("-mfloat-abi");
864 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000865 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000866
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000867 // Kernel code has more strict alignment requirements.
868 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000869 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000870 CmdArgs.push_back("-backend-option");
871 CmdArgs.push_back("-arm-long-calls");
872 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000873
Daniel Dunbar12100e22011-03-22 16:48:17 +0000874 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000875 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000876
877 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000878 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000879 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000880 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000881
Bob Wilson0874e532014-07-29 00:23:18 +0000882 // -mkernel implies -mstrict-align; don't add the redundant option.
883 if (!KernelOrKext) {
884 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
885 options::OPT_munaligned_access)) {
886 CmdArgs.push_back("-backend-option");
887 if (A->getOption().matches(options::OPT_mno_unaligned_access))
888 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000889 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000890 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000891 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000892 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000893 }
Bob Wilson0874e532014-07-29 00:23:18 +0000894 }
895 }
896
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000897 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000898 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
899 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000900 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000901 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000902 CmdArgs.push_back("-arm-global-merge=false");
903 else
904 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000905 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000906
Bob Wilson9c8af452013-04-11 18:53:25 +0000907 if (!Args.hasFlag(options::OPT_mimplicit_float,
908 options::OPT_mno_implicit_float,
909 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000910 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000911
Logan Chien749763e2014-04-03 13:12:44 +0000912 // llvm does not support reserving registers in general. There is support
913 // for reserving r9 on ARM though (defined as a platform-specific register
914 // in ARM EABI).
915 if (Args.hasArg(options::OPT_ffixed_r9)) {
916 CmdArgs.push_back("-backend-option");
917 CmdArgs.push_back("-arm-reserve-r9");
918 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000919}
920
Tim Northover573cbee2014-05-24 12:52:07 +0000921/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
922/// targeting.
923static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000924 Arg *A;
925 std::string CPU;
926 // If we have -mtune or -mcpu, use that.
927 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
928 CPU = A->getValue();
929 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000930 StringRef Mcpu = A->getValue();
Kevin Qin110db6f2014-07-18 07:03:22 +0000931 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000932 }
933
Kevin Qin110db6f2014-07-18 07:03:22 +0000934 // Handle CPU name is 'native'.
935 if (CPU == "native")
936 return llvm::sys::getHostCPUName();
937 else if (CPU.size())
938 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000939
James Molloy9b1586b2014-04-17 12:51:17 +0000940 // Make sure we pick "cyclone" if -arch is used.
941 // FIXME: Should this be picked by checking the target triple instead?
942 if (Args.getLastArg(options::OPT_arch))
943 return "cyclone";
944
945 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000946}
947
Tim Northover573cbee2014-05-24 12:52:07 +0000948void Clang::AddAArch64TargetArgs(const ArgList &Args,
949 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000950 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
951 llvm::Triple Triple(TripleStr);
952
953 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
954 Args.hasArg(options::OPT_mkernel) ||
955 Args.hasArg(options::OPT_fapple_kext))
956 CmdArgs.push_back("-disable-red-zone");
957
958 if (!Args.hasFlag(options::OPT_mimplicit_float,
959 options::OPT_mno_implicit_float, true))
960 CmdArgs.push_back("-no-implicit-float");
961
Craig Topper92fc2df2014-05-17 16:56:41 +0000962 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000963 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
964 ABIName = A->getValue();
965 else if (Triple.isOSDarwin())
966 ABIName = "darwinpcs";
967 else
968 ABIName = "aapcs";
969
970 CmdArgs.push_back("-target-abi");
971 CmdArgs.push_back(ABIName);
972
Bob Wilson0874e532014-07-29 00:23:18 +0000973 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
974 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000975 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000976 if (A->getOption().matches(options::OPT_mno_unaligned_access))
977 CmdArgs.push_back("-aarch64-strict-align");
978 else
979 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000980 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000981
Bradley Smith9ff64332014-10-13 10:16:06 +0000982 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
983 options::OPT_mno_fix_cortex_a53_835769)) {
984 CmdArgs.push_back("-backend-option");
985 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
986 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
987 else
988 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000989 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
990 // Enabled A53 errata (835769) workaround by default on android
991 CmdArgs.push_back("-backend-option");
992 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000993 }
994
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000995 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000996 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
997 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000998 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000999 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001000 CmdArgs.push_back("-aarch64-global-merge=false");
1001 else
1002 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001003 }
Renato Golinb625f482015-01-25 23:17:48 +00001004
1005 if (Args.hasArg(options::OPT_ffixed_x18)) {
1006 CmdArgs.push_back("-backend-option");
1007 CmdArgs.push_back("-aarch64-reserve-x18");
1008 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001009}
1010
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001011// Get CPU and ABI names. They are not independent
1012// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001013void mips::getMipsCPUAndABI(const ArgList &Args,
1014 const llvm::Triple &Triple,
1015 StringRef &CPUName,
1016 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001017 const char *DefMips32CPU = "mips32r2";
1018 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001019
Daniel Sanders2bf13662014-07-10 14:40:57 +00001020 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1021 // default for mips64(el)?-img-linux-gnu.
1022 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1023 Triple.getEnvironment() == llvm::Triple::GNU) {
1024 DefMips32CPU = "mips32r6";
1025 DefMips64CPU = "mips64r6";
1026 }
1027
Brad Smithba26f582015-01-06 02:53:17 +00001028 // MIPS3 is the default for mips64*-unknown-openbsd.
1029 if (Triple.getOS() == llvm::Triple::OpenBSD)
1030 DefMips64CPU = "mips3";
1031
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001032 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001033 options::OPT_mcpu_EQ))
1034 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001035
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001036 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001037 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001038 // Convert a GNU style Mips ABI name to the name
1039 // accepted by LLVM Mips backend.
1040 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
1041 .Case("32", "o32")
1042 .Case("64", "n64")
1043 .Default(ABIName);
1044 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001045
1046 // Setup default CPU and ABI names.
1047 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001048 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001049 default:
1050 llvm_unreachable("Unexpected triple arch name");
1051 case llvm::Triple::mips:
1052 case llvm::Triple::mipsel:
1053 CPUName = DefMips32CPU;
1054 break;
1055 case llvm::Triple::mips64:
1056 case llvm::Triple::mips64el:
1057 CPUName = DefMips64CPU;
1058 break;
1059 }
1060 }
1061
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001062 if (ABIName.empty()) {
1063 // Deduce ABI name from the target triple.
1064 if (Triple.getArch() == llvm::Triple::mips ||
1065 Triple.getArch() == llvm::Triple::mipsel)
1066 ABIName = "o32";
1067 else
1068 ABIName = "n64";
1069 }
1070
1071 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001072 // Deduce CPU name from ABI name.
1073 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001074 .Cases("o32", "eabi", DefMips32CPU)
1075 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001076 .Default("");
1077 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001078
1079 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001080}
1081
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001082// Convert ABI name to the GNU tools acceptable variant.
1083static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1084 return llvm::StringSwitch<llvm::StringRef>(ABI)
1085 .Case("o32", "32")
1086 .Case("n64", "64")
1087 .Default(ABI);
1088}
1089
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001090// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1091// and -mfloat-abi=.
1092static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001093 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001094 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001095 options::OPT_mhard_float,
1096 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001097 if (A->getOption().matches(options::OPT_msoft_float))
1098 FloatABI = "soft";
1099 else if (A->getOption().matches(options::OPT_mhard_float))
1100 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001101 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001102 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001103 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001104 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001105 FloatABI = "hard";
1106 }
1107 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001108 }
1109
1110 // If unspecified, choose the default based on the platform.
1111 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001112 // Assume "hard", because it's a default value used by gcc.
1113 // When we start to recognize specific target MIPS processors,
1114 // we will be able to select the default more correctly.
1115 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 }
1117
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001118 return FloatABI;
1119}
1120
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001121static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001122 std::vector<const char *> &Features,
1123 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001124 StringRef FeatureName) {
1125 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001126 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001127 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001128 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001129 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 }
1131}
1132
Daniel Sanders379d44b2014-07-16 11:52:23 +00001133static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1134 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001136 StringRef CPUName;
1137 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001138 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139 ABIName = getGnuCompatibleMipsABIName(ABIName);
1140
Daniel Sandersfeb61302014-08-08 15:47:17 +00001141 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1142 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001143
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001144 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001145 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001146 // FIXME: Note, this is a hack. We need to pass the selected float
1147 // mode to the MipsTargetInfoBase to define appropriate macros there.
1148 // Now it is the only method.
1149 Features.push_back("+soft-float");
1150 }
1151
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001153 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001154 if (Val == "2008") {
1155 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1156 Features.push_back("+nan2008");
1157 else {
1158 Features.push_back("-nan2008");
1159 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1160 }
1161 } else if (Val == "legacy") {
1162 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1163 Features.push_back("-nan2008");
1164 else {
1165 Features.push_back("+nan2008");
1166 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1167 }
1168 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001169 D.Diag(diag::err_drv_unsupported_option_argument)
1170 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001171 }
1172
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001173 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1174 options::OPT_mdouble_float, "single-float");
1175 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1176 "mips16");
1177 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1178 options::OPT_mno_micromips, "micromips");
1179 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1180 "dsp");
1181 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1182 "dspr2");
1183 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1184 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001185
1186 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1187 // pass -mfpxx
1188 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1189 options::OPT_mfp64)) {
1190 if (A->getOption().matches(options::OPT_mfp32))
1191 Features.push_back(Args.MakeArgString("-fp64"));
1192 else if (A->getOption().matches(options::OPT_mfpxx)) {
1193 Features.push_back(Args.MakeArgString("+fpxx"));
1194 Features.push_back(Args.MakeArgString("+nooddspreg"));
1195 } else
1196 Features.push_back(Args.MakeArgString("+fp64"));
1197 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001198 Features.push_back(Args.MakeArgString("+fpxx"));
1199 Features.push_back(Args.MakeArgString("+nooddspreg"));
1200 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001201
Daniel Sanders28e5d392014-07-10 10:39:51 +00001202 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1203 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001204}
1205
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001207 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208 const Driver &D = getToolChain().getDriver();
1209 StringRef CPUName;
1210 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001211 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001212 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001213
1214 CmdArgs.push_back("-target-abi");
1215 CmdArgs.push_back(ABIName.data());
1216
1217 StringRef FloatABI = getMipsFloatABI(D, Args);
1218
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001219 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001220 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001222 CmdArgs.push_back("-mfloat-abi");
1223 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001224 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001225 else {
1226 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001227 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001228 CmdArgs.push_back("-mfloat-abi");
1229 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001230 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001231
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001232 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1233 if (A->getOption().matches(options::OPT_mxgot)) {
1234 CmdArgs.push_back("-mllvm");
1235 CmdArgs.push_back("-mxgot");
1236 }
1237 }
1238
Simon Atanasyanc580b322013-05-11 06:33:44 +00001239 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1240 options::OPT_mno_ldc1_sdc1)) {
1241 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1242 CmdArgs.push_back("-mllvm");
1243 CmdArgs.push_back("-mno-ldc1-sdc1");
1244 }
1245 }
1246
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001247 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1248 options::OPT_mno_check_zero_division)) {
1249 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1250 CmdArgs.push_back("-mllvm");
1251 CmdArgs.push_back("-mno-check-zero-division");
1252 }
1253 }
1254
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001255 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001256 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001257 CmdArgs.push_back("-mllvm");
1258 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1259 A->claim();
1260 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001261}
1262
Hal Finkel8eb59282012-06-11 22:35:19 +00001263/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1264static std::string getPPCTargetCPU(const ArgList &Args) {
1265 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001266 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001267
1268 if (CPUName == "native") {
1269 std::string CPU = llvm::sys::getHostCPUName();
1270 if (!CPU.empty() && CPU != "generic")
1271 return CPU;
1272 else
1273 return "";
1274 }
1275
1276 return llvm::StringSwitch<const char *>(CPUName)
1277 .Case("common", "generic")
1278 .Case("440", "440")
1279 .Case("440fp", "440")
1280 .Case("450", "450")
1281 .Case("601", "601")
1282 .Case("602", "602")
1283 .Case("603", "603")
1284 .Case("603e", "603e")
1285 .Case("603ev", "603ev")
1286 .Case("604", "604")
1287 .Case("604e", "604e")
1288 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001289 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001290 .Case("G3", "g3")
1291 .Case("7400", "7400")
1292 .Case("G4", "g4")
1293 .Case("7450", "7450")
1294 .Case("G4+", "g4+")
1295 .Case("750", "750")
1296 .Case("970", "970")
1297 .Case("G5", "g5")
1298 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001299 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001300 .Case("e500mc", "e500mc")
1301 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001302 .Case("power3", "pwr3")
1303 .Case("power4", "pwr4")
1304 .Case("power5", "pwr5")
1305 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001306 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001307 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001308 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001309 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001310 .Case("pwr3", "pwr3")
1311 .Case("pwr4", "pwr4")
1312 .Case("pwr5", "pwr5")
1313 .Case("pwr5x", "pwr5x")
1314 .Case("pwr6", "pwr6")
1315 .Case("pwr6x", "pwr6x")
1316 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001317 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001318 .Case("powerpc", "ppc")
1319 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001320 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 .Default("");
1322 }
1323
1324 return "";
1325}
1326
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001327static void getPPCTargetFeatures(const ArgList &Args,
1328 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001329 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1330 ie = Args.filtered_end();
1331 it != ie; ++it) {
1332 StringRef Name = (*it)->getOption().getName();
1333 (*it)->claim();
1334
1335 // Skip over "-m".
1336 assert(Name.startswith("m") && "Invalid feature name.");
1337 Name = Name.substr(1);
1338
1339 bool IsNegative = Name.startswith("no-");
1340 if (IsNegative)
1341 Name = Name.substr(3);
1342
1343 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1344 // pass the correct option to the backend while calling the frontend
1345 // option the same.
1346 // TODO: Change the LLVM backend option maybe?
1347 if (Name == "mfcrf")
1348 Name = "mfocrf";
1349
1350 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1351 }
1352
1353 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001354 AddTargetFeature(Args, Features, options::OPT_faltivec,
1355 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001356}
1357
Ulrich Weigand8afad612014-07-28 13:17:52 +00001358void Clang::AddPPCTargetArgs(const ArgList &Args,
1359 ArgStringList &CmdArgs) const {
1360 // Select the ABI to use.
1361 const char *ABIName = nullptr;
1362 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1363 ABIName = A->getValue();
1364 } else if (getToolChain().getTriple().isOSLinux())
1365 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001366 case llvm::Triple::ppc64: {
1367 // When targeting a processor that supports QPX, or if QPX is
1368 // specifically enabled, default to using the ABI that supports QPX (so
1369 // long as it is not specifically disabled).
1370 bool HasQPX = false;
1371 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1372 HasQPX = A->getValue() == StringRef("a2q");
1373 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1374 if (HasQPX) {
1375 ABIName = "elfv1-qpx";
1376 break;
1377 }
1378
Ulrich Weigand8afad612014-07-28 13:17:52 +00001379 ABIName = "elfv1";
1380 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001381 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001382 case llvm::Triple::ppc64le:
1383 ABIName = "elfv2";
1384 break;
1385 default:
1386 break;
1387 }
1388
1389 if (ABIName) {
1390 CmdArgs.push_back("-target-abi");
1391 CmdArgs.push_back(ABIName);
1392 }
1393}
1394
1395bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1396 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1397 return A && (A->getValue() == StringRef(Value));
1398}
1399
Tom Stellard6674c702013-04-01 20:56:53 +00001400/// Get the (LLVM) name of the R600 gpu we are targeting.
1401static std::string getR600TargetGPU(const ArgList &Args) {
1402 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001403 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001404 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001405 .Cases("rv630", "rv635", "r600")
1406 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001407 .Case("rv740", "rv770")
1408 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001409 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001410 .Case("hemlock", "cypress")
1411 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001412 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001413 }
1414 return "";
1415}
1416
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001417static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001418 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001419 bool SoftFloatABI = true;
1420 if (Arg *A =
1421 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1422 if (A->getOption().matches(options::OPT_mhard_float))
1423 SoftFloatABI = false;
1424 }
1425 if (SoftFloatABI)
1426 Features.push_back("+soft-float");
1427}
1428
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429void Clang::AddSparcTargetArgs(const ArgList &Args,
1430 ArgStringList &CmdArgs) const {
1431 const Driver &D = getToolChain().getDriver();
1432
Brad Smith10cd0f42014-07-11 20:12:08 +00001433 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001434 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001435 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1436 options::OPT_mhard_float)) {
1437 if (A->getOption().matches(options::OPT_msoft_float))
1438 FloatABI = "soft";
1439 else if (A->getOption().matches(options::OPT_mhard_float))
1440 FloatABI = "hard";
1441 }
1442
1443 // If unspecified, choose the default based on the platform.
1444 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001445 // Assume "soft", but warn the user we are guessing.
1446 FloatABI = "soft";
1447 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001448 }
1449
1450 if (FloatABI == "soft") {
1451 // Floating point operations and argument passing are soft.
1452 //
1453 // FIXME: This changes CPP defines, we need -target-soft-float.
1454 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001455 } else {
1456 assert(FloatABI == "hard" && "Invalid float abi!");
1457 CmdArgs.push_back("-mhard-float");
1458 }
1459}
1460
Richard Sandiford4652d892013-07-19 16:51:51 +00001461static const char *getSystemZTargetCPU(const ArgList &Args) {
1462 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1463 return A->getValue();
1464 return "z10";
1465}
1466
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001467static void getSystemZTargetFeatures(const ArgList &Args,
1468 std::vector<const char *> &Features) {
1469 // -m(no-)htm overrides use of the transactional-execution facility.
1470 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1471 options::OPT_mno_htm)) {
1472 if (A->getOption().matches(options::OPT_mhtm))
1473 Features.push_back("+transactional-execution");
1474 else
1475 Features.push_back("-transactional-execution");
1476 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001477 // -m(no-)vx overrides use of the vector facility.
1478 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1479 options::OPT_mno_vx)) {
1480 if (A->getOption().matches(options::OPT_mvx))
1481 Features.push_back("+vector");
1482 else
1483 Features.push_back("-vector");
1484 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001485}
1486
Chandler Carruth953fb082013-01-13 11:46:33 +00001487static const char *getX86TargetCPU(const ArgList &Args,
1488 const llvm::Triple &Triple) {
1489 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001490 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001491 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001492 return "core-avx2";
1493
Chandler Carruth953fb082013-01-13 11:46:33 +00001494 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001495 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001496
1497 // FIXME: Reject attempts to use -march=native unless the target matches
1498 // the host.
1499 //
1500 // FIXME: We should also incorporate the detected target features for use
1501 // with -native.
1502 std::string CPU = llvm::sys::getHostCPUName();
1503 if (!CPU.empty() && CPU != "generic")
1504 return Args.MakeArgString(CPU);
1505 }
1506
1507 // Select the default CPU if none was given (or detection failed).
1508
1509 if (Triple.getArch() != llvm::Triple::x86_64 &&
1510 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001511 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001512
1513 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1514
1515 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001516 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001517 if (Triple.getArchName() == "x86_64h")
1518 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001519 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001520 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001521
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001522 // Set up default CPU name for PS4 compilers.
1523 if (Triple.isPS4CPU())
1524 return "btver2";
1525
Alexey Bataev286d1b92014-01-31 04:07:13 +00001526 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001527 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001528 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001529
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001530 // Everything else goes to x86-64 in 64-bit mode.
1531 if (Is64Bit)
1532 return "x86-64";
1533
1534 switch (Triple.getOS()) {
1535 case llvm::Triple::FreeBSD:
1536 case llvm::Triple::NetBSD:
1537 case llvm::Triple::OpenBSD:
1538 return "i486";
1539 case llvm::Triple::Haiku:
1540 return "i586";
1541 case llvm::Triple::Bitrig:
1542 return "i686";
1543 default:
1544 // Fallback to p4.
1545 return "pentium4";
1546 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001547}
1548
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001549static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1550 switch(T.getArch()) {
1551 default:
1552 return "";
1553
Amara Emerson703da2e2013-10-31 09:32:33 +00001554 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001555 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001556 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001557
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001558 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001559 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001560 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001561 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001562 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001563
1564 case llvm::Triple::mips:
1565 case llvm::Triple::mipsel:
1566 case llvm::Triple::mips64:
1567 case llvm::Triple::mips64el: {
1568 StringRef CPUName;
1569 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001570 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001571 return CPUName;
1572 }
1573
1574 case llvm::Triple::ppc:
1575 case llvm::Triple::ppc64:
1576 case llvm::Triple::ppc64le: {
1577 std::string TargetCPUName = getPPCTargetCPU(Args);
1578 // LLVM may default to generating code for the native CPU,
1579 // but, like gcc, we default to a more generic option for
1580 // each architecture. (except on Darwin)
1581 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1582 if (T.getArch() == llvm::Triple::ppc64)
1583 TargetCPUName = "ppc64";
1584 else if (T.getArch() == llvm::Triple::ppc64le)
1585 TargetCPUName = "ppc64le";
1586 else
1587 TargetCPUName = "ppc";
1588 }
1589 return TargetCPUName;
1590 }
1591
1592 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001593 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001594 case llvm::Triple::sparcv9:
1595 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001596 return A->getValue();
1597 return "";
1598
1599 case llvm::Triple::x86:
1600 case llvm::Triple::x86_64:
1601 return getX86TargetCPU(Args, T);
1602
1603 case llvm::Triple::hexagon:
1604 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1605
1606 case llvm::Triple::systemz:
1607 return getSystemZTargetCPU(Args);
1608
1609 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001610 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001611 return getR600TargetGPU(Args);
1612 }
1613}
1614
Alp Tokerce365ca2013-12-02 12:43:03 +00001615static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1616 ArgStringList &CmdArgs) {
1617 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1618 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1619 // forward.
1620 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001621 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001622 CmdArgs.push_back(Args.MakeArgString(Plugin));
1623
1624 // Try to pass driver level flags relevant to LTO code generation down to
1625 // the plugin.
1626
1627 // Handle flags for selecting CPU variants.
1628 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1629 if (!CPU.empty())
1630 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1631}
1632
Eric Christopherc54920a2015-03-23 19:26:05 +00001633static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001634 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001635 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001636 // If -march=native, autodetect the feature list.
1637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1638 if (StringRef(A->getValue()) == "native") {
1639 llvm::StringMap<bool> HostFeatures;
1640 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1641 for (auto &F : HostFeatures)
1642 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1643 F.first()));
1644 }
1645 }
1646
Jim Grosbach82eee262013-11-16 00:53:35 +00001647 if (Triple.getArchName() == "x86_64h") {
1648 // x86_64h implies quite a few of the more modern subtarget features
1649 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1650 Features.push_back("-rdrnd");
1651 Features.push_back("-aes");
1652 Features.push_back("-pclmul");
1653 Features.push_back("-rtm");
1654 Features.push_back("-hle");
1655 Features.push_back("-fsgsbase");
1656 }
1657
Eric Christopherc54920a2015-03-23 19:26:05 +00001658 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001659 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001660 if (Triple.getArch() == llvm::Triple::x86_64) {
1661 Features.push_back("+sse4.2");
1662 Features.push_back("+popcnt");
1663 } else
1664 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 }
1666
Eric Christopherc54920a2015-03-23 19:26:05 +00001667 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001668 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1669 StringRef Arch = A->getValue();
1670 bool ArchUsed = false;
1671 // First, look for flags that are shared in x86 and x86-64.
1672 if (Triple.getArch() == llvm::Triple::x86_64 ||
1673 Triple.getArch() == llvm::Triple::x86) {
1674 if (Arch == "AVX" || Arch == "AVX2") {
1675 ArchUsed = true;
1676 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1677 }
1678 }
1679 // Then, look for x86-specific flags.
1680 if (Triple.getArch() == llvm::Triple::x86) {
1681 if (Arch == "IA32") {
1682 ArchUsed = true;
1683 } else if (Arch == "SSE" || Arch == "SSE2") {
1684 ArchUsed = true;
1685 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1686 }
1687 }
1688 if (!ArchUsed)
1689 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1690 }
1691
Jim Grosbach82eee262013-11-16 00:53:35 +00001692 // Now add any that the user explicitly requested on the command line,
1693 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001694 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1695 ie = Args.filtered_end();
1696 it != ie; ++it) {
1697 StringRef Name = (*it)->getOption().getName();
1698 (*it)->claim();
1699
1700 // Skip over "-m".
1701 assert(Name.startswith("m") && "Invalid feature name.");
1702 Name = Name.substr(1);
1703
1704 bool IsNegative = Name.startswith("no-");
1705 if (IsNegative)
1706 Name = Name.substr(3);
1707
1708 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1709 }
1710}
1711
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001712void Clang::AddX86TargetArgs(const ArgList &Args,
1713 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001714 if (!Args.hasFlag(options::OPT_mred_zone,
1715 options::OPT_mno_red_zone,
1716 true) ||
1717 Args.hasArg(options::OPT_mkernel) ||
1718 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001719 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001720
Bob Wilson2616e2e2013-02-10 16:01:41 +00001721 // Default to avoid implicit floating-point for kernel/kext code, but allow
1722 // that to be overridden with -mno-soft-float.
1723 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1724 Args.hasArg(options::OPT_fapple_kext));
1725 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1726 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001727 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001728 options::OPT_mno_implicit_float)) {
1729 const Option &O = A->getOption();
1730 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1731 O.matches(options::OPT_msoft_float));
1732 }
1733 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001734 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001735
1736 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1737 StringRef Value = A->getValue();
1738 if (Value == "intel" || Value == "att") {
1739 CmdArgs.push_back("-mllvm");
1740 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1741 } else {
1742 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1743 << A->getOption().getName() << Value;
1744 }
1745 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001746}
1747
Tony Linthicum76329bf2011-12-12 21:14:55 +00001748void Clang::AddHexagonTargetArgs(const ArgList &Args,
1749 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001750 CmdArgs.push_back("-mqdsp6-compat");
1751 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001752
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001753 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1754 std::string SmallDataThreshold="-hexagon-small-data-threshold=";
1755 SmallDataThreshold += v;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001756 CmdArgs.push_back ("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001757 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001758 }
1759
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001760 if (!Args.hasArg(options::OPT_fno_short_enums))
1761 CmdArgs.push_back("-fshort-enums");
1762 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1763 CmdArgs.push_back ("-mllvm");
1764 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1765 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001766 CmdArgs.push_back ("-mllvm");
1767 CmdArgs.push_back ("-machine-sink-split=0");
1768}
1769
Kevin Qin110db6f2014-07-18 07:03:22 +00001770// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001771static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001772 std::vector<const char *> &Features) {
1773 SmallVector<StringRef, 8> Split;
1774 text.split(Split, StringRef("+"), -1, false);
1775
1776 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1777 const char *result = llvm::StringSwitch<const char *>(Split[I])
1778 .Case("fp", "+fp-armv8")
1779 .Case("simd", "+neon")
1780 .Case("crc", "+crc")
1781 .Case("crypto", "+crypto")
1782 .Case("nofp", "-fp-armv8")
1783 .Case("nosimd", "-neon")
1784 .Case("nocrc", "-crc")
1785 .Case("nocrypto", "-crypto")
1786 .Default(nullptr);
1787 if (result)
1788 Features.push_back(result);
1789 else if (Split[I] == "neon" || Split[I] == "noneon")
1790 D.Diag(diag::err_drv_no_neon_modifier);
1791 else
1792 return false;
1793 }
1794 return true;
1795}
1796
1797// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1798// decode CPU and feature.
1799static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1800 std::vector<const char *> &Features) {
1801 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1802 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001803 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001804 Features.push_back("+neon");
1805 Features.push_back("+crc");
1806 Features.push_back("+crypto");
1807 } else if (CPU == "generic") {
1808 Features.push_back("+neon");
1809 } else {
1810 return false;
1811 }
1812
1813 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1814 return false;
1815
1816 return true;
1817}
1818
1819static bool
1820getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1821 const ArgList &Args,
1822 std::vector<const char *> &Features) {
1823 std::pair<StringRef, StringRef> Split = March.split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001824
1825 if (Split.first == "armv8-a" ||
1826 Split.first == "armv8a") {
1827 // ok, no additional features.
1828 } else if (
1829 Split.first == "armv8.1-a" ||
1830 Split.first == "armv8.1a" ) {
1831 Features.push_back("+v8.1a");
1832 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001833 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001834 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001835
1836 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1837 return false;
1838
1839 return true;
1840}
1841
1842static bool
1843getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1844 const ArgList &Args,
1845 std::vector<const char *> &Features) {
1846 StringRef CPU;
1847 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1848 return false;
1849
1850 return true;
1851}
1852
1853static bool
1854getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1855 const ArgList &Args,
1856 std::vector<const char *> &Features) {
1857 // Handle CPU name is 'native'.
1858 if (Mtune == "native")
1859 Mtune = llvm::sys::getHostCPUName();
1860 if (Mtune == "cyclone") {
1861 Features.push_back("+zcm");
1862 Features.push_back("+zcz");
1863 }
1864 return true;
1865}
1866
1867static bool
1868getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1869 const ArgList &Args,
1870 std::vector<const char *> &Features) {
1871 StringRef CPU;
1872 std::vector<const char *> DecodedFeature;
1873 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1874 return false;
1875
1876 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1877}
1878
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001879static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1880 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001881 Arg *A;
1882 bool success = true;
1883 // Enable NEON by default.
1884 Features.push_back("+neon");
1885 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1886 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1887 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1888 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001889 else if (Args.hasArg(options::OPT_arch))
1890 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1891 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001892
1893 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1894 success =
1895 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1896 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1897 success =
1898 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001899 else if (Args.hasArg(options::OPT_arch))
1900 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1901 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001902
1903 if (!success)
1904 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001905
1906 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1907 Features.push_back("-fp-armv8");
1908 Features.push_back("-crypto");
1909 Features.push_back("-neon");
1910 }
Bradley Smith418c5932014-05-02 15:17:51 +00001911
1912 // En/disable crc
1913 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1914 options::OPT_mnocrc)) {
1915 if (A->getOption().matches(options::OPT_mcrc))
1916 Features.push_back("+crc");
1917 else
1918 Features.push_back("-crc");
1919 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001920}
1921
1922static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001923 const ArgList &Args, ArgStringList &CmdArgs,
1924 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001925 std::vector<const char *> Features;
1926 switch (Triple.getArch()) {
1927 default:
1928 break;
1929 case llvm::Triple::mips:
1930 case llvm::Triple::mipsel:
1931 case llvm::Triple::mips64:
1932 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001933 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001934 break;
1935
1936 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001937 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001938 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001939 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001940 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001941 break;
1942
1943 case llvm::Triple::ppc:
1944 case llvm::Triple::ppc64:
1945 case llvm::Triple::ppc64le:
1946 getPPCTargetFeatures(Args, Features);
1947 break;
1948 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001949 case llvm::Triple::sparcel:
Brad Smithf436e9e2014-08-19 21:50:15 +00001950 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001951 getSparcTargetFeatures(Args, Features);
1952 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001953 case llvm::Triple::systemz:
1954 getSystemZTargetFeatures(Args, Features);
1955 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001956 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001957 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001958 getAArch64TargetFeatures(D, Args, Features);
1959 break;
1960 case llvm::Triple::x86:
1961 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001962 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001963 break;
1964 }
Rafael Espindola43964802013-08-21 17:34:32 +00001965
1966 // Find the last of each feature.
1967 llvm::StringMap<unsigned> LastOpt;
1968 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1969 const char *Name = Features[I];
1970 assert(Name[0] == '-' || Name[0] == '+');
1971 LastOpt[Name + 1] = I;
1972 }
1973
1974 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1975 // If this feature was overridden, ignore it.
1976 const char *Name = Features[I];
1977 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1978 assert(LastI != LastOpt.end());
1979 unsigned Last = LastI->second;
1980 if (Last != I)
1981 continue;
1982
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001983 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001984 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001985 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001986}
1987
David Majnemerae394812014-12-09 00:12:30 +00001988static bool
1989shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1990 const llvm::Triple &Triple) {
1991 // We use the zero-cost exception tables for Objective-C if the non-fragile
1992 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1993 // later.
1994 if (runtime.isNonFragile())
1995 return true;
1996
1997 if (!Triple.isMacOSX())
1998 return false;
1999
2000 return (!Triple.isMacOSXVersionLT(10,5) &&
2001 (Triple.getArch() == llvm::Triple::x86_64 ||
2002 Triple.getArch() == llvm::Triple::arm));
2003}
2004
Nico Webere8e53112014-05-11 01:04:02 +00002005// exceptionSettings() exists to share the logic between -cc1 and linker
2006// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002007static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002008 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002009 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002010 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002011 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002012
David Majnemer8de68642014-12-05 08:11:58 +00002013 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002014}
2015
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002016/// Adds exception related arguments to the driver command arguments. There's a
2017/// master flag, -fexceptions and also language specific flags to enable/disable
2018/// C++ and Objective-C exceptions. This makes it possible to for example
2019/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002020static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002021 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002022 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002023 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002024 const Driver &D = TC.getDriver();
2025 const llvm::Triple &Triple = TC.getTriple();
2026
Chad Rosier4fab82c2012-03-26 22:04:46 +00002027 if (KernelOrKext) {
2028 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2029 // arguments now to avoid warnings about unused arguments.
2030 Args.ClaimAllArgs(options::OPT_fexceptions);
2031 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2032 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2033 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2034 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2035 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002036 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002037 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002038
David Majnemer8de68642014-12-05 08:11:58 +00002039 // Gather the exception settings from the command line arguments.
2040 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002041
David Majnemerae394812014-12-09 00:12:30 +00002042 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2043 // is not necessarily sensible, but follows GCC.
2044 if (types::isObjC(InputType) &&
2045 Args.hasFlag(options::OPT_fobjc_exceptions,
2046 options::OPT_fno_objc_exceptions,
2047 true)) {
2048 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002049
David Majnemerae394812014-12-09 00:12:30 +00002050 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002051 }
2052
2053 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002054 bool CXXExceptionsEnabled =
2055 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002056 Arg *ExceptionArg = Args.getLastArg(
2057 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2058 options::OPT_fexceptions, options::OPT_fno_exceptions);
2059 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002060 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002061 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2062 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002063
2064 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002065 if (Triple.isPS4CPU()) {
2066 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2067 assert(ExceptionArg &&
2068 "On the PS4 exceptions should only be enabled if passing "
2069 "an argument");
2070 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2071 const Arg *RTTIArg = TC.getRTTIArg();
2072 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2073 D.Diag(diag::err_drv_argument_not_allowed_with)
2074 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2075 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2076 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2077 } else
2078 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2079
Anders Carlssone96ab552011-02-28 02:27:16 +00002080 CmdArgs.push_back("-fcxx-exceptions");
2081
David Majnemer8de68642014-12-05 08:11:58 +00002082 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002083 }
2084 }
2085
David Majnemer8de68642014-12-05 08:11:58 +00002086 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002087 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002088}
2089
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002090static bool ShouldDisableAutolink(const ArgList &Args,
2091 const ToolChain &TC) {
2092 bool Default = true;
2093 if (TC.getTriple().isOSDarwin()) {
2094 // The native darwin assembler doesn't support the linker_option directives,
2095 // so we disable them if we think the .s file will be passed to it.
2096 Default = TC.useIntegratedAs();
2097 }
2098 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2099 Default);
2100}
2101
Ted Kremenek62093662013-03-12 17:02:12 +00002102static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2103 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002104 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2105 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002106 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002107 return !UseDwarfDirectory;
2108}
2109
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002110/// \brief Check whether the given input tree contains any compilation actions.
2111static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002112 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002113 return true;
2114
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002115 for (const auto &Act : *A)
2116 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002117 return true;
2118
2119 return false;
2120}
2121
2122/// \brief Check if -relax-all should be passed to the internal assembler.
2123/// This is done by default when compiling non-assembler source with -O0.
2124static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2125 bool RelaxDefault = true;
2126
2127 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2128 RelaxDefault = A->getOption().matches(options::OPT_O0);
2129
2130 if (RelaxDefault) {
2131 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002132 for (const auto &Act : C.getActions()) {
2133 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002134 RelaxDefault = true;
2135 break;
2136 }
2137 }
2138 }
2139
2140 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2141 RelaxDefault);
2142}
2143
David Blaikie9260ed62013-07-25 21:19:01 +00002144static void CollectArgsForIntegratedAssembler(Compilation &C,
2145 const ArgList &Args,
2146 ArgStringList &CmdArgs,
2147 const Driver &D) {
2148 if (UseRelaxAll(C, Args))
2149 CmdArgs.push_back("-mrelax-all");
2150
David Peixottodfb66142013-11-14 22:52:58 +00002151 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002152 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002153 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2154 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2155 // arg after parsing the '-I' arg.
2156 bool TakeNextArg = false;
2157
David Blaikie9260ed62013-07-25 21:19:01 +00002158 // When using an integrated assembler, translate -Wa, and -Xassembler
2159 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002160 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002161 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2162 options::OPT_Xassembler),
2163 ie = Args.filtered_end(); it != ie; ++it) {
2164 const Arg *A = *it;
2165 A->claim();
2166
2167 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2168 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002169 if (TakeNextArg) {
2170 CmdArgs.push_back(Value.data());
2171 TakeNextArg = false;
2172 continue;
2173 }
David Blaikie9260ed62013-07-25 21:19:01 +00002174
2175 if (Value == "-force_cpusubtype_ALL") {
2176 // Do nothing, this is the default and we don't support anything else.
2177 } else if (Value == "-L") {
2178 CmdArgs.push_back("-msave-temp-labels");
2179 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002180 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002181 } else if (Value == "--noexecstack") {
2182 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002183 } else if (Value == "-compress-debug-sections" ||
2184 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002185 CompressDebugSections = true;
2186 } else if (Value == "-nocompress-debug-sections" ||
2187 Value == "--nocompress-debug-sections") {
2188 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002189 } else if (Value.startswith("-I")) {
2190 CmdArgs.push_back(Value.data());
2191 // We need to consume the next argument if the current arg is a plain
2192 // -I. The next arg will be the include directory.
2193 if (Value == "-I")
2194 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002195 } else if (Value.startswith("-gdwarf-")) {
2196 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002197 } else {
2198 D.Diag(diag::err_drv_unsupported_option_argument)
2199 << A->getOption().getName() << Value;
2200 }
2201 }
2202 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002203 if (CompressDebugSections) {
2204 if (llvm::zlib::isAvailable())
2205 CmdArgs.push_back("-compress-debug-sections");
2206 else
2207 D.Diag(diag::warn_debug_compression_unavailable);
2208 }
David Blaikie9260ed62013-07-25 21:19:01 +00002209}
2210
Renato Goline807c122014-01-31 11:47:28 +00002211// Until ARM libraries are build separately, we have them all in one library
2212static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002213 // FIXME: handle 64-bit
2214 if (TC.getTriple().isOSWindows() &&
2215 !TC.getTriple().isWindowsItaniumEnvironment())
2216 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002217 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002218 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002219 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002220}
2221
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002222static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2223 // The runtimes are located in the OS-specific resource directory.
2224 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002225 const llvm::Triple &Triple = TC.getTriple();
2226 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002227 StringRef OSLibName =
2228 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002229 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002230 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002231}
2232
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002233static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002234 bool Shared = false) {
2235 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2236 ? "-android"
2237 : "";
2238
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002239 bool IsOSWindows = TC.getTriple().isOSWindows();
2240 StringRef Arch = getArchNameForCompilerRTLib(TC);
2241 const char *Prefix = IsOSWindows ? "" : "lib";
2242 const char *Suffix =
2243 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2244
2245 SmallString<128> Path = getCompilerRTLibDir(TC);
2246 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2247 Arch + Env + Suffix);
2248
2249 return Path;
2250}
2251
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002252// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002253// FIXME: Make sure we can also emit shared objects if they're requested
2254// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002255static void addClangRT(const ToolChain &TC, const ArgList &Args,
2256 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002257 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002258
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002259 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002260 // FIXME: why do we link against gcc when we are using compiler-rt?
2261 CmdArgs.push_back("-lgcc_s");
2262 if (TC.getDriver().CCCIsCXX())
2263 CmdArgs.push_back("-lgcc_eh");
2264 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002265}
2266
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002267static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2268 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002269 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2270 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002271 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002272 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002273 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002274 Args.hasArg(options::OPT_fcreate_profile) ||
2275 Args.hasArg(options::OPT_coverage)))
2276 return;
2277
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002278 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002279}
2280
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002281namespace {
2282enum OpenMPRuntimeKind {
2283 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2284 /// without knowing what runtime to target.
2285 OMPRT_Unknown,
2286
2287 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2288 /// the default for Clang.
2289 OMPRT_OMP,
2290
2291 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2292 /// this runtime but can swallow the pragmas, and find and link against the
2293 /// runtime library itself.
2294 OMPRT_GOMP,
2295
2296 /// The legacy name for the LLVM OpenMP runtim from when it was the Intel
2297 /// OpenMP runtime. We support this mode for users with existing dependencies
2298 /// on this runtime library name.
2299 OMPRT_IOMP5
2300};
2301}
2302
2303/// Compute the desired OpenMP runtime from the flag provided.
2304static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC, const ArgList &Args) {
2305 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2306
2307 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2308 if (A)
2309 RuntimeName = A->getValue();
2310
2311 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
2312 .Case("libomp", OMPRT_OMP)
2313 .Case("libgomp", OMPRT_GOMP)
2314 .Case("libiomp5", OMPRT_IOMP5)
2315 .Default(OMPRT_Unknown);
2316
2317 if (RT == OMPRT_Unknown) {
2318 if (A)
2319 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
2320 << A->getOption().getName() << A->getValue();
2321 else
2322 // FIXME: We could use a nicer diagnostic here.
2323 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2324 }
2325
2326 return RT;
2327}
2328
Alexey Samsonov52550342014-09-15 19:58:40 +00002329static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2330 ArgStringList &CmdArgs, StringRef Sanitizer,
2331 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002332 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002333 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002334 if (!IsShared)
2335 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002336 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002337 if (!IsShared)
2338 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002339}
2340
Alexey Samsonov52550342014-09-15 19:58:40 +00002341// Tries to use a file with the list of dynamic symbols that need to be exported
2342// from the runtime library. Returns true if the file was found.
2343static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2344 ArgStringList &CmdArgs,
2345 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002346 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2347 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2348 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002349 return true;
2350 }
2351 return false;
2352}
2353
2354static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2355 ArgStringList &CmdArgs) {
2356 // Force linking against the system libraries sanitizers depends on
2357 // (see PR15823 why this is necessary).
2358 CmdArgs.push_back("--no-as-needed");
2359 CmdArgs.push_back("-lpthread");
2360 CmdArgs.push_back("-lrt");
2361 CmdArgs.push_back("-lm");
2362 // There's no libdl on FreeBSD.
2363 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2364 CmdArgs.push_back("-ldl");
2365}
2366
2367static void
2368collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2369 SmallVectorImpl<StringRef> &SharedRuntimes,
2370 SmallVectorImpl<StringRef> &StaticRuntimes,
2371 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2372 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2373 // Collect shared runtimes.
2374 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2375 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002376 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002377
Alexey Samsonov52550342014-09-15 19:58:40 +00002378 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002379 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002380 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2381 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002382 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002383 }
2384 if (SanArgs.needsAsanRt()) {
2385 if (SanArgs.needsSharedAsanRt()) {
2386 HelperStaticRuntimes.push_back("asan-preinit");
2387 } else {
2388 StaticRuntimes.push_back("asan");
2389 if (SanArgs.linkCXXRuntimes())
2390 StaticRuntimes.push_back("asan_cxx");
2391 }
2392 }
2393 if (SanArgs.needsDfsanRt())
2394 StaticRuntimes.push_back("dfsan");
2395 if (SanArgs.needsLsanRt())
2396 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002397 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002398 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002399 if (SanArgs.linkCXXRuntimes())
2400 StaticRuntimes.push_back("msan_cxx");
2401 }
2402 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002403 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002404 if (SanArgs.linkCXXRuntimes())
2405 StaticRuntimes.push_back("tsan_cxx");
2406 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002407 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002408 StaticRuntimes.push_back("ubsan_standalone");
2409 if (SanArgs.linkCXXRuntimes())
2410 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002411 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002412}
2413
Alexey Samsonov52550342014-09-15 19:58:40 +00002414// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2415// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2416static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002417 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002418 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2419 HelperStaticRuntimes;
2420 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2421 HelperStaticRuntimes);
2422 for (auto RT : SharedRuntimes)
2423 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2424 for (auto RT : HelperStaticRuntimes)
2425 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2426 bool AddExportDynamic = false;
2427 for (auto RT : StaticRuntimes) {
2428 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2429 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2430 }
2431 // If there is a static runtime with no dynamic list, force all the symbols
2432 // to be dynamic to be sure we export sanitizer interface functions.
2433 if (AddExportDynamic)
2434 CmdArgs.push_back("-export-dynamic");
2435 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002436}
2437
Reid Kleckner86ea7702015-02-04 23:45:07 +00002438static bool areOptimizationsEnabled(const ArgList &Args) {
2439 // Find the last -O arg and see if it is non-zero.
2440 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2441 return !A->getOption().matches(options::OPT_O0);
2442 // Defaults to -O0.
2443 return false;
2444}
2445
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002446static bool shouldUseFramePointerForTarget(const ArgList &Args,
2447 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002448 // XCore never wants frame pointers, regardless of OS.
2449 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002450 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002451 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002452
2453 if (Triple.isOSLinux()) {
2454 switch (Triple.getArch()) {
2455 // Don't use a frame pointer on linux if optimizing for certain targets.
2456 case llvm::Triple::mips64:
2457 case llvm::Triple::mips64el:
2458 case llvm::Triple::mips:
2459 case llvm::Triple::mipsel:
2460 case llvm::Triple::systemz:
2461 case llvm::Triple::x86:
2462 case llvm::Triple::x86_64:
2463 return !areOptimizationsEnabled(Args);
2464 default:
2465 return true;
2466 }
2467 }
2468
2469 if (Triple.isOSWindows()) {
2470 switch (Triple.getArch()) {
2471 case llvm::Triple::x86:
2472 return !areOptimizationsEnabled(Args);
2473 default:
2474 // All other supported Windows ISAs use xdata unwind information, so frame
2475 // pointers are not generally useful.
2476 return false;
2477 }
2478 }
2479
2480 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002481}
2482
Rafael Espindola224dd632011-12-14 21:02:23 +00002483static bool shouldUseFramePointer(const ArgList &Args,
2484 const llvm::Triple &Triple) {
2485 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2486 options::OPT_fomit_frame_pointer))
2487 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2488
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002489 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002490}
2491
Eric Christopherb7d97e92013-04-03 01:58:53 +00002492static bool shouldUseLeafFramePointer(const ArgList &Args,
2493 const llvm::Triple &Triple) {
2494 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2495 options::OPT_momit_leaf_frame_pointer))
2496 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2497
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002498 if (Triple.isPS4CPU())
2499 return false;
2500
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002501 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002502}
2503
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002504/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002505static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002506 SmallString<128> cwd;
2507 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002508 CmdArgs.push_back("-fdebug-compilation-dir");
2509 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002510 }
2511}
2512
Eric Christopherd3804002013-02-22 20:12:52 +00002513static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002514 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002515 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2516 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2517 SmallString<128> T(FinalOutput->getValue());
2518 llvm::sys::path::replace_extension(T, "dwo");
2519 return Args.MakeArgString(T);
2520 } else {
2521 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002522 SmallString<128> T(
2523 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002524 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002525 llvm::sys::path::replace_extension(F, "dwo");
2526 T += F;
2527 return Args.MakeArgString(F);
2528 }
2529}
2530
2531static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2532 const Tool &T, const JobAction &JA,
2533 const ArgList &Args, const InputInfo &Output,
2534 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002535 ArgStringList ExtractArgs;
2536 ExtractArgs.push_back("--extract-dwo");
2537
2538 ArgStringList StripArgs;
2539 StripArgs.push_back("--strip-dwo");
2540
2541 // Grabbing the output of the earlier compile step.
2542 StripArgs.push_back(Output.getFilename());
2543 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002544 ExtractArgs.push_back(OutFile);
2545
2546 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002547 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002548
2549 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002550 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002551
2552 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002553 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002554}
2555
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002556/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002557/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2558static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002559 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002560 if (A->getOption().matches(options::OPT_O4) ||
2561 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002562 return true;
2563
2564 if (A->getOption().matches(options::OPT_O0))
2565 return false;
2566
2567 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2568
Rafael Espindola91780de2013-08-26 14:05:41 +00002569 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002570 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002571 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002572 return true;
2573
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002574 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002575 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002576 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002577
2578 unsigned OptLevel = 0;
2579 if (S.getAsInteger(10, OptLevel))
2580 return false;
2581
2582 return OptLevel > 1;
2583 }
2584
2585 return false;
2586}
2587
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002588/// Add -x lang to \p CmdArgs for \p Input.
2589static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2590 ArgStringList &CmdArgs) {
2591 // When using -verify-pch, we don't want to provide the type
2592 // 'precompiled-header' if it was inferred from the file extension
2593 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2594 return;
2595
2596 CmdArgs.push_back("-x");
2597 if (Args.hasArg(options::OPT_rewrite_objc))
2598 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2599 else
2600 CmdArgs.push_back(types::getTypeName(Input.getType()));
2601}
2602
David Majnemerc371ff02015-03-22 08:39:22 +00002603static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002604 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002605 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002606
2607 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002608 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002609
2610 unsigned Build = 0, Factor = 1;
2611 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2612 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002613 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002614}
2615
Rafael Espindola577637a2015-01-03 00:06:04 +00002616// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002617// options that build systems might add but are unused when assembling or only
2618// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002619static void claimNoWarnArgs(const ArgList &Args) {
2620 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002621 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002622 Args.ClaimAllArgs(options::OPT_flto);
2623 Args.ClaimAllArgs(options::OPT_fno_lto);
2624}
2625
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002626static void appendUserToPath(SmallVectorImpl<char> &Result) {
2627#ifdef LLVM_ON_UNIX
2628 const char *Username = getenv("LOGNAME");
2629#else
2630 const char *Username = getenv("USERNAME");
2631#endif
2632 if (Username) {
2633 // Validate that LoginName can be used in a path, and get its length.
2634 size_t Len = 0;
2635 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002636 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002637 Username = nullptr;
2638 break;
2639 }
2640 }
2641
2642 if (Username && Len > 0) {
2643 Result.append(Username, Username + Len);
2644 return;
2645 }
2646 }
2647
2648 // Fallback to user id.
2649#ifdef LLVM_ON_UNIX
2650 std::string UID = llvm::utostr(getuid());
2651#else
2652 // FIXME: Windows seems to have an 'SID' that might work.
2653 std::string UID = "9999";
2654#endif
2655 Result.append(UID.begin(), UID.end());
2656}
2657
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002658void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002659 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002660 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002661 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002662 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002663 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2664 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002665 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002666 ArgStringList CmdArgs;
2667
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002668 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002669 bool IsWindowsCygnus =
2670 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002671 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2672
Daniel Dunbare521a892009-03-31 20:53:55 +00002673 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002674 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002675
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002676 // Invoke ourselves in -cc1 mode.
2677 //
2678 // FIXME: Implement custom jobs for internal actions.
2679 CmdArgs.push_back("-cc1");
2680
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002681 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002682 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002683 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002684 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002685
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002686 const llvm::Triple TT(TripleStr);
2687 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2688 TT.getArch() == llvm::Triple::thumb)) {
2689 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2690 unsigned Version;
2691 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2692 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002693 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2694 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002695 }
2696
Tim Northover336f1892014-03-29 13:16:12 +00002697 // Push all default warning arguments that are specific to
2698 // the given target. These come before user provided warning options
2699 // are provided.
2700 getToolChain().addClangWarningOptions(CmdArgs);
2701
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002702 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002703 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002704
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002705 if (isa<AnalyzeJobAction>(JA)) {
2706 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2707 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002708 } else if (isa<MigrateJobAction>(JA)) {
2709 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002710 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002711 if (Output.getType() == types::TY_Dependencies)
2712 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002713 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002714 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002715 if (Args.hasArg(options::OPT_rewrite_objc) &&
2716 !Args.hasArg(options::OPT_g_Group))
2717 CmdArgs.push_back("-P");
2718 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002719 } else if (isa<AssembleJobAction>(JA)) {
2720 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002721
David Blaikie9260ed62013-07-25 21:19:01 +00002722 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002723
2724 // Also ignore explicit -force_cpusubtype_ALL option.
2725 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002726 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002727 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002728 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002729
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002730 if (JA.getType() == types::TY_Nothing)
2731 CmdArgs.push_back("-fsyntax-only");
2732 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002733 CmdArgs.push_back("-emit-pch");
2734 else
2735 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002736 } else if (isa<VerifyPCHJobAction>(JA)) {
2737 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002738 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002739 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2740 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002741
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002742 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002743 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002744 } else if (JA.getType() == types::TY_LLVM_IR ||
2745 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002746 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002747 } else if (JA.getType() == types::TY_LLVM_BC ||
2748 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002749 CmdArgs.push_back("-emit-llvm-bc");
2750 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002751 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002752 } else if (JA.getType() == types::TY_AST) {
2753 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002754 } else if (JA.getType() == types::TY_ModuleFile) {
2755 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002756 } else if (JA.getType() == types::TY_RewrittenObjC) {
2757 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002758 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002759 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2760 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002761 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002762 } else {
2763 assert(JA.getType() == types::TY_PP_Asm &&
2764 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002765 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002766
2767 // Preserve use-list order by default when emitting bitcode, so that
2768 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2769 // same result as running passes here. For LTO, we don't need to preserve
2770 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002771 if (JA.getType() == types::TY_LLVM_BC)
2772 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002773 }
2774
Justin Bognera88f0122014-06-20 22:59:50 +00002775 // We normally speed up the clang process a bit by skipping destructors at
2776 // exit, but when we're generating diagnostics we can rely on some of the
2777 // cleanup.
2778 if (!C.isForDiagnostics())
2779 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002780
John McCallbb79b5f2010-02-13 03:50:24 +00002781 // Disable the verification pass in -asserts builds.
2782#ifdef NDEBUG
2783 CmdArgs.push_back("-disable-llvm-verifier");
2784#endif
2785
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002786 // Set the main file name, so that debug info works even with
2787 // -save-temps.
2788 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002789 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002790
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002791 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002792 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002793 if (Args.hasArg(options::OPT_static))
2794 CmdArgs.push_back("-static-define");
2795
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002796 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002797 // Enable region store model by default.
2798 CmdArgs.push_back("-analyzer-store=region");
2799
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002800 // Treat blocks as analysis entry points.
2801 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2802
Ted Kremenek49c79792011-03-24 00:28:47 +00002803 CmdArgs.push_back("-analyzer-eagerly-assume");
2804
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002805 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002806 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002807 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002808
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002809 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002810 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002811
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002812 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002813 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002814
2815 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002816
Artem Belevichba558952015-05-06 18:20:23 +00002817 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002818 CmdArgs.push_back("-analyzer-checker=cplusplus");
2819
Nico Webere8e53112014-05-11 01:04:02 +00002820 // Enable the following experimental checkers for testing.
2821 CmdArgs.push_back(
2822 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002823 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2824 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2825 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2826 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2827 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002828 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002829
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002830 // Set the output format. The default is plist, for (lame) historical
2831 // reasons.
2832 CmdArgs.push_back("-analyzer-output");
2833 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002834 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002835 else
2836 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002837
Ted Kremenekfe449a22010-03-22 22:32:05 +00002838 // Disable the presentation of standard compiler warnings when
2839 // using --analyze. We only want to show static analyzer diagnostics
2840 // or frontend errors.
2841 CmdArgs.push_back("-w");
2842
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002843 // Add -Xanalyzer arguments when running as analyzer.
2844 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002845 }
2846
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002847 CheckCodeGenerationOptions(D, Args);
2848
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002849 bool PIE = getToolChain().isPIEDefault();
2850 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002851 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002852
Alexey Bataev40e75222014-01-28 06:30:35 +00002853 // Android-specific defaults for PIC/PIE
2854 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2855 switch (getToolChain().getTriple().getArch()) {
2856 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002857 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002858 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002859 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002860 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002861 case llvm::Triple::mips:
2862 case llvm::Triple::mipsel:
2863 case llvm::Triple::mips64:
2864 case llvm::Triple::mips64el:
2865 PIC = true; // "-fpic"
2866 break;
2867
2868 case llvm::Triple::x86:
2869 case llvm::Triple::x86_64:
2870 PIC = true; // "-fPIC"
2871 IsPICLevelTwo = true;
2872 break;
2873
2874 default:
2875 break;
2876 }
2877 }
2878
Brad Smith5b05db82014-06-24 19:51:29 +00002879 // OpenBSD-specific defaults for PIE
2880 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2881 switch (getToolChain().getTriple().getArch()) {
2882 case llvm::Triple::mips64:
2883 case llvm::Triple::mips64el:
2884 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002885 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002886 case llvm::Triple::x86:
2887 case llvm::Triple::x86_64:
2888 IsPICLevelTwo = false; // "-fpie"
2889 break;
2890
2891 case llvm::Triple::ppc:
2892 case llvm::Triple::sparcv9:
2893 IsPICLevelTwo = true; // "-fPIE"
2894 break;
2895
2896 default:
2897 break;
2898 }
2899 }
2900
Alexey Samsonov090301e2013-04-09 12:28:19 +00002901 // For the PIC and PIE flag options, this logic is different from the
2902 // legacy logic in very old versions of GCC, as that logic was just
2903 // a bug no one had ever fixed. This logic is both more rational and
2904 // consistent with GCC's new logic now that the bugs are fixed. The last
2905 // argument relating to either PIC or PIE wins, and no other argument is
2906 // used. If the last argument is any flavor of the '-fno-...' arguments,
2907 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2908 // at the same level.
2909 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2910 options::OPT_fpic, options::OPT_fno_pic,
2911 options::OPT_fPIE, options::OPT_fno_PIE,
2912 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002913 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2914 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002915 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002916 if (LastPICArg) {
2917 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002918 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2919 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2920 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2921 PIC = PIE || O.matches(options::OPT_fPIC) ||
2922 O.matches(options::OPT_fpic);
2923 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2924 O.matches(options::OPT_fPIC);
2925 } else {
2926 PIE = PIC = false;
2927 }
2928 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002929 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002930
Nick Lewycky609dd662013-10-11 03:33:53 +00002931 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002932 // specified while enabling PIC enabled level 1 PIC, just force it back to
2933 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2934 // informal testing).
2935 if (PIC && getToolChain().getTriple().isOSDarwin())
2936 IsPICLevelTwo |= getToolChain().isPICDefault();
2937
Chandler Carruthc0c04552012-04-08 16:40:35 +00002938 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2939 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002940 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002941 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002942 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002943 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002944 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002945
Chandler Carruth76a943b2012-11-19 03:52:03 +00002946 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2947 // This is a very special mode. It trumps the other modes, almost no one
2948 // uses it, and it isn't even valid on any OS but Darwin.
2949 if (!getToolChain().getTriple().isOSDarwin())
2950 D.Diag(diag::err_drv_unsupported_opt_for_target)
2951 << A->getSpelling() << getToolChain().getTriple().str();
2952
2953 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2954
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002955 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002956 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002957
Chandler Carruth76a943b2012-11-19 03:52:03 +00002958 // Only a forced PIC mode can cause the actual compile to have PIC defines
2959 // etc., no flags are sufficient. This behavior was selected to closely
2960 // match that of llvm-gcc and Apple GCC before that.
2961 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2962 CmdArgs.push_back("-pic-level");
2963 CmdArgs.push_back("2");
2964 }
2965 } else {
2966 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2967 // handled in Clang's IRGen by the -pie-level flag.
2968 CmdArgs.push_back("-mrelocation-model");
2969 CmdArgs.push_back(PIC ? "pic" : "static");
2970
2971 if (PIC) {
2972 CmdArgs.push_back("-pic-level");
2973 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2974 if (PIE) {
2975 CmdArgs.push_back("-pie-level");
2976 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2977 }
2978 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002979 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002980
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002981 CmdArgs.push_back("-mthread-model");
2982 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2983 CmdArgs.push_back(A->getValue());
2984 else
2985 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2986
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00002987 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
2988
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002989 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2990 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002991 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002992
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002993 // LLVM Code Generator Options.
2994
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002995 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2996 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2997 for (arg_iterator
2998 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2999 options::OPT_frewrite_map_file_EQ),
3000 MFE = Args.filtered_end();
3001 MFI != MFE; ++MFI) {
3002 CmdArgs.push_back("-frewrite-map-file");
3003 CmdArgs.push_back((*MFI)->getValue());
3004 (*MFI)->claim();
3005 }
3006 }
3007
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003008 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3009 StringRef v = A->getValue();
3010 CmdArgs.push_back("-mllvm");
3011 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3012 A->claim();
3013 }
3014
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003015 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3016 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003017 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003018 }
3019
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003020 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3021 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003022 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003023 D.Diag(diag::err_drv_unsupported_opt_for_target)
3024 << A->getSpelling() << getToolChain().getTriple().str();
3025 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3026 CmdArgs.push_back("-fpcc-struct-return");
3027 } else {
3028 assert(A->getOption().matches(options::OPT_freg_struct_return));
3029 CmdArgs.push_back("-freg-struct-return");
3030 }
3031 }
3032
Roman Divacky65b88cd2011-03-01 17:40:53 +00003033 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3034 CmdArgs.push_back("-mrtd");
3035
Rafael Espindola224dd632011-12-14 21:02:23 +00003036 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003037 CmdArgs.push_back("-mdisable-fp-elim");
3038 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3039 options::OPT_fno_zero_initialized_in_bss))
3040 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003041
3042 bool OFastEnabled = isOptimizationLevelFast(Args);
3043 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3044 // enabled. This alias option is being used to simplify the hasFlag logic.
3045 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
3046 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003047 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3048 // doesn't do any TBAA.
3049 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003050 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003051 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003052 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003053 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3054 options::OPT_fno_struct_path_tbaa))
3055 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003056 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3057 false))
3058 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003059 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3060 options::OPT_fno_optimize_sibling_calls))
3061 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003062
Eric Christopher006208c2013-04-04 06:29:47 +00003063 // Handle segmented stacks.
3064 if (Args.hasArg(options::OPT_fsplit_stack))
3065 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003066
3067 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3068 // This alias option is being used to simplify the getLastArg logic.
3069 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3070 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003071
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003072 // Handle various floating point optimization flags, mapping them to the
3073 // appropriate LLVM code generation flags. The pattern for all of these is to
3074 // default off the codegen optimizations, and if any flag enables them and no
3075 // flag disables them after the flag enabling them, enable the codegen
3076 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003077 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003078 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003079 options::OPT_ffinite_math_only,
3080 options::OPT_fno_finite_math_only,
3081 options::OPT_fhonor_infinities,
3082 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003083 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3084 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003085 A->getOption().getID() != options::OPT_fhonor_infinities)
3086 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003087 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003088 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003089 options::OPT_ffinite_math_only,
3090 options::OPT_fno_finite_math_only,
3091 options::OPT_fhonor_nans,
3092 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003093 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3094 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003095 A->getOption().getID() != options::OPT_fhonor_nans)
3096 CmdArgs.push_back("-menable-no-nans");
3097
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003098 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3099 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003100 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003101 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003102 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003103 options::OPT_fno_math_errno)) {
3104 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3105 // However, turning *off* -ffast_math merely restores the toolchain default
3106 // (which may be false).
3107 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3108 A->getOption().getID() == options::OPT_ffast_math ||
3109 A->getOption().getID() == options::OPT_Ofast)
3110 MathErrno = false;
3111 else if (A->getOption().getID() == options::OPT_fmath_errno)
3112 MathErrno = true;
3113 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003114 if (MathErrno)
3115 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003116
3117 // There are several flags which require disabling very specific
3118 // optimizations. Any of these being disabled forces us to turn off the
3119 // entire set of LLVM optimizations, so collect them through all the flag
3120 // madness.
3121 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003122 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003123 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003124 options::OPT_funsafe_math_optimizations,
3125 options::OPT_fno_unsafe_math_optimizations,
3126 options::OPT_fassociative_math,
3127 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003128 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3129 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003130 A->getOption().getID() != options::OPT_fno_associative_math)
3131 AssociativeMath = true;
3132 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003133 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003134 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003135 options::OPT_funsafe_math_optimizations,
3136 options::OPT_fno_unsafe_math_optimizations,
3137 options::OPT_freciprocal_math,
3138 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003139 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3140 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003141 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3142 ReciprocalMath = true;
3143 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003144 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003145 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003146 options::OPT_funsafe_math_optimizations,
3147 options::OPT_fno_unsafe_math_optimizations,
3148 options::OPT_fsigned_zeros,
3149 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003150 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3151 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003152 A->getOption().getID() != options::OPT_fsigned_zeros)
3153 SignedZeros = false;
3154 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003155 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003156 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003157 options::OPT_funsafe_math_optimizations,
3158 options::OPT_fno_unsafe_math_optimizations,
3159 options::OPT_ftrapping_math,
3160 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003161 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3162 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003163 A->getOption().getID() != options::OPT_ftrapping_math)
3164 TrappingMath = false;
3165 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3166 !TrappingMath)
3167 CmdArgs.push_back("-menable-unsafe-fp-math");
3168
Sanjay Patel76c9e092015-01-23 16:40:50 +00003169 if (!SignedZeros)
3170 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003171
Sanjay Patel359b1052015-04-09 15:03:23 +00003172 if (ReciprocalMath)
3173 CmdArgs.push_back("-freciprocal-math");
3174
Lang Hamesaa53b932012-07-06 00:59:19 +00003175 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003176 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003177 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003178 options::OPT_ffp_contract)) {
3179 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003180 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003181 if (Val == "fast" || Val == "on" || Val == "off") {
3182 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3183 } else {
3184 D.Diag(diag::err_drv_unsupported_option_argument)
3185 << A->getOption().getName() << Val;
3186 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003187 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3188 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003189 // If fast-math is set then set the fp-contract mode to fast.
3190 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3191 }
3192 }
3193
Bob Wilson6a039162012-07-19 03:52:53 +00003194 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3195 // and if we find them, tell the frontend to provide the appropriate
3196 // preprocessor macros. This is distinct from enabling any optimizations as
3197 // these options induce language changes which must survive serialization
3198 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003199 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3200 options::OPT_fno_fast_math))
3201 if (!A->getOption().matches(options::OPT_fno_fast_math))
3202 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003203 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3204 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003205 if (A->getOption().matches(options::OPT_ffinite_math_only))
3206 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003207
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003208 // Decide whether to use verbose asm. Verbose assembly is the default on
3209 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003210 bool IsIntegratedAssemblerDefault =
3211 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003212 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003213 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003214 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003215 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003216
Rafael Espindolab8a12932015-05-22 20:44:03 +00003217 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3218 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003219 CmdArgs.push_back("-no-integrated-as");
3220
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003221 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3222 CmdArgs.push_back("-mdebug-pass");
3223 CmdArgs.push_back("Structure");
3224 }
3225 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3226 CmdArgs.push_back("-mdebug-pass");
3227 CmdArgs.push_back("Arguments");
3228 }
3229
John McCall8517abc2010-02-19 02:45:38 +00003230 // Enable -mconstructor-aliases except on darwin, where we have to
3231 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003232 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003233 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003234
John McCall7ef5cb32011-03-18 02:56:14 +00003235 // Darwin's kernel doesn't support guard variables; just die if we
3236 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003237 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003238 CmdArgs.push_back("-fforbid-guard-variables");
3239
Douglas Gregordbe39272011-02-01 15:15:22 +00003240 if (Args.hasArg(options::OPT_mms_bitfields)) {
3241 CmdArgs.push_back("-mms-bitfields");
3242 }
John McCall8517abc2010-02-19 02:45:38 +00003243
Daniel Dunbar306945d2009-09-16 06:17:29 +00003244 // This is a coarse approximation of what llvm-gcc actually does, both
3245 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3246 // complicated ways.
3247 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003248 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3249 options::OPT_fno_asynchronous_unwind_tables,
3250 (getToolChain().IsUnwindTablesDefault() ||
3251 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3252 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003253 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3254 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003255 CmdArgs.push_back("-munwind-tables");
3256
Chandler Carruth05fb5852012-11-21 23:40:23 +00003257 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003258
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003259 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3260 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003261 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003262 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003263
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003264 // FIXME: Handle -mtune=.
3265 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003266
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003267 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003268 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003269 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003270 }
3271
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003272 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003273 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003274 if (!CPU.empty()) {
3275 CmdArgs.push_back("-target-cpu");
3276 CmdArgs.push_back(Args.MakeArgString(CPU));
3277 }
3278
Rafael Espindolaeb265472013-08-21 21:59:03 +00003279 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3280 CmdArgs.push_back("-mfpmath");
3281 CmdArgs.push_back(A->getValue());
3282 }
3283
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003284 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003285 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003286
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003287 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003288 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003289 default:
3290 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003291
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003292 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003293 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003294 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003295 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003296 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003297 break;
3298
Tim Northover573cbee2014-05-24 12:52:07 +00003299 case llvm::Triple::aarch64:
3300 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003301 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003302 break;
3303
Eric Christopher0b26a612010-03-02 02:41:08 +00003304 case llvm::Triple::mips:
3305 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003306 case llvm::Triple::mips64:
3307 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003308 AddMIPSTargetArgs(Args, CmdArgs);
3309 break;
3310
Ulrich Weigand8afad612014-07-28 13:17:52 +00003311 case llvm::Triple::ppc:
3312 case llvm::Triple::ppc64:
3313 case llvm::Triple::ppc64le:
3314 AddPPCTargetArgs(Args, CmdArgs);
3315 break;
3316
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003317 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003318 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003319 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003320 AddSparcTargetArgs(Args, CmdArgs);
3321 break;
3322
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003323 case llvm::Triple::x86:
3324 case llvm::Triple::x86_64:
3325 AddX86TargetArgs(Args, CmdArgs);
3326 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003327
3328 case llvm::Triple::hexagon:
3329 AddHexagonTargetArgs(Args, CmdArgs);
3330 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003331 }
3332
Hans Wennborg75958c42013-08-08 00:17:41 +00003333 // Add clang-cl arguments.
3334 if (getToolChain().getDriver().IsCLMode())
3335 AddClangCLArgs(Args, CmdArgs);
3336
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003337 // Pass the linker version in use.
3338 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3339 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003340 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003341 }
3342
Eric Christopherb7d97e92013-04-03 01:58:53 +00003343 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003344 CmdArgs.push_back("-momit-leaf-frame-pointer");
3345
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003346 // Explicitly error on some things we know we don't support and can't just
3347 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003348 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003349 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3350 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003351 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003352 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003353 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003354 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3355 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003356 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003357 << Unsupported->getOption().getName();
3358 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003359 }
3360
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003361 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003362 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003363 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003364 CmdArgs.push_back("-header-include-file");
3365 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3366 D.CCPrintHeadersFilename : "-");
3367 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003368 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003369 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003370
Chad Rosierbe10f982011-08-02 17:58:04 +00003371 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003372 CmdArgs.push_back("-diagnostic-log-file");
3373 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3374 D.CCLogDiagnosticsFilename : "-");
3375 }
3376
Manman Ren17bdb0f2013-11-20 20:22:14 +00003377 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3378 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003379 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003380 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003381 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3382 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003383 // FIXME: we should support specifying dwarf version with
3384 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003385 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003386 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003387 const llvm::Triple &Triple = getToolChain().getTriple();
3388 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003389 Triple.getOS() == llvm::Triple::FreeBSD ||
3390 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003391 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003392 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003393 CmdArgs.push_back("-gdwarf-2");
3394 else if (A->getOption().matches(options::OPT_gdwarf_3))
3395 CmdArgs.push_back("-gdwarf-3");
3396 else if (A->getOption().matches(options::OPT_gdwarf_4))
3397 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003398 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003399 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003400 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003401 const llvm::Triple &Triple = getToolChain().getTriple();
3402 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003403 Triple.getOS() == llvm::Triple::FreeBSD ||
3404 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003405 CmdArgs.push_back("-gdwarf-2");
3406 else
3407 CmdArgs.push_back("-g");
3408 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003409 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003410
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003411 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3412 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003413 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3414 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003415 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003416
Eric Christopher138c32b2013-09-13 22:37:55 +00003417 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003418 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3419 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003420 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003421 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003422 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003423 CmdArgs.push_back("-g");
3424 CmdArgs.push_back("-backend-option");
3425 CmdArgs.push_back("-split-dwarf=Enable");
3426 }
3427
Eric Christopher138c32b2013-09-13 22:37:55 +00003428 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3429 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3430 CmdArgs.push_back("-backend-option");
3431 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3432 }
Eric Christophereec89c22013-06-18 00:03:50 +00003433
Eric Christopher0d403d22014-02-14 01:27:03 +00003434 // -gdwarf-aranges turns on the emission of the aranges section in the
3435 // backend.
3436 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3437 CmdArgs.push_back("-backend-option");
3438 CmdArgs.push_back("-generate-arange-section");
3439 }
3440
David Blaikief36d9ba2014-01-27 18:52:43 +00003441 if (Args.hasFlag(options::OPT_fdebug_types_section,
3442 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003443 CmdArgs.push_back("-backend-option");
3444 CmdArgs.push_back("-generate-type-units");
3445 }
Eric Christophereec89c22013-06-18 00:03:50 +00003446
Ed Schouten6e576152015-03-26 17:50:28 +00003447 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3448 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3449
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003450 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003451 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003452 CmdArgs.push_back("-ffunction-sections");
3453 }
3454
3455 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003456 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003457 CmdArgs.push_back("-fdata-sections");
3458 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003459
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003460 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003461 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003462 CmdArgs.push_back("-fno-unique-section-names");
3463
Chris Lattner3c77a352010-06-22 00:03:40 +00003464 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3465
Justin Bognera71e6812015-04-30 23:49:42 +00003466 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3467 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003468 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3469 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3470 D.Diag(diag::err_drv_argument_not_allowed_with)
3471 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3472
Justin Bognera71e6812015-04-30 23:49:42 +00003473 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3474 A->render(Args, CmdArgs);
3475 else
3476 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003477
3478 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3479 A->render(Args, CmdArgs);
3480 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3481 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3482
Nick Lewycky207bce32011-04-21 23:44:07 +00003483 if (Args.hasArg(options::OPT_ftest_coverage) ||
3484 Args.hasArg(options::OPT_coverage))
3485 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003486 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3487 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003488 Args.hasArg(options::OPT_coverage))
3489 CmdArgs.push_back("-femit-coverage-data");
3490
Alex Lorenzee024992014-08-04 18:41:51 +00003491 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003492 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3493 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003494 D.Diag(diag::err_drv_argument_only_allowed_with)
3495 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3496
3497 if (Args.hasArg(options::OPT_fcoverage_mapping))
3498 CmdArgs.push_back("-fcoverage-mapping");
3499
Nick Lewycky480cb992011-05-04 20:46:58 +00003500 if (C.getArgs().hasArg(options::OPT_c) ||
3501 C.getArgs().hasArg(options::OPT_S)) {
3502 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003503 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003504 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003505 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003506 CoverageFilename = FinalOutput->getValue();
3507 } else {
3508 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3509 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003510 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003511 SmallString<128> Pwd;
3512 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003513 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003514 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003515 }
3516 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003517 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003518 }
3519 }
3520
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003521 // Pass options for controlling the default header search paths.
3522 if (Args.hasArg(options::OPT_nostdinc)) {
3523 CmdArgs.push_back("-nostdsysteminc");
3524 CmdArgs.push_back("-nobuiltininc");
3525 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003526 if (Args.hasArg(options::OPT_nostdlibinc))
3527 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003528 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3529 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3530 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003531
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003532 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003533 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003534 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003535
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003536 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3537
Ted Kremenekf7639e12012-03-06 20:06:33 +00003538 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003539 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003540 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003541 options::OPT_ccc_arcmt_modify,
3542 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003543 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003544 switch (A->getOption().getID()) {
3545 default:
3546 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003547 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003548 CmdArgs.push_back("-arcmt-check");
3549 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003550 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003551 CmdArgs.push_back("-arcmt-modify");
3552 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003553 case options::OPT_ccc_arcmt_migrate:
3554 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003555 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003556 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003557
3558 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3559 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003560 break;
John McCalld70fb982011-06-15 23:25:17 +00003561 }
3562 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003563 } else {
3564 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3565 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3566 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003567 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003568
Ted Kremenekf7639e12012-03-06 20:06:33 +00003569 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3570 if (ARCMTEnabled) {
3571 D.Diag(diag::err_drv_argument_not_allowed_with)
3572 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3573 }
3574 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003575 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003576
3577 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003578 options::OPT_objcmt_migrate_subscripting,
3579 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003580 // None specified, means enable them all.
3581 CmdArgs.push_back("-objcmt-migrate-literals");
3582 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003583 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003584 } else {
3585 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3586 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003587 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003588 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003589 } else {
3590 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3591 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3592 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3593 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3594 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3595 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003596 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003597 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3598 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3599 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3600 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3601 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3602 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3603 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003604 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003605 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003606 }
3607
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003608 // Add preprocessing options like -I, -D, etc. if we are using the
3609 // preprocessor.
3610 //
3611 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003612 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003613 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003614
Rafael Espindolaa7431922011-07-21 23:40:37 +00003615 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3616 // that "The compiler can only warn and ignore the option if not recognized".
3617 // When building with ccache, it will pass -D options to clang even on
3618 // preprocessed inputs and configure concludes that -fPIC is not supported.
3619 Args.ClaimAllArgs(options::OPT_D);
3620
Alp Toker7874bdc2013-11-15 20:40:58 +00003621 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003622 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3623 if (A->getOption().matches(options::OPT_O4)) {
3624 CmdArgs.push_back("-O3");
3625 D.Diag(diag::warn_O4_is_O3);
3626 } else {
3627 A->render(Args, CmdArgs);
3628 }
3629 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003630
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003631 // Warn about ignored options to clang.
3632 for (arg_iterator it = Args.filtered_begin(
3633 options::OPT_clang_ignored_gcc_optimization_f_Group),
3634 ie = Args.filtered_end(); it != ie; ++it) {
3635 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3636 }
3637
Rafael Espindola577637a2015-01-03 00:06:04 +00003638 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003639
Richard Smith3be1cb22014-08-07 00:24:21 +00003640 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003641 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003642 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3643 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003644 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003645 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003646
3647 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003648 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003649 //
3650 // If a std is supplied, only add -trigraphs if it follows the
3651 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003652 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003653 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3654 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003655 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003656 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003657 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003658 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003659 else
3660 Std->render(Args, CmdArgs);
3661
Nico Weber00721502014-12-23 22:32:37 +00003662 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003663 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003664 options::OPT_ftrigraphs,
3665 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003666 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003667 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003668 } else {
3669 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003670 //
3671 // FIXME: Clang doesn't correctly handle -std= when the input language
3672 // doesn't match. For the time being just ignore this for C++ inputs;
3673 // eventually we want to do all the standard defaulting here instead of
3674 // splitting it between the driver and clang -cc1.
3675 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003676 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3677 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003678 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003679 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003680
Nico Weber00721502014-12-23 22:32:37 +00003681 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3682 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003683 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003684
Richard Smith282b4492013-09-04 22:50:31 +00003685 // GCC's behavior for -Wwrite-strings is a bit strange:
3686 // * In C, this "warning flag" changes the types of string literals from
3687 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3688 // for the discarded qualifier.
3689 // * In C++, this is just a normal warning flag.
3690 //
3691 // Implementing this warning correctly in C is hard, so we follow GCC's
3692 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3693 // a non-const char* in C, rather than using this crude hack.
3694 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003695 // FIXME: This should behave just like a warning flag, and thus should also
3696 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3697 Arg *WriteStrings =
3698 Args.getLastArg(options::OPT_Wwrite_strings,
3699 options::OPT_Wno_write_strings, options::OPT_w);
3700 if (WriteStrings &&
3701 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003702 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003703 }
3704
Chandler Carruth61fbf622011-04-23 09:27:53 +00003705 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003706 // during C++ compilation, which it is by default. GCC keeps this define even
3707 // in the presence of '-w', match this behavior bug-for-bug.
3708 if (types::isCXX(InputType) &&
3709 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3710 true)) {
3711 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003712 }
3713
Chandler Carruthe0391482010-05-22 02:21:53 +00003714 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3715 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3716 if (Asm->getOption().matches(options::OPT_fasm))
3717 CmdArgs.push_back("-fgnu-keywords");
3718 else
3719 CmdArgs.push_back("-fno-gnu-keywords");
3720 }
3721
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003722 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3723 CmdArgs.push_back("-fno-dwarf-directory-asm");
3724
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003725 if (ShouldDisableAutolink(Args, getToolChain()))
3726 CmdArgs.push_back("-fno-autolink");
3727
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003728 // Add in -fdebug-compilation-dir if necessary.
3729 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003730
Richard Smith9a568822011-11-21 19:36:32 +00003731 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3732 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003733 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003734 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003735 }
3736
Richard Smith79c927b2013-11-06 19:31:51 +00003737 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3738 CmdArgs.push_back("-foperator-arrow-depth");
3739 CmdArgs.push_back(A->getValue());
3740 }
3741
Richard Smith9a568822011-11-21 19:36:32 +00003742 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3743 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003744 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003745 }
3746
Richard Smitha3d3bd22013-05-08 02:12:03 +00003747 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3748 CmdArgs.push_back("-fconstexpr-steps");
3749 CmdArgs.push_back(A->getValue());
3750 }
3751
Richard Smithb3a14522013-02-22 01:59:51 +00003752 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3753 CmdArgs.push_back("-fbracket-depth");
3754 CmdArgs.push_back(A->getValue());
3755 }
3756
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003757 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3758 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003759 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003760 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003761 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3762 } else
3763 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003764 }
3765
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003766
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003767 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003768 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003769
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003770 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3771 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003772 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003773 }
David Chisnall5778fce2009-08-31 16:41:57 +00003774
Chris Lattnere23003d2010-01-09 21:54:33 +00003775 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3776 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003777 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003778 }
3779
Chris Lattnerb35583d2010-04-07 20:49:23 +00003780 CmdArgs.push_back("-ferror-limit");
3781 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003782 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003783 else
3784 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003785
Chandler Carrutha77a7272010-05-06 04:55:18 +00003786 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3787 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003788 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003789 }
3790
3791 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3792 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003793 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003794 }
3795
Richard Smithf6f003a2011-12-16 19:06:07 +00003796 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3797 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003798 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003799 }
3800
Nick Lewycky24653262014-12-16 21:39:02 +00003801 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3802 CmdArgs.push_back("-fspell-checking-limit");
3803 CmdArgs.push_back(A->getValue());
3804 }
3805
Daniel Dunbar2c978472009-11-04 06:24:47 +00003806 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003807 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003808 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003809 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003810 } else {
3811 // If -fmessage-length=N was not specified, determine whether this is a
3812 // terminal and, if so, implicitly define -fmessage-length appropriately.
3813 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003814 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003815 }
3816
John McCallb4a99d32013-02-19 01:57:35 +00003817 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3818 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3819 options::OPT_fvisibility_ms_compat)) {
3820 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3821 CmdArgs.push_back("-fvisibility");
3822 CmdArgs.push_back(A->getValue());
3823 } else {
3824 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3825 CmdArgs.push_back("-fvisibility");
3826 CmdArgs.push_back("hidden");
3827 CmdArgs.push_back("-ftype-visibility");
3828 CmdArgs.push_back("default");
3829 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003830 }
3831
Douglas Gregor08329632010-06-15 17:05:35 +00003832 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003833
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003834 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3835
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003836 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003837 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3838 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003839 CmdArgs.push_back("-ffreestanding");
3840
Daniel Dunbare357d562009-12-03 18:42:11 +00003841 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003842 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003843 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003844 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3845 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003846 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003847 // AltiVec language extensions aren't relevant for assembling.
3848 if (!isa<PreprocessJobAction>(JA) ||
3849 Output.getType() != types::TY_PP_Asm)
3850 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003851 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3852 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003853
Alexey Bataevdb390212015-05-20 04:24:19 +00003854 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003855 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3856 options::OPT_fno_openmp, false))
3857 switch (getOpenMPRuntime(getToolChain(), Args)) {
3858 case OMPRT_OMP:
3859 case OMPRT_IOMP5:
3860 // Clang can generate useful OpenMP code for these two runtime libraries.
3861 CmdArgs.push_back("-fopenmp");
3862 break;
3863 default:
3864 // By default, if Clang doesn't know how to generate useful OpenMP code
3865 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3866 // down to the actual compilation.
3867 // FIXME: It would be better to have a mode which *only* omits IR
3868 // generation based on the OpenMP support so that we get consistent
3869 // semantic analysis, etc.
3870 break;
3871 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003872
Peter Collingbourne32701642013-11-01 18:16:25 +00003873 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3874 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003875
Eric Christopher459d2712013-02-19 06:16:53 +00003876 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003877 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003878 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003879 getToolChain().getArch() == llvm::Triple::ppc64 ||
3880 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003881 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003882 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003883
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003884 if (getToolChain().SupportsProfiling())
3885 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003886
3887 // -flax-vector-conversions is default.
3888 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3889 options::OPT_fno_lax_vector_conversions))
3890 CmdArgs.push_back("-fno-lax-vector-conversions");
3891
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003892 if (Args.getLastArg(options::OPT_fapple_kext))
3893 CmdArgs.push_back("-fapple-kext");
3894
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003895 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003896 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003897 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003898 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3899 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003900
3901 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3902 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003903 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003904 }
3905
Bob Wilson14adb362012-02-03 06:27:22 +00003906 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003907
Chandler Carruth6e501032011-03-27 00:04:55 +00003908 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3909 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3910 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3911 options::OPT_fno_wrapv)) {
3912 if (A->getOption().matches(options::OPT_fwrapv))
3913 CmdArgs.push_back("-fwrapv");
3914 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3915 options::OPT_fno_strict_overflow)) {
3916 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3917 CmdArgs.push_back("-fwrapv");
3918 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003919
3920 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3921 options::OPT_fno_reroll_loops))
3922 if (A->getOption().matches(options::OPT_freroll_loops))
3923 CmdArgs.push_back("-freroll-loops");
3924
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003925 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003926 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3927 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003928
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003929 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3930
Mahesha S6a682be42012-10-27 07:47:56 +00003931
Daniel Dunbar4930e332009-11-17 08:07:36 +00003932 // -stack-protector=0 is default.
3933 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003934 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3935 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003936 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003937 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003938 if (A->getOption().matches(options::OPT_fstack_protector)) {
3939 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3940 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3941 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003942 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003943 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003944 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003945 } else {
3946 StackProtectorLevel =
3947 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3948 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003949 if (StackProtectorLevel) {
3950 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003951 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003952 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003953
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003954 // --param ssp-buffer-size=
3955 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3956 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003957 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003958 if (Str.startswith("ssp-buffer-size=")) {
3959 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003960 CmdArgs.push_back("-stack-protector-buffer-size");
3961 // FIXME: Verify the argument is a valid integer.
3962 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003963 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003964 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003965 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003966 }
3967
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003968 // Translate -mstackrealign
3969 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3970 false)) {
3971 CmdArgs.push_back("-backend-option");
3972 CmdArgs.push_back("-force-align-stack");
3973 }
3974 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3975 false)) {
3976 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3977 }
3978
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003979 if (Args.hasArg(options::OPT_mstack_alignment)) {
3980 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3981 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003982 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003983
Hans Wennborg77dc2362015-01-20 19:45:50 +00003984 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3985 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3986
3987 if (!Size.empty())
3988 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3989 else
3990 CmdArgs.push_back("-mstack-probe-size=0");
3991 }
3992
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003993 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3994 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3995 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3996
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003997 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3998 options::OPT_mno_restrict_it)) {
3999 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4000 CmdArgs.push_back("-backend-option");
4001 CmdArgs.push_back("-arm-restrict-it");
4002 } else {
4003 CmdArgs.push_back("-backend-option");
4004 CmdArgs.push_back("-arm-no-restrict-it");
4005 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004006 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4007 TT.getArch() == llvm::Triple::thumb)) {
4008 // Windows on ARM expects restricted IT blocks
4009 CmdArgs.push_back("-backend-option");
4010 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004011 }
4012
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004013 if (TT.getArch() == llvm::Triple::arm ||
4014 TT.getArch() == llvm::Triple::thumb) {
4015 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
4016 options::OPT_mno_long_calls)) {
4017 if (A->getOption().matches(options::OPT_mlong_calls)) {
4018 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00004019 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004020 }
4021 }
4022 }
4023
Daniel Dunbard18049a2009-04-07 21:16:11 +00004024 // Forward -f options with positive and negative forms; we translate
4025 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004026 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4027 StringRef fname = A->getValue();
4028 if (!llvm::sys::fs::exists(fname))
4029 D.Diag(diag::err_drv_no_such_file) << fname;
4030 else
4031 A->render(Args, CmdArgs);
4032 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004033
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004034 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004035 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004036 CmdArgs.push_back("-fapple-kext");
4037 if (!Args.hasArg(options::OPT_fbuiltin))
4038 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004039 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004040 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004041 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004042 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004043 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004044
Nuno Lopes13c88c72009-12-16 16:59:22 +00004045 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4046 options::OPT_fno_assume_sane_operator_new))
4047 CmdArgs.push_back("-fno-assume-sane-operator-new");
4048
Daniel Dunbar4930e332009-11-17 08:07:36 +00004049 // -fblocks=0 is default.
4050 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004051 getToolChain().IsBlocksDefault()) ||
4052 (Args.hasArg(options::OPT_fgnu_runtime) &&
4053 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4054 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004055 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004056
4057 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
4058 !getToolChain().hasBlocksRuntime())
4059 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004060 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004061
Richard Smithffb65082014-09-30 23:10:19 +00004062 // -fmodules enables modules (off by default).
4063 // Users can pass -fno-cxx-modules to turn off modules support for
4064 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004065 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004066 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
4067 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4068 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004069 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004070 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004071 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004072 HaveModules = true;
4073 }
4074 }
4075
Daniel Jasper07e6c402013-08-05 20:26:17 +00004076 // -fmodule-maps enables module map processing (off by default) for header
4077 // checking. It is implied by -fmodules.
4078 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
4079 false)) {
4080 CmdArgs.push_back("-fmodule-maps");
4081 }
4082
Daniel Jasperac42b752013-10-21 06:34:34 +00004083 // -fmodules-decluse checks that modules used are declared so (off by
4084 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004085 if (Args.hasFlag(options::OPT_fmodules_decluse,
4086 options::OPT_fno_modules_decluse,
4087 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004088 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004089 }
4090
Daniel Jasper962b38e2014-04-11 11:47:45 +00004091 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4092 // all #included headers are part of modules.
4093 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4094 options::OPT_fno_modules_strict_decluse,
4095 false)) {
4096 CmdArgs.push_back("-fmodules-strict-decluse");
4097 }
4098
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004099 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4100 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4101 options::OPT_fno_implicit_modules)) {
4102 CmdArgs.push_back("-fno-implicit-modules");
4103 }
4104
Daniel Jasperac42b752013-10-21 06:34:34 +00004105 // -fmodule-name specifies the module that is currently being built (or
4106 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004107 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004108
Richard Smith9887d792014-10-17 01:42:53 +00004109 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004110 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004111 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004112
Richard Smithe842a472014-10-22 02:05:46 +00004113 // -fmodule-file can be used to specify files containing precompiled modules.
4114 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4115
4116 // -fmodule-cache-path specifies where our implicitly-built module files
4117 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004118 SmallString<128> ModuleCachePath;
4119 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4120 ModuleCachePath = A->getValue();
4121 if (HaveModules) {
4122 if (C.isForDiagnostics()) {
4123 // When generating crash reports, we want to emit the modules along with
4124 // the reproduction sources, so we ignore any provided module path.
4125 ModuleCachePath = Output.getFilename();
4126 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4127 llvm::sys::path::append(ModuleCachePath, "modules");
4128 } else if (ModuleCachePath.empty()) {
4129 // No module path was provided: use the default.
4130 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4131 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004132 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4133 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004134 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4135 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004136 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004137 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4138 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4139 }
4140
4141 // When building modules and generating crashdumps, we need to dump a module
4142 // dependency VFS alongside the output.
4143 if (HaveModules && C.isForDiagnostics()) {
4144 SmallString<128> VFSDir(Output.getFilename());
4145 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004146 // Add the cache directory as a temp so the crash diagnostics pick it up.
4147 C.addTempFile(Args.MakeArgString(VFSDir));
4148
Justin Bognera88f0122014-06-20 22:59:50 +00004149 llvm::sys::path::append(VFSDir, "vfs");
4150 CmdArgs.push_back("-module-dependency-dir");
4151 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004152 }
4153
Richard Smith9887d792014-10-17 01:42:53 +00004154 if (HaveModules)
4155 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004156
Douglas Gregor35b04d62013-02-07 19:01:24 +00004157 // Pass through all -fmodules-ignore-macro arguments.
4158 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004159 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4160 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004161
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004162 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4163
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004164 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4165 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4166 D.Diag(diag::err_drv_argument_not_allowed_with)
4167 << A->getAsString(Args) << "-fbuild-session-timestamp";
4168
4169 llvm::sys::fs::file_status Status;
4170 if (llvm::sys::fs::status(A->getValue(), Status))
4171 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004172 CmdArgs.push_back(Args.MakeArgString(
4173 "-fbuild-session-timestamp=" +
4174 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004175 }
4176
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004177 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004178 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4179 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004180 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4181
4182 Args.AddLastArg(CmdArgs,
4183 options::OPT_fmodules_validate_once_per_build_session);
4184 }
4185
Ben Langmuirdcf73862014-03-12 00:06:17 +00004186 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4187
John McCalldfea9982010-04-09 19:12:06 +00004188 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004189 if (Args.hasFlag(options::OPT_fno_access_control,
4190 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004191 false))
John McCall3155f572010-04-09 19:03:51 +00004192 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004193
Anders Carlssond470fef2010-11-21 00:09:52 +00004194 // -felide-constructors is the default.
4195 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4196 options::OPT_felide_constructors,
4197 false))
4198 CmdArgs.push_back("-fno-elide-constructors");
4199
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004200 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004201
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004202 if (KernelOrKext || (types::isCXX(InputType) &&
4203 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4204 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004205 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004206
Tony Linthicum76329bf2011-12-12 21:14:55 +00004207 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004208 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004209 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004210 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004211 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004212 CmdArgs.push_back("-fshort-enums");
4213
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004214 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004215 if (Arg *A = Args.getLastArg(
4216 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4217 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4218 if (A->getOption().matches(options::OPT_funsigned_char) ||
4219 A->getOption().matches(options::OPT_fno_signed_char)) {
4220 CmdArgs.push_back("-fno-signed-char");
4221 }
4222 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004223 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004224 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004225
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004226 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004227 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4228 options::OPT_fno_use_cxa_atexit,
4229 !IsWindowsCygnus && !IsWindowsGNU &&
4230 getToolChain().getArch() != llvm::Triple::hexagon &&
4231 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004232 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004233 CmdArgs.push_back("-fno-use-cxa-atexit");
4234
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004235 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004236 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004237 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004238 CmdArgs.push_back("-fms-extensions");
4239
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004240 // -fno-use-line-directives is default.
4241 if (Args.hasFlag(options::OPT_fuse_line_directives,
4242 options::OPT_fno_use_line_directives, false))
4243 CmdArgs.push_back("-fuse-line-directives");
4244
Francois Pichet1b4f1632011-09-17 04:32:15 +00004245 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004246 if (Args.hasFlag(options::OPT_fms_compatibility,
4247 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004248 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4249 options::OPT_fno_ms_extensions,
4250 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004251 CmdArgs.push_back("-fms-compatibility");
4252
David Majnemerc371ff02015-03-22 08:39:22 +00004253 // -fms-compatibility-version=18.00 is default.
4254 VersionTuple MSVT;
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004255 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
David Majnemerc371ff02015-03-22 08:39:22 +00004256 IsWindowsMSVC) ||
4257 Args.hasArg(options::OPT_fmsc_version) ||
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004258 Args.hasArg(options::OPT_fms_compatibility_version)) {
4259 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4260 const Arg *MSCompatibilityVersion =
4261 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004262
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004263 if (MSCVersion && MSCompatibilityVersion)
4264 D.Diag(diag::err_drv_argument_not_allowed_with)
4265 << MSCVersion->getAsString(Args)
4266 << MSCompatibilityVersion->getAsString(Args);
4267
David Majnemerc371ff02015-03-22 08:39:22 +00004268 if (MSCompatibilityVersion) {
4269 if (MSVT.tryParse(MSCompatibilityVersion->getValue()))
4270 D.Diag(diag::err_drv_invalid_value)
4271 << MSCompatibilityVersion->getAsString(Args)
4272 << MSCompatibilityVersion->getValue();
4273 } else if (MSCVersion) {
4274 unsigned Version = 0;
4275 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version))
4276 D.Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
4277 << MSCVersion->getValue();
4278 MSVT = getMSCompatibilityVersion(Version);
4279 } else {
4280 MSVT = VersionTuple(18);
4281 }
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004282
David Majnemerc371ff02015-03-22 08:39:22 +00004283 CmdArgs.push_back(
4284 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004285 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004286
David Majnemer8db91762015-05-18 04:49:30 +00004287 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4288 if (ImplyVCPPCXXVer) {
4289 if (IsMSVC2015Compatible)
4290 CmdArgs.push_back("-std=c++14");
4291 else
4292 CmdArgs.push_back("-std=c++11");
4293 }
4294
Eric Christopher5ecce122013-02-18 00:38:31 +00004295 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004296 if (Args.hasFlag(options::OPT_fborland_extensions,
4297 options::OPT_fno_borland_extensions, false))
4298 CmdArgs.push_back("-fborland-extensions");
4299
David Majnemerc371ff02015-03-22 08:39:22 +00004300 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4301 // than 19.
4302 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4303 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004304 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004305 CmdArgs.push_back("-fno-threadsafe-statics");
4306
Francois Pichet02744872011-09-01 16:38:08 +00004307 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4308 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004309 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004310 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004311 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004312
Chandler Carruthe03aa552010-04-17 20:17:31 +00004313 // -fgnu-keywords default varies depending on language; only pass if
4314 // specified.
4315 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004316 options::OPT_fno_gnu_keywords))
4317 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004318
Rafael Espindola922a6242011-06-02 17:30:53 +00004319 if (Args.hasFlag(options::OPT_fgnu89_inline,
4320 options::OPT_fno_gnu89_inline,
4321 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004322 CmdArgs.push_back("-fgnu89-inline");
4323
Chad Rosier9c76d242012-03-15 22:31:42 +00004324 if (Args.hasArg(options::OPT_fno_inline))
4325 CmdArgs.push_back("-fno-inline");
4326
Chad Rosier64d6be92012-03-06 21:17:19 +00004327 if (Args.hasArg(options::OPT_fno_inline_functions))
4328 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004329
John McCall5fb5df92012-06-20 06:18:46 +00004330 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004331
John McCall5fb5df92012-06-20 06:18:46 +00004332 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004333 // legacy is the default. Except for deployment taget of 10.5,
4334 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4335 // gets ignored silently.
4336 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004337 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4338 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004339 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004340 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004341 if (getToolChain().UseObjCMixedDispatch())
4342 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4343 else
4344 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4345 }
4346 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004347
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004348 // When ObjectiveC legacy runtime is in effect on MacOSX,
4349 // turn on the option to do Array/Dictionary subscripting
4350 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004351 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4352 getToolChain().getTriple().isMacOSX() &&
4353 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4354 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004355 objcRuntime.isNeXTFamily())
4356 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4357
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004358 // -fencode-extended-block-signature=1 is default.
4359 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4360 CmdArgs.push_back("-fencode-extended-block-signature");
4361 }
4362
John McCall24fc0de2011-07-06 00:26:06 +00004363 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4364 // NOTE: This logic is duplicated in ToolChains.cpp.
4365 bool ARC = isObjCAutoRefCount(Args);
4366 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004367 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004368
John McCall24fc0de2011-07-06 00:26:06 +00004369 CmdArgs.push_back("-fobjc-arc");
4370
Chandler Carruth491db322011-11-04 07:34:47 +00004371 // FIXME: It seems like this entire block, and several around it should be
4372 // wrapped in isObjC, but for now we just use it here as this is where it
4373 // was being used previously.
4374 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4375 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4376 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4377 else
4378 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4379 }
4380
John McCall24fc0de2011-07-06 00:26:06 +00004381 // Allow the user to enable full exceptions code emission.
4382 // We define off for Objective-CC, on for Objective-C++.
4383 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4384 options::OPT_fno_objc_arc_exceptions,
4385 /*default*/ types::isCXX(InputType)))
4386 CmdArgs.push_back("-fobjc-arc-exceptions");
4387 }
4388
4389 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4390 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004391 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004392 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004393
John McCall24fc0de2011-07-06 00:26:06 +00004394 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4395 // takes precedence.
4396 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4397 if (!GCArg)
4398 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4399 if (GCArg) {
4400 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004401 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004402 << GCArg->getAsString(Args);
4403 } else if (getToolChain().SupportsObjCGC()) {
4404 GCArg->render(Args, CmdArgs);
4405 } else {
4406 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004407 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004408 << GCArg->getAsString(Args);
4409 }
4410 }
4411
Bob Wilsonb111ec92015-03-02 19:01:14 +00004412 if (Args.hasFlag(options::OPT_fapplication_extension,
4413 options::OPT_fno_application_extension, false))
4414 CmdArgs.push_back("-fapplication-extension");
4415
Reid Klecknerc542d372014-06-27 17:02:02 +00004416 // Handle GCC-style exception args.
4417 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004418 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004419 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004420
4421 if (getToolChain().UseSjLjExceptions())
4422 CmdArgs.push_back("-fsjlj-exceptions");
4423
4424 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004425 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4426 options::OPT_fno_assume_sane_operator_new))
4427 CmdArgs.push_back("-fno-assume-sane-operator-new");
4428
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004429 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4430 // most platforms.
4431 if (Args.hasFlag(options::OPT_fsized_deallocation,
4432 options::OPT_fno_sized_deallocation, false))
4433 CmdArgs.push_back("-fsized-deallocation");
4434
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004435 // -fconstant-cfstrings is default, and may be subject to argument translation
4436 // on Darwin.
4437 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4438 options::OPT_fno_constant_cfstrings) ||
4439 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4440 options::OPT_mno_constant_cfstrings))
4441 CmdArgs.push_back("-fno-constant-cfstrings");
4442
John Thompsoned4e2952009-11-05 20:14:16 +00004443 // -fshort-wchar default varies depending on platform; only
4444 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004445 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4446 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004447 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004448
Hans Wennborg28c96312013-07-31 23:39:13 +00004449 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004450 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004451 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004452 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004453 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004454
Daniel Dunbar096ed292011-10-05 21:04:55 +00004455 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4456 // -fno-pack-struct doesn't apply to -fpack-struct=.
4457 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004458 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004459 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004460 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004461 } else if (Args.hasFlag(options::OPT_fpack_struct,
4462 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004463 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004464 }
4465
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004466 // Handle -fmax-type-align=N and -fno-type-align
4467 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4468 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4469 if (!SkipMaxTypeAlign) {
4470 std::string MaxTypeAlignStr = "-fmax-type-align=";
4471 MaxTypeAlignStr += A->getValue();
4472 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4473 }
4474 } else if (getToolChain().getTriple().isOSDarwin()) {
4475 if (!SkipMaxTypeAlign) {
4476 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4477 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4478 }
4479 }
4480
Robert Lytton0e076492013-08-13 09:43:10 +00004481 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004482 if (!Args.hasArg(options::OPT_fcommon))
4483 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004484 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004485 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004486
Daniel Dunbard18049a2009-04-07 21:16:11 +00004487 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004488 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004489 CmdArgs.push_back("-fno-common");
4490
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004491 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004492 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004493 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004494 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004495 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004496 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4497
Daniel Dunbar6358d682010-10-15 22:30:42 +00004498 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4499 if (!Args.hasFlag(options::OPT_ffor_scope,
4500 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004501 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004502 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4503
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004504 // -finput_charset=UTF-8 is default. Reject others
4505 if (Arg *inputCharset = Args.getLastArg(
4506 options::OPT_finput_charset_EQ)) {
4507 StringRef value = inputCharset->getValue();
4508 if (value != "UTF-8")
4509 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4510 }
4511
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004512 // -fexec_charset=UTF-8 is default. Reject others
4513 if (Arg *execCharset = Args.getLastArg(
4514 options::OPT_fexec_charset_EQ)) {
4515 StringRef value = execCharset->getValue();
4516 if (value != "UTF-8")
4517 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4518 }
4519
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004520 // -fcaret-diagnostics is default.
4521 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4522 options::OPT_fno_caret_diagnostics, true))
4523 CmdArgs.push_back("-fno-caret-diagnostics");
4524
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004525 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004526 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004527 options::OPT_fno_diagnostics_fixit_info))
4528 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004529
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004530 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004531 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004532 options::OPT_fno_diagnostics_show_option))
4533 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004534
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004535 if (const Arg *A =
4536 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4537 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004538 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004539 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004540
Douglas Gregor643c9222011-05-21 17:07:29 +00004541 if (const Arg *A =
4542 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4543 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004544 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004545 }
4546
Chandler Carruthb6766f02011-03-27 01:50:55 +00004547 if (Arg *A = Args.getLastArg(
4548 options::OPT_fdiagnostics_show_note_include_stack,
4549 options::OPT_fno_diagnostics_show_note_include_stack)) {
4550 if (A->getOption().matches(
4551 options::OPT_fdiagnostics_show_note_include_stack))
4552 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4553 else
4554 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4555 }
4556
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004557 // Color diagnostics are the default, unless the terminal doesn't support
4558 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004559 // Support both clang's -f[no-]color-diagnostics and gcc's
4560 // -f[no-]diagnostics-colors[=never|always|auto].
4561 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004562 for (const auto &Arg : Args) {
4563 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004564 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4565 !O.matches(options::OPT_fdiagnostics_color) &&
4566 !O.matches(options::OPT_fno_color_diagnostics) &&
4567 !O.matches(options::OPT_fno_diagnostics_color) &&
4568 !O.matches(options::OPT_fdiagnostics_color_EQ))
4569 continue;
4570
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004571 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004572 if (O.matches(options::OPT_fcolor_diagnostics) ||
4573 O.matches(options::OPT_fdiagnostics_color)) {
4574 ShowColors = Colors_On;
4575 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4576 O.matches(options::OPT_fno_diagnostics_color)) {
4577 ShowColors = Colors_Off;
4578 } else {
4579 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004580 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004581 if (value == "always")
4582 ShowColors = Colors_On;
4583 else if (value == "never")
4584 ShowColors = Colors_Off;
4585 else if (value == "auto")
4586 ShowColors = Colors_Auto;
4587 else
4588 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4589 << ("-fdiagnostics-color=" + value).str();
4590 }
4591 }
4592 if (ShowColors == Colors_On ||
4593 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004594 CmdArgs.push_back("-fcolor-diagnostics");
4595
Nico Rieck7857d462013-09-11 00:38:02 +00004596 if (Args.hasArg(options::OPT_fansi_escape_codes))
4597 CmdArgs.push_back("-fansi-escape-codes");
4598
Daniel Dunbardb097022009-06-08 21:13:54 +00004599 if (!Args.hasFlag(options::OPT_fshow_source_location,
4600 options::OPT_fno_show_source_location))
4601 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004602
Douglas Gregor643c9222011-05-21 17:07:29 +00004603 if (!Args.hasFlag(options::OPT_fshow_column,
4604 options::OPT_fno_show_column,
4605 true))
4606 CmdArgs.push_back("-fno-show-column");
4607
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004608 if (!Args.hasFlag(options::OPT_fspell_checking,
4609 options::OPT_fno_spell_checking))
4610 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004611
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004612
Chad Rosierc8e56e82012-12-05 21:08:21 +00004613 // -fno-asm-blocks is default.
4614 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4615 false))
4616 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004617
Steven Wucb0d13f2015-01-16 23:05:28 +00004618 // -fgnu-inline-asm is default.
4619 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4620 options::OPT_fno_gnu_inline_asm, true))
4621 CmdArgs.push_back("-fno-gnu-inline-asm");
4622
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004623 // Enable vectorization per default according to the optimization level
4624 // selected. For optimization levels that want vectorization we use the alias
4625 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004626 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004627 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004628 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004629 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004630 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004631 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004632
Chad Rosier136d67d2014-04-28 19:30:57 +00004633 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004634 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4635 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004636 options::OPT_fslp_vectorize;
4637 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004638 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004639 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004640
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004641 // -fno-slp-vectorize-aggressive is default.
4642 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004643 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004644 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004645
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004646 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4647 A->render(Args, CmdArgs);
4648
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004649 // -fdollars-in-identifiers default varies depending on platform and
4650 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004651 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004652 options::OPT_fno_dollars_in_identifiers)) {
4653 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004654 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004655 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004656 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004657 }
4658
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004659 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4660 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004661 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004662 options::OPT_fno_unit_at_a_time)) {
4663 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004664 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004665 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004666
Eli Friedman055c9702011-11-02 01:53:16 +00004667 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4668 options::OPT_fno_apple_pragma_pack, false))
4669 CmdArgs.push_back("-fapple-pragma-pack");
4670
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004671 // le32-specific flags:
4672 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4673 // by default.
4674 if (getToolChain().getArch() == llvm::Triple::le32) {
4675 CmdArgs.push_back("-fno-math-builtin");
4676 }
4677
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004678 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004679 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004680 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004681#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004682 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004683 (getToolChain().getArch() == llvm::Triple::arm ||
4684 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004685 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4686 CmdArgs.push_back("-fno-builtin-strcat");
4687 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4688 CmdArgs.push_back("-fno-builtin-strcpy");
4689 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004690#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004691
Justin Bognera88f0122014-06-20 22:59:50 +00004692 // Enable rewrite includes if the user's asked for it or if we're generating
4693 // diagnostics.
4694 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4695 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004696 if (Args.hasFlag(options::OPT_frewrite_includes,
4697 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004698 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004699 CmdArgs.push_back("-frewrite-includes");
4700
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004701 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004702 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004703 options::OPT_traditional_cpp)) {
4704 if (isa<PreprocessJobAction>(JA))
4705 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004706 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004707 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004708 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004709
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004710 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004711 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004712
4713 // Handle serialized diagnostics.
4714 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4715 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004716 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004717 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004718
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004719 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4720 CmdArgs.push_back("-fretain-comments-from-system-headers");
4721
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004722 // Forward -fcomment-block-commands to -cc1.
4723 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004724 // Forward -fparse-all-comments to -cc1.
4725 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004726
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004727 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4728 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004729 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004730 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004731 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4732 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004733 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004734
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004735 // We translate this by hand to the -cc1 argument, since nightly test uses
4736 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004737 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004738 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004739 OptDisabled = true;
4740 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004741 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004742 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004743
Bob Wilson23a55f12014-12-21 07:00:00 +00004744 // With -save-temps, we want to save the unoptimized bitcode output from the
4745 // CompileJobAction, so disable optimizations if they are not already
4746 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004747 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004748 isa<CompileJobAction>(JA))
4749 CmdArgs.push_back("-disable-llvm-optzns");
4750
Daniel Dunbard67a3222009-03-30 06:36:42 +00004751 if (Output.getType() == types::TY_Dependencies) {
4752 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004753 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004754 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004755 CmdArgs.push_back(Output.getFilename());
4756 } else {
4757 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004758 }
4759
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004760 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004761 addDashXForInput(Args, II, CmdArgs);
4762
Daniel Dunbarb440f562010-08-02 02:38:21 +00004763 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004764 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004765 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004766 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004767 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004768
Chris Lattnere9d7d782009-11-03 19:50:27 +00004769 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4770
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004771 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004772
4773 // Optionally embed the -cc1 level arguments into the debug info, for build
4774 // analysis.
4775 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004776 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004777 for (const auto &Arg : Args)
4778 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004779
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004780 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004781 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004782 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004783 SmallString<128> EscapedArg;
4784 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004785 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004786 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004787 }
4788 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004789 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004790 }
4791
Eric Christopherd3804002013-02-22 20:12:52 +00004792 // Add the split debug info name to the command lines here so we
4793 // can propagate it to the backend.
4794 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004795 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004796 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4797 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004798 const char *SplitDwarfOut;
4799 if (SplitDwarf) {
4800 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004801 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004802 CmdArgs.push_back(SplitDwarfOut);
4803 }
4804
4805 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004806 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004807 Output.getType() == types::TY_Object &&
4808 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004809 auto CLCommand =
4810 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4811 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4812 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004813 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004814 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004815 }
4816
Daniel Dunbar17731772009-03-23 19:03:36 +00004817
Eric Christopherf1545832013-02-22 23:50:16 +00004818 // Handle the debug info splitting at object creation time if we're
4819 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004820 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004821 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004822 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004823
Roman Divacky178e01602011-02-10 16:52:03 +00004824 if (Arg *A = Args.getLastArg(options::OPT_pg))
4825 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004826 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004827 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004828
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004829 // Claim some arguments which clang supports automatically.
4830
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004831 // -fpch-preprocess is used with gcc to add a special marker in the output to
4832 // include the PCH file. Clang's PTH solution is completely transparent, so we
4833 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004834 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004835
Daniel Dunbar17731772009-03-23 19:03:36 +00004836 // Claim some arguments which clang doesn't support, but we don't
4837 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004838 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4839 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004840
Rafael Espindolab0092d72013-09-04 19:37:35 +00004841 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004842 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004843}
4844
John McCall5fb5df92012-06-20 06:18:46 +00004845/// Add options related to the Objective-C runtime/ABI.
4846///
4847/// Returns true if the runtime is non-fragile.
4848ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4849 ArgStringList &cmdArgs,
4850 RewriteKind rewriteKind) const {
4851 // Look for the controlling runtime option.
4852 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4853 options::OPT_fgnu_runtime,
4854 options::OPT_fobjc_runtime_EQ);
4855
4856 // Just forward -fobjc-runtime= to the frontend. This supercedes
4857 // options about fragility.
4858 if (runtimeArg &&
4859 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4860 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004861 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004862 if (runtime.tryParse(value)) {
4863 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4864 << value;
4865 }
4866
4867 runtimeArg->render(args, cmdArgs);
4868 return runtime;
4869 }
4870
4871 // Otherwise, we'll need the ABI "version". Version numbers are
4872 // slightly confusing for historical reasons:
4873 // 1 - Traditional "fragile" ABI
4874 // 2 - Non-fragile ABI, version 1
4875 // 3 - Non-fragile ABI, version 2
4876 unsigned objcABIVersion = 1;
4877 // If -fobjc-abi-version= is present, use that to set the version.
4878 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004879 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004880 if (value == "1")
4881 objcABIVersion = 1;
4882 else if (value == "2")
4883 objcABIVersion = 2;
4884 else if (value == "3")
4885 objcABIVersion = 3;
4886 else
4887 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4888 << value;
4889 } else {
4890 // Otherwise, determine if we are using the non-fragile ABI.
4891 bool nonFragileABIIsDefault =
4892 (rewriteKind == RK_NonFragile ||
4893 (rewriteKind == RK_None &&
4894 getToolChain().IsObjCNonFragileABIDefault()));
4895 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4896 options::OPT_fno_objc_nonfragile_abi,
4897 nonFragileABIIsDefault)) {
4898 // Determine the non-fragile ABI version to use.
4899#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4900 unsigned nonFragileABIVersion = 1;
4901#else
4902 unsigned nonFragileABIVersion = 2;
4903#endif
4904
4905 if (Arg *abiArg = args.getLastArg(
4906 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004907 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004908 if (value == "1")
4909 nonFragileABIVersion = 1;
4910 else if (value == "2")
4911 nonFragileABIVersion = 2;
4912 else
4913 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4914 << value;
4915 }
4916
4917 objcABIVersion = 1 + nonFragileABIVersion;
4918 } else {
4919 objcABIVersion = 1;
4920 }
4921 }
4922
4923 // We don't actually care about the ABI version other than whether
4924 // it's non-fragile.
4925 bool isNonFragile = objcABIVersion != 1;
4926
4927 // If we have no runtime argument, ask the toolchain for its default runtime.
4928 // However, the rewriter only really supports the Mac runtime, so assume that.
4929 ObjCRuntime runtime;
4930 if (!runtimeArg) {
4931 switch (rewriteKind) {
4932 case RK_None:
4933 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4934 break;
4935 case RK_Fragile:
4936 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4937 break;
4938 case RK_NonFragile:
4939 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4940 break;
4941 }
4942
4943 // -fnext-runtime
4944 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4945 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004946 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004947 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4948
4949 // Otherwise, build for a generic macosx port.
4950 } else {
4951 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4952 }
4953
4954 // -fgnu-runtime
4955 } else {
4956 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004957 // Legacy behaviour is to target the gnustep runtime if we are i
4958 // non-fragile mode or the GCC runtime in fragile mode.
4959 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004960 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004961 else
4962 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004963 }
4964
4965 cmdArgs.push_back(args.MakeArgString(
4966 "-fobjc-runtime=" + runtime.getAsString()));
4967 return runtime;
4968}
4969
Reid Klecknerc542d372014-06-27 17:02:02 +00004970static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4971 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4972 I += HaveDash;
4973 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004974}
Reid Klecknerc542d372014-06-27 17:02:02 +00004975
4976struct EHFlags {
4977 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4978 bool Synch;
4979 bool Asynch;
4980 bool NoExceptC;
4981};
4982
4983/// /EH controls whether to run destructor cleanups when exceptions are
4984/// thrown. There are three modifiers:
4985/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4986/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4987/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4988/// - c: Assume that extern "C" functions are implicitly noexcept. This
4989/// modifier is an optimization, so we ignore it for now.
4990/// The default is /EHs-c-, meaning cleanups are disabled.
4991static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4992 EHFlags EH;
4993 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4994 for (auto EHVal : EHArgs) {
4995 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4996 switch (EHVal[I]) {
4997 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4998 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4999 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
5000 default: break;
5001 }
5002 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5003 break;
5004 }
5005 }
5006 return EH;
5007}
5008
Hans Wennborg75958c42013-08-08 00:17:41 +00005009void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5010 unsigned RTOptionID = options::OPT__SLASH_MT;
5011
Hans Wennborgf1a74252013-09-10 20:18:04 +00005012 if (Args.hasArg(options::OPT__SLASH_LDd))
5013 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5014 // but defining _DEBUG is sticky.
5015 RTOptionID = options::OPT__SLASH_MTd;
5016
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005017 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005018 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005019
Hans Wennborg75958c42013-08-08 00:17:41 +00005020 switch(RTOptionID) {
5021 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00005022 if (Args.hasArg(options::OPT__SLASH_LDd))
5023 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00005024 CmdArgs.push_back("-D_MT");
5025 CmdArgs.push_back("-D_DLL");
5026 CmdArgs.push_back("--dependent-lib=msvcrt");
5027 break;
5028 case options::OPT__SLASH_MDd:
5029 CmdArgs.push_back("-D_DEBUG");
5030 CmdArgs.push_back("-D_MT");
5031 CmdArgs.push_back("-D_DLL");
5032 CmdArgs.push_back("--dependent-lib=msvcrtd");
5033 break;
5034 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00005035 if (Args.hasArg(options::OPT__SLASH_LDd))
5036 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00005037 CmdArgs.push_back("-D_MT");
5038 CmdArgs.push_back("--dependent-lib=libcmt");
5039 break;
5040 case options::OPT__SLASH_MTd:
5041 CmdArgs.push_back("-D_DEBUG");
5042 CmdArgs.push_back("-D_MT");
5043 CmdArgs.push_back("--dependent-lib=libcmtd");
5044 break;
5045 default:
5046 llvm_unreachable("Unexpected option ID.");
5047 }
5048
Reid Kleckner6beca0e2013-08-08 19:33:10 +00005049 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5050 // users want. The /Za flag to cl.exe turns this off, but it's not
5051 // implemented in clang.
5052 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00005053
Hans Wennborg8858a032014-07-21 23:42:07 +00005054 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5055 // would produce interleaved output, so ignore /showIncludes in such cases.
5056 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5057 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5058 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005059
David Majnemerf6072342014-07-01 22:24:56 +00005060 // This controls whether or not we emit RTTI data for polymorphic types.
5061 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5062 /*default=*/false))
5063 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005064
Reid Klecknerc542d372014-06-27 17:02:02 +00005065 const Driver &D = getToolChain().getDriver();
5066 EHFlags EH = parseClangCLEHFlags(D, Args);
5067 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005068 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005069 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005070 CmdArgs.push_back("-fexceptions");
5071 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005072
Hans Wennborge50cec32014-06-13 20:59:54 +00005073 // /EP should expand to -E -P.
5074 if (Args.hasArg(options::OPT__SLASH_EP)) {
5075 CmdArgs.push_back("-E");
5076 CmdArgs.push_back("-P");
5077 }
5078
David Majnemera5b195a2015-02-14 01:35:12 +00005079 unsigned VolatileOptionID;
5080 if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
5081 getToolChain().getTriple().getArch() == llvm::Triple::x86)
5082 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5083 else
5084 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5085
5086 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5087 VolatileOptionID = A->getOption().getID();
5088
5089 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5090 CmdArgs.push_back("-fms-volatile");
5091
David Majnemer86c318f2014-02-11 21:05:00 +00005092 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5093 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5094 if (MostGeneralArg && BestCaseArg)
5095 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5096 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5097
5098 if (MostGeneralArg) {
5099 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5100 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5101 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5102
5103 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5104 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5105 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5106 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5107 << FirstConflict->getAsString(Args)
5108 << SecondConflict->getAsString(Args);
5109
5110 if (SingleArg)
5111 CmdArgs.push_back("-fms-memptr-rep=single");
5112 else if (MultipleArg)
5113 CmdArgs.push_back("-fms-memptr-rep=multiple");
5114 else
5115 CmdArgs.push_back("-fms-memptr-rep=virtual");
5116 }
5117
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005118 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5119 A->render(Args, CmdArgs);
5120
Hans Wennborg81f74482013-09-10 01:07:07 +00005121 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5122 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005123 if (Args.hasArg(options::OPT__SLASH_fallback))
5124 CmdArgs.push_back("msvc-fallback");
5125 else
5126 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005127 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005128}
5129
Hans Wennborg1da044a2014-06-26 19:59:02 +00005130visualstudio::Compile *Clang::getCLFallback() const {
5131 if (!CLFallback)
5132 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5133 return CLFallback.get();
5134}
5135
Daniel Sanders7f933f42015-01-30 17:35:23 +00005136void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5137 ArgStringList &CmdArgs) const {
5138 StringRef CPUName;
5139 StringRef ABIName;
5140 const llvm::Triple &Triple = getToolChain().getTriple();
5141 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5142
5143 CmdArgs.push_back("-target-abi");
5144 CmdArgs.push_back(ABIName.data());
5145}
5146
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005147void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005148 const InputInfo &Output,
5149 const InputInfoList &Inputs,
5150 const ArgList &Args,
5151 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005152 ArgStringList CmdArgs;
5153
5154 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5155 const InputInfo &Input = Inputs[0];
5156
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005157 // Don't warn about "clang -w -c foo.s"
5158 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005159 // and "clang -emit-llvm -c foo.s"
5160 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005161
Rafael Espindola577637a2015-01-03 00:06:04 +00005162 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005163
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005164 // Invoke ourselves in -cc1as mode.
5165 //
5166 // FIXME: Implement custom jobs for internal actions.
5167 CmdArgs.push_back("-cc1as");
5168
5169 // Add the "effective" target triple.
5170 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005171 std::string TripleStr =
5172 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005173 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5174
5175 // Set the output mode, we currently only expect to be used as a real
5176 // assembler.
5177 CmdArgs.push_back("-filetype");
5178 CmdArgs.push_back("obj");
5179
Eric Christopher45f2e712012-12-18 00:31:10 +00005180 // Set the main file name, so that debug info works even with
5181 // -save-temps or preprocessed assembly.
5182 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005183 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005184
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005185 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005186 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005187 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005188 if (!CPU.empty()) {
5189 CmdArgs.push_back("-target-cpu");
5190 CmdArgs.push_back(Args.MakeArgString(CPU));
5191 }
5192
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005193 // Add the target features
5194 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005195 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005196
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005197 // Ignore explicit -force_cpusubtype_ALL option.
5198 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005199
Eric Christopherfc3ee562012-01-10 00:38:01 +00005200 // Determine the original source input.
5201 const Action *SourceAction = &JA;
5202 while (SourceAction->getKind() != Action::InputClass) {
5203 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5204 SourceAction = SourceAction->getInputs()[0];
5205 }
5206
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005207 // Forward -g and handle debug info related flags, assuming we are dealing
5208 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005209 if (SourceAction->getType() == types::TY_Asm ||
5210 SourceAction->getType() == types::TY_PP_Asm) {
5211 Args.ClaimAllArgs(options::OPT_g_Group);
5212 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5213 if (!A->getOption().matches(options::OPT_g0))
5214 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005215
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005216 if (Args.hasArg(options::OPT_gdwarf_2))
5217 CmdArgs.push_back("-gdwarf-2");
5218 if (Args.hasArg(options::OPT_gdwarf_3))
5219 CmdArgs.push_back("-gdwarf-3");
5220 if (Args.hasArg(options::OPT_gdwarf_4))
5221 CmdArgs.push_back("-gdwarf-4");
5222
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005223 // Add the -fdebug-compilation-dir flag if needed.
5224 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005225
5226 // Set the AT_producer to the clang version when using the integrated
5227 // assembler on assembly source files.
5228 CmdArgs.push_back("-dwarf-debug-producer");
5229 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005230 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005231
5232 // Optionally embed the -cc1as level arguments into the debug info, for build
5233 // analysis.
5234 if (getToolChain().UseDwarfDebugFlags()) {
5235 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005236 for (const auto &Arg : Args)
5237 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005238
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005239 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005240 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5241 Flags += Exec;
5242 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005243 SmallString<128> EscapedArg;
5244 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005245 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005246 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005247 }
5248 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005249 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005250 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005251
5252 // FIXME: Add -static support, once we have it.
5253
Daniel Sanders7f933f42015-01-30 17:35:23 +00005254 // Add target specific flags.
5255 switch(getToolChain().getArch()) {
5256 default:
5257 break;
5258
5259 case llvm::Triple::mips:
5260 case llvm::Triple::mipsel:
5261 case llvm::Triple::mips64:
5262 case llvm::Triple::mips64el:
5263 AddMIPSTargetArgs(Args, CmdArgs);
5264 break;
5265 }
5266
David Blaikie372d9502014-01-17 03:17:40 +00005267 // Consume all the warning flags. Usually this would be handled more
5268 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5269 // doesn't handle that so rather than warning about unused flags that are
5270 // actually used, we'll lie by omission instead.
5271 // FIXME: Stop lying and consume only the appropriate driver flags
5272 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5273 ie = Args.filtered_end();
5274 it != ie; ++it)
5275 (*it)->claim();
5276
David Blaikie9260ed62013-07-25 21:19:01 +00005277 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5278 getToolChain().getDriver());
5279
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005280 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005281
5282 assert(Output.isFilename() && "Unexpected lipo output.");
5283 CmdArgs.push_back("-o");
5284 CmdArgs.push_back(Output.getFilename());
5285
Daniel Dunbarb440f562010-08-02 02:38:21 +00005286 assert(Input.isFilename() && "Invalid input.");
5287 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005288
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005289 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005290 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005291
5292 // Handle the debug info splitting at object creation time if we're
5293 // creating an object.
5294 // TODO: Currently only works on linux with newer objcopy.
5295 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005296 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005297 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005298 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005299}
5300
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005301void GnuTool::anchor() {}
5302
Daniel Dunbara3246a02009-03-18 08:07:30 +00005303void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005304 const InputInfo &Output,
5305 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005306 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005307 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005308 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005309 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005310
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005311 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005312 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005313 // Don't forward any -g arguments to assembly steps.
5314 if (isa<AssembleJobAction>(JA) &&
5315 A->getOption().matches(options::OPT_g_Group))
5316 continue;
5317
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005318 // Don't forward any -W arguments to assembly and link steps.
5319 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5320 A->getOption().matches(options::OPT_W_Group))
5321 continue;
5322
Daniel Dunbar2da02722009-03-19 07:55:12 +00005323 // It is unfortunate that we have to claim here, as this means
5324 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005325 // platforms using a generic gcc, even if we are just using gcc
5326 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005327 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005328 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005329 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005331
Daniel Dunbar4e295052010-01-25 22:35:08 +00005332 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005333
5334 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005335 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005336 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005337 CmdArgs.push_back(
5338 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005339 }
5340
Daniel Dunbar5716d872009-05-02 21:41:52 +00005341 // Try to force gcc to match the tool chain we want, if we recognize
5342 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005343 //
5344 // FIXME: The triple class should directly provide the information we want
5345 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005346 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005347 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005348 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005349 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5350 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005351 CmdArgs.push_back("-m64");
5352
Daniel Dunbarb440f562010-08-02 02:38:21 +00005353 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005354 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005355 CmdArgs.push_back(Output.getFilename());
5356 } else {
5357 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005358 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005359 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005360
Tony Linthicum76329bf2011-12-12 21:14:55 +00005361 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5362 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005363
5364 // Only pass -x if gcc will understand it; otherwise hope gcc
5365 // understands the suffix correctly. The main use case this would go
5366 // wrong in is for linker inputs if they happened to have an odd
5367 // suffix; really the only way to get this to happen is a command
5368 // like '-x foobar a.c' which will treat a.c like a linker input.
5369 //
5370 // FIXME: For the linker case specifically, can we safely convert
5371 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005372 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005373 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005374 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5375 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005376 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005377 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005378 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005379 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005380 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005381 else if (II.getType() == types::TY_ModuleFile)
5382 D.Diag(diag::err_drv_no_module_support)
5383 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005384
Daniel Dunbara3246a02009-03-18 08:07:30 +00005385 if (types::canTypeBeUserSpecified(II.getType())) {
5386 CmdArgs.push_back("-x");
5387 CmdArgs.push_back(types::getTypeName(II.getType()));
5388 }
5389
Daniel Dunbarb440f562010-08-02 02:38:21 +00005390 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005391 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005392 else {
5393 const Arg &A = II.getInputArg();
5394
5395 // Reverse translate some rewritten options.
5396 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5397 CmdArgs.push_back("-lstdc++");
5398 continue;
5399 }
5400
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005401 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005402 A.render(Args, CmdArgs);
5403 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005404 }
5405
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005406 const std::string customGCCName = D.getCCCGenericGCCName();
5407 const char *GCCName;
5408 if (!customGCCName.empty())
5409 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005410 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005411 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005412 } else
5413 GCCName = "gcc";
5414
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005415 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005416 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005417 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005418}
5419
Daniel Dunbar4e295052010-01-25 22:35:08 +00005420void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5421 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005422 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005423}
5424
Daniel Dunbar4e295052010-01-25 22:35:08 +00005425void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5426 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005427 const Driver &D = getToolChain().getDriver();
5428
Eric Christophercc7ff502015-01-29 00:56:17 +00005429 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005430 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005431 case types::TY_LLVM_IR:
5432 case types::TY_LTO_IR:
5433 case types::TY_LLVM_BC:
5434 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005435 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005436 break;
5437 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005438 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005439 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005440 case types::TY_Nothing:
5441 CmdArgs.push_back("-fsyntax-only");
5442 break;
5443 default:
5444 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005445 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005446}
5447
Daniel Dunbar4e295052010-01-25 22:35:08 +00005448void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5449 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005450 // The types are (hopefully) good enough.
5451}
5452
Tony Linthicum76329bf2011-12-12 21:14:55 +00005453// Hexagon tools start.
5454void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5455 ArgStringList &CmdArgs) const {
5456
5457}
5458void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5459 const InputInfo &Output,
5460 const InputInfoList &Inputs,
5461 const ArgList &Args,
5462 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005463 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005464
5465 const Driver &D = getToolChain().getDriver();
5466 ArgStringList CmdArgs;
5467
5468 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005469 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005470 CmdArgs.push_back(Args.MakeArgString(MarchString));
5471
5472 RenderExtraToolArgs(JA, CmdArgs);
5473
5474 if (Output.isFilename()) {
5475 CmdArgs.push_back("-o");
5476 CmdArgs.push_back(Output.getFilename());
5477 } else {
5478 assert(Output.isNothing() && "Unexpected output");
5479 CmdArgs.push_back("-fsyntax-only");
5480 }
5481
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005482 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
5483 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005484
Matthew Curtise5df3812012-12-07 17:23:04 +00005485 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5486 options::OPT_Xassembler);
5487
Tony Linthicum76329bf2011-12-12 21:14:55 +00005488 // Only pass -x if gcc will understand it; otherwise hope gcc
5489 // understands the suffix correctly. The main use case this would go
5490 // wrong in is for linker inputs if they happened to have an odd
5491 // suffix; really the only way to get this to happen is a command
5492 // like '-x foobar a.c' which will treat a.c like a linker input.
5493 //
5494 // FIXME: For the linker case specifically, can we safely convert
5495 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005496 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005497 // Don't try to pass LLVM or AST inputs to a generic gcc.
5498 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5499 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5500 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5501 << getToolChain().getTripleString();
5502 else if (II.getType() == types::TY_AST)
5503 D.Diag(clang::diag::err_drv_no_ast_support)
5504 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005505 else if (II.getType() == types::TY_ModuleFile)
5506 D.Diag(diag::err_drv_no_module_support)
5507 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005508
5509 if (II.isFilename())
5510 CmdArgs.push_back(II.getFilename());
5511 else
5512 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5513 II.getInputArg().render(Args, CmdArgs);
5514 }
5515
5516 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005517 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005518 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005519}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005520
Tony Linthicum76329bf2011-12-12 21:14:55 +00005521void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5522 ArgStringList &CmdArgs) const {
5523 // The types are (hopefully) good enough.
5524}
5525
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005526static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5527 const toolchains::Hexagon_TC& ToolChain,
5528 const InputInfo &Output,
5529 const InputInfoList &Inputs,
5530 const ArgList &Args,
5531 ArgStringList &CmdArgs,
5532 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005533
Matthew Curtise689b052012-12-06 15:46:07 +00005534 const Driver &D = ToolChain.getDriver();
5535
Tony Linthicum76329bf2011-12-12 21:14:55 +00005536
Matthew Curtise689b052012-12-06 15:46:07 +00005537 //----------------------------------------------------------------------------
5538 //
5539 //----------------------------------------------------------------------------
5540 bool hasStaticArg = Args.hasArg(options::OPT_static);
5541 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005542 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005543 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5544 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5545 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005546 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005547 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005548
Matthew Curtise689b052012-12-06 15:46:07 +00005549 //----------------------------------------------------------------------------
5550 // Silence warnings for various options
5551 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005552
Matthew Curtise689b052012-12-06 15:46:07 +00005553 Args.ClaimAllArgs(options::OPT_g_Group);
5554 Args.ClaimAllArgs(options::OPT_emit_llvm);
5555 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5556 // handled somewhere else.
5557 Args.ClaimAllArgs(options::OPT_static_libgcc);
5558
5559 //----------------------------------------------------------------------------
5560 //
5561 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005562 for (const auto &Opt : ToolChain.ExtraOpts)
5563 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005564
Matthew Curtisf10a5952012-12-06 14:16:43 +00005565 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5566 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005567
Matthew Curtise689b052012-12-06 15:46:07 +00005568 if (buildingLib) {
5569 CmdArgs.push_back("-shared");
5570 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5571 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005572 }
5573
Matthew Curtise689b052012-12-06 15:46:07 +00005574 if (hasStaticArg)
5575 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005576
Matthew Curtise8f80a12012-12-06 17:49:03 +00005577 if (buildPIE && !buildingLib)
5578 CmdArgs.push_back("-pie");
5579
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005580 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
5581 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5582 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005583 }
5584
Matthew Curtise689b052012-12-06 15:46:07 +00005585 //----------------------------------------------------------------------------
5586 //
5587 //----------------------------------------------------------------------------
5588 CmdArgs.push_back("-o");
5589 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005590
Matthew Curtise689b052012-12-06 15:46:07 +00005591 const std::string MarchSuffix = "/" + MarchString;
5592 const std::string G0Suffix = "/G0";
5593 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005594 const std::string RootDir =
5595 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005596 const std::string StartFilesDir = RootDir
5597 + "hexagon/lib"
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005598 + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005599
5600 //----------------------------------------------------------------------------
5601 // moslib
5602 //----------------------------------------------------------------------------
5603 std::vector<std::string> oslibs;
5604 bool hasStandalone= false;
5605
5606 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5607 ie = Args.filtered_end(); it != ie; ++it) {
5608 (*it)->claim();
5609 oslibs.push_back((*it)->getValue());
5610 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005611 }
Matthew Curtise689b052012-12-06 15:46:07 +00005612 if (oslibs.empty()) {
5613 oslibs.push_back("standalone");
5614 hasStandalone = true;
5615 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005616
Matthew Curtise689b052012-12-06 15:46:07 +00005617 //----------------------------------------------------------------------------
5618 // Start Files
5619 //----------------------------------------------------------------------------
5620 if (incStdLib && incStartFiles) {
5621
5622 if (!buildingLib) {
5623 if (hasStandalone) {
5624 CmdArgs.push_back(
5625 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5626 }
5627 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5628 }
5629 std::string initObj = useShared ? "/initS.o" : "/init.o";
5630 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5631 }
5632
5633 //----------------------------------------------------------------------------
5634 // Library Search Paths
5635 //----------------------------------------------------------------------------
5636 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005637 for (const auto &LibPath : LibPaths)
5638 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005639
5640 //----------------------------------------------------------------------------
5641 //
5642 //----------------------------------------------------------------------------
5643 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5644 Args.AddAllArgs(CmdArgs, options::OPT_e);
5645 Args.AddAllArgs(CmdArgs, options::OPT_s);
5646 Args.AddAllArgs(CmdArgs, options::OPT_t);
5647 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5648
5649 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5650
5651 //----------------------------------------------------------------------------
5652 // Libraries
5653 //----------------------------------------------------------------------------
5654 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005655 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005656 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5657 CmdArgs.push_back("-lm");
5658 }
5659
5660 CmdArgs.push_back("--start-group");
5661
5662 if (!buildingLib) {
5663 for(std::vector<std::string>::iterator i = oslibs.begin(),
5664 e = oslibs.end(); i != e; ++i)
5665 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5666 CmdArgs.push_back("-lc");
5667 }
5668 CmdArgs.push_back("-lgcc");
5669
5670 CmdArgs.push_back("--end-group");
5671 }
5672
5673 //----------------------------------------------------------------------------
5674 // End files
5675 //----------------------------------------------------------------------------
5676 if (incStdLib && incStartFiles) {
5677 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5678 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5679 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005680}
5681
5682void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5683 const InputInfo &Output,
5684 const InputInfoList &Inputs,
5685 const ArgList &Args,
5686 const char *LinkingOutput) const {
5687
5688 const toolchains::Hexagon_TC& ToolChain =
5689 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5690
5691 ArgStringList CmdArgs;
5692 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5693 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005694
5695 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005696 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5697 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005698}
5699// Hexagon tools end.
5700
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005701const StringRef arm::getARMArch(const ArgList &Args,
5702 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005703 StringRef MArch;
5704 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5705 // Otherwise, if we have -march= choose the base CPU for that arch.
5706 MArch = A->getValue();
5707 } else {
5708 // Otherwise, use the Arch from the triple.
5709 MArch = Triple.getArchName();
5710 }
John Brawn94fd9632015-05-21 12:19:49 +00005711
5712 // Handle -march=native.
5713 if (MArch == "native") {
5714 std::string CPU = llvm::sys::getHostCPUName();
5715 if (CPU != "generic") {
5716 // Translate the native cpu into the architecture suffix for that CPU.
5717 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5718 // If there is no valid architecture suffix for this CPU we don't know how
5719 // to handle it, so return no architecture.
5720 if (strcmp(Suffix,"") == 0)
5721 MArch = "";
5722 else
5723 MArch = std::string("arm") + Suffix;
5724 }
5725 }
5726
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005727 return MArch;
5728}
5729/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5730const char *arm::getARMCPUForMArch(const ArgList &Args,
5731 const llvm::Triple &Triple) {
5732 StringRef MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005733 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5734 // here means an -march=native that we can't handle, so instead return no CPU.
5735 if (MArch.empty())
5736 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005737
John Brawna95c1a82015-05-08 12:52:18 +00005738 // We need to return an empty string here on invalid MArch values as the
5739 // various places that call this function can't cope with a null result.
5740 const char *result = Triple.getARMCPUForArch(MArch);
5741 if (result)
5742 return result;
5743 else
5744 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005745}
5746
5747/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005748StringRef arm::getARMTargetCPU(const ArgList &Args,
5749 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005750 // FIXME: Warn on inconsistent use of -mcpu and -march.
5751 // If we have -mcpu=, use that.
5752 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Renato Golin4045f662015-05-08 15:44:36 +00005753 StringRef MCPU = A->getValue();
Bernard Ogden31561762013-12-12 13:27:11 +00005754 // Handle -mcpu=native.
5755 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005756 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005757 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005758 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005759 }
5760
5761 return getARMCPUForMArch(Args, Triple);
5762}
5763
5764/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005765/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005766//
5767// FIXME: This is redundant with -mcpu, why does LLVM use this.
5768// FIXME: tblgen this, or kill it!
Renato Golin0600e1e2015-05-08 21:04:50 +00005769// FIXME: Use ARMTargetParser.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005770const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
5771 // FIXME: Use ARMTargetParser
5772 if (CPU == "generic") {
5773 if (Arch == "armv8.1a" || Arch == "armv8.1-a" ||
5774 Arch == "armebv8.1a" || Arch == "armebv8.1-a") {
5775 return "v8.1a";
5776 }
5777 }
5778
John Brawn94fd9632015-05-21 12:19:49 +00005779 // FIXME: Use ARMTargetParser
Bernard Ogden31561762013-12-12 13:27:11 +00005780 return llvm::StringSwitch<const char *>(CPU)
John Brawn94fd9632015-05-21 12:19:49 +00005781 .Cases("arm8", "arm810", "v4")
5782 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "v4")
Bernard Ogden31561762013-12-12 13:27:11 +00005783 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5784 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5785 .Cases("arm920", "arm920t", "arm922t", "v4t")
5786 .Cases("arm940t", "ep9312","v4t")
5787 .Cases("arm10tdmi", "arm1020t", "v5")
5788 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5789 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5790 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
Renato Goline11531f2015-03-17 11:55:43 +00005791 .Cases("arm1136j-s", "arm1136jf-s", "v6")
5792 .Cases("arm1176jz-s", "arm1176jzf-s", "v6k")
5793 .Cases("mpcorenovfp", "mpcore", "v6k")
Bernard Ogden31561762013-12-12 13:27:11 +00005794 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005795 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005796 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Javed Absar879d18b82015-04-09 14:12:10 +00005797 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "v7r")
Bradley Smithd86d6702015-02-18 10:34:48 +00005798 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "v6m")
5799 .Cases("sc300", "cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005800 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005801 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005802 .Case("cyclone", "v8")
Renato Golin84545d72015-02-04 13:31:56 +00005803 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005804 .Default("");
5805}
5806
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005807void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
5808 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005809 if (Args.hasArg(options::OPT_r))
5810 return;
5811
John Brawn94fd9632015-05-21 12:19:49 +00005812 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5813 // to generate BE-8 executables.
5814 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5815 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005816}
5817
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005818mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5819 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5820 .Case("mips1", NanLegacy)
5821 .Case("mips2", NanLegacy)
5822 .Case("mips3", NanLegacy)
5823 .Case("mips4", NanLegacy)
5824 .Case("mips5", NanLegacy)
5825 .Case("mips32", NanLegacy)
5826 .Case("mips32r2", NanLegacy)
5827 .Case("mips32r3", NanLegacy | Nan2008)
5828 .Case("mips32r5", NanLegacy | Nan2008)
5829 .Case("mips32r6", Nan2008)
5830 .Case("mips64", NanLegacy)
5831 .Case("mips64r2", NanLegacy)
5832 .Case("mips64r3", NanLegacy | Nan2008)
5833 .Case("mips64r5", NanLegacy | Nan2008)
5834 .Case("mips64r6", Nan2008)
5835 .Default(NanLegacy);
5836}
5837
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005838bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5839 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5840 return A && (A->getValue() == StringRef(Value));
5841}
5842
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005843bool mips::isUCLibc(const ArgList &Args) {
5844 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005845 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005846}
5847
Daniel Sanders2bf13662014-07-10 14:40:57 +00005848bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005849 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5850 return llvm::StringSwitch<bool>(NaNArg->getValue())
5851 .Case("2008", true)
5852 .Case("legacy", false)
5853 .Default(false);
5854
5855 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005856 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5857 .Cases("mips32r6", "mips64r6", true)
5858 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005859
5860 return false;
5861}
5862
Daniel Sanders379d44b2014-07-16 11:52:23 +00005863bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5864 StringRef ABIName) {
5865 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005866 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005867 return false;
5868
5869 if (ABIName != "32")
5870 return false;
5871
5872 return llvm::StringSwitch<bool>(CPUName)
5873 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005874 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5875 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005876 .Default(false);
5877}
5878
Tim Northover157d9112014-01-16 08:48:16 +00005879llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005880 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5881 // archs which Darwin doesn't use.
5882
5883 // The matching this routine does is fairly pointless, since it is neither the
5884 // complete architecture list, nor a reasonable subset. The problem is that
5885 // historically the driver driver accepts this and also ties its -march=
5886 // handling to the architecture name, so we need to be careful before removing
5887 // support for it.
5888
5889 // This code must be kept in sync with Clang's Darwin specific argument
5890 // translation.
5891
5892 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5893 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5894 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5895 .Case("ppc64", llvm::Triple::ppc64)
5896 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5897 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5898 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005899 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005900 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005901 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005902 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005903 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005904 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005905 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005906 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005907 .Case("nvptx", llvm::Triple::nvptx)
5908 .Case("nvptx64", llvm::Triple::nvptx64)
5909 .Case("amdil", llvm::Triple::amdil)
5910 .Case("spir", llvm::Triple::spir)
5911 .Default(llvm::Triple::UnknownArch);
5912}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005913
Tim Northover157d9112014-01-16 08:48:16 +00005914void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5915 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5916 T.setArch(Arch);
5917
5918 if (Str == "x86_64h")
5919 T.setArchName(Str);
5920 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5921 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005922 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005923 }
5924}
5925
Bob Wilsondecc03e2012-11-23 06:14:39 +00005926const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005927 const InputInfo &Input) {
5928 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005929}
5930
Bob Wilsondecc03e2012-11-23 06:14:39 +00005931const char *Clang::getBaseInputStem(const ArgList &Args,
5932 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005933 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005934
Chris Lattner906bb902011-01-16 08:14:11 +00005935 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005936 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005937
5938 return Str;
5939}
5940
Bob Wilsondecc03e2012-11-23 06:14:39 +00005941const char *Clang::getDependencyFileName(const ArgList &Args,
5942 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005943 // FIXME: Think about this more.
5944 std::string Res;
5945
5946 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005947 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005948 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005949 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005950 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005951 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005952 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005953}
5954
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005955void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5956 const InputInfo &Output,
5957 const InputInfoList &Inputs,
5958 const ArgList &Args,
5959 const char *LinkingOutput) const {
5960 const ToolChain &ToolChain = getToolChain();
5961 const Driver &D = ToolChain.getDriver();
5962 ArgStringList CmdArgs;
5963
5964 // Silence warning for "clang -g foo.o -o foo"
5965 Args.ClaimAllArgs(options::OPT_g_Group);
5966 // and "clang -emit-llvm foo.o -o foo"
5967 Args.ClaimAllArgs(options::OPT_emit_llvm);
5968 // and for "clang -w foo.o -o foo". Other warning options are already
5969 // handled somewhere else.
5970 Args.ClaimAllArgs(options::OPT_w);
5971
5972 if (!D.SysRoot.empty())
5973 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5974
5975 // CloudABI only supports static linkage.
5976 CmdArgs.push_back("-Bstatic");
5977 CmdArgs.push_back("--eh-frame-hdr");
5978 CmdArgs.push_back("--gc-sections");
5979
5980 if (Output.isFilename()) {
5981 CmdArgs.push_back("-o");
5982 CmdArgs.push_back(Output.getFilename());
5983 } else {
5984 assert(Output.isNothing() && "Invalid output.");
5985 }
5986
5987 if (!Args.hasArg(options::OPT_nostdlib) &&
5988 !Args.hasArg(options::OPT_nostartfiles)) {
5989 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5990 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5991 }
5992
5993 Args.AddAllArgs(CmdArgs, options::OPT_L);
5994 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5995 for (const auto &Path : Paths)
5996 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5997 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5998 Args.AddAllArgs(CmdArgs, options::OPT_e);
5999 Args.AddAllArgs(CmdArgs, options::OPT_s);
6000 Args.AddAllArgs(CmdArgs, options::OPT_t);
6001 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6002 Args.AddAllArgs(CmdArgs, options::OPT_r);
6003
6004 if (D.IsUsingLTO(ToolChain, Args))
6005 AddGoldPlugin(ToolChain, Args, CmdArgs);
6006
6007 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6008
6009 if (!Args.hasArg(options::OPT_nostdlib) &&
6010 !Args.hasArg(options::OPT_nodefaultlibs)) {
6011 if (D.CCCIsCXX())
6012 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6013 CmdArgs.push_back("-lc");
6014 CmdArgs.push_back("-lcompiler_rt");
6015 }
6016
6017 if (!Args.hasArg(options::OPT_nostdlib) &&
6018 !Args.hasArg(options::OPT_nostartfiles))
6019 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6020
6021 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
6022 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
6023}
6024
Daniel Dunbarbe220842009-03-20 16:06:39 +00006025void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006026 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006027 const InputInfoList &Inputs,
6028 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00006029 const char *LinkingOutput) const {
6030 ArgStringList CmdArgs;
6031
6032 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6033 const InputInfo &Input = Inputs[0];
6034
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006035 // Determine the original source input.
6036 const Action *SourceAction = &JA;
6037 while (SourceAction->getKind() != Action::InputClass) {
6038 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6039 SourceAction = SourceAction->getInputs()[0];
6040 }
6041
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006042 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006043 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006044 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6045 // FIXME: at run-time detect assembler capabilities or rely on version
6046 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006047 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006048 const llvm::Triple &T(getToolChain().getTriple());
6049 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006050 CmdArgs.push_back("-Q");
6051 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006052
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006053 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006054 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006055 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006056 if (Args.hasArg(options::OPT_gstabs))
6057 CmdArgs.push_back("--gstabs");
6058 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006059 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006060 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006061
Daniel Dunbarbe220842009-03-20 16:06:39 +00006062 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006063 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006064
Daniel Dunbar6d484762010-07-22 01:47:22 +00006065 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006066 if (getToolChain().getArch() == llvm::Triple::x86 ||
6067 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006068 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6069 CmdArgs.push_back("-force_cpusubtype_ALL");
6070
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006071 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006072 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006073 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006074 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006075 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006076 CmdArgs.push_back("-static");
6077
Daniel Dunbarbe220842009-03-20 16:06:39 +00006078 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6079 options::OPT_Xassembler);
6080
6081 assert(Output.isFilename() && "Unexpected lipo output.");
6082 CmdArgs.push_back("-o");
6083 CmdArgs.push_back(Output.getFilename());
6084
Daniel Dunbarb440f562010-08-02 02:38:21 +00006085 assert(Input.isFilename() && "Invalid input.");
6086 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006087
6088 // asm_final spec is empty.
6089
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006090 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006091 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006092 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006093}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006094
Tim Northover157d9112014-01-16 08:48:16 +00006095void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006096
Tim Northover157d9112014-01-16 08:48:16 +00006097void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6098 ArgStringList &CmdArgs) const {
6099 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006100
Daniel Dunbarc1964212009-03-26 16:23:12 +00006101 // Derived from darwin_arch spec.
6102 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006103 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006104
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006105 // FIXME: Is this needed anymore?
6106 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006107 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006108}
6109
Bill Wendling3b2000f2012-10-02 18:02:50 +00006110bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
6111 // We only need to generate a temp path for LTO if we aren't compiling object
6112 // files. When compiling source files, we run 'dsymutil' after linking. We
6113 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006114 for (const auto &Input : Inputs)
6115 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006116 return true;
6117
6118 return false;
6119}
6120
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006121void darwin::Link::AddLinkArgs(Compilation &C,
6122 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006123 ArgStringList &CmdArgs,
6124 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006125 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006126 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006127
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006128 unsigned Version[3] = { 0, 0, 0 };
6129 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6130 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006131 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006132 Version[1], Version[2], HadExtra) ||
6133 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006134 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006135 << A->getAsString(Args);
6136 }
6137
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006138 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006139 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006140 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6141 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006142
Bob Wilson3d27dad2013-08-02 22:25:34 +00006143 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6144 CmdArgs.push_back("-export_dynamic");
6145
Bob Wilsonb111ec92015-03-02 19:01:14 +00006146 // If we are using App Extension restrictions, pass a flag to the linker
6147 // telling it that the compiled code has been audited.
6148 if (Args.hasFlag(options::OPT_fapplication_extension,
6149 options::OPT_fno_application_extension, false))
6150 CmdArgs.push_back("-application_extension");
6151
Bill Wendling313b6bf2012-11-16 23:03:00 +00006152 // If we are using LTO, then automatically create a temporary file path for
6153 // the linker to use, so that it's lifetime will extend past a possible
6154 // dsymutil step.
Peter Collingbournea4ccff32015-02-20 20:30:56 +00006155 if (Version[0] >= 116 && D.IsUsingLTO(getToolChain(), Args) &&
6156 NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006157 const char *TmpPath = C.getArgs().MakeArgString(
6158 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6159 C.addTempFile(TmpPath);
6160 CmdArgs.push_back("-object_path_lto");
6161 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006162 }
6163
Daniel Dunbarc1964212009-03-26 16:23:12 +00006164 // Derived from the "link" spec.
6165 Args.AddAllArgs(CmdArgs, options::OPT_static);
6166 if (!Args.hasArg(options::OPT_static))
6167 CmdArgs.push_back("-dynamic");
6168 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6169 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6170 // here. How do we wish to handle such things?
6171 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006172
Daniel Dunbarc1964212009-03-26 16:23:12 +00006173 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006174 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006175 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006176 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006177
6178 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6179 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6180 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6181
6182 Arg *A;
6183 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6184 (A = Args.getLastArg(options::OPT_current__version)) ||
6185 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006186 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006187 << A->getAsString(Args) << "-dynamiclib";
6188
6189 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6190 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6191 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6192 } else {
6193 CmdArgs.push_back("-dylib");
6194
6195 Arg *A;
6196 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6197 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6198 (A = Args.getLastArg(options::OPT_client__name)) ||
6199 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6200 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6201 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006202 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006203 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006204
Daniel Dunbarc1964212009-03-26 16:23:12 +00006205 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6206 "-dylib_compatibility_version");
6207 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6208 "-dylib_current_version");
6209
Tim Northover157d9112014-01-16 08:48:16 +00006210 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006211
6212 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6213 "-dylib_install_name");
6214 }
6215
6216 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6217 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6218 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006219 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006220 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006221 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6222 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6223 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6224 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6225 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6226 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006227 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006228 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6229 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6230 Args.AddAllArgs(CmdArgs, options::OPT_init);
6231
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006232 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006233 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006234
Daniel Dunbarc1964212009-03-26 16:23:12 +00006235 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6236 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6237 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6238 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6239 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006240
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006241 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6242 options::OPT_fno_pie,
6243 options::OPT_fno_PIE)) {
6244 if (A->getOption().matches(options::OPT_fpie) ||
6245 A->getOption().matches(options::OPT_fPIE))
6246 CmdArgs.push_back("-pie");
6247 else
6248 CmdArgs.push_back("-no_pie");
6249 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006250
6251 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6252 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6253 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6254 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6255 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6256 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6257 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6258 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6259 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6260 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6261 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6262 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6263 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6264 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6265 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6266 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006267
Daniel Dunbar84384642011-05-02 21:03:47 +00006268 // Give --sysroot= preference, over the Apple specific behavior to also use
6269 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006270 StringRef sysroot = C.getSysRoot();
6271 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006272 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006273 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006274 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6275 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006276 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006277 }
6278
Daniel Dunbarc1964212009-03-26 16:23:12 +00006279 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6280 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6281 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6282 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6283 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006284 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006285 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6286 Args.AddAllArgs(CmdArgs, options::OPT_y);
6287 Args.AddLastArg(CmdArgs, options::OPT_w);
6288 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6289 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6290 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6291 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6292 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6293 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6294 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6295 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6296 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6297 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6298 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6299 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6300}
6301
6302void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006303 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006304 const InputInfoList &Inputs,
6305 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006306 const char *LinkingOutput) const {
6307 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006308
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006309 // If the number of arguments surpasses the system limits, we will encode the
6310 // input files in a separate file, shortening the command line. To this end,
6311 // build a list of input file names that can be passed via a file with the
6312 // -filelist linker option.
6313 llvm::opt::ArgStringList InputFileList;
6314
Daniel Dunbarc1964212009-03-26 16:23:12 +00006315 // The logic here is derived from gcc's behavior; most of which
6316 // comes from specs (starting with link_command). Consult gcc for
6317 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006318 ArgStringList CmdArgs;
6319
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006320 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6321 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6322 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006323 for (const auto &Arg : Args)
6324 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006325 const char *Exec =
6326 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6327 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006328 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006329 return;
6330 }
6331
Daniel Dunbarc1964212009-03-26 16:23:12 +00006332 // I'm not sure why this particular decomposition exists in gcc, but
6333 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006334 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006335
Daniel Dunbarc1964212009-03-26 16:23:12 +00006336 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6337 Args.AddAllArgs(CmdArgs, options::OPT_s);
6338 Args.AddAllArgs(CmdArgs, options::OPT_t);
6339 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6340 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006341 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006342 Args.AddAllArgs(CmdArgs, options::OPT_r);
6343
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006344 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6345 // members of static archive libraries which implement Objective-C classes or
6346 // categories.
6347 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6348 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006349
Daniel Dunbarc1964212009-03-26 16:23:12 +00006350 CmdArgs.push_back("-o");
6351 CmdArgs.push_back(Output.getFilename());
6352
Chad Rosier06fd3c62012-05-16 23:45:12 +00006353 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006354 !Args.hasArg(options::OPT_nostartfiles))
6355 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006356
6357 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006358
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006359 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6360 options::OPT_fno_openmp, false)) {
6361 switch (getOpenMPRuntime(getToolChain(), Args)) {
6362 case OMPRT_OMP:
6363 CmdArgs.push_back("-lomp");
6364 break;
6365 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006366 CmdArgs.push_back("-lgomp");
6367 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006368 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006369 CmdArgs.push_back("-liomp5");
6370 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006371 case OMPRT_Unknown:
6372 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006373 break;
6374 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006375 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006376
Douglas Gregor9295df02012-05-15 21:00:27 +00006377 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006378 // Build the input file for -filelist (list of linker input files) in case we
6379 // need it later
6380 for (const auto &II : Inputs) {
6381 if (!II.isFilename()) {
6382 // This is a linker input argument.
6383 // We cannot mix input arguments and file names in a -filelist input, thus
6384 // we prematurely stop our list (remaining files shall be passed as
6385 // arguments).
6386 if (InputFileList.size() > 0)
6387 break;
6388
6389 continue;
6390 }
6391
6392 InputFileList.push_back(II.getFilename());
6393 }
6394
Bob Wilson16d93952012-05-15 18:57:39 +00006395 if (isObjCRuntimeLinked(Args) &&
6396 !Args.hasArg(options::OPT_nostdlib) &&
6397 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006398 // We use arclite library for both ARC and subscripting support.
6399 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6400
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006401 CmdArgs.push_back("-framework");
6402 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006403 // Link libobj.
6404 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006405 }
John McCall31168b02011-06-15 23:02:42 +00006406
Daniel Dunbarc1964212009-03-26 16:23:12 +00006407 if (LinkingOutput) {
6408 CmdArgs.push_back("-arch_multiple");
6409 CmdArgs.push_back("-final_output");
6410 CmdArgs.push_back(LinkingOutput);
6411 }
6412
Daniel Dunbarc1964212009-03-26 16:23:12 +00006413 if (Args.hasArg(options::OPT_fnested_functions))
6414 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006415
Justin Bognerc7701242015-05-12 05:44:36 +00006416 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6417 // paths are different enough from other toolchains that this needs a fair
6418 // amount of refactoring done first.
6419 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6420
Daniel Dunbarc1964212009-03-26 16:23:12 +00006421 if (!Args.hasArg(options::OPT_nostdlib) &&
6422 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006423 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006424 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006425
Daniel Dunbarc1964212009-03-26 16:23:12 +00006426 // link_ssp spec is empty.
6427
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006428 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006429 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006430 }
6431
Chad Rosier06fd3c62012-05-16 23:45:12 +00006432 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006433 !Args.hasArg(options::OPT_nostartfiles)) {
6434 // endfile_spec is empty.
6435 }
6436
6437 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6438 Args.AddAllArgs(CmdArgs, options::OPT_F);
6439
Steven Wu3ffb61b2015-02-06 18:08:29 +00006440 // -iframework should be forwarded as -F.
6441 for (auto it = Args.filtered_begin(options::OPT_iframework),
6442 ie = Args.filtered_end(); it != ie; ++it)
6443 CmdArgs.push_back(Args.MakeArgString(std::string("-F") +
6444 (*it)->getValue()));
6445
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006446 if (!Args.hasArg(options::OPT_nostdlib) &&
6447 !Args.hasArg(options::OPT_nodefaultlibs)) {
6448 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6449 if (A->getValue() == StringRef("Accelerate")) {
6450 CmdArgs.push_back("-framework");
6451 CmdArgs.push_back("Accelerate");
6452 }
6453 }
6454 }
6455
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006456 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006457 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006458 std::unique_ptr<Command> Cmd =
6459 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6460 Cmd->setInputFileList(std::move(InputFileList));
6461 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006462}
6463
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006464void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006465 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006466 const InputInfoList &Inputs,
6467 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006468 const char *LinkingOutput) const {
6469 ArgStringList CmdArgs;
6470
6471 CmdArgs.push_back("-create");
6472 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006473
6474 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006475 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006476
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006477 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006478 assert(II.isFilename() && "Unexpected lipo input.");
6479 CmdArgs.push_back(II.getFilename());
6480 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006481
6482 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006483 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006484}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006485
Daniel Dunbar88299622010-06-04 18:28:36 +00006486void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006487 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006488 const InputInfoList &Inputs,
6489 const ArgList &Args,
6490 const char *LinkingOutput) const {
6491 ArgStringList CmdArgs;
6492
Daniel Dunbareb86b042011-05-09 17:23:16 +00006493 CmdArgs.push_back("-o");
6494 CmdArgs.push_back(Output.getFilename());
6495
Daniel Dunbar88299622010-06-04 18:28:36 +00006496 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6497 const InputInfo &Input = Inputs[0];
6498 assert(Input.isFilename() && "Unexpected dsymutil input.");
6499 CmdArgs.push_back(Input.getFilename());
6500
Daniel Dunbar88299622010-06-04 18:28:36 +00006501 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006502 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006503 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006504}
6505
Eric Christopher551ef452011-08-23 17:56:55 +00006506void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006507 const InputInfo &Output,
6508 const InputInfoList &Inputs,
6509 const ArgList &Args,
6510 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006511 ArgStringList CmdArgs;
6512 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006513 CmdArgs.push_back("--debug-info");
6514 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006515 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006516
6517 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6518 const InputInfo &Input = Inputs[0];
6519 assert(Input.isFilename() && "Unexpected verify input");
6520
6521 // Grabbing the output of the earlier dsymutil run.
6522 CmdArgs.push_back(Input.getFilename());
6523
6524 const char *Exec =
6525 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006526 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006527}
6528
David Chisnallf571cde2012-02-15 13:39:01 +00006529void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6530 const InputInfo &Output,
6531 const InputInfoList &Inputs,
6532 const ArgList &Args,
6533 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006534 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006535 ArgStringList CmdArgs;
6536
6537 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6538 options::OPT_Xassembler);
6539
6540 CmdArgs.push_back("-o");
6541 CmdArgs.push_back(Output.getFilename());
6542
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006543 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006544 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006545
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006546 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006547 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006548}
6549
David Chisnallf571cde2012-02-15 13:39:01 +00006550void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6551 const InputInfo &Output,
6552 const InputInfoList &Inputs,
6553 const ArgList &Args,
6554 const char *LinkingOutput) const {
6555 // FIXME: Find a real GCC, don't hard-code versions here
6556 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6557 const llvm::Triple &T = getToolChain().getTriple();
6558 std::string LibPath = "/usr/lib/";
6559 llvm::Triple::ArchType Arch = T.getArch();
6560 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006561 case llvm::Triple::x86:
6562 GCCLibPath +=
6563 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6564 break;
6565 case llvm::Triple::x86_64:
6566 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6567 GCCLibPath += "/4.5.2/amd64/";
6568 LibPath += "amd64/";
6569 break;
6570 default:
6571 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006572 }
6573
6574 ArgStringList CmdArgs;
6575
David Chisnall272a0712012-02-29 15:06:12 +00006576 // Demangle C++ names in errors
6577 CmdArgs.push_back("-C");
6578
David Chisnallf571cde2012-02-15 13:39:01 +00006579 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6580 (!Args.hasArg(options::OPT_shared))) {
6581 CmdArgs.push_back("-e");
6582 CmdArgs.push_back("_start");
6583 }
6584
6585 if (Args.hasArg(options::OPT_static)) {
6586 CmdArgs.push_back("-Bstatic");
6587 CmdArgs.push_back("-dn");
6588 } else {
6589 CmdArgs.push_back("-Bdynamic");
6590 if (Args.hasArg(options::OPT_shared)) {
6591 CmdArgs.push_back("-shared");
6592 } else {
6593 CmdArgs.push_back("--dynamic-linker");
6594 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6595 }
6596 }
6597
6598 if (Output.isFilename()) {
6599 CmdArgs.push_back("-o");
6600 CmdArgs.push_back(Output.getFilename());
6601 } else {
6602 assert(Output.isNothing() && "Invalid output.");
6603 }
6604
6605 if (!Args.hasArg(options::OPT_nostdlib) &&
6606 !Args.hasArg(options::OPT_nostartfiles)) {
6607 if (!Args.hasArg(options::OPT_shared)) {
6608 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6609 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006610 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006611 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6612 } else {
6613 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006614 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6615 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006616 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006617 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006618 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006619 }
6620
6621 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6622
6623 Args.AddAllArgs(CmdArgs, options::OPT_L);
6624 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6625 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006626 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006627
6628 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6629
6630 if (!Args.hasArg(options::OPT_nostdlib) &&
6631 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006632 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006633 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006634 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006635 if (!Args.hasArg(options::OPT_shared)) {
6636 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006637 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006638 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006639 }
David Chisnallf571cde2012-02-15 13:39:01 +00006640 }
6641
6642 if (!Args.hasArg(options::OPT_nostdlib) &&
6643 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006644 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006645 }
David Chisnall96de9932012-02-16 16:00:47 +00006646 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006647
Alexey Samsonov7811d192014-02-20 13:57:37 +00006648 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006649
6650 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006651 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006652 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006653}
6654
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006655void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006656 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006657 const InputInfoList &Inputs,
6658 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006659 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006660 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006661 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006662 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006663
Rafael Espindolacc126272014-02-28 01:55:21 +00006664 switch (getToolChain().getArch()) {
6665 case llvm::Triple::x86:
6666 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6667 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006668 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006669 break;
6670
6671 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006672 CmdArgs.push_back("-mppc");
6673 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006674 break;
6675
6676 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006677 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006678 CmdArgs.push_back("-32");
6679 NeedsKPIC = true;
6680 break;
6681
6682 case llvm::Triple::sparcv9:
6683 CmdArgs.push_back("-64");
6684 CmdArgs.push_back("-Av9a");
6685 NeedsKPIC = true;
6686 break;
6687
6688 case llvm::Triple::mips64:
6689 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006690 StringRef CPUName;
6691 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006692 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006693
6694 CmdArgs.push_back("-mabi");
6695 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6696
6697 if (getToolChain().getArch() == llvm::Triple::mips64)
6698 CmdArgs.push_back("-EB");
6699 else
6700 CmdArgs.push_back("-EL");
6701
Rafael Espindolacc126272014-02-28 01:55:21 +00006702 NeedsKPIC = true;
6703 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006704 }
6705
Rafael Espindolacc126272014-02-28 01:55:21 +00006706 default:
6707 break;
6708 }
6709
6710 if (NeedsKPIC)
6711 addAssemblerKPIC(Args, CmdArgs);
6712
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006713 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6714 options::OPT_Xassembler);
6715
6716 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006717 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006718
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006719 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006720 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006721
6722 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006723 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006724 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006725}
6726
6727void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006728 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006729 const InputInfoList &Inputs,
6730 const ArgList &Args,
6731 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006732 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006733 ArgStringList CmdArgs;
6734
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006735 // Silence warning for "clang -g foo.o -o foo"
6736 Args.ClaimAllArgs(options::OPT_g_Group);
6737 // and "clang -emit-llvm foo.o -o foo"
6738 Args.ClaimAllArgs(options::OPT_emit_llvm);
6739 // and for "clang -w foo.o -o foo". Other warning options are already
6740 // handled somewhere else.
6741 Args.ClaimAllArgs(options::OPT_w);
6742
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006743 if (getToolChain().getArch() == llvm::Triple::mips64)
6744 CmdArgs.push_back("-EB");
6745 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6746 CmdArgs.push_back("-EL");
6747
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006748 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006749 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006750 CmdArgs.push_back("-e");
6751 CmdArgs.push_back("__start");
6752 }
6753
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006754 if (Args.hasArg(options::OPT_static)) {
6755 CmdArgs.push_back("-Bstatic");
6756 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006757 if (Args.hasArg(options::OPT_rdynamic))
6758 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006759 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006760 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006761 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006762 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006763 } else {
6764 CmdArgs.push_back("-dynamic-linker");
6765 CmdArgs.push_back("/usr/libexec/ld.so");
6766 }
6767 }
6768
Rafael Espindola044f7832013-06-05 04:28:55 +00006769 if (Args.hasArg(options::OPT_nopie))
6770 CmdArgs.push_back("-nopie");
6771
Daniel Dunbarb440f562010-08-02 02:38:21 +00006772 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006773 CmdArgs.push_back("-o");
6774 CmdArgs.push_back(Output.getFilename());
6775 } else {
6776 assert(Output.isNothing() && "Invalid output.");
6777 }
6778
6779 if (!Args.hasArg(options::OPT_nostdlib) &&
6780 !Args.hasArg(options::OPT_nostartfiles)) {
6781 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006782 if (Args.hasArg(options::OPT_pg))
6783 CmdArgs.push_back(Args.MakeArgString(
6784 getToolChain().GetFilePath("gcrt0.o")));
6785 else
6786 CmdArgs.push_back(Args.MakeArgString(
6787 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006788 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006789 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006790 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006791 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006792 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006793 }
6794 }
6795
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006796 std::string Triple = getToolChain().getTripleString();
6797 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006798 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006799 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006800 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006801
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006802 Args.AddAllArgs(CmdArgs, options::OPT_L);
6803 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6804 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006805 Args.AddAllArgs(CmdArgs, options::OPT_s);
6806 Args.AddAllArgs(CmdArgs, options::OPT_t);
6807 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6808 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006809
Daniel Dunbar54423b22010-09-17 00:24:54 +00006810 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006811
6812 if (!Args.hasArg(options::OPT_nostdlib) &&
6813 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006814 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006815 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006816 if (Args.hasArg(options::OPT_pg))
6817 CmdArgs.push_back("-lm_p");
6818 else
6819 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006820 }
6821
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006822 // FIXME: For some reason GCC passes -lgcc before adding
6823 // the default system libraries. Just mimic this for now.
6824 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006825
Eric Christopher17674ec2012-09-13 06:32:34 +00006826 if (Args.hasArg(options::OPT_pthread)) {
6827 if (!Args.hasArg(options::OPT_shared) &&
6828 Args.hasArg(options::OPT_pg))
6829 CmdArgs.push_back("-lpthread_p");
6830 else
6831 CmdArgs.push_back("-lpthread");
6832 }
6833
Chandler Carruth45661652011-12-17 22:32:42 +00006834 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006835 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006836 CmdArgs.push_back("-lc_p");
6837 else
6838 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006839 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006840
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006841 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006842 }
6843
6844 if (!Args.hasArg(options::OPT_nostdlib) &&
6845 !Args.hasArg(options::OPT_nostartfiles)) {
6846 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006847 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006848 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006849 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006850 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006851 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006852 }
6853
6854 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006855 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006856 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006857}
Ed Schoutene33194b2009-04-02 19:13:12 +00006858
Eli Friedman9fa28852012-08-08 23:57:20 +00006859void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6860 const InputInfo &Output,
6861 const InputInfoList &Inputs,
6862 const ArgList &Args,
6863 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006864 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006865 ArgStringList CmdArgs;
6866
6867 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6868 options::OPT_Xassembler);
6869
6870 CmdArgs.push_back("-o");
6871 CmdArgs.push_back(Output.getFilename());
6872
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006873 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006874 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006875
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006876 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006877 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006878}
6879
6880void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6881 const InputInfo &Output,
6882 const InputInfoList &Inputs,
6883 const ArgList &Args,
6884 const char *LinkingOutput) const {
6885 const Driver &D = getToolChain().getDriver();
6886 ArgStringList CmdArgs;
6887
6888 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6889 (!Args.hasArg(options::OPT_shared))) {
6890 CmdArgs.push_back("-e");
6891 CmdArgs.push_back("__start");
6892 }
6893
6894 if (Args.hasArg(options::OPT_static)) {
6895 CmdArgs.push_back("-Bstatic");
6896 } else {
6897 if (Args.hasArg(options::OPT_rdynamic))
6898 CmdArgs.push_back("-export-dynamic");
6899 CmdArgs.push_back("--eh-frame-hdr");
6900 CmdArgs.push_back("-Bdynamic");
6901 if (Args.hasArg(options::OPT_shared)) {
6902 CmdArgs.push_back("-shared");
6903 } else {
6904 CmdArgs.push_back("-dynamic-linker");
6905 CmdArgs.push_back("/usr/libexec/ld.so");
6906 }
6907 }
6908
6909 if (Output.isFilename()) {
6910 CmdArgs.push_back("-o");
6911 CmdArgs.push_back(Output.getFilename());
6912 } else {
6913 assert(Output.isNothing() && "Invalid output.");
6914 }
6915
6916 if (!Args.hasArg(options::OPT_nostdlib) &&
6917 !Args.hasArg(options::OPT_nostartfiles)) {
6918 if (!Args.hasArg(options::OPT_shared)) {
6919 if (Args.hasArg(options::OPT_pg))
6920 CmdArgs.push_back(Args.MakeArgString(
6921 getToolChain().GetFilePath("gcrt0.o")));
6922 else
6923 CmdArgs.push_back(Args.MakeArgString(
6924 getToolChain().GetFilePath("crt0.o")));
6925 CmdArgs.push_back(Args.MakeArgString(
6926 getToolChain().GetFilePath("crtbegin.o")));
6927 } else {
6928 CmdArgs.push_back(Args.MakeArgString(
6929 getToolChain().GetFilePath("crtbeginS.o")));
6930 }
6931 }
6932
6933 Args.AddAllArgs(CmdArgs, options::OPT_L);
6934 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6935 Args.AddAllArgs(CmdArgs, options::OPT_e);
6936
6937 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6938
6939 if (!Args.hasArg(options::OPT_nostdlib) &&
6940 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006941 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006942 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6943 if (Args.hasArg(options::OPT_pg))
6944 CmdArgs.push_back("-lm_p");
6945 else
6946 CmdArgs.push_back("-lm");
6947 }
6948
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006949 if (Args.hasArg(options::OPT_pthread)) {
6950 if (!Args.hasArg(options::OPT_shared) &&
6951 Args.hasArg(options::OPT_pg))
6952 CmdArgs.push_back("-lpthread_p");
6953 else
6954 CmdArgs.push_back("-lpthread");
6955 }
6956
Eli Friedman9fa28852012-08-08 23:57:20 +00006957 if (!Args.hasArg(options::OPT_shared)) {
6958 if (Args.hasArg(options::OPT_pg))
6959 CmdArgs.push_back("-lc_p");
6960 else
6961 CmdArgs.push_back("-lc");
6962 }
6963
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006964 StringRef MyArch;
6965 switch (getToolChain().getTriple().getArch()) {
6966 case llvm::Triple::arm:
6967 MyArch = "arm";
6968 break;
6969 case llvm::Triple::x86:
6970 MyArch = "i386";
6971 break;
6972 case llvm::Triple::x86_64:
6973 MyArch = "amd64";
6974 break;
6975 default:
6976 llvm_unreachable("Unsupported architecture");
6977 }
6978 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006979 }
6980
6981 if (!Args.hasArg(options::OPT_nostdlib) &&
6982 !Args.hasArg(options::OPT_nostartfiles)) {
6983 if (!Args.hasArg(options::OPT_shared))
6984 CmdArgs.push_back(Args.MakeArgString(
6985 getToolChain().GetFilePath("crtend.o")));
6986 else
6987 CmdArgs.push_back(Args.MakeArgString(
6988 getToolChain().GetFilePath("crtendS.o")));
6989 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006990
6991 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006992 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006993 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006994}
6995
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006996void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006997 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006998 const InputInfoList &Inputs,
6999 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00007000 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007001 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007002 ArgStringList CmdArgs;
7003
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007004 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7005 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007006 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007007 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007008 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007009 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007010 else if (getToolChain().getArch() == llvm::Triple::mips ||
7011 getToolChain().getArch() == llvm::Triple::mipsel ||
7012 getToolChain().getArch() == llvm::Triple::mips64 ||
7013 getToolChain().getArch() == llvm::Triple::mips64el) {
7014 StringRef CPUName;
7015 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007016 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007017
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007018 CmdArgs.push_back("-march");
7019 CmdArgs.push_back(CPUName.data());
7020
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007021 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007022 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007023
7024 if (getToolChain().getArch() == llvm::Triple::mips ||
7025 getToolChain().getArch() == llvm::Triple::mips64)
7026 CmdArgs.push_back("-EB");
7027 else
7028 CmdArgs.push_back("-EL");
7029
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007030 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007031 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007032 getToolChain().getArch() == llvm::Triple::armeb ||
7033 getToolChain().getArch() == llvm::Triple::thumb ||
7034 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007035 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007036 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007037 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7038
7039 if (FloatABI == "hard") {
7040 CmdArgs.push_back("-mfpu=vfp");
7041 } else {
7042 CmdArgs.push_back("-mfpu=softvfp");
7043 }
7044
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007045 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007046 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007047 case llvm::Triple::GNUEABI:
7048 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007049 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007050 break;
7051
7052 default:
7053 CmdArgs.push_back("-matpcs");
7054 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007055 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007056 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007057 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007058 if (getToolChain().getArch() == llvm::Triple::sparc)
7059 CmdArgs.push_back("-Av8plusa");
7060 else
7061 CmdArgs.push_back("-Av9a");
7062
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007063 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007064 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007065
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007066 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7067 options::OPT_Xassembler);
7068
7069 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007070 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007071
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007072 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007073 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007074
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007075 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007076 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007077}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007078
7079void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007080 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007081 const InputInfoList &Inputs,
7082 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00007083 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00007084 const toolchains::FreeBSD& ToolChain =
7085 static_cast<const toolchains::FreeBSD&>(getToolChain());
7086 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007087 const bool IsPIE =
7088 !Args.hasArg(options::OPT_shared) &&
7089 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007090 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007091
7092 // Silence warning for "clang -g foo.o -o foo"
7093 Args.ClaimAllArgs(options::OPT_g_Group);
7094 // and "clang -emit-llvm foo.o -o foo"
7095 Args.ClaimAllArgs(options::OPT_emit_llvm);
7096 // and for "clang -w foo.o -o foo". Other warning options are already
7097 // handled somewhere else.
7098 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007099
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007100 if (!D.SysRoot.empty())
7101 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7102
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007103 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007104 CmdArgs.push_back("-pie");
7105
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007106 if (Args.hasArg(options::OPT_static)) {
7107 CmdArgs.push_back("-Bstatic");
7108 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007109 if (Args.hasArg(options::OPT_rdynamic))
7110 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007111 CmdArgs.push_back("--eh-frame-hdr");
7112 if (Args.hasArg(options::OPT_shared)) {
7113 CmdArgs.push_back("-Bshareable");
7114 } else {
7115 CmdArgs.push_back("-dynamic-linker");
7116 CmdArgs.push_back("/libexec/ld-elf.so.1");
7117 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007118 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
7119 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00007120 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7121 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7122 CmdArgs.push_back("--hash-style=both");
7123 }
7124 }
7125 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007126 }
7127
7128 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7129 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007130 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007131 CmdArgs.push_back("-m");
7132 CmdArgs.push_back("elf_i386_fbsd");
7133 }
7134
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007135 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007136 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007137 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007138 }
7139
Daniel Dunbarb440f562010-08-02 02:38:21 +00007140 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007141 CmdArgs.push_back("-o");
7142 CmdArgs.push_back(Output.getFilename());
7143 } else {
7144 assert(Output.isNothing() && "Invalid output.");
7145 }
7146
7147 if (!Args.hasArg(options::OPT_nostdlib) &&
7148 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007149 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007150 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007151 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007152 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007153 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007154 crt1 = "Scrt1.o";
7155 else
7156 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007157 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007158 if (crt1)
7159 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7160
7161 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7162
Craig Topper92fc2df2014-05-17 16:56:41 +00007163 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007164 if (Args.hasArg(options::OPT_static))
7165 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007166 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007167 crtbegin = "crtbeginS.o";
7168 else
7169 crtbegin = "crtbegin.o";
7170
7171 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007172 }
7173
7174 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007175 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007176 for (const auto &Path : Paths)
7177 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007178 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7179 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007180 Args.AddAllArgs(CmdArgs, options::OPT_s);
7181 Args.AddAllArgs(CmdArgs, options::OPT_t);
7182 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7183 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007184
Peter Collingbournea4ccff32015-02-20 20:30:56 +00007185 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007186 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007187
Alexey Samsonov52550342014-09-15 19:58:40 +00007188 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007189 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007190
7191 if (!Args.hasArg(options::OPT_nostdlib) &&
7192 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007193 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007194 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007195 if (Args.hasArg(options::OPT_pg))
7196 CmdArgs.push_back("-lm_p");
7197 else
7198 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007199 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007200 if (NeedsSanitizerDeps)
7201 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007202 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7203 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007204 if (Args.hasArg(options::OPT_pg))
7205 CmdArgs.push_back("-lgcc_p");
7206 else
7207 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007208 if (Args.hasArg(options::OPT_static)) {
7209 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007210 } else if (Args.hasArg(options::OPT_pg)) {
7211 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007212 } else {
7213 CmdArgs.push_back("--as-needed");
7214 CmdArgs.push_back("-lgcc_s");
7215 CmdArgs.push_back("--no-as-needed");
7216 }
7217
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007218 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007219 if (Args.hasArg(options::OPT_pg))
7220 CmdArgs.push_back("-lpthread_p");
7221 else
7222 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007223 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007224
Roman Divacky66f22762011-02-10 16:59:40 +00007225 if (Args.hasArg(options::OPT_pg)) {
7226 if (Args.hasArg(options::OPT_shared))
7227 CmdArgs.push_back("-lc");
7228 else
7229 CmdArgs.push_back("-lc_p");
7230 CmdArgs.push_back("-lgcc_p");
7231 } else {
7232 CmdArgs.push_back("-lc");
7233 CmdArgs.push_back("-lgcc");
7234 }
7235
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007236 if (Args.hasArg(options::OPT_static)) {
7237 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007238 } else if (Args.hasArg(options::OPT_pg)) {
7239 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007240 } else {
7241 CmdArgs.push_back("--as-needed");
7242 CmdArgs.push_back("-lgcc_s");
7243 CmdArgs.push_back("--no-as-needed");
7244 }
7245 }
7246
7247 if (!Args.hasArg(options::OPT_nostdlib) &&
7248 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007249 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007250 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007251 else
7252 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007253 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007254 }
7255
Alexey Samsonov7811d192014-02-20 13:57:37 +00007256 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007257
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007258 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007259 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007261}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007262
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007263void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7264 const InputInfo &Output,
7265 const InputInfoList &Inputs,
7266 const ArgList &Args,
7267 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007268 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007269 ArgStringList CmdArgs;
7270
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007271 // GNU as needs different flags for creating the correct output format
7272 // on architectures with different ABIs or optional feature sets.
7273 switch (getToolChain().getArch()) {
7274 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007275 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007276 break;
7277 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007278 case llvm::Triple::armeb:
7279 case llvm::Triple::thumb:
7280 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00007281 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007282 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007283 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007284 }
7285
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007286 case llvm::Triple::mips:
7287 case llvm::Triple::mipsel:
7288 case llvm::Triple::mips64:
7289 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007290 StringRef CPUName;
7291 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007292 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007293
7294 CmdArgs.push_back("-march");
7295 CmdArgs.push_back(CPUName.data());
7296
7297 CmdArgs.push_back("-mabi");
7298 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7299
7300 if (getToolChain().getArch() == llvm::Triple::mips ||
7301 getToolChain().getArch() == llvm::Triple::mips64)
7302 CmdArgs.push_back("-EB");
7303 else
7304 CmdArgs.push_back("-EL");
7305
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007306 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007307 break;
7308 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007309
7310 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007311 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007312 CmdArgs.push_back("-32");
7313 addAssemblerKPIC(Args, CmdArgs);
7314 break;
7315
7316 case llvm::Triple::sparcv9:
7317 CmdArgs.push_back("-64");
7318 CmdArgs.push_back("-Av9");
7319 addAssemblerKPIC(Args, CmdArgs);
7320 break;
7321
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007322 default:
7323 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007324 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007325
7326 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7327 options::OPT_Xassembler);
7328
7329 CmdArgs.push_back("-o");
7330 CmdArgs.push_back(Output.getFilename());
7331
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007332 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007333 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007334
David Chisnallddbd68f2011-09-27 22:03:18 +00007335 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007336 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007337}
7338
7339void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7340 const InputInfo &Output,
7341 const InputInfoList &Inputs,
7342 const ArgList &Args,
7343 const char *LinkingOutput) const {
7344 const Driver &D = getToolChain().getDriver();
7345 ArgStringList CmdArgs;
7346
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007347 if (!D.SysRoot.empty())
7348 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7349
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007350 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007351 if (Args.hasArg(options::OPT_static)) {
7352 CmdArgs.push_back("-Bstatic");
7353 } else {
7354 if (Args.hasArg(options::OPT_rdynamic))
7355 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007356 if (Args.hasArg(options::OPT_shared)) {
7357 CmdArgs.push_back("-Bshareable");
7358 } else {
7359 CmdArgs.push_back("-dynamic-linker");
7360 CmdArgs.push_back("/libexec/ld.elf_so");
7361 }
7362 }
7363
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007364 // Many NetBSD architectures support more than one ABI.
7365 // Determine the correct emulation for ld.
7366 switch (getToolChain().getArch()) {
7367 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007368 CmdArgs.push_back("-m");
7369 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007370 break;
7371 case llvm::Triple::arm:
7372 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007373 CmdArgs.push_back("-m");
7374 switch (getToolChain().getTriple().getEnvironment()) {
7375 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007376 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007377 CmdArgs.push_back("armelf_nbsd_eabi");
7378 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007379 case llvm::Triple::EABIHF:
7380 case llvm::Triple::GNUEABIHF:
7381 CmdArgs.push_back("armelf_nbsd_eabihf");
7382 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007383 default:
7384 CmdArgs.push_back("armelf_nbsd");
7385 break;
7386 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007387 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007388 case llvm::Triple::armeb:
7389 case llvm::Triple::thumbeb:
John Brawn94fd9632015-05-21 12:19:49 +00007390 arm::appendEBLinkFlags(Args, CmdArgs,
7391 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007392 CmdArgs.push_back("-m");
7393 switch (getToolChain().getTriple().getEnvironment()) {
7394 case llvm::Triple::EABI:
7395 case llvm::Triple::GNUEABI:
7396 CmdArgs.push_back("armelfb_nbsd_eabi");
7397 break;
7398 case llvm::Triple::EABIHF:
7399 case llvm::Triple::GNUEABIHF:
7400 CmdArgs.push_back("armelfb_nbsd_eabihf");
7401 break;
7402 default:
7403 CmdArgs.push_back("armelfb_nbsd");
7404 break;
7405 }
7406 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007407 case llvm::Triple::mips64:
7408 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007409 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007410 CmdArgs.push_back("-m");
7411 if (getToolChain().getArch() == llvm::Triple::mips64)
7412 CmdArgs.push_back("elf32btsmip");
7413 else
7414 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007415 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007416 CmdArgs.push_back("-m");
7417 if (getToolChain().getArch() == llvm::Triple::mips64)
7418 CmdArgs.push_back("elf64btsmip");
7419 else
7420 CmdArgs.push_back("elf64ltsmip");
7421 }
7422 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007423 case llvm::Triple::ppc:
7424 CmdArgs.push_back("-m");
7425 CmdArgs.push_back("elf32ppc_nbsd");
7426 break;
7427
7428 case llvm::Triple::ppc64:
7429 case llvm::Triple::ppc64le:
7430 CmdArgs.push_back("-m");
7431 CmdArgs.push_back("elf64ppc");
7432 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007433
7434 case llvm::Triple::sparc:
7435 CmdArgs.push_back("-m");
7436 CmdArgs.push_back("elf32_sparc");
7437 break;
7438
7439 case llvm::Triple::sparcv9:
7440 CmdArgs.push_back("-m");
7441 CmdArgs.push_back("elf64_sparc");
7442 break;
7443
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007444 default:
7445 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007446 }
7447
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007448 if (Output.isFilename()) {
7449 CmdArgs.push_back("-o");
7450 CmdArgs.push_back(Output.getFilename());
7451 } else {
7452 assert(Output.isNothing() && "Invalid output.");
7453 }
7454
7455 if (!Args.hasArg(options::OPT_nostdlib) &&
7456 !Args.hasArg(options::OPT_nostartfiles)) {
7457 if (!Args.hasArg(options::OPT_shared)) {
7458 CmdArgs.push_back(Args.MakeArgString(
7459 getToolChain().GetFilePath("crt0.o")));
7460 CmdArgs.push_back(Args.MakeArgString(
7461 getToolChain().GetFilePath("crti.o")));
7462 CmdArgs.push_back(Args.MakeArgString(
7463 getToolChain().GetFilePath("crtbegin.o")));
7464 } else {
7465 CmdArgs.push_back(Args.MakeArgString(
7466 getToolChain().GetFilePath("crti.o")));
7467 CmdArgs.push_back(Args.MakeArgString(
7468 getToolChain().GetFilePath("crtbeginS.o")));
7469 }
7470 }
7471
7472 Args.AddAllArgs(CmdArgs, options::OPT_L);
7473 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7474 Args.AddAllArgs(CmdArgs, options::OPT_e);
7475 Args.AddAllArgs(CmdArgs, options::OPT_s);
7476 Args.AddAllArgs(CmdArgs, options::OPT_t);
7477 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7478 Args.AddAllArgs(CmdArgs, options::OPT_r);
7479
7480 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7481
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007482 unsigned Major, Minor, Micro;
7483 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7484 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007485 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007486 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007487 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007488 case llvm::Triple::arm:
7489 case llvm::Triple::armeb:
7490 case llvm::Triple::thumb:
7491 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007492 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007493 case llvm::Triple::ppc64:
7494 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007495 case llvm::Triple::x86:
7496 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007497 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007498 break;
7499 default:
7500 break;
7501 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007502 }
7503
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007504 if (!Args.hasArg(options::OPT_nostdlib) &&
7505 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007506 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007507 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7508 CmdArgs.push_back("-lm");
7509 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007510 if (Args.hasArg(options::OPT_pthread))
7511 CmdArgs.push_back("-lpthread");
7512 CmdArgs.push_back("-lc");
7513
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007514 if (useLibgcc) {
7515 if (Args.hasArg(options::OPT_static)) {
7516 // libgcc_eh depends on libc, so resolve as much as possible,
7517 // pull in any new requirements from libc and then get the rest
7518 // of libgcc.
7519 CmdArgs.push_back("-lgcc_eh");
7520 CmdArgs.push_back("-lc");
7521 CmdArgs.push_back("-lgcc");
7522 } else {
7523 CmdArgs.push_back("-lgcc");
7524 CmdArgs.push_back("--as-needed");
7525 CmdArgs.push_back("-lgcc_s");
7526 CmdArgs.push_back("--no-as-needed");
7527 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007528 }
7529 }
7530
7531 if (!Args.hasArg(options::OPT_nostdlib) &&
7532 !Args.hasArg(options::OPT_nostartfiles)) {
7533 if (!Args.hasArg(options::OPT_shared))
7534 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7535 "crtend.o")));
7536 else
7537 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7538 "crtendS.o")));
7539 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7540 "crtn.o")));
7541 }
7542
Alexey Samsonov7811d192014-02-20 13:57:37 +00007543 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007544
Logan Chieneb9162f2014-06-26 14:23:45 +00007545 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007546 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007547}
7548
Thomas Schwinge4e555262013-03-28 19:04:25 +00007549void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7550 const InputInfo &Output,
7551 const InputInfoList &Inputs,
7552 const ArgList &Args,
7553 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007554 claimNoWarnArgs(Args);
7555
Rafael Espindola92b00932010-08-10 00:25:48 +00007556 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007557 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007558
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007559 switch (getToolChain().getArch()) {
7560 default:
7561 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007562 // Add --32/--64 to make sure we get the format we want.
7563 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007564 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007565 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007566 break;
7567 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007568 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7569 CmdArgs.push_back("--x32");
7570 else
7571 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007572 break;
7573 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007574 CmdArgs.push_back("-a32");
7575 CmdArgs.push_back("-mppc");
7576 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007577 break;
7578 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007579 CmdArgs.push_back("-a64");
7580 CmdArgs.push_back("-mppc64");
7581 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007582 break;
7583 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007584 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007585 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007586 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007587 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007588 break;
7589 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007590 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007591 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007592 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007593 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007594 break;
7595 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007596 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007597 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007598 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007599 break;
7600 case llvm::Triple::arm:
7601 case llvm::Triple::armeb:
7602 case llvm::Triple::thumb:
7603 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007604 const llvm::Triple &Triple = getToolChain().getTriple();
7605 switch (Triple.getSubArch()) {
7606 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007607 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007608 break;
7609 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007610 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007611 break;
7612 default:
7613 break;
7614 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007615
Tim Northover9c7e0352013-12-12 11:55:52 +00007616 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007617 getToolChain().getDriver(), Args,
7618 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007619 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007620
7621 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007622
7623 // FIXME: remove krait check when GNU tools support krait cpu
7624 // for now replace it with -march=armv7-a to avoid a lower
7625 // march from being picked in the absence of a cpu flag.
7626 Arg *A;
7627 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Renato Golin4045f662015-05-08 15:44:36 +00007628 StringRef(A->getValue()) == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007629 CmdArgs.push_back("-march=armv7-a");
7630 else
7631 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007632 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007633 break;
7634 }
7635 case llvm::Triple::mips:
7636 case llvm::Triple::mipsel:
7637 case llvm::Triple::mips64:
7638 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007639 StringRef CPUName;
7640 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007641 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007642 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007643
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007644 CmdArgs.push_back("-march");
7645 CmdArgs.push_back(CPUName.data());
7646
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007647 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007648 CmdArgs.push_back(ABIName.data());
7649
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007650 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7651 // or -mshared (not implemented) is in effect.
7652 bool IsPicOrPie = false;
7653 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7654 options::OPT_fpic, options::OPT_fno_pic,
7655 options::OPT_fPIE, options::OPT_fno_PIE,
7656 options::OPT_fpie, options::OPT_fno_pie)) {
7657 if (A->getOption().matches(options::OPT_fPIC) ||
7658 A->getOption().matches(options::OPT_fpic) ||
7659 A->getOption().matches(options::OPT_fPIE) ||
7660 A->getOption().matches(options::OPT_fpie))
7661 IsPicOrPie = true;
7662 }
7663 if (!IsPicOrPie)
7664 CmdArgs.push_back("-mno-shared");
7665
Daniel Sanders379d44b2014-07-16 11:52:23 +00007666 // LLVM doesn't support -mplt yet and acts as if it is always given.
7667 // However, -mplt has no effect with the N64 ABI.
7668 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007669
7670 if (getToolChain().getArch() == llvm::Triple::mips ||
7671 getToolChain().getArch() == llvm::Triple::mips64)
7672 CmdArgs.push_back("-EB");
7673 else
7674 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007675
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007676 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7677 if (StringRef(A->getValue()) == "2008")
7678 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7679 }
7680
Daniel Sanders379d44b2014-07-16 11:52:23 +00007681 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7682 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7683 options::OPT_mfp64)) {
7684 A->claim();
7685 A->render(Args, CmdArgs);
7686 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7687 ABIName))
7688 CmdArgs.push_back("-mfpxx");
7689
7690 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7691 // -mno-mips16 is actually -no-mips16.
7692 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7693 options::OPT_mno_mips16)) {
7694 if (A->getOption().matches(options::OPT_mips16)) {
7695 A->claim();
7696 A->render(Args, CmdArgs);
7697 } else {
7698 A->claim();
7699 CmdArgs.push_back("-no-mips16");
7700 }
7701 }
7702
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007703 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7704 options::OPT_mno_micromips);
7705 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7706 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7707
Simon Atanasyanbd986632013-11-26 11:58:04 +00007708 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7709 // Do not use AddLastArg because not all versions of MIPS assembler
7710 // support -mmsa / -mno-msa options.
7711 if (A->getOption().matches(options::OPT_mmsa))
7712 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7713 }
7714
Daniel Sanders379d44b2014-07-16 11:52:23 +00007715 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7716 options::OPT_msoft_float);
7717
7718 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7719 options::OPT_mno_odd_spreg);
7720
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007721 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007722 break;
7723 }
7724 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007725 // Always pass an -march option, since our default of z10 is later
7726 // than the GNU assembler's default.
7727 StringRef CPUName = getSystemZTargetCPU(Args);
7728 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007729 break;
7730 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007731 }
7732
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007733 if (NeedsKPIC)
7734 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007735
7736 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7737 options::OPT_Xassembler);
7738
7739 CmdArgs.push_back("-o");
7740 CmdArgs.push_back(Output.getFilename());
7741
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007742 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007743 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007744
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007745 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007746 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007747
7748 // Handle the debug info splitting at object creation time if we're
7749 // creating an object.
7750 // TODO: Currently only works on linux with newer objcopy.
7751 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007752 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007753 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007754 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007755}
7756
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007757static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007758 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007759 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007760 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7761 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007762 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007763 CmdArgs.push_back("-lgcc");
7764
Logan Chien3d3373c2012-11-19 12:04:11 +00007765 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007766 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007767 CmdArgs.push_back("-lgcc");
7768 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007769 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007770 CmdArgs.push_back("--as-needed");
7771 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007772 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007773 CmdArgs.push_back("--no-as-needed");
7774 }
7775
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007776 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007777 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007778 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007779 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007780
7781 // According to Android ABI, we have to link with libdl if we are
7782 // linking with non-static libgcc.
7783 //
7784 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7785 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7786 if (isAndroid && !StaticLibgcc)
7787 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007788}
7789
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007790static std::string getLinuxDynamicLinker(const ArgList &Args,
7791 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007792 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7793 if (ToolChain.getTriple().isArch64Bit())
7794 return "/system/bin/linker64";
7795 else
7796 return "/system/bin/linker";
7797 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007798 ToolChain.getArch() == llvm::Triple::sparc ||
7799 ToolChain.getArch() == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007800 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007801 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007802 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007803 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007804 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007805 else if (ToolChain.getArch() == llvm::Triple::arm ||
7806 ToolChain.getArch() == llvm::Triple::thumb) {
7807 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7808 return "/lib/ld-linux-armhf.so.3";
7809 else
7810 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007811 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7812 ToolChain.getArch() == llvm::Triple::thumbeb) {
7813 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7814 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7815 else
7816 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007817 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007818 ToolChain.getArch() == llvm::Triple::mipsel ||
7819 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007820 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007821 StringRef CPUName;
7822 StringRef ABIName;
7823 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7824 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7825
7826 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7827 .Case("o32", "/lib")
7828 .Case("n32", "/lib32")
7829 .Case("n64", "/lib64")
7830 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007831 StringRef LibName;
7832 if (mips::isUCLibc(Args))
7833 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7834 else
7835 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007836
7837 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007838 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7839 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007840 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7841 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7842 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007843 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007844 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7845 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7846 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007847 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007848 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7849 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007850 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7851 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007852 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7853 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7854 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007855 else
7856 return "/lib64/ld-linux-x86-64.so.2";
7857}
7858
Renato Golinc4b49242014-02-13 10:01:16 +00007859static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007860 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007861 // Make use of compiler-rt if --rtlib option is used
7862 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7863
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007864 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007865 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007866 switch (TC.getTriple().getOS()) {
7867 default: llvm_unreachable("unsupported OS");
7868 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007869 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007870 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007871 break;
7872 }
Renato Golinc4b49242014-02-13 10:01:16 +00007873 break;
7874 case ToolChain::RLT_Libgcc:
7875 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7876 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007877 }
7878}
7879
Rafael Espindola1e085772014-08-15 17:14:35 +00007880static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7881 switch (T.getArch()) {
7882 case llvm::Triple::x86:
7883 return "elf_i386";
7884 case llvm::Triple::aarch64:
7885 return "aarch64linux";
7886 case llvm::Triple::aarch64_be:
7887 return "aarch64_be_linux";
7888 case llvm::Triple::arm:
7889 case llvm::Triple::thumb:
7890 return "armelf_linux_eabi";
7891 case llvm::Triple::armeb:
7892 case llvm::Triple::thumbeb:
7893 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7894 case llvm::Triple::ppc:
7895 return "elf32ppclinux";
7896 case llvm::Triple::ppc64:
7897 return "elf64ppc";
7898 case llvm::Triple::ppc64le:
7899 return "elf64lppc";
7900 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007901 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007902 return "elf32_sparc";
7903 case llvm::Triple::sparcv9:
7904 return "elf64_sparc";
7905 case llvm::Triple::mips:
7906 return "elf32btsmip";
7907 case llvm::Triple::mipsel:
7908 return "elf32ltsmip";
7909 case llvm::Triple::mips64:
7910 if (mips::hasMipsAbiArg(Args, "n32"))
7911 return "elf32btsmipn32";
7912 return "elf64btsmip";
7913 case llvm::Triple::mips64el:
7914 if (mips::hasMipsAbiArg(Args, "n32"))
7915 return "elf32ltsmipn32";
7916 return "elf64ltsmip";
7917 case llvm::Triple::systemz:
7918 return "elf64_s390";
7919 case llvm::Triple::x86_64:
7920 if (T.getEnvironment() == llvm::Triple::GNUX32)
7921 return "elf32_x86_64";
7922 return "elf_x86_64";
7923 default:
7924 llvm_unreachable("Unexpected arch");
7925 }
7926}
7927
Thomas Schwinge4e555262013-03-28 19:04:25 +00007928void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7929 const InputInfo &Output,
7930 const InputInfoList &Inputs,
7931 const ArgList &Args,
7932 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007933 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007934 static_cast<const toolchains::Linux&>(getToolChain());
7935 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007936 const bool isAndroid =
7937 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007938 const bool IsPIE =
7939 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007940 !Args.hasArg(options::OPT_static) &&
Dan Albert77214a42015-03-03 18:24:57 +00007941 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007942
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007943 ArgStringList CmdArgs;
7944
Rafael Espindolad1002f62010-11-15 18:28:16 +00007945 // Silence warning for "clang -g foo.o -o foo"
7946 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007947 // and "clang -emit-llvm foo.o -o foo"
7948 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007949 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007950 // handled somewhere else.
7951 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007952
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007953 if (!D.SysRoot.empty())
7954 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007955
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007956 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007957 CmdArgs.push_back("-pie");
7958
Rafael Espindola1c76c592010-11-07 22:57:16 +00007959 if (Args.hasArg(options::OPT_rdynamic))
7960 CmdArgs.push_back("-export-dynamic");
7961
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007962 if (Args.hasArg(options::OPT_s))
7963 CmdArgs.push_back("-s");
7964
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007965 if (ToolChain.getArch() == llvm::Triple::armeb ||
7966 ToolChain.getArch() == llvm::Triple::thumbeb)
John Brawn94fd9632015-05-21 12:19:49 +00007967 arm::appendEBLinkFlags(Args, CmdArgs,
7968 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007969
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007970 for (const auto &Opt : ToolChain.ExtraOpts)
7971 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007972
7973 if (!Args.hasArg(options::OPT_static)) {
7974 CmdArgs.push_back("--eh-frame-hdr");
7975 }
7976
7977 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007978 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007979
7980 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007981 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007982 ToolChain.getArch() == llvm::Triple::armeb ||
7983 ToolChain.getArch() == llvm::Triple::thumb ||
7984 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007985 CmdArgs.push_back("-Bstatic");
7986 else
7987 CmdArgs.push_back("-static");
7988 } else if (Args.hasArg(options::OPT_shared)) {
7989 CmdArgs.push_back("-shared");
7990 }
7991
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007992 if (ToolChain.getArch() == llvm::Triple::arm ||
7993 ToolChain.getArch() == llvm::Triple::armeb ||
7994 ToolChain.getArch() == llvm::Triple::thumb ||
7995 ToolChain.getArch() == llvm::Triple::thumbeb ||
7996 (!Args.hasArg(options::OPT_static) &&
7997 !Args.hasArg(options::OPT_shared))) {
7998 CmdArgs.push_back("-dynamic-linker");
7999 CmdArgs.push_back(Args.MakeArgString(
8000 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8001 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008002
8003 CmdArgs.push_back("-o");
8004 CmdArgs.push_back(Output.getFilename());
8005
Rafael Espindola81937ec2010-12-01 01:52:43 +00008006 if (!Args.hasArg(options::OPT_nostdlib) &&
8007 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008008 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008009 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008010 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00008011 if (Args.hasArg(options::OPT_pg))
8012 crt1 = "gcrt1.o";
8013 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008014 crt1 = "Scrt1.o";
8015 else
8016 crt1 = "crt1.o";
8017 }
8018 if (crt1)
8019 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008020
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008021 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8022 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008023
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008024 const char *crtbegin;
8025 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008026 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008027 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008028 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008029 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008030 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008031 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008032 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008033 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008034
8035 // Add crtfastmath.o if available and fast math is enabled.
8036 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008037 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008038
8039 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008040 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008041
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008042 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008043
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008044 for (const auto &Path : Paths)
8045 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008046
Peter Collingbournea4ccff32015-02-20 20:30:56 +00008047 if (D.IsUsingLTO(getToolChain(), Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008048 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008049
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008050 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8051 CmdArgs.push_back("--no-demangle");
8052
Alexey Samsonov52550342014-09-15 19:58:40 +00008053 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008054 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008055 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008056 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008057
Hans Wennborg70850d82013-07-18 20:29:38 +00008058 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008059 !Args.hasArg(options::OPT_nostdlib) &&
8060 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008061 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8062 !Args.hasArg(options::OPT_static);
8063 if (OnlyLibstdcxxStatic)
8064 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008065 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008066 if (OnlyLibstdcxxStatic)
8067 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008068 CmdArgs.push_back("-lm");
8069 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008070 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8071 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008072
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008073 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008074 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8075 if (Args.hasArg(options::OPT_static))
8076 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008077
Alexey Samsonov52550342014-09-15 19:58:40 +00008078 if (NeedsSanitizerDeps)
8079 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8080
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008081 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8082 Args.hasArg(options::OPT_pthreads);
8083
8084 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8085 options::OPT_fno_openmp, false)) {
8086 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8087 // FIXME: Does this really make sense for all GNU toolchains?
8088 WantPthread = true;
8089
8090 // Also link the particular OpenMP runtimes.
8091 switch (getOpenMPRuntime(ToolChain, Args)) {
8092 case OMPRT_OMP:
8093 CmdArgs.push_back("-lomp");
8094 break;
8095 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008096 CmdArgs.push_back("-lgomp");
8097
8098 // FIXME: Exclude this for platforms with libgomp that don't require
8099 // librt. Most modern Linux platforms require it, but some may not.
8100 CmdArgs.push_back("-lrt");
8101 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008102 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008103 CmdArgs.push_back("-liomp5");
8104 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008105 case OMPRT_Unknown:
8106 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008107 break;
8108 }
Chandler Carruth01538002013-01-17 13:19:29 +00008109 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008110
Renato Golinc4b49242014-02-13 10:01:16 +00008111 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008112
Richard Smith31d1de22015-05-20 22:48:44 +00008113 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008114 CmdArgs.push_back("-lpthread");
8115
8116 CmdArgs.push_back("-lc");
8117
8118 if (Args.hasArg(options::OPT_static))
8119 CmdArgs.push_back("--end-group");
8120 else
Renato Golinc4b49242014-02-13 10:01:16 +00008121 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008122 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008123
Rafael Espindola81937ec2010-12-01 01:52:43 +00008124 if (!Args.hasArg(options::OPT_nostartfiles)) {
8125 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008126 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008127 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008128 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008129 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008130 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008131 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008132
Rafael Espindola81937ec2010-12-01 01:52:43 +00008133 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008134 if (!isAndroid)
8135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008136 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008137 }
8138
David Blaikiec11bf802014-09-04 16:04:28 +00008139 C.addCommand(
8140 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008141}
8142
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008143
8144// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8145// for the various SFI requirements like register masking. The assembly tool
8146// inserts the file containing the macros as an input into all the assembly
8147// jobs.
8148void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8149 const InputInfo &Output,
8150 const InputInfoList &Inputs,
8151 const ArgList &Args,
8152 const char *LinkingOutput) const {
8153 const toolchains::NaCl_TC& ToolChain =
8154 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8155 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8156 "nacl-arm-macros.s");
8157 InputInfoList NewInputs;
8158 NewInputs.push_back(NaClMacros);
8159 NewInputs.append(Inputs.begin(), Inputs.end());
8160 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8161 LinkingOutput);
8162}
8163
8164
8165// This is quite similar to gnutools::link::ConstructJob with changes that
8166// we use static by default, do not yet support sanitizers or LTO, and a few
8167// others. Eventually we can support more of that and hopefully migrate back
8168// to gnutools::link.
8169void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
8170 const InputInfo &Output,
8171 const InputInfoList &Inputs,
8172 const ArgList &Args,
8173 const char *LinkingOutput) const {
8174
8175 const toolchains::NaCl_TC& ToolChain =
8176 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8177 const Driver &D = ToolChain.getDriver();
8178 const bool IsStatic =
8179 !Args.hasArg(options::OPT_dynamic) &&
8180 !Args.hasArg(options::OPT_shared);
8181
8182 ArgStringList CmdArgs;
8183
8184 // Silence warning for "clang -g foo.o -o foo"
8185 Args.ClaimAllArgs(options::OPT_g_Group);
8186 // and "clang -emit-llvm foo.o -o foo"
8187 Args.ClaimAllArgs(options::OPT_emit_llvm);
8188 // and for "clang -w foo.o -o foo". Other warning options are already
8189 // handled somewhere else.
8190 Args.ClaimAllArgs(options::OPT_w);
8191
8192 if (!D.SysRoot.empty())
8193 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8194
8195 if (Args.hasArg(options::OPT_rdynamic))
8196 CmdArgs.push_back("-export-dynamic");
8197
8198 if (Args.hasArg(options::OPT_s))
8199 CmdArgs.push_back("-s");
8200
8201 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8202 // there is --build-id, which we do want.
8203 CmdArgs.push_back("--build-id");
8204
8205 if (!IsStatic)
8206 CmdArgs.push_back("--eh-frame-hdr");
8207
8208 CmdArgs.push_back("-m");
8209 if (ToolChain.getArch() == llvm::Triple::x86)
8210 CmdArgs.push_back("elf_i386_nacl");
8211 else if (ToolChain.getArch() == llvm::Triple::arm)
8212 CmdArgs.push_back("armelf_nacl");
8213 else if (ToolChain.getArch() == llvm::Triple::x86_64)
8214 CmdArgs.push_back("elf_x86_64_nacl");
8215 else
8216 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() <<
8217 "Native Client";
8218
8219
8220 if (IsStatic)
8221 CmdArgs.push_back("-static");
8222 else if (Args.hasArg(options::OPT_shared))
8223 CmdArgs.push_back("-shared");
8224
8225 CmdArgs.push_back("-o");
8226 CmdArgs.push_back(Output.getFilename());
8227 if (!Args.hasArg(options::OPT_nostdlib) &&
8228 !Args.hasArg(options::OPT_nostartfiles)) {
8229 if (!Args.hasArg(options::OPT_shared))
8230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8231 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8232
8233 const char *crtbegin;
8234 if (IsStatic)
8235 crtbegin = "crtbeginT.o";
8236 else if (Args.hasArg(options::OPT_shared))
8237 crtbegin = "crtbeginS.o";
8238 else
8239 crtbegin = "crtbegin.o";
8240 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8241 }
8242
8243 Args.AddAllArgs(CmdArgs, options::OPT_L);
8244 Args.AddAllArgs(CmdArgs, options::OPT_u);
8245
8246 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8247
8248 for (const auto &Path : Paths)
8249 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8250
8251 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8252 CmdArgs.push_back("--no-demangle");
8253
8254 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8255
8256 if (D.CCCIsCXX() &&
8257 !Args.hasArg(options::OPT_nostdlib) &&
8258 !Args.hasArg(options::OPT_nodefaultlibs)) {
8259 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8260 !IsStatic;
8261 if (OnlyLibstdcxxStatic)
8262 CmdArgs.push_back("-Bstatic");
8263 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8264 if (OnlyLibstdcxxStatic)
8265 CmdArgs.push_back("-Bdynamic");
8266 CmdArgs.push_back("-lm");
8267 }
8268
8269 if (!Args.hasArg(options::OPT_nostdlib)) {
8270 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8271 // Always use groups, since it has no effect on dynamic libraries.
8272 CmdArgs.push_back("--start-group");
8273 CmdArgs.push_back("-lc");
8274 // NaCl's libc++ currently requires libpthread, so just always include it
8275 // in the group for C++.
8276 if (Args.hasArg(options::OPT_pthread) ||
8277 Args.hasArg(options::OPT_pthreads) ||
8278 D.CCCIsCXX()) {
8279 CmdArgs.push_back("-lpthread");
8280 }
8281
8282 CmdArgs.push_back("-lgcc");
8283 CmdArgs.push_back("--as-needed");
8284 if (IsStatic)
8285 CmdArgs.push_back("-lgcc_eh");
8286 else
8287 CmdArgs.push_back("-lgcc_s");
8288 CmdArgs.push_back("--no-as-needed");
8289 CmdArgs.push_back("--end-group");
8290 }
8291
8292 if (!Args.hasArg(options::OPT_nostartfiles)) {
8293 const char *crtend;
8294 if (Args.hasArg(options::OPT_shared))
8295 crtend = "crtendS.o";
8296 else
8297 crtend = "crtend.o";
8298
8299 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8301 }
8302 }
8303
8304 C.addCommand(llvm::make_unique<Command>(JA, *this,
8305 ToolChain.Linker.c_str(), CmdArgs));
8306}
8307
8308
Chris Lattner3e2ee142010-07-07 16:01:42 +00008309void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008310 const InputInfo &Output,
8311 const InputInfoList &Inputs,
8312 const ArgList &Args,
8313 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008314 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008315 ArgStringList CmdArgs;
8316
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008317 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008318
8319 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008320 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008321
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008322 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008323 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008324
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008325 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008326 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008327}
8328
8329void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008330 const InputInfo &Output,
8331 const InputInfoList &Inputs,
8332 const ArgList &Args,
8333 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008334 const Driver &D = getToolChain().getDriver();
8335 ArgStringList CmdArgs;
8336
Daniel Dunbarb440f562010-08-02 02:38:21 +00008337 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008338 CmdArgs.push_back("-o");
8339 CmdArgs.push_back(Output.getFilename());
8340 } else {
8341 assert(Output.isNothing() && "Invalid output.");
8342 }
8343
8344 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008345 !Args.hasArg(options::OPT_nostartfiles)) {
8346 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8347 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8348 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8349 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8350 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008351
8352 Args.AddAllArgs(CmdArgs, options::OPT_L);
8353 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8354 Args.AddAllArgs(CmdArgs, options::OPT_e);
8355
Daniel Dunbar54423b22010-09-17 00:24:54 +00008356 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008357
Alexey Samsonov7811d192014-02-20 13:57:37 +00008358 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008359
Chris Lattner3e2ee142010-07-07 16:01:42 +00008360 if (!Args.hasArg(options::OPT_nostdlib) &&
8361 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008362 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008363 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008364 CmdArgs.push_back("-lm");
8365 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008366 }
8367
8368 if (!Args.hasArg(options::OPT_nostdlib) &&
8369 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008370 if (Args.hasArg(options::OPT_pthread))
8371 CmdArgs.push_back("-lpthread");
8372 CmdArgs.push_back("-lc");
8373 CmdArgs.push_back("-lCompilerRT-Generic");
8374 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8375 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008376 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008377 }
8378
Logan Chieneb9162f2014-06-26 14:23:45 +00008379 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008380 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008381}
8382
Daniel Dunbarcc912342009-05-02 18:28:39 +00008383/// DragonFly Tools
8384
8385// For now, DragonFly Assemble does just about the same as for
8386// FreeBSD, but this may change soon.
8387void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008388 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008389 const InputInfoList &Inputs,
8390 const ArgList &Args,
8391 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008392 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008393 ArgStringList CmdArgs;
8394
8395 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8396 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008397 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008398 CmdArgs.push_back("--32");
8399
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008400 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008401
8402 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008403 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008404
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008405 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008406 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008407
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008408 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008409 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008410}
8411
8412void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008413 const InputInfo &Output,
8414 const InputInfoList &Inputs,
8415 const ArgList &Args,
8416 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008417 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008418 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008419 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008420
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008421 if (!D.SysRoot.empty())
8422 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8423
John McCall65b8da02013-04-11 22:55:55 +00008424 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008425 if (Args.hasArg(options::OPT_static)) {
8426 CmdArgs.push_back("-Bstatic");
8427 } else {
John McCall65b8da02013-04-11 22:55:55 +00008428 if (Args.hasArg(options::OPT_rdynamic))
8429 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008430 if (Args.hasArg(options::OPT_shared))
8431 CmdArgs.push_back("-Bshareable");
8432 else {
8433 CmdArgs.push_back("-dynamic-linker");
8434 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8435 }
John McCall65b8da02013-04-11 22:55:55 +00008436 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008437 }
8438
8439 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8440 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008441 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008442 CmdArgs.push_back("-m");
8443 CmdArgs.push_back("elf_i386");
8444 }
8445
Daniel Dunbarb440f562010-08-02 02:38:21 +00008446 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008447 CmdArgs.push_back("-o");
8448 CmdArgs.push_back(Output.getFilename());
8449 } else {
8450 assert(Output.isNothing() && "Invalid output.");
8451 }
8452
8453 if (!Args.hasArg(options::OPT_nostdlib) &&
8454 !Args.hasArg(options::OPT_nostartfiles)) {
8455 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008456 if (Args.hasArg(options::OPT_pg))
8457 CmdArgs.push_back(Args.MakeArgString(
8458 getToolChain().GetFilePath("gcrt1.o")));
8459 else {
8460 if (Args.hasArg(options::OPT_pie))
8461 CmdArgs.push_back(Args.MakeArgString(
8462 getToolChain().GetFilePath("Scrt1.o")));
8463 else
8464 CmdArgs.push_back(Args.MakeArgString(
8465 getToolChain().GetFilePath("crt1.o")));
8466 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008467 }
John McCall65b8da02013-04-11 22:55:55 +00008468 CmdArgs.push_back(Args.MakeArgString(
8469 getToolChain().GetFilePath("crti.o")));
8470 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8471 CmdArgs.push_back(Args.MakeArgString(
8472 getToolChain().GetFilePath("crtbeginS.o")));
8473 else
8474 CmdArgs.push_back(Args.MakeArgString(
8475 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008476 }
8477
8478 Args.AddAllArgs(CmdArgs, options::OPT_L);
8479 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8480 Args.AddAllArgs(CmdArgs, options::OPT_e);
8481
Daniel Dunbar54423b22010-09-17 00:24:54 +00008482 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008483
8484 if (!Args.hasArg(options::OPT_nostdlib) &&
8485 !Args.hasArg(options::OPT_nodefaultlibs)) {
8486 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8487 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008488 if (UseGCC47)
8489 CmdArgs.push_back("-L/usr/lib/gcc47");
8490 else
8491 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008492
8493 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008494 if (UseGCC47) {
8495 CmdArgs.push_back("-rpath");
8496 CmdArgs.push_back("/usr/lib/gcc47");
8497 } else {
8498 CmdArgs.push_back("-rpath");
8499 CmdArgs.push_back("/usr/lib/gcc44");
8500 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008501 }
8502
Hans Wennborg70850d82013-07-18 20:29:38 +00008503 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008504 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008505 CmdArgs.push_back("-lm");
8506 }
8507
Daniel Dunbarcc912342009-05-02 18:28:39 +00008508 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008509 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008510
8511 if (!Args.hasArg(options::OPT_nolibc)) {
8512 CmdArgs.push_back("-lc");
8513 }
8514
John McCall65b8da02013-04-11 22:55:55 +00008515 if (UseGCC47) {
8516 if (Args.hasArg(options::OPT_static) ||
8517 Args.hasArg(options::OPT_static_libgcc)) {
8518 CmdArgs.push_back("-lgcc");
8519 CmdArgs.push_back("-lgcc_eh");
8520 } else {
8521 if (Args.hasArg(options::OPT_shared_libgcc)) {
8522 CmdArgs.push_back("-lgcc_pic");
8523 if (!Args.hasArg(options::OPT_shared))
8524 CmdArgs.push_back("-lgcc");
8525 } else {
8526 CmdArgs.push_back("-lgcc");
8527 CmdArgs.push_back("--as-needed");
8528 CmdArgs.push_back("-lgcc_pic");
8529 CmdArgs.push_back("--no-as-needed");
8530 }
8531 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008532 } else {
John McCall65b8da02013-04-11 22:55:55 +00008533 if (Args.hasArg(options::OPT_shared)) {
8534 CmdArgs.push_back("-lgcc_pic");
8535 } else {
8536 CmdArgs.push_back("-lgcc");
8537 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008538 }
8539 }
8540
8541 if (!Args.hasArg(options::OPT_nostdlib) &&
8542 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008543 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008544 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008545 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008546 else
8547 CmdArgs.push_back(Args.MakeArgString(
8548 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008549 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008550 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008551 }
8552
Alexey Samsonov7811d192014-02-20 13:57:37 +00008553 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008554
Logan Chieneb9162f2014-06-26 14:23:45 +00008555 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008557}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008558
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008559// Try to find Exe from a Visual Studio distribution. This first tries to find
8560// an installed copy of Visual Studio and, failing that, looks in the PATH,
8561// making sure that whatever executable that's found is not a same-named exe
8562// from clang itself to prevent clang from falling back to itself.
8563static std::string FindVisualStudioExecutable(const ToolChain &TC,
8564 const char *Exe,
8565 const char *ClangProgramPath) {
8566 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8567 std::string visualStudioBinDir;
8568 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8569 visualStudioBinDir)) {
8570 SmallString<128> FilePath(visualStudioBinDir);
8571 llvm::sys::path::append(FilePath, Exe);
8572 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8573 return FilePath.str();
8574 }
8575
8576 return Exe;
8577}
8578
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008579void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8580 const InputInfo &Output,
8581 const InputInfoList &Inputs,
8582 const ArgList &Args,
8583 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008584 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008585 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008586
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008587 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8588 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008589 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8590 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008591
8592 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008593 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008594 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008595
Zachary Turner10d75b22014-10-22 20:40:43 +00008596 if (!llvm::sys::Process::GetEnv("LIB")) {
8597 // If the VC environment hasn't been configured (perhaps because the user
8598 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008599 // the environment variable is set however, assume the user knows what
8600 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008601 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008602 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008603 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8604 SmallString<128> LibDir(VisualStudioDir);
8605 llvm::sys::path::append(LibDir, "VC", "lib");
8606 switch (MSVC.getArch()) {
8607 case llvm::Triple::x86:
8608 // x86 just puts the libraries directly in lib
8609 break;
8610 case llvm::Triple::x86_64:
8611 llvm::sys::path::append(LibDir, "amd64");
8612 break;
8613 case llvm::Triple::arm:
8614 llvm::sys::path::append(LibDir, "arm");
8615 break;
8616 default:
8617 break;
8618 }
8619 CmdArgs.push_back(
8620 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8621 }
8622
8623 std::string WindowsSdkLibPath;
8624 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8625 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8626 WindowsSdkLibPath.c_str()));
8627 }
8628
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008629 CmdArgs.push_back("-nologo");
8630
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008631 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008632 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008633
Hans Wennborge4c47f22015-03-04 23:16:21 +00008634 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8635 options::OPT__SLASH_LDd,
8636 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008637 if (DLL) {
8638 CmdArgs.push_back(Args.MakeArgString("-dll"));
8639
8640 SmallString<128> ImplibName(Output.getFilename());
8641 llvm::sys::path::replace_extension(ImplibName, "lib");
8642 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008643 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008644 }
8645
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008646 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008647 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008648 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008649 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008650 static const char *CompilerRTComponents[] = {
8651 "asan_dynamic",
8652 "asan_dynamic_runtime_thunk",
8653 };
8654 for (const auto &Component : CompilerRTComponents)
8655 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008656 // Make sure the dynamic runtime thunk is not optimized out at link time
8657 // to ensure proper SEH handling.
8658 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008659 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008660 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008661 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008662 static const char *CompilerRTComponents[] = {
8663 "asan",
8664 "asan_cxx",
8665 };
8666 for (const auto &Component : CompilerRTComponents)
8667 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008668 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008669 }
8670
Hans Wennborg2e274592013-08-13 23:38:57 +00008671 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008672
Reid Kleckner337188f2014-09-16 19:22:00 +00008673 // Add filenames, libraries, and other linker inputs.
8674 for (const auto &Input : Inputs) {
8675 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008676 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008677 continue;
8678 }
8679
8680 const Arg &A = Input.getInputArg();
8681
8682 // Render -l options differently for the MSVC linker.
8683 if (A.getOption().matches(options::OPT_l)) {
8684 StringRef Lib = A.getValue();
8685 const char *LinkLibArg;
8686 if (Lib.endswith(".lib"))
8687 LinkLibArg = Args.MakeArgString(Lib);
8688 else
8689 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8690 CmdArgs.push_back(LinkLibArg);
8691 continue;
8692 }
8693
8694 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8695 // or -L. Render it, even if MSVC doesn't understand it.
8696 A.renderAsInput(Args, CmdArgs);
8697 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008698
Zachary Turner719f58c2014-12-01 23:06:47 +00008699 // We need to special case some linker paths. In the case of lld, we need to
8700 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8701 // linker, we need to use a special search algorithm.
8702 llvm::SmallString<128> linkPath;
8703 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8704 if (Linker.equals_lower("lld"))
8705 Linker = "lld-link";
8706
8707 if (Linker.equals_lower("link")) {
8708 // If we're using the MSVC linker, it's not sufficient to just use link
8709 // from the program PATH, because other environments like GnuWin32 install
8710 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008711 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008712 C.getDriver().getClangProgramPath());
8713 } else {
8714 linkPath = Linker;
8715 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008716 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008717 }
8718
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008719 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008720 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008721}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008722
8723void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8724 const InputInfo &Output,
8725 const InputInfoList &Inputs,
8726 const ArgList &Args,
8727 const char *LinkingOutput) const {
8728 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8729}
8730
David Blaikiec11bf802014-09-04 16:04:28 +00008731std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8732 Compilation &C, const JobAction &JA, const InputInfo &Output,
8733 const InputInfoList &Inputs, const ArgList &Args,
8734 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008735 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008736 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008737 CmdArgs.push_back("/c"); // Compile only.
8738 CmdArgs.push_back("/W0"); // No warnings.
8739
8740 // The goal is to be able to invoke this tool correctly based on
8741 // any flag accepted by clang-cl.
8742
8743 // These are spelled the same way in clang and cl.exe,.
8744 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8745 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008746
8747 // Optimization level.
8748 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8749 if (A->getOption().getID() == options::OPT_O0) {
8750 CmdArgs.push_back("/Od");
8751 } else {
8752 StringRef OptLevel = A->getValue();
8753 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8754 A->render(Args, CmdArgs);
8755 else if (OptLevel == "3")
8756 CmdArgs.push_back("/Ox");
8757 }
8758 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008759
Nico Weber3f8dafb2015-03-12 19:37:10 +00008760 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008761 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8762
David Majnemerf6072342014-07-01 22:24:56 +00008763 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8764 /*default=*/false))
8765 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008766 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8767 options::OPT_fno_function_sections))
8768 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8769 ? "/Gy"
8770 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008771 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8772 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008773 CmdArgs.push_back(
8774 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008775 if (Args.hasArg(options::OPT_fsyntax_only))
8776 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008777 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8778 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008779
Nico Weber3f8dafb2015-03-12 19:37:10 +00008780 std::vector<std::string> Includes =
8781 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008782 for (const auto &Include : Includes)
8783 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008784
Hans Wennborg87cfa712013-09-19 20:32:16 +00008785 // Flags that can simply be passed through.
8786 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8787 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008788 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008789
8790 // The order of these flags is relevant, so pick the last one.
8791 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8792 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8793 A->render(Args, CmdArgs);
8794
8795
8796 // Input filename.
8797 assert(Inputs.size() == 1);
8798 const InputInfo &II = Inputs[0];
8799 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8800 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8801 if (II.isFilename())
8802 CmdArgs.push_back(II.getFilename());
8803 else
8804 II.getInputArg().renderAsInput(Args, CmdArgs);
8805
8806 // Output filename.
8807 assert(Output.getType() == types::TY_Object);
8808 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8809 Output.getFilename());
8810 CmdArgs.push_back(Fo);
8811
Hans Wennborg188382e2013-09-20 18:16:35 +00008812 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008813 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8814 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008815 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8816 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008817}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008818
8819
8820/// XCore Tools
8821// We pass assemble and link construction to the xcc tool.
8822
8823void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8824 const InputInfo &Output,
8825 const InputInfoList &Inputs,
8826 const ArgList &Args,
8827 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008828 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008829 ArgStringList CmdArgs;
8830
8831 CmdArgs.push_back("-o");
8832 CmdArgs.push_back(Output.getFilename());
8833
8834 CmdArgs.push_back("-c");
8835
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008836 if (Args.hasArg(options::OPT_v))
8837 CmdArgs.push_back("-v");
8838
Robert Lytton894d25c2014-05-02 09:33:25 +00008839 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8840 if (!A->getOption().matches(options::OPT_g0))
8841 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008842
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008843 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8844 false))
8845 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008846
8847 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8848 options::OPT_Xassembler);
8849
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008850 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008851 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008852
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008853 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008855}
8856
8857void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8858 const InputInfo &Output,
8859 const InputInfoList &Inputs,
8860 const ArgList &Args,
8861 const char *LinkingOutput) const {
8862 ArgStringList CmdArgs;
8863
8864 if (Output.isFilename()) {
8865 CmdArgs.push_back("-o");
8866 CmdArgs.push_back(Output.getFilename());
8867 } else {
8868 assert(Output.isNothing() && "Invalid output.");
8869 }
8870
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008871 if (Args.hasArg(options::OPT_v))
8872 CmdArgs.push_back("-v");
8873
David Majnemer8de68642014-12-05 08:11:58 +00008874 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008875 CmdArgs.push_back("-fexceptions");
8876
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008877 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8878
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008879 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008880 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008881}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008882
8883void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8884 const InputInfo &Output,
8885 const InputInfoList &Inputs,
8886 const ArgList &Args,
8887 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008888 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008889 const auto &TC =
8890 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8891 ArgStringList CmdArgs;
8892 const char *Exec;
8893
8894 switch (TC.getArch()) {
8895 default: llvm_unreachable("unsupported architecture");
8896 case llvm::Triple::arm:
8897 case llvm::Triple::thumb:
8898 break;
8899 case llvm::Triple::x86:
8900 CmdArgs.push_back("--32");
8901 break;
8902 case llvm::Triple::x86_64:
8903 CmdArgs.push_back("--64");
8904 break;
8905 }
8906
8907 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8908
8909 CmdArgs.push_back("-o");
8910 CmdArgs.push_back(Output.getFilename());
8911
8912 for (const auto &Input : Inputs)
8913 CmdArgs.push_back(Input.getFilename());
8914
8915 const std::string Assembler = TC.GetProgramPath("as");
8916 Exec = Args.MakeArgString(Assembler);
8917
8918 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8919}
8920
8921void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8922 const InputInfo &Output,
8923 const InputInfoList &Inputs,
8924 const ArgList &Args,
8925 const char *LinkingOutput) const {
8926 const auto &TC =
8927 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8928 const llvm::Triple &T = TC.getTriple();
8929 const Driver &D = TC.getDriver();
8930 SmallString<128> EntryPoint;
8931 ArgStringList CmdArgs;
8932 const char *Exec;
8933
8934 // Silence warning for "clang -g foo.o -o foo"
8935 Args.ClaimAllArgs(options::OPT_g_Group);
8936 // and "clang -emit-llvm foo.o -o foo"
8937 Args.ClaimAllArgs(options::OPT_emit_llvm);
8938 // and for "clang -w foo.o -o foo"
8939 Args.ClaimAllArgs(options::OPT_w);
8940 // Other warning options are already handled somewhere else.
8941
8942 if (!D.SysRoot.empty())
8943 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8944
8945 if (Args.hasArg(options::OPT_pie))
8946 CmdArgs.push_back("-pie");
8947 if (Args.hasArg(options::OPT_rdynamic))
8948 CmdArgs.push_back("-export-dynamic");
8949 if (Args.hasArg(options::OPT_s))
8950 CmdArgs.push_back("--strip-all");
8951
8952 CmdArgs.push_back("-m");
8953 switch (TC.getArch()) {
8954 default: llvm_unreachable("unsupported architecture");
8955 case llvm::Triple::arm:
8956 case llvm::Triple::thumb:
8957 // FIXME: this is incorrect for WinCE
8958 CmdArgs.push_back("thumb2pe");
8959 break;
8960 case llvm::Triple::x86:
8961 CmdArgs.push_back("i386pe");
8962 EntryPoint.append("_");
8963 break;
8964 case llvm::Triple::x86_64:
8965 CmdArgs.push_back("i386pep");
8966 break;
8967 }
8968
8969 if (Args.hasArg(options::OPT_shared)) {
8970 switch (T.getArch()) {
8971 default: llvm_unreachable("unsupported architecture");
8972 case llvm::Triple::arm:
8973 case llvm::Triple::thumb:
8974 case llvm::Triple::x86_64:
8975 EntryPoint.append("_DllMainCRTStartup");
8976 break;
8977 case llvm::Triple::x86:
8978 EntryPoint.append("_DllMainCRTStartup@12");
8979 break;
8980 }
8981
8982 CmdArgs.push_back("-shared");
8983 CmdArgs.push_back("-Bdynamic");
8984
8985 CmdArgs.push_back("--enable-auto-image-base");
8986
8987 CmdArgs.push_back("--entry");
8988 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8989 } else {
8990 EntryPoint.append("mainCRTStartup");
8991
8992 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8993 : "-Bdynamic");
8994
8995 if (!Args.hasArg(options::OPT_nostdlib) &&
8996 !Args.hasArg(options::OPT_nostartfiles)) {
8997 CmdArgs.push_back("--entry");
8998 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8999 }
9000
9001 // FIXME: handle subsystem
9002 }
9003
9004 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009005 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009006
9007 CmdArgs.push_back("-o");
9008 CmdArgs.push_back(Output.getFilename());
9009
9010 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9011 SmallString<261> ImpLib(Output.getFilename());
9012 llvm::sys::path::replace_extension(ImpLib, ".lib");
9013
9014 CmdArgs.push_back("--out-implib");
9015 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9016 }
9017
9018 if (!Args.hasArg(options::OPT_nostdlib) &&
9019 !Args.hasArg(options::OPT_nostartfiles)) {
9020 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9021 const char *CRTBegin;
9022
9023 CRTBegin =
9024 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9025 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9026 }
9027
9028 Args.AddAllArgs(CmdArgs, options::OPT_L);
9029
9030 const auto &Paths = TC.getFilePaths();
9031 for (const auto &Path : Paths)
9032 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9033
9034 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9035
9036 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9037 !Args.hasArg(options::OPT_nodefaultlibs)) {
9038 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9039 !Args.hasArg(options::OPT_static);
9040 if (StaticCXX)
9041 CmdArgs.push_back("-Bstatic");
9042 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9043 if (StaticCXX)
9044 CmdArgs.push_back("-Bdynamic");
9045 }
9046
9047 if (!Args.hasArg(options::OPT_nostdlib)) {
9048 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9049 // TODO handle /MT[d] /MD[d]
9050 CmdArgs.push_back("-lmsvcrt");
9051 AddRunTimeLibs(TC, D, CmdArgs, Args);
9052 }
9053 }
9054
9055 const std::string Linker = TC.GetProgramPath("ld");
9056 Exec = Args.MakeArgString(Linker);
9057
9058 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9059}