blob: 2ba969d667ba9817c9a0e897898a3ebdebefa32d [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>
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000346 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000347
Daniel Dunbara442fd52010-06-11 22:00:13 +0000348 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000350 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000351 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 CmdArgs.push_back(Args.MakeArgString(Quoted));
353
354 // -MT flag - no change
355 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000356 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000357 }
358 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000359
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 // Add -i* options, and automatically translate to
361 // -include-pch/-include-pth for transparent PCH support. It's
362 // wonky, but we include looking for .gch so we can support seamless
363 // replacement into a build system already set up to be generating
364 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000365 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000366 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000367 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000368 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
369 RenderedImplicitInclude = true;
370
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000371 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000372 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000373
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000374 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000375 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000376 SmallString<128> P(A->getValue());
377 // We want the files to have a name like foo.h.pch. Add a dummy extension
378 // so that replace_extension does the right thing.
379 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000380 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000381 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000382 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000383 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000384 }
385
Douglas Gregor111af7d2009-04-18 00:34:01 +0000386 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000395 FoundPCH = UsePCH;
396 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000397 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 }
399
400 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000401 if (IsFirstImplicitInclude) {
402 A->claim();
403 if (UsePCH)
404 CmdArgs.push_back("-include-pch");
405 else
406 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000407 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000408 continue;
409 } else {
410 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000411 D.Diag(diag::warn_drv_pch_not_first_include)
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 << P << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000413 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000414 }
415 }
416
417 // Not translated, render as usual.
418 A->claim();
419 A->render(Args, CmdArgs);
420 }
421
422 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000423 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
424 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000425
426 // Add -Wp, and -Xassembler if using the preprocessor.
427
428 // FIXME: There is a very unfortunate problem here, some troubled
429 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
430 // really support that we would have to parse and then translate
431 // those options. :(
432 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
433 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000434
435 // -I- is a deprecated GCC feature, reject it.
436 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000437 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000438
439 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
440 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000441 StringRef sysroot = C.getSysRoot();
442 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000443 if (!Args.hasArg(options::OPT_isysroot)) {
444 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000445 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000446 }
447 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000448
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000449 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000450 // FIXME: We should probably sink the logic for handling these from the
451 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // CPATH - included following the user specified includes (but prior to
453 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000454 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000456 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000457 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000458 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000459 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000463
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000464 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000465 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000466 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000467
468 // Add system include arguments.
469 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000470}
471
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000472// FIXME: Move to target hook.
473static bool isSignedCharDefault(const llvm::Triple &Triple) {
474 switch (Triple.getArch()) {
475 default:
476 return true;
477
Tim Northover9bb857a2013-01-31 12:13:10 +0000478 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000479 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000480 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000481 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000482 case llvm::Triple::thumb:
483 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000484 if (Triple.isOSDarwin() || Triple.isOSWindows())
485 return true;
486 return false;
487
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000488 case llvm::Triple::ppc:
489 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000490 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000491 return true;
492 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000493
David Majnemerdcecd932015-05-23 19:23:55 +0000494 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000495 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000496 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000497 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000498 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000499 }
500}
501
Robert Lytton0e076492013-08-13 09:43:10 +0000502static bool isNoCommonDefault(const llvm::Triple &Triple) {
503 switch (Triple.getArch()) {
504 default:
505 return false;
506
507 case llvm::Triple::xcore:
508 return true;
509 }
510}
511
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000512// Handle -mhwdiv=.
513static void getARMHWDivFeatures(const Driver &D, const Arg *A,
514 const ArgList &Args,
515 std::vector<const char *> &Features) {
516 StringRef HWDiv = A->getValue();
517 if (HWDiv == "arm") {
518 Features.push_back("+hwdiv-arm");
519 Features.push_back("-hwdiv");
520 } else if (HWDiv == "thumb") {
521 Features.push_back("-hwdiv-arm");
522 Features.push_back("+hwdiv");
523 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
524 Features.push_back("+hwdiv-arm");
525 Features.push_back("+hwdiv");
526 } else if (HWDiv == "none") {
527 Features.push_back("-hwdiv-arm");
528 Features.push_back("-hwdiv");
529 } else
530 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
531}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000532
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000533// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000534static void getARMFPUFeatures(const Driver &D, const Arg *A,
535 const ArgList &Args,
536 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000537 StringRef FPU = A->getValue();
John Brawn5a589ad2015-06-05 13:34:11 +0000538 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
539 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000540 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
541}
542
John Brawn94fd9632015-05-21 12:19:49 +0000543static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000544 llvm::StringRef Arch = Triple.getArchName();
545 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000546}
547
John Brawn94fd9632015-05-21 12:19:49 +0000548static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000549 llvm::StringRef Arch = Triple.getArchName();
550 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
551 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000552}
553
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000554// Select the float ABI as determined by -msoft-float, -mhard-float, and
555// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000556StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000557 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000558 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000559 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
560 options::OPT_mhard_float,
561 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000562 if (A->getOption().matches(options::OPT_msoft_float))
563 FloatABI = "soft";
564 else if (A->getOption().matches(options::OPT_mhard_float))
565 FloatABI = "hard";
566 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000567 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000568 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000569 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000570 << A->getAsString(Args);
571 FloatABI = "soft";
572 }
573 }
574 }
575
576 // If unspecified, choose the default based on the platform.
577 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000578 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000579 case llvm::Triple::Darwin:
580 case llvm::Triple::MacOSX:
581 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000582 // Darwin defaults to "softfp" for v6 and v7.
583 //
John Brawn94fd9632015-05-21 12:19:49 +0000584 if (getARMSubArchVersionNumber(Triple) == 6 ||
585 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000586 FloatABI = "softfp";
587 else
588 FloatABI = "soft";
589 break;
590 }
591
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000592 // FIXME: this is invalid for WindowsCE
593 case llvm::Triple::Win32:
594 FloatABI = "hard";
595 break;
596
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000597 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000598 switch(Triple.getEnvironment()) {
599 case llvm::Triple::GNUEABIHF:
600 FloatABI = "hard";
601 break;
602 default:
603 // FreeBSD defaults to soft float
604 FloatABI = "soft";
605 break;
606 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000607 break;
608
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000610 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000611 case llvm::Triple::GNUEABIHF:
612 FloatABI = "hard";
613 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000614 case llvm::Triple::GNUEABI:
615 FloatABI = "softfp";
616 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000617 case llvm::Triple::EABIHF:
618 FloatABI = "hard";
619 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000620 case llvm::Triple::EABI:
621 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
622 FloatABI = "softfp";
623 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000624 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000625 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000626 FloatABI = "softfp";
627 else
628 FloatABI = "soft";
629 break;
630 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000631 default:
632 // Assume "soft", but warn the user we are guessing.
633 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000634 if (Triple.getOS() != llvm::Triple::UnknownOS ||
635 !Triple.isOSBinFormatMachO())
636 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000637 break;
638 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 }
640 }
641
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000642 return FloatABI;
643}
644
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000645static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
646 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000647 std::vector<const char *> &Features,
648 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000649 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
650 if (!ForAS) {
651 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
652 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
653 // stripped out by the ARM target. We should probably pass this a new
654 // -target-option, which is handled by the -cc1/-cc1as invocation.
655 //
656 // FIXME2: For consistency, it would be ideal if we set up the target
657 // machine state the same when using the frontend or the assembler. We don't
658 // currently do that for the assembler, we pass the options directly to the
659 // backend and never even instantiate the frontend TargetInfo. If we did,
660 // and used its handleTargetFeatures hook, then we could ensure the
661 // assembler and the frontend behave the same.
662
663 // Use software floating point operations?
664 if (FloatABI == "soft")
665 Features.push_back("+soft-float");
666
667 // Use software floating point argument passing?
668 if (FloatABI != "hard")
669 Features.push_back("+soft-float-abi");
670 }
671
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000672 // Honor -mfpu=.
673 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000674 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000675 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
676 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000677
John Brawna8f82342015-05-29 13:10:44 +0000678 // Check if -march is valid by checking if it can be canonicalised and parsed.
679 // getARMArch is used here instead of just checking the -march value in order
680 // to handle -march=native correctly.
John Brawn94fd9632015-05-21 12:19:49 +0000681 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000682 std::string Arch = arm::getARMArch(Args, Triple);
John Brawna8f82342015-05-29 13:10:44 +0000683 if (llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_INVALID)
John Brawna95c1a82015-05-08 12:52:18 +0000684 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000685 }
686
687 // We do a similar thing with -mcpu, but here things are complicated because
688 // the only function we have to check if a cpu is valid is
689 // getLLVMArchSuffixForARM which also needs an architecture.
690 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000691 std::string CPU = arm::getARMTargetCPU(Args, Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000692 std::string Arch = arm::getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000693 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
694 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
695 }
John Brawna95c1a82015-05-08 12:52:18 +0000696
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000697 // Setting -msoft-float effectively disables NEON because of the GCC
698 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000699 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000700 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000701 // Also need to explicitly disable features which imply NEON.
702 Features.push_back("-crypto");
703 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000704
Eric Christopher269c2a22015-04-04 03:34:43 +0000705 // En/disable crc code generation.
706 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000707 if (A->getOption().matches(options::OPT_mcrc))
708 Features.push_back("+crc");
709 else
710 Features.push_back("-crc");
711 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000712
713 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
714 Features.insert(Features.begin(), "+v8.1a");
715 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000716}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000717
718void Clang::AddARMTargetArgs(const ArgList &Args,
719 ArgStringList &CmdArgs,
720 bool KernelOrKext) const {
721 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000722 // Get the effective triple, which takes into account the deployment target.
723 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
724 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000725
726 // Select the ABI to use.
727 //
728 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000729 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000730 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000731 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000732 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000733 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000734 // The backend is hardwired to assume AAPCS for M-class processors, ensure
735 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000736 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000737 Triple.getOS() == llvm::Triple::UnknownOS ||
John Brawn94fd9632015-05-21 12:19:49 +0000738 isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000739 ABIName = "aapcs";
740 } else {
741 ABIName = "apcs-gnu";
742 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000743 } else if (Triple.isOSWindows()) {
744 // FIXME: this is invalid for WindowsCE
745 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000746 } else {
747 // Select the default based on the platform.
748 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000749 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000750 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000751 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752 ABIName = "aapcs-linux";
753 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000754 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000755 case llvm::Triple::EABI:
756 ABIName = "aapcs";
757 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000758 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000759 if (Triple.getOS() == llvm::Triple::NetBSD)
760 ABIName = "apcs-gnu";
761 else
762 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000763 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000764 }
765 }
766 CmdArgs.push_back("-target-abi");
767 CmdArgs.push_back(ABIName);
768
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000770 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000771 if (FloatABI == "soft") {
772 // Floating point operations and argument passing are soft.
773 //
774 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000775 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000776 CmdArgs.push_back("-mfloat-abi");
777 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000778 } else if (FloatABI == "softfp") {
779 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000780 CmdArgs.push_back("-mfloat-abi");
781 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000782 } else {
783 // Floating point operations and argument passing are hard.
784 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000785 CmdArgs.push_back("-mfloat-abi");
786 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000787 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000788
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000789 // Kernel code has more strict alignment requirements.
790 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000791 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000792 CmdArgs.push_back("-backend-option");
793 CmdArgs.push_back("-arm-long-calls");
794 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000795
Daniel Dunbar12100e22011-03-22 16:48:17 +0000796 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000797 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000798
799 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000800 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000801 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000802 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000803
Bob Wilson0874e532014-07-29 00:23:18 +0000804 // -mkernel implies -mstrict-align; don't add the redundant option.
805 if (!KernelOrKext) {
806 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
807 options::OPT_munaligned_access)) {
808 CmdArgs.push_back("-backend-option");
809 if (A->getOption().matches(options::OPT_mno_unaligned_access))
810 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000811 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000812 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000813 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000814 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000815 }
Bob Wilson0874e532014-07-29 00:23:18 +0000816 }
817 }
818
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000819 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000820 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
821 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000822 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000823 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000824 CmdArgs.push_back("-arm-global-merge=false");
825 else
826 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000827 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000828
Bob Wilson9c8af452013-04-11 18:53:25 +0000829 if (!Args.hasFlag(options::OPT_mimplicit_float,
830 options::OPT_mno_implicit_float,
831 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000832 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000833
Logan Chien749763e2014-04-03 13:12:44 +0000834 // llvm does not support reserving registers in general. There is support
835 // for reserving r9 on ARM though (defined as a platform-specific register
836 // in ARM EABI).
837 if (Args.hasArg(options::OPT_ffixed_r9)) {
838 CmdArgs.push_back("-backend-option");
839 CmdArgs.push_back("-arm-reserve-r9");
840 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000841}
842
Tim Northover573cbee2014-05-24 12:52:07 +0000843/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
844/// targeting.
845static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000846 Arg *A;
847 std::string CPU;
848 // If we have -mtune or -mcpu, use that.
849 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
850 CPU = A->getValue();
851 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000852 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000853 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000854 }
855
Kevin Qin110db6f2014-07-18 07:03:22 +0000856 // Handle CPU name is 'native'.
857 if (CPU == "native")
858 return llvm::sys::getHostCPUName();
859 else if (CPU.size())
860 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000861
James Molloy9b1586b2014-04-17 12:51:17 +0000862 // Make sure we pick "cyclone" if -arch is used.
863 // FIXME: Should this be picked by checking the target triple instead?
864 if (Args.getLastArg(options::OPT_arch))
865 return "cyclone";
866
867 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000868}
869
Tim Northover573cbee2014-05-24 12:52:07 +0000870void Clang::AddAArch64TargetArgs(const ArgList &Args,
871 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000872 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
873 llvm::Triple Triple(TripleStr);
874
875 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
876 Args.hasArg(options::OPT_mkernel) ||
877 Args.hasArg(options::OPT_fapple_kext))
878 CmdArgs.push_back("-disable-red-zone");
879
880 if (!Args.hasFlag(options::OPT_mimplicit_float,
881 options::OPT_mno_implicit_float, true))
882 CmdArgs.push_back("-no-implicit-float");
883
Craig Topper92fc2df2014-05-17 16:56:41 +0000884 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000885 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
886 ABIName = A->getValue();
887 else if (Triple.isOSDarwin())
888 ABIName = "darwinpcs";
889 else
890 ABIName = "aapcs";
891
892 CmdArgs.push_back("-target-abi");
893 CmdArgs.push_back(ABIName);
894
Bob Wilson0874e532014-07-29 00:23:18 +0000895 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
896 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000897 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000898 if (A->getOption().matches(options::OPT_mno_unaligned_access))
899 CmdArgs.push_back("-aarch64-strict-align");
900 else
901 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000902 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000903
Bradley Smith9ff64332014-10-13 10:16:06 +0000904 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
905 options::OPT_mno_fix_cortex_a53_835769)) {
906 CmdArgs.push_back("-backend-option");
907 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
908 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
909 else
910 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000911 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
912 // Enabled A53 errata (835769) workaround by default on android
913 CmdArgs.push_back("-backend-option");
914 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000915 }
916
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000917 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000918 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
919 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000920 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000921 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000922 CmdArgs.push_back("-aarch64-global-merge=false");
923 else
924 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000925 }
Renato Golinb625f482015-01-25 23:17:48 +0000926
927 if (Args.hasArg(options::OPT_ffixed_x18)) {
928 CmdArgs.push_back("-backend-option");
929 CmdArgs.push_back("-aarch64-reserve-x18");
930 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000931}
932
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000933// Get CPU and ABI names. They are not independent
934// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000935void mips::getMipsCPUAndABI(const ArgList &Args,
936 const llvm::Triple &Triple,
937 StringRef &CPUName,
938 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000939 const char *DefMips32CPU = "mips32r2";
940 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000941
Daniel Sanders2bf13662014-07-10 14:40:57 +0000942 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
943 // default for mips64(el)?-img-linux-gnu.
944 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
945 Triple.getEnvironment() == llvm::Triple::GNU) {
946 DefMips32CPU = "mips32r6";
947 DefMips64CPU = "mips64r6";
948 }
949
Brad Smithba26f582015-01-06 02:53:17 +0000950 // MIPS3 is the default for mips64*-unknown-openbsd.
951 if (Triple.getOS() == llvm::Triple::OpenBSD)
952 DefMips64CPU = "mips3";
953
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000954 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000955 options::OPT_mcpu_EQ))
956 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000957
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000958 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000959 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000960 // Convert a GNU style Mips ABI name to the name
961 // accepted by LLVM Mips backend.
962 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
963 .Case("32", "o32")
964 .Case("64", "n64")
965 .Default(ABIName);
966 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000967
968 // Setup default CPU and ABI names.
969 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000970 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000971 default:
972 llvm_unreachable("Unexpected triple arch name");
973 case llvm::Triple::mips:
974 case llvm::Triple::mipsel:
975 CPUName = DefMips32CPU;
976 break;
977 case llvm::Triple::mips64:
978 case llvm::Triple::mips64el:
979 CPUName = DefMips64CPU;
980 break;
981 }
982 }
983
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000984 if (ABIName.empty()) {
985 // Deduce ABI name from the target triple.
986 if (Triple.getArch() == llvm::Triple::mips ||
987 Triple.getArch() == llvm::Triple::mipsel)
988 ABIName = "o32";
989 else
990 ABIName = "n64";
991 }
992
993 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000994 // Deduce CPU name from ABI name.
995 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +0000996 .Cases("o32", "eabi", DefMips32CPU)
997 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000998 .Default("");
999 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001000
1001 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001002}
1003
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001004// Convert ABI name to the GNU tools acceptable variant.
1005static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1006 return llvm::StringSwitch<llvm::StringRef>(ABI)
1007 .Case("o32", "32")
1008 .Case("n64", "64")
1009 .Default(ABI);
1010}
1011
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001012// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1013// and -mfloat-abi=.
1014static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001015 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001016 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001017 options::OPT_mhard_float,
1018 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001019 if (A->getOption().matches(options::OPT_msoft_float))
1020 FloatABI = "soft";
1021 else if (A->getOption().matches(options::OPT_mhard_float))
1022 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001023 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001025 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001026 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001027 FloatABI = "hard";
1028 }
1029 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001030 }
1031
1032 // If unspecified, choose the default based on the platform.
1033 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001034 // Assume "hard", because it's a default value used by gcc.
1035 // When we start to recognize specific target MIPS processors,
1036 // we will be able to select the default more correctly.
1037 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001038 }
1039
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001040 return FloatABI;
1041}
1042
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001043static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001044 std::vector<const char *> &Features,
1045 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001046 StringRef FeatureName) {
1047 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001048 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001049 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001050 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001051 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001052 }
1053}
1054
Daniel Sanders379d44b2014-07-16 11:52:23 +00001055static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1056 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001057 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001058 StringRef CPUName;
1059 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001060 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001061 ABIName = getGnuCompatibleMipsABIName(ABIName);
1062
Daniel Sandersfeb61302014-08-08 15:47:17 +00001063 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1064 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001065
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001066 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001067 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001068 // FIXME: Note, this is a hack. We need to pass the selected float
1069 // mode to the MipsTargetInfoBase to define appropriate macros there.
1070 // Now it is the only method.
1071 Features.push_back("+soft-float");
1072 }
1073
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001074 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001075 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001076 if (Val == "2008") {
1077 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1078 Features.push_back("+nan2008");
1079 else {
1080 Features.push_back("-nan2008");
1081 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1082 }
1083 } else if (Val == "legacy") {
1084 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1085 Features.push_back("-nan2008");
1086 else {
1087 Features.push_back("+nan2008");
1088 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1089 }
1090 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001091 D.Diag(diag::err_drv_unsupported_option_argument)
1092 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001093 }
1094
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001095 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1096 options::OPT_mdouble_float, "single-float");
1097 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1098 "mips16");
1099 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1100 options::OPT_mno_micromips, "micromips");
1101 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1102 "dsp");
1103 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1104 "dspr2");
1105 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1106 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001107
1108 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1109 // pass -mfpxx
1110 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1111 options::OPT_mfp64)) {
1112 if (A->getOption().matches(options::OPT_mfp32))
1113 Features.push_back(Args.MakeArgString("-fp64"));
1114 else if (A->getOption().matches(options::OPT_mfpxx)) {
1115 Features.push_back(Args.MakeArgString("+fpxx"));
1116 Features.push_back(Args.MakeArgString("+nooddspreg"));
1117 } else
1118 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001119 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001120 Features.push_back(Args.MakeArgString("+fpxx"));
1121 Features.push_back(Args.MakeArgString("+nooddspreg"));
1122 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001123
Daniel Sanders28e5d392014-07-10 10:39:51 +00001124 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1125 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001126}
1127
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001128void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001129 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001130 const Driver &D = getToolChain().getDriver();
1131 StringRef CPUName;
1132 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001133 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001134 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001135
1136 CmdArgs.push_back("-target-abi");
1137 CmdArgs.push_back(ABIName.data());
1138
1139 StringRef FloatABI = getMipsFloatABI(D, Args);
1140
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001141 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001142 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001143 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001144 CmdArgs.push_back("-mfloat-abi");
1145 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001146 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001147 else {
1148 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001149 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001150 CmdArgs.push_back("-mfloat-abi");
1151 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001152 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001153
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1155 if (A->getOption().matches(options::OPT_mxgot)) {
1156 CmdArgs.push_back("-mllvm");
1157 CmdArgs.push_back("-mxgot");
1158 }
1159 }
1160
Simon Atanasyanc580b322013-05-11 06:33:44 +00001161 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1162 options::OPT_mno_ldc1_sdc1)) {
1163 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1164 CmdArgs.push_back("-mllvm");
1165 CmdArgs.push_back("-mno-ldc1-sdc1");
1166 }
1167 }
1168
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001169 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1170 options::OPT_mno_check_zero_division)) {
1171 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1172 CmdArgs.push_back("-mllvm");
1173 CmdArgs.push_back("-mno-check-zero-division");
1174 }
1175 }
1176
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001177 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001178 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001179 CmdArgs.push_back("-mllvm");
1180 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1181 A->claim();
1182 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001183}
1184
Hal Finkel8eb59282012-06-11 22:35:19 +00001185/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1186static std::string getPPCTargetCPU(const ArgList &Args) {
1187 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001188 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001189
1190 if (CPUName == "native") {
1191 std::string CPU = llvm::sys::getHostCPUName();
1192 if (!CPU.empty() && CPU != "generic")
1193 return CPU;
1194 else
1195 return "";
1196 }
1197
1198 return llvm::StringSwitch<const char *>(CPUName)
1199 .Case("common", "generic")
1200 .Case("440", "440")
1201 .Case("440fp", "440")
1202 .Case("450", "450")
1203 .Case("601", "601")
1204 .Case("602", "602")
1205 .Case("603", "603")
1206 .Case("603e", "603e")
1207 .Case("603ev", "603ev")
1208 .Case("604", "604")
1209 .Case("604e", "604e")
1210 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001211 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001212 .Case("G3", "g3")
1213 .Case("7400", "7400")
1214 .Case("G4", "g4")
1215 .Case("7450", "7450")
1216 .Case("G4+", "g4+")
1217 .Case("750", "750")
1218 .Case("970", "970")
1219 .Case("G5", "g5")
1220 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001221 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001222 .Case("e500mc", "e500mc")
1223 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001224 .Case("power3", "pwr3")
1225 .Case("power4", "pwr4")
1226 .Case("power5", "pwr5")
1227 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001228 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001229 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001230 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001231 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001232 .Case("pwr3", "pwr3")
1233 .Case("pwr4", "pwr4")
1234 .Case("pwr5", "pwr5")
1235 .Case("pwr5x", "pwr5x")
1236 .Case("pwr6", "pwr6")
1237 .Case("pwr6x", "pwr6x")
1238 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001239 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001240 .Case("powerpc", "ppc")
1241 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001242 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001243 .Default("");
1244 }
1245
1246 return "";
1247}
1248
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249static void getPPCTargetFeatures(const ArgList &Args,
1250 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001251 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1252 StringRef Name = A->getOption().getName();
1253 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001254
1255 // Skip over "-m".
1256 assert(Name.startswith("m") && "Invalid feature name.");
1257 Name = Name.substr(1);
1258
1259 bool IsNegative = Name.startswith("no-");
1260 if (IsNegative)
1261 Name = Name.substr(3);
1262
1263 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1264 // pass the correct option to the backend while calling the frontend
1265 // option the same.
1266 // TODO: Change the LLVM backend option maybe?
1267 if (Name == "mfcrf")
1268 Name = "mfocrf";
1269
1270 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1271 }
1272
1273 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001274 AddTargetFeature(Args, Features, options::OPT_faltivec,
1275 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001276}
1277
Ulrich Weigand8afad612014-07-28 13:17:52 +00001278void Clang::AddPPCTargetArgs(const ArgList &Args,
1279 ArgStringList &CmdArgs) const {
1280 // Select the ABI to use.
1281 const char *ABIName = nullptr;
1282 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1283 ABIName = A->getValue();
1284 } else if (getToolChain().getTriple().isOSLinux())
1285 switch(getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001286 case llvm::Triple::ppc64: {
1287 // When targeting a processor that supports QPX, or if QPX is
1288 // specifically enabled, default to using the ABI that supports QPX (so
1289 // long as it is not specifically disabled).
1290 bool HasQPX = false;
1291 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1292 HasQPX = A->getValue() == StringRef("a2q");
1293 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1294 if (HasQPX) {
1295 ABIName = "elfv1-qpx";
1296 break;
1297 }
1298
Ulrich Weigand8afad612014-07-28 13:17:52 +00001299 ABIName = "elfv1";
1300 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001301 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001302 case llvm::Triple::ppc64le:
1303 ABIName = "elfv2";
1304 break;
1305 default:
1306 break;
1307 }
1308
1309 if (ABIName) {
1310 CmdArgs.push_back("-target-abi");
1311 CmdArgs.push_back(ABIName);
1312 }
1313}
1314
1315bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1316 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1317 return A && (A->getValue() == StringRef(Value));
1318}
1319
Tom Stellard6674c702013-04-01 20:56:53 +00001320/// Get the (LLVM) name of the R600 gpu we are targeting.
1321static std::string getR600TargetGPU(const ArgList &Args) {
1322 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001323 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001324 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001325 .Cases("rv630", "rv635", "r600")
1326 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001327 .Case("rv740", "rv770")
1328 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001329 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001330 .Case("hemlock", "cypress")
1331 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001332 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001333 }
1334 return "";
1335}
1336
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001337void Clang::AddSparcTargetArgs(const ArgList &Args,
1338 ArgStringList &CmdArgs) const {
1339 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001340 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001341
James Y Knightb2406522015-06-15 20:51:24 +00001342 bool SoftFloatABI = false;
1343 if (Arg *A =
1344 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001345 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001346 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001347 }
1348
James Y Knightb2406522015-06-15 20:51:24 +00001349 // Only the hard-float ABI on Sparc is standardized, and it is the
1350 // default. GCC also supports a nonstandard soft-float ABI mode, and
1351 // perhaps LLVM should implement that, too. However, since llvm
1352 // currently does not support Sparc soft-float, at all, display an
1353 // error if it's requested.
1354 if (SoftFloatABI) {
1355 D.Diag(diag::err_drv_unsupported_opt_for_target)
1356 << "-msoft-float" << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001357 }
1358}
1359
Richard Sandiford4652d892013-07-19 16:51:51 +00001360static const char *getSystemZTargetCPU(const ArgList &Args) {
1361 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1362 return A->getValue();
1363 return "z10";
1364}
1365
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001366static void getSystemZTargetFeatures(const ArgList &Args,
1367 std::vector<const char *> &Features) {
1368 // -m(no-)htm overrides use of the transactional-execution facility.
1369 if (Arg *A = Args.getLastArg(options::OPT_mhtm,
1370 options::OPT_mno_htm)) {
1371 if (A->getOption().matches(options::OPT_mhtm))
1372 Features.push_back("+transactional-execution");
1373 else
1374 Features.push_back("-transactional-execution");
1375 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001376 // -m(no-)vx overrides use of the vector facility.
1377 if (Arg *A = Args.getLastArg(options::OPT_mvx,
1378 options::OPT_mno_vx)) {
1379 if (A->getOption().matches(options::OPT_mvx))
1380 Features.push_back("+vector");
1381 else
1382 Features.push_back("-vector");
1383 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001384}
1385
Chandler Carruth953fb082013-01-13 11:46:33 +00001386static const char *getX86TargetCPU(const ArgList &Args,
1387 const llvm::Triple &Triple) {
1388 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001389 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001390 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001391 return "core-avx2";
1392
Chandler Carruth953fb082013-01-13 11:46:33 +00001393 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001394 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001395
1396 // FIXME: Reject attempts to use -march=native unless the target matches
1397 // the host.
1398 //
1399 // FIXME: We should also incorporate the detected target features for use
1400 // with -native.
1401 std::string CPU = llvm::sys::getHostCPUName();
1402 if (!CPU.empty() && CPU != "generic")
1403 return Args.MakeArgString(CPU);
1404 }
1405
1406 // Select the default CPU if none was given (or detection failed).
1407
1408 if (Triple.getArch() != llvm::Triple::x86_64 &&
1409 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001410 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001411
1412 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1413
1414 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001415 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001416 if (Triple.getArchName() == "x86_64h")
1417 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001418 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001419 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001420
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001421 // Set up default CPU name for PS4 compilers.
1422 if (Triple.isPS4CPU())
1423 return "btver2";
1424
Alexey Bataev286d1b92014-01-31 04:07:13 +00001425 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001426 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001427 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001428
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001429 // Everything else goes to x86-64 in 64-bit mode.
1430 if (Is64Bit)
1431 return "x86-64";
1432
1433 switch (Triple.getOS()) {
1434 case llvm::Triple::FreeBSD:
1435 case llvm::Triple::NetBSD:
1436 case llvm::Triple::OpenBSD:
1437 return "i486";
1438 case llvm::Triple::Haiku:
1439 return "i586";
1440 case llvm::Triple::Bitrig:
1441 return "i686";
1442 default:
1443 // Fallback to p4.
1444 return "pentium4";
1445 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001446}
1447
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001448static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1449 switch(T.getArch()) {
1450 default:
1451 return "";
1452
Amara Emerson703da2e2013-10-31 09:32:33 +00001453 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001454 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001455 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001456
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001457 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001458 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001459 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001460 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001461 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001462
1463 case llvm::Triple::mips:
1464 case llvm::Triple::mipsel:
1465 case llvm::Triple::mips64:
1466 case llvm::Triple::mips64el: {
1467 StringRef CPUName;
1468 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001469 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001470 return CPUName;
1471 }
1472
1473 case llvm::Triple::ppc:
1474 case llvm::Triple::ppc64:
1475 case llvm::Triple::ppc64le: {
1476 std::string TargetCPUName = getPPCTargetCPU(Args);
1477 // LLVM may default to generating code for the native CPU,
1478 // but, like gcc, we default to a more generic option for
1479 // each architecture. (except on Darwin)
1480 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1481 if (T.getArch() == llvm::Triple::ppc64)
1482 TargetCPUName = "ppc64";
1483 else if (T.getArch() == llvm::Triple::ppc64le)
1484 TargetCPUName = "ppc64le";
1485 else
1486 TargetCPUName = "ppc";
1487 }
1488 return TargetCPUName;
1489 }
1490
1491 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001492 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001493 case llvm::Triple::sparcv9:
1494 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001495 return A->getValue();
1496 return "";
1497
1498 case llvm::Triple::x86:
1499 case llvm::Triple::x86_64:
1500 return getX86TargetCPU(Args, T);
1501
1502 case llvm::Triple::hexagon:
1503 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1504
1505 case llvm::Triple::systemz:
1506 return getSystemZTargetCPU(Args);
1507
1508 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001509 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001510 return getR600TargetGPU(Args);
1511 }
1512}
1513
Alp Tokerce365ca2013-12-02 12:43:03 +00001514static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1515 ArgStringList &CmdArgs) {
1516 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1517 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1518 // forward.
1519 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001520 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001521 CmdArgs.push_back(Args.MakeArgString(Plugin));
1522
1523 // Try to pass driver level flags relevant to LTO code generation down to
1524 // the plugin.
1525
1526 // Handle flags for selecting CPU variants.
1527 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1528 if (!CPU.empty())
1529 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1530}
1531
Sanjay Patel2987c292015-06-11 14:53:41 +00001532/// This is a helper function for validating the optional refinement step
1533/// parameter in reciprocal argument strings. Return false if there is an error
1534/// parsing the refinement step. Otherwise, return true and set the Position
1535/// of the refinement step in the input string.
1536static bool getRefinementStep(const StringRef &In, const Driver &D,
1537 const Arg &A, size_t &Position) {
1538 const char RefinementStepToken = ':';
1539 Position = In.find(RefinementStepToken);
1540 if (Position != StringRef::npos) {
1541 StringRef Option = A.getOption().getName();
1542 StringRef RefStep = In.substr(Position + 1);
1543 // Allow exactly one numeric character for the additional refinement
1544 // step parameter. This is reasonable for all currently-supported
1545 // operations and architectures because we would expect that a larger value
1546 // of refinement steps would cause the estimate "optimization" to
1547 // under-perform the native operation. Also, if the estimate does not
1548 // converge quickly, it probably will not ever converge, so further
1549 // refinement steps will not produce a better answer.
1550 if (RefStep.size() != 1) {
1551 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1552 return false;
1553 }
1554 char RefStepChar = RefStep[0];
1555 if (RefStepChar < '0' || RefStepChar > '9') {
1556 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1557 return false;
1558 }
1559 }
1560 return true;
1561}
1562
1563/// The -mrecip flag requires processing of many optional parameters.
1564static void ParseMRecip(const Driver &D, const ArgList &Args,
1565 ArgStringList &OutStrings) {
1566 StringRef DisabledPrefixIn = "!";
1567 StringRef DisabledPrefixOut = "!";
1568 StringRef EnabledPrefixOut = "";
1569 StringRef Out = "-mrecip=";
1570
1571 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1572 if (!A)
1573 return;
1574
1575 unsigned NumOptions = A->getNumValues();
1576 if (NumOptions == 0) {
1577 // No option is the same as "all".
1578 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1579 return;
1580 }
1581
1582 // Pass through "all", "none", or "default" with an optional refinement step.
1583 if (NumOptions == 1) {
1584 StringRef Val = A->getValue(0);
1585 size_t RefStepLoc;
1586 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1587 return;
1588 StringRef ValBase = Val.slice(0, RefStepLoc);
1589 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1590 OutStrings.push_back(Args.MakeArgString(Out + Val));
1591 return;
1592 }
1593 }
1594
1595 // Each reciprocal type may be enabled or disabled individually.
1596 // Check each input value for validity, concatenate them all back together,
1597 // and pass through.
1598
1599 llvm::StringMap<bool> OptionStrings;
1600 OptionStrings.insert(std::make_pair("divd", false));
1601 OptionStrings.insert(std::make_pair("divf", false));
1602 OptionStrings.insert(std::make_pair("vec-divd", false));
1603 OptionStrings.insert(std::make_pair("vec-divf", false));
1604 OptionStrings.insert(std::make_pair("sqrtd", false));
1605 OptionStrings.insert(std::make_pair("sqrtf", false));
1606 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1607 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
1608
1609 for (unsigned i = 0; i != NumOptions; ++i) {
1610 StringRef Val = A->getValue(i);
1611
1612 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1613 // Ignore the disablement token for string matching.
1614 if (IsDisabled)
1615 Val = Val.substr(1);
1616
1617 size_t RefStep;
1618 if (!getRefinementStep(Val, D, *A, RefStep))
1619 return;
1620
1621 StringRef ValBase = Val.slice(0, RefStep);
1622 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1623 if (OptionIter == OptionStrings.end()) {
1624 // Try again specifying float suffix.
1625 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1626 if (OptionIter == OptionStrings.end()) {
1627 // The input name did not match any known option string.
1628 D.Diag(diag::err_drv_unknown_argument) << Val;
1629 return;
1630 }
1631 // The option was specified without a float or double suffix.
1632 // Make sure that the double entry was not already specified.
1633 // The float entry will be checked below.
1634 if (OptionStrings[ValBase.str() + 'd']) {
1635 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1636 return;
1637 }
1638 }
1639
1640 if (OptionIter->second == true) {
1641 // Duplicate option specified.
1642 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1643 return;
1644 }
1645
1646 // Mark the matched option as found. Do not allow duplicate specifiers.
1647 OptionIter->second = true;
1648
1649 // If the precision was not specified, also mark the double entry as found.
1650 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1651 OptionStrings[ValBase.str() + 'd'] = true;
1652
1653 // Build the output string.
1654 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1655 Out = Args.MakeArgString(Out + Prefix + Val);
1656 if (i != NumOptions - 1)
1657 Out = Args.MakeArgString(Out + ",");
1658 }
1659
1660 OutStrings.push_back(Args.MakeArgString(Out));
1661}
1662
Eric Christopherc54920a2015-03-23 19:26:05 +00001663static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001664 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001665 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001666 // If -march=native, autodetect the feature list.
1667 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1668 if (StringRef(A->getValue()) == "native") {
1669 llvm::StringMap<bool> HostFeatures;
1670 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1671 for (auto &F : HostFeatures)
1672 Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
1673 F.first()));
1674 }
1675 }
1676
Jim Grosbach82eee262013-11-16 00:53:35 +00001677 if (Triple.getArchName() == "x86_64h") {
1678 // x86_64h implies quite a few of the more modern subtarget features
1679 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1680 Features.push_back("-rdrnd");
1681 Features.push_back("-aes");
1682 Features.push_back("-pclmul");
1683 Features.push_back("-rtm");
1684 Features.push_back("-hle");
1685 Features.push_back("-fsgsbase");
1686 }
1687
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001688 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001689 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001690 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001691 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001692 Features.push_back("+sse4.2");
1693 Features.push_back("+popcnt");
1694 } else
1695 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001696 }
1697
Eric Christopherc54920a2015-03-23 19:26:05 +00001698 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001699 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1700 StringRef Arch = A->getValue();
1701 bool ArchUsed = false;
1702 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001703 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001704 if (Arch == "AVX" || Arch == "AVX2") {
1705 ArchUsed = true;
1706 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1707 }
1708 }
1709 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001710 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001711 if (Arch == "IA32") {
1712 ArchUsed = true;
1713 } else if (Arch == "SSE" || Arch == "SSE2") {
1714 ArchUsed = true;
1715 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1716 }
1717 }
1718 if (!ArchUsed)
1719 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1720 }
1721
Jim Grosbach82eee262013-11-16 00:53:35 +00001722 // Now add any that the user explicitly requested on the command line,
1723 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001724 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1725 StringRef Name = A->getOption().getName();
1726 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001727
1728 // Skip over "-m".
1729 assert(Name.startswith("m") && "Invalid feature name.");
1730 Name = Name.substr(1);
1731
1732 bool IsNegative = Name.startswith("no-");
1733 if (IsNegative)
1734 Name = Name.substr(3);
1735
1736 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1737 }
1738}
1739
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001740void Clang::AddX86TargetArgs(const ArgList &Args,
1741 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001742 if (!Args.hasFlag(options::OPT_mred_zone,
1743 options::OPT_mno_red_zone,
1744 true) ||
1745 Args.hasArg(options::OPT_mkernel) ||
1746 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001747 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001748
Bob Wilson2616e2e2013-02-10 16:01:41 +00001749 // Default to avoid implicit floating-point for kernel/kext code, but allow
1750 // that to be overridden with -mno-soft-float.
1751 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1752 Args.hasArg(options::OPT_fapple_kext));
1753 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1754 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001755 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001756 options::OPT_mno_implicit_float)) {
1757 const Option &O = A->getOption();
1758 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1759 O.matches(options::OPT_msoft_float));
1760 }
1761 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001762 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001763
1764 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1765 StringRef Value = A->getValue();
1766 if (Value == "intel" || Value == "att") {
1767 CmdArgs.push_back("-mllvm");
1768 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1769 } else {
1770 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1771 << A->getOption().getName() << Value;
1772 }
1773 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001774}
1775
Tony Linthicum76329bf2011-12-12 21:14:55 +00001776void Clang::AddHexagonTargetArgs(const ArgList &Args,
1777 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001778 CmdArgs.push_back("-mqdsp6-compat");
1779 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001780
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001781 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1782 std::string SmallDataThreshold="-hexagon-small-data-threshold=";
1783 SmallDataThreshold += v;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001784 CmdArgs.push_back ("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001785 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001786 }
1787
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001788 if (!Args.hasArg(options::OPT_fno_short_enums))
1789 CmdArgs.push_back("-fshort-enums");
1790 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1791 CmdArgs.push_back ("-mllvm");
1792 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1793 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001794 CmdArgs.push_back ("-mllvm");
1795 CmdArgs.push_back ("-machine-sink-split=0");
1796}
1797
Kevin Qin110db6f2014-07-18 07:03:22 +00001798// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001799static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001800 std::vector<const char *> &Features) {
1801 SmallVector<StringRef, 8> Split;
1802 text.split(Split, StringRef("+"), -1, false);
1803
1804 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1805 const char *result = llvm::StringSwitch<const char *>(Split[I])
1806 .Case("fp", "+fp-armv8")
1807 .Case("simd", "+neon")
1808 .Case("crc", "+crc")
1809 .Case("crypto", "+crypto")
1810 .Case("nofp", "-fp-armv8")
1811 .Case("nosimd", "-neon")
1812 .Case("nocrc", "-crc")
1813 .Case("nocrypto", "-crypto")
1814 .Default(nullptr);
1815 if (result)
1816 Features.push_back(result);
1817 else if (Split[I] == "neon" || Split[I] == "noneon")
1818 D.Diag(diag::err_drv_no_neon_modifier);
1819 else
1820 return false;
1821 }
1822 return true;
1823}
1824
1825// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1826// decode CPU and feature.
1827static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1828 std::vector<const char *> &Features) {
1829 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1830 CPU = Split.first;
Renato Golin84545d72015-02-04 13:31:56 +00001831 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001832 Features.push_back("+neon");
1833 Features.push_back("+crc");
1834 Features.push_back("+crypto");
1835 } else if (CPU == "generic") {
1836 Features.push_back("+neon");
1837 } else {
1838 return false;
1839 }
1840
1841 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1842 return false;
1843
1844 return true;
1845}
1846
1847static bool
1848getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1849 const ArgList &Args,
1850 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001851 std::string MarchLowerCase = March.lower();
1852 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001853
1854 if (Split.first == "armv8-a" ||
1855 Split.first == "armv8a") {
1856 // ok, no additional features.
1857 } else if (
1858 Split.first == "armv8.1-a" ||
1859 Split.first == "armv8.1a" ) {
1860 Features.push_back("+v8.1a");
1861 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001862 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001863 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001864
1865 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1866 return false;
1867
1868 return true;
1869}
1870
1871static bool
1872getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1873 const ArgList &Args,
1874 std::vector<const char *> &Features) {
1875 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001876 std::string McpuLowerCase = Mcpu.lower();
1877 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001878 return false;
1879
1880 return true;
1881}
1882
1883static bool
1884getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1885 const ArgList &Args,
1886 std::vector<const char *> &Features) {
1887 // Handle CPU name is 'native'.
1888 if (Mtune == "native")
1889 Mtune = llvm::sys::getHostCPUName();
1890 if (Mtune == "cyclone") {
1891 Features.push_back("+zcm");
1892 Features.push_back("+zcz");
1893 }
1894 return true;
1895}
1896
1897static bool
1898getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1899 const ArgList &Args,
1900 std::vector<const char *> &Features) {
1901 StringRef CPU;
1902 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001903 std::string McpuLowerCase = Mcpu.lower();
1904 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00001905 return false;
1906
1907 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1908}
1909
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001910static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1911 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001912 Arg *A;
1913 bool success = true;
1914 // Enable NEON by default.
1915 Features.push_back("+neon");
1916 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1917 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1918 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1919 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001920 else if (Args.hasArg(options::OPT_arch))
1921 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1922 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001923
1924 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1925 success =
1926 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1927 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1928 success =
1929 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001930 else if (Args.hasArg(options::OPT_arch))
1931 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1932 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001933
1934 if (!success)
1935 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001936
1937 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1938 Features.push_back("-fp-armv8");
1939 Features.push_back("-crypto");
1940 Features.push_back("-neon");
1941 }
Bradley Smith418c5932014-05-02 15:17:51 +00001942
1943 // En/disable crc
1944 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1945 options::OPT_mnocrc)) {
1946 if (A->getOption().matches(options::OPT_mcrc))
1947 Features.push_back("+crc");
1948 else
1949 Features.push_back("-crc");
1950 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001951}
1952
1953static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001954 const ArgList &Args, ArgStringList &CmdArgs,
1955 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001956 std::vector<const char *> Features;
1957 switch (Triple.getArch()) {
1958 default:
1959 break;
1960 case llvm::Triple::mips:
1961 case llvm::Triple::mipsel:
1962 case llvm::Triple::mips64:
1963 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001964 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001965 break;
1966
1967 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001968 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001969 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001970 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001971 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001972 break;
1973
1974 case llvm::Triple::ppc:
1975 case llvm::Triple::ppc64:
1976 case llvm::Triple::ppc64le:
1977 getPPCTargetFeatures(Args, Features);
1978 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001979 case llvm::Triple::systemz:
1980 getSystemZTargetFeatures(Args, Features);
1981 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001982 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001983 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001984 getAArch64TargetFeatures(D, Args, Features);
1985 break;
1986 case llvm::Triple::x86:
1987 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001988 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001989 break;
1990 }
Rafael Espindola43964802013-08-21 17:34:32 +00001991
1992 // Find the last of each feature.
1993 llvm::StringMap<unsigned> LastOpt;
1994 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1995 const char *Name = Features[I];
1996 assert(Name[0] == '-' || Name[0] == '+');
1997 LastOpt[Name + 1] = I;
1998 }
1999
2000 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2001 // If this feature was overridden, ignore it.
2002 const char *Name = Features[I];
2003 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2004 assert(LastI != LastOpt.end());
2005 unsigned Last = LastI->second;
2006 if (Last != I)
2007 continue;
2008
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002009 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002010 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002011 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002012}
2013
David Majnemerae394812014-12-09 00:12:30 +00002014static bool
2015shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2016 const llvm::Triple &Triple) {
2017 // We use the zero-cost exception tables for Objective-C if the non-fragile
2018 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2019 // later.
2020 if (runtime.isNonFragile())
2021 return true;
2022
2023 if (!Triple.isMacOSX())
2024 return false;
2025
2026 return (!Triple.isMacOSXVersionLT(10,5) &&
2027 (Triple.getArch() == llvm::Triple::x86_64 ||
2028 Triple.getArch() == llvm::Triple::arm));
2029}
2030
Nico Webere8e53112014-05-11 01:04:02 +00002031// exceptionSettings() exists to share the logic between -cc1 and linker
2032// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002033static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002034 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002035 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002036 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002037 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002038
David Majnemer8de68642014-12-05 08:11:58 +00002039 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002040}
2041
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002042/// Adds exception related arguments to the driver command arguments. There's a
2043/// master flag, -fexceptions and also language specific flags to enable/disable
2044/// C++ and Objective-C exceptions. This makes it possible to for example
2045/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002046static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002047 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002048 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002049 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002050 const Driver &D = TC.getDriver();
2051 const llvm::Triple &Triple = TC.getTriple();
2052
Chad Rosier4fab82c2012-03-26 22:04:46 +00002053 if (KernelOrKext) {
2054 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2055 // arguments now to avoid warnings about unused arguments.
2056 Args.ClaimAllArgs(options::OPT_fexceptions);
2057 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2058 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2059 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2060 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2061 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002062 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002063 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002064
David Majnemer8de68642014-12-05 08:11:58 +00002065 // Gather the exception settings from the command line arguments.
2066 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002067
David Majnemerae394812014-12-09 00:12:30 +00002068 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2069 // is not necessarily sensible, but follows GCC.
2070 if (types::isObjC(InputType) &&
2071 Args.hasFlag(options::OPT_fobjc_exceptions,
2072 options::OPT_fno_objc_exceptions,
2073 true)) {
2074 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002075
David Majnemerae394812014-12-09 00:12:30 +00002076 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002077 }
2078
2079 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002080 bool CXXExceptionsEnabled =
2081 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002082 Arg *ExceptionArg = Args.getLastArg(
2083 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2084 options::OPT_fexceptions, options::OPT_fno_exceptions);
2085 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002086 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002087 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2088 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002089
2090 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002091 if (Triple.isPS4CPU()) {
2092 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2093 assert(ExceptionArg &&
2094 "On the PS4 exceptions should only be enabled if passing "
2095 "an argument");
2096 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2097 const Arg *RTTIArg = TC.getRTTIArg();
2098 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2099 D.Diag(diag::err_drv_argument_not_allowed_with)
2100 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2101 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2102 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2103 } else
2104 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2105
Anders Carlssone96ab552011-02-28 02:27:16 +00002106 CmdArgs.push_back("-fcxx-exceptions");
2107
David Majnemer8de68642014-12-05 08:11:58 +00002108 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002109 }
2110 }
2111
David Majnemer8de68642014-12-05 08:11:58 +00002112 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002113 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002114}
2115
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002116static bool ShouldDisableAutolink(const ArgList &Args,
2117 const ToolChain &TC) {
2118 bool Default = true;
2119 if (TC.getTriple().isOSDarwin()) {
2120 // The native darwin assembler doesn't support the linker_option directives,
2121 // so we disable them if we think the .s file will be passed to it.
2122 Default = TC.useIntegratedAs();
2123 }
2124 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2125 Default);
2126}
2127
Ted Kremenek62093662013-03-12 17:02:12 +00002128static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2129 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002130 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2131 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002132 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002133 return !UseDwarfDirectory;
2134}
2135
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002136/// \brief Check whether the given input tree contains any compilation actions.
2137static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002138 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002139 return true;
2140
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002141 for (const auto &Act : *A)
2142 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002143 return true;
2144
2145 return false;
2146}
2147
2148/// \brief Check if -relax-all should be passed to the internal assembler.
2149/// This is done by default when compiling non-assembler source with -O0.
2150static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2151 bool RelaxDefault = true;
2152
2153 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2154 RelaxDefault = A->getOption().matches(options::OPT_O0);
2155
2156 if (RelaxDefault) {
2157 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002158 for (const auto &Act : C.getActions()) {
2159 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002160 RelaxDefault = true;
2161 break;
2162 }
2163 }
2164 }
2165
2166 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2167 RelaxDefault);
2168}
2169
David Blaikie9260ed62013-07-25 21:19:01 +00002170static void CollectArgsForIntegratedAssembler(Compilation &C,
2171 const ArgList &Args,
2172 ArgStringList &CmdArgs,
2173 const Driver &D) {
2174 if (UseRelaxAll(C, Args))
2175 CmdArgs.push_back("-mrelax-all");
2176
David Peixottodfb66142013-11-14 22:52:58 +00002177 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002178 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002179 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2180 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2181 // arg after parsing the '-I' arg.
2182 bool TakeNextArg = false;
2183
David Blaikie9260ed62013-07-25 21:19:01 +00002184 // When using an integrated assembler, translate -Wa, and -Xassembler
2185 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002186 bool CompressDebugSections = false;
Sean Silva14facf32015-06-09 01:57:17 +00002187 for (const Arg *A :
2188 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
David Blaikie9260ed62013-07-25 21:19:01 +00002189 A->claim();
2190
2191 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2192 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002193 if (TakeNextArg) {
2194 CmdArgs.push_back(Value.data());
2195 TakeNextArg = false;
2196 continue;
2197 }
David Blaikie9260ed62013-07-25 21:19:01 +00002198
2199 if (Value == "-force_cpusubtype_ALL") {
2200 // Do nothing, this is the default and we don't support anything else.
2201 } else if (Value == "-L") {
2202 CmdArgs.push_back("-msave-temp-labels");
2203 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002204 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002205 } else if (Value == "--noexecstack") {
2206 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002207 } else if (Value == "-compress-debug-sections" ||
2208 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002209 CompressDebugSections = true;
2210 } else if (Value == "-nocompress-debug-sections" ||
2211 Value == "--nocompress-debug-sections") {
2212 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002213 } else if (Value.startswith("-I")) {
2214 CmdArgs.push_back(Value.data());
2215 // We need to consume the next argument if the current arg is a plain
2216 // -I. The next arg will be the include directory.
2217 if (Value == "-I")
2218 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002219 } else if (Value.startswith("-gdwarf-")) {
2220 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002221 } else {
2222 D.Diag(diag::err_drv_unsupported_option_argument)
2223 << A->getOption().getName() << Value;
2224 }
2225 }
2226 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002227 if (CompressDebugSections) {
2228 if (llvm::zlib::isAvailable())
2229 CmdArgs.push_back("-compress-debug-sections");
2230 else
2231 D.Diag(diag::warn_debug_compression_unavailable);
2232 }
David Blaikie9260ed62013-07-25 21:19:01 +00002233}
2234
Renato Goline807c122014-01-31 11:47:28 +00002235// Until ARM libraries are build separately, we have them all in one library
2236static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002237 // FIXME: handle 64-bit
2238 if (TC.getTriple().isOSWindows() &&
2239 !TC.getTriple().isWindowsItaniumEnvironment())
2240 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002241 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002242 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002243 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002244}
2245
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002246static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2247 // The runtimes are located in the OS-specific resource directory.
2248 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002249 const llvm::Triple &Triple = TC.getTriple();
2250 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002251 StringRef OSLibName =
2252 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002253 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002254 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002255}
2256
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002257static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002258 bool Shared = false) {
2259 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2260 ? "-android"
2261 : "";
2262
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002263 bool IsOSWindows = TC.getTriple().isOSWindows();
2264 StringRef Arch = getArchNameForCompilerRTLib(TC);
2265 const char *Prefix = IsOSWindows ? "" : "lib";
2266 const char *Suffix =
2267 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2268
2269 SmallString<128> Path = getCompilerRTLibDir(TC);
2270 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2271 Arch + Env + Suffix);
2272
2273 return Path;
2274}
2275
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002276// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002277// FIXME: Make sure we can also emit shared objects if they're requested
2278// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002279static void addClangRT(const ToolChain &TC, const ArgList &Args,
2280 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002281 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002282
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002283 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002284 // FIXME: why do we link against gcc when we are using compiler-rt?
2285 CmdArgs.push_back("-lgcc_s");
2286 if (TC.getDriver().CCCIsCXX())
2287 CmdArgs.push_back("-lgcc_eh");
2288 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002289}
2290
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002291static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2292 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002293 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2294 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002295 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002296 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002297 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002298 Args.hasArg(options::OPT_fcreate_profile) ||
2299 Args.hasArg(options::OPT_coverage)))
2300 return;
2301
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002302 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002303}
2304
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002305namespace {
2306enum OpenMPRuntimeKind {
2307 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2308 /// without knowing what runtime to target.
2309 OMPRT_Unknown,
2310
2311 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2312 /// the default for Clang.
2313 OMPRT_OMP,
2314
2315 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2316 /// this runtime but can swallow the pragmas, and find and link against the
2317 /// runtime library itself.
2318 OMPRT_GOMP,
2319
Chandler Carruthc6625c62015-05-28 21:10:31 +00002320 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002321 /// OpenMP runtime. We support this mode for users with existing dependencies
2322 /// on this runtime library name.
2323 OMPRT_IOMP5
2324};
Alexander Kornienko3d9d9292015-06-22 09:47:44 +00002325} // namespace
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002326
2327/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002328static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2329 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002330 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2331
2332 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2333 if (A)
2334 RuntimeName = A->getValue();
2335
2336 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
2337 .Case("libomp", OMPRT_OMP)
2338 .Case("libgomp", OMPRT_GOMP)
2339 .Case("libiomp5", OMPRT_IOMP5)
2340 .Default(OMPRT_Unknown);
2341
2342 if (RT == OMPRT_Unknown) {
2343 if (A)
2344 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
2345 << A->getOption().getName() << A->getValue();
2346 else
2347 // FIXME: We could use a nicer diagnostic here.
2348 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2349 }
2350
2351 return RT;
2352}
2353
Alexey Samsonov52550342014-09-15 19:58:40 +00002354static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2355 ArgStringList &CmdArgs, StringRef Sanitizer,
2356 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002357 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002358 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002359 if (!IsShared)
2360 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002361 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002362 if (!IsShared)
2363 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002364}
2365
Alexey Samsonov52550342014-09-15 19:58:40 +00002366// Tries to use a file with the list of dynamic symbols that need to be exported
2367// from the runtime library. Returns true if the file was found.
2368static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2369 ArgStringList &CmdArgs,
2370 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002371 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2372 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2373 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002374 return true;
2375 }
2376 return false;
2377}
2378
2379static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2380 ArgStringList &CmdArgs) {
2381 // Force linking against the system libraries sanitizers depends on
2382 // (see PR15823 why this is necessary).
2383 CmdArgs.push_back("--no-as-needed");
2384 CmdArgs.push_back("-lpthread");
2385 CmdArgs.push_back("-lrt");
2386 CmdArgs.push_back("-lm");
2387 // There's no libdl on FreeBSD.
2388 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2389 CmdArgs.push_back("-ldl");
2390}
2391
2392static void
2393collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2394 SmallVectorImpl<StringRef> &SharedRuntimes,
2395 SmallVectorImpl<StringRef> &StaticRuntimes,
2396 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2397 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2398 // Collect shared runtimes.
2399 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2400 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002401 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002402
Alexey Samsonov52550342014-09-15 19:58:40 +00002403 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002404 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002405 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2406 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002407 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002408 }
2409 if (SanArgs.needsAsanRt()) {
2410 if (SanArgs.needsSharedAsanRt()) {
2411 HelperStaticRuntimes.push_back("asan-preinit");
2412 } else {
2413 StaticRuntimes.push_back("asan");
2414 if (SanArgs.linkCXXRuntimes())
2415 StaticRuntimes.push_back("asan_cxx");
2416 }
2417 }
2418 if (SanArgs.needsDfsanRt())
2419 StaticRuntimes.push_back("dfsan");
2420 if (SanArgs.needsLsanRt())
2421 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002422 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002423 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002424 if (SanArgs.linkCXXRuntimes())
2425 StaticRuntimes.push_back("msan_cxx");
2426 }
2427 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002428 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002429 if (SanArgs.linkCXXRuntimes())
2430 StaticRuntimes.push_back("tsan_cxx");
2431 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002432 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002433 StaticRuntimes.push_back("ubsan_standalone");
2434 if (SanArgs.linkCXXRuntimes())
2435 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002436 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002437 if (SanArgs.needsSafeStackRt())
2438 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002439}
2440
Alexey Samsonov52550342014-09-15 19:58:40 +00002441// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2442// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2443static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002444 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002445 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2446 HelperStaticRuntimes;
2447 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2448 HelperStaticRuntimes);
2449 for (auto RT : SharedRuntimes)
2450 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2451 for (auto RT : HelperStaticRuntimes)
2452 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2453 bool AddExportDynamic = false;
2454 for (auto RT : StaticRuntimes) {
2455 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2456 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2457 }
2458 // If there is a static runtime with no dynamic list, force all the symbols
2459 // to be dynamic to be sure we export sanitizer interface functions.
2460 if (AddExportDynamic)
2461 CmdArgs.push_back("-export-dynamic");
2462 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002463}
2464
Reid Kleckner86ea7702015-02-04 23:45:07 +00002465static bool areOptimizationsEnabled(const ArgList &Args) {
2466 // Find the last -O arg and see if it is non-zero.
2467 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2468 return !A->getOption().matches(options::OPT_O0);
2469 // Defaults to -O0.
2470 return false;
2471}
2472
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002473static bool shouldUseFramePointerForTarget(const ArgList &Args,
2474 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002475 // XCore never wants frame pointers, regardless of OS.
2476 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002477 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002478 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002479
2480 if (Triple.isOSLinux()) {
2481 switch (Triple.getArch()) {
2482 // Don't use a frame pointer on linux if optimizing for certain targets.
2483 case llvm::Triple::mips64:
2484 case llvm::Triple::mips64el:
2485 case llvm::Triple::mips:
2486 case llvm::Triple::mipsel:
2487 case llvm::Triple::systemz:
2488 case llvm::Triple::x86:
2489 case llvm::Triple::x86_64:
2490 return !areOptimizationsEnabled(Args);
2491 default:
2492 return true;
2493 }
2494 }
2495
2496 if (Triple.isOSWindows()) {
2497 switch (Triple.getArch()) {
2498 case llvm::Triple::x86:
2499 return !areOptimizationsEnabled(Args);
2500 default:
2501 // All other supported Windows ISAs use xdata unwind information, so frame
2502 // pointers are not generally useful.
2503 return false;
2504 }
2505 }
2506
2507 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002508}
2509
Rafael Espindola224dd632011-12-14 21:02:23 +00002510static bool shouldUseFramePointer(const ArgList &Args,
2511 const llvm::Triple &Triple) {
2512 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2513 options::OPT_fomit_frame_pointer))
2514 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2515
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002516 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002517}
2518
Eric Christopherb7d97e92013-04-03 01:58:53 +00002519static bool shouldUseLeafFramePointer(const ArgList &Args,
2520 const llvm::Triple &Triple) {
2521 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2522 options::OPT_momit_leaf_frame_pointer))
2523 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2524
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002525 if (Triple.isPS4CPU())
2526 return false;
2527
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002528 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002529}
2530
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002531/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002532static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002533 SmallString<128> cwd;
2534 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002535 CmdArgs.push_back("-fdebug-compilation-dir");
2536 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002537 }
2538}
2539
Eric Christopherd3804002013-02-22 20:12:52 +00002540static const char *SplitDebugName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00002541 const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002542 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2543 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2544 SmallString<128> T(FinalOutput->getValue());
2545 llvm::sys::path::replace_extension(T, "dwo");
2546 return Args.MakeArgString(T);
2547 } else {
2548 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002549 SmallString<128> T(
2550 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002551 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002552 llvm::sys::path::replace_extension(F, "dwo");
2553 T += F;
2554 return Args.MakeArgString(F);
2555 }
2556}
2557
2558static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2559 const Tool &T, const JobAction &JA,
2560 const ArgList &Args, const InputInfo &Output,
2561 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002562 ArgStringList ExtractArgs;
2563 ExtractArgs.push_back("--extract-dwo");
2564
2565 ArgStringList StripArgs;
2566 StripArgs.push_back("--strip-dwo");
2567
2568 // Grabbing the output of the earlier compile step.
2569 StripArgs.push_back(Output.getFilename());
2570 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002571 ExtractArgs.push_back(OutFile);
2572
2573 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002574 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002575
2576 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002577 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002578
2579 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002580 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002581}
2582
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002583/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002584/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2585static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002586 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002587 if (A->getOption().matches(options::OPT_O4) ||
2588 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002589 return true;
2590
2591 if (A->getOption().matches(options::OPT_O0))
2592 return false;
2593
2594 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2595
Rafael Espindola91780de2013-08-26 14:05:41 +00002596 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002597 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002598 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002599 return true;
2600
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002601 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002602 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002603 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002604
2605 unsigned OptLevel = 0;
2606 if (S.getAsInteger(10, OptLevel))
2607 return false;
2608
2609 return OptLevel > 1;
2610 }
2611
2612 return false;
2613}
2614
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002615/// Add -x lang to \p CmdArgs for \p Input.
2616static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2617 ArgStringList &CmdArgs) {
2618 // When using -verify-pch, we don't want to provide the type
2619 // 'precompiled-header' if it was inferred from the file extension
2620 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2621 return;
2622
2623 CmdArgs.push_back("-x");
2624 if (Args.hasArg(options::OPT_rewrite_objc))
2625 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2626 else
2627 CmdArgs.push_back(types::getTypeName(Input.getType()));
2628}
2629
David Majnemerc371ff02015-03-22 08:39:22 +00002630static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002631 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002632 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002633
2634 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002635 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002636
2637 unsigned Build = 0, Factor = 1;
2638 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2639 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002640 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002641}
2642
Rafael Espindola577637a2015-01-03 00:06:04 +00002643// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002644// options that build systems might add but are unused when assembling or only
2645// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002646static void claimNoWarnArgs(const ArgList &Args) {
2647 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002648 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002649 Args.ClaimAllArgs(options::OPT_flto);
2650 Args.ClaimAllArgs(options::OPT_fno_lto);
2651}
2652
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002653static void appendUserToPath(SmallVectorImpl<char> &Result) {
2654#ifdef LLVM_ON_UNIX
2655 const char *Username = getenv("LOGNAME");
2656#else
2657 const char *Username = getenv("USERNAME");
2658#endif
2659 if (Username) {
2660 // Validate that LoginName can be used in a path, and get its length.
2661 size_t Len = 0;
2662 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002663 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002664 Username = nullptr;
2665 break;
2666 }
2667 }
2668
2669 if (Username && Len > 0) {
2670 Result.append(Username, Username + Len);
2671 return;
2672 }
2673 }
2674
2675 // Fallback to user id.
2676#ifdef LLVM_ON_UNIX
2677 std::string UID = llvm::utostr(getuid());
2678#else
2679 // FIXME: Windows seems to have an 'SID' that might work.
2680 std::string UID = "9999";
2681#endif
2682 Result.append(UID.begin(), UID.end());
2683}
2684
David Majnemere11d3732015-06-08 00:22:46 +00002685VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2686 const llvm::Triple &Triple,
2687 const llvm::opt::ArgList &Args,
2688 bool IsWindowsMSVC) {
2689 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2690 IsWindowsMSVC) ||
2691 Args.hasArg(options::OPT_fmsc_version) ||
2692 Args.hasArg(options::OPT_fms_compatibility_version)) {
2693 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2694 const Arg *MSCompatibilityVersion =
2695 Args.getLastArg(options::OPT_fms_compatibility_version);
2696
2697 if (MSCVersion && MSCompatibilityVersion) {
2698 if (D)
2699 D->Diag(diag::err_drv_argument_not_allowed_with)
2700 << MSCVersion->getAsString(Args)
2701 << MSCompatibilityVersion->getAsString(Args);
2702 return VersionTuple();
2703 }
2704
2705 if (MSCompatibilityVersion) {
2706 VersionTuple MSVT;
2707 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2708 D->Diag(diag::err_drv_invalid_value)
2709 << MSCompatibilityVersion->getAsString(Args)
2710 << MSCompatibilityVersion->getValue();
2711 return MSVT;
2712 }
2713
2714 if (MSCVersion) {
2715 unsigned Version = 0;
2716 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2717 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2718 << MSCVersion->getValue();
2719 return getMSCompatibilityVersion(Version);
2720 }
2721
2722 unsigned Major, Minor, Micro;
2723 Triple.getEnvironmentVersion(Major, Minor, Micro);
2724 if (Major || Minor || Micro)
2725 return VersionTuple(Major, Minor, Micro);
2726
2727 return VersionTuple(18);
2728 }
2729 return VersionTuple();
2730}
2731
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002732void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002733 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002734 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002735 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002736 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002737 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2738 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002739 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002740 ArgStringList CmdArgs;
2741
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002742 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002743 bool IsWindowsCygnus =
2744 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002745 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2746
Daniel Dunbare521a892009-03-31 20:53:55 +00002747 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002748 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002749
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002750 // Invoke ourselves in -cc1 mode.
2751 //
2752 // FIXME: Implement custom jobs for internal actions.
2753 CmdArgs.push_back("-cc1");
2754
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002755 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002756 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002757 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002758 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002759
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002760 const llvm::Triple TT(TripleStr);
2761 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2762 TT.getArch() == llvm::Triple::thumb)) {
2763 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2764 unsigned Version;
2765 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2766 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002767 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2768 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002769 }
2770
Tim Northover336f1892014-03-29 13:16:12 +00002771 // Push all default warning arguments that are specific to
2772 // the given target. These come before user provided warning options
2773 // are provided.
2774 getToolChain().addClangWarningOptions(CmdArgs);
2775
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002776 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002777 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002778
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002779 if (isa<AnalyzeJobAction>(JA)) {
2780 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2781 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002782 } else if (isa<MigrateJobAction>(JA)) {
2783 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002784 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002785 if (Output.getType() == types::TY_Dependencies)
2786 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002787 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002788 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002789 if (Args.hasArg(options::OPT_rewrite_objc) &&
2790 !Args.hasArg(options::OPT_g_Group))
2791 CmdArgs.push_back("-P");
2792 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002793 } else if (isa<AssembleJobAction>(JA)) {
2794 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002795
David Blaikie9260ed62013-07-25 21:19:01 +00002796 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002797
2798 // Also ignore explicit -force_cpusubtype_ALL option.
2799 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002800 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002801 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002802 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002803
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002804 if (JA.getType() == types::TY_Nothing)
2805 CmdArgs.push_back("-fsyntax-only");
2806 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002807 CmdArgs.push_back("-emit-pch");
2808 else
2809 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002810 } else if (isa<VerifyPCHJobAction>(JA)) {
2811 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002813 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2814 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002815
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002816 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002817 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002818 } else if (JA.getType() == types::TY_LLVM_IR ||
2819 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002820 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002821 } else if (JA.getType() == types::TY_LLVM_BC ||
2822 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823 CmdArgs.push_back("-emit-llvm-bc");
2824 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002825 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002826 } else if (JA.getType() == types::TY_AST) {
2827 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002828 } else if (JA.getType() == types::TY_ModuleFile) {
2829 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002830 } else if (JA.getType() == types::TY_RewrittenObjC) {
2831 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002832 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002833 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2834 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002835 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002836 } else {
2837 assert(JA.getType() == types::TY_PP_Asm &&
2838 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002839 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002840
2841 // Preserve use-list order by default when emitting bitcode, so that
2842 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2843 // same result as running passes here. For LTO, we don't need to preserve
2844 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002845 if (JA.getType() == types::TY_LLVM_BC)
2846 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002847 }
2848
Justin Bognera88f0122014-06-20 22:59:50 +00002849 // We normally speed up the clang process a bit by skipping destructors at
2850 // exit, but when we're generating diagnostics we can rely on some of the
2851 // cleanup.
2852 if (!C.isForDiagnostics())
2853 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002854
John McCallbb79b5f2010-02-13 03:50:24 +00002855 // Disable the verification pass in -asserts builds.
2856#ifdef NDEBUG
2857 CmdArgs.push_back("-disable-llvm-verifier");
2858#endif
2859
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002860 // Set the main file name, so that debug info works even with
2861 // -save-temps.
2862 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002863 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002864
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002865 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002866 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002867 if (Args.hasArg(options::OPT_static))
2868 CmdArgs.push_back("-static-define");
2869
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002870 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002871 // Enable region store model by default.
2872 CmdArgs.push_back("-analyzer-store=region");
2873
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002874 // Treat blocks as analysis entry points.
2875 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2876
Ted Kremenek49c79792011-03-24 00:28:47 +00002877 CmdArgs.push_back("-analyzer-eagerly-assume");
2878
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002879 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002880 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002881 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002882
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002883 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002884 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002885
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002886 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002887 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002888
2889 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002890
Artem Belevichba558952015-05-06 18:20:23 +00002891 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002892 CmdArgs.push_back("-analyzer-checker=cplusplus");
2893
Nico Webere8e53112014-05-11 01:04:02 +00002894 // Enable the following experimental checkers for testing.
2895 CmdArgs.push_back(
2896 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002897 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2898 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2899 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2900 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2901 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002902 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002903
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002904 // Set the output format. The default is plist, for (lame) historical
2905 // reasons.
2906 CmdArgs.push_back("-analyzer-output");
2907 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002908 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002909 else
2910 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002911
Ted Kremenekfe449a22010-03-22 22:32:05 +00002912 // Disable the presentation of standard compiler warnings when
2913 // using --analyze. We only want to show static analyzer diagnostics
2914 // or frontend errors.
2915 CmdArgs.push_back("-w");
2916
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002917 // Add -Xanalyzer arguments when running as analyzer.
2918 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002919 }
2920
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002921 CheckCodeGenerationOptions(D, Args);
2922
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002923 bool PIE = getToolChain().isPIEDefault();
2924 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002925 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002926
Alexey Bataev40e75222014-01-28 06:30:35 +00002927 // Android-specific defaults for PIC/PIE
2928 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002929 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00002930 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002931 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002932 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002933 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002934 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002935 case llvm::Triple::mips:
2936 case llvm::Triple::mipsel:
2937 case llvm::Triple::mips64:
2938 case llvm::Triple::mips64el:
2939 PIC = true; // "-fpic"
2940 break;
2941
2942 case llvm::Triple::x86:
2943 case llvm::Triple::x86_64:
2944 PIC = true; // "-fPIC"
2945 IsPICLevelTwo = true;
2946 break;
2947
2948 default:
2949 break;
2950 }
2951 }
2952
Brad Smith5b05db82014-06-24 19:51:29 +00002953 // OpenBSD-specific defaults for PIE
2954 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002955 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00002956 case llvm::Triple::mips64:
2957 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002958 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002959 case llvm::Triple::x86:
2960 case llvm::Triple::x86_64:
2961 IsPICLevelTwo = false; // "-fpie"
2962 break;
2963
2964 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00002965 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00002966 case llvm::Triple::sparcv9:
2967 IsPICLevelTwo = true; // "-fPIE"
2968 break;
2969
2970 default:
2971 break;
2972 }
2973 }
2974
Alexey Samsonov090301e2013-04-09 12:28:19 +00002975 // For the PIC and PIE flag options, this logic is different from the
2976 // legacy logic in very old versions of GCC, as that logic was just
2977 // a bug no one had ever fixed. This logic is both more rational and
2978 // consistent with GCC's new logic now that the bugs are fixed. The last
2979 // argument relating to either PIC or PIE wins, and no other argument is
2980 // used. If the last argument is any flavor of the '-fno-...' arguments,
2981 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2982 // at the same level.
2983 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2984 options::OPT_fpic, options::OPT_fno_pic,
2985 options::OPT_fPIE, options::OPT_fno_PIE,
2986 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002987 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2988 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002989 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002990 if (LastPICArg) {
2991 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002992 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2993 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2994 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2995 PIC = PIE || O.matches(options::OPT_fPIC) ||
2996 O.matches(options::OPT_fpic);
2997 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2998 O.matches(options::OPT_fPIC);
2999 } else {
3000 PIE = PIC = false;
3001 }
3002 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003003 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00003004
Nick Lewycky609dd662013-10-11 03:33:53 +00003005 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003006 // specified while enabling PIC enabled level 1 PIC, just force it back to
3007 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3008 // informal testing).
3009 if (PIC && getToolChain().getTriple().isOSDarwin())
3010 IsPICLevelTwo |= getToolChain().isPICDefault();
3011
Chandler Carruthc0c04552012-04-08 16:40:35 +00003012 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3013 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003014 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003015 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003016 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003017 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003018 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003019
Chandler Carruth76a943b2012-11-19 03:52:03 +00003020 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3021 // This is a very special mode. It trumps the other modes, almost no one
3022 // uses it, and it isn't even valid on any OS but Darwin.
3023 if (!getToolChain().getTriple().isOSDarwin())
3024 D.Diag(diag::err_drv_unsupported_opt_for_target)
3025 << A->getSpelling() << getToolChain().getTriple().str();
3026
3027 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3028
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003029 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003030 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003031
Chandler Carruth76a943b2012-11-19 03:52:03 +00003032 // Only a forced PIC mode can cause the actual compile to have PIC defines
3033 // etc., no flags are sufficient. This behavior was selected to closely
3034 // match that of llvm-gcc and Apple GCC before that.
3035 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3036 CmdArgs.push_back("-pic-level");
3037 CmdArgs.push_back("2");
3038 }
3039 } else {
3040 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3041 // handled in Clang's IRGen by the -pie-level flag.
3042 CmdArgs.push_back("-mrelocation-model");
3043 CmdArgs.push_back(PIC ? "pic" : "static");
3044
3045 if (PIC) {
3046 CmdArgs.push_back("-pic-level");
3047 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3048 if (PIE) {
3049 CmdArgs.push_back("-pie-level");
3050 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3051 }
3052 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003053 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003054
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003055 CmdArgs.push_back("-mthread-model");
3056 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3057 CmdArgs.push_back(A->getValue());
3058 else
3059 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3060
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003061 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3062
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003063 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3064 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003065 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003066
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003067 // LLVM Code Generator Options.
3068
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003069 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3070 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003071 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3072 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003073 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003074 CmdArgs.push_back(A->getValue());
3075 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003076 }
3077 }
3078
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003079 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3080 StringRef v = A->getValue();
3081 CmdArgs.push_back("-mllvm");
3082 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3083 A->claim();
3084 }
3085
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003086 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3087 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003088 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003089 }
3090
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003091 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3092 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003093 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003094 D.Diag(diag::err_drv_unsupported_opt_for_target)
3095 << A->getSpelling() << getToolChain().getTriple().str();
3096 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3097 CmdArgs.push_back("-fpcc-struct-return");
3098 } else {
3099 assert(A->getOption().matches(options::OPT_freg_struct_return));
3100 CmdArgs.push_back("-freg-struct-return");
3101 }
3102 }
3103
Roman Divacky65b88cd2011-03-01 17:40:53 +00003104 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3105 CmdArgs.push_back("-mrtd");
3106
Rafael Espindola224dd632011-12-14 21:02:23 +00003107 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003108 CmdArgs.push_back("-mdisable-fp-elim");
3109 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3110 options::OPT_fno_zero_initialized_in_bss))
3111 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003112
3113 bool OFastEnabled = isOptimizationLevelFast(Args);
3114 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3115 // enabled. This alias option is being used to simplify the hasFlag logic.
3116 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
3117 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003118 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3119 // doesn't do any TBAA.
3120 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003121 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003122 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003123 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003124 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3125 options::OPT_fno_struct_path_tbaa))
3126 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003127 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3128 false))
3129 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003130 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3131 options::OPT_fno_optimize_sibling_calls))
3132 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003133
Eric Christopher006208c2013-04-04 06:29:47 +00003134 // Handle segmented stacks.
3135 if (Args.hasArg(options::OPT_fsplit_stack))
3136 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003137
3138 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3139 // This alias option is being used to simplify the getLastArg logic.
3140 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
3141 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00003142
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003143 // Handle various floating point optimization flags, mapping them to the
3144 // appropriate LLVM code generation flags. The pattern for all of these is to
3145 // default off the codegen optimizations, and if any flag enables them and no
3146 // flag disables them after the flag enabling them, enable the codegen
3147 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003148 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003149 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003150 options::OPT_ffinite_math_only,
3151 options::OPT_fno_finite_math_only,
3152 options::OPT_fhonor_infinities,
3153 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003154 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3155 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003156 A->getOption().getID() != options::OPT_fhonor_infinities)
3157 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003158 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003159 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003160 options::OPT_ffinite_math_only,
3161 options::OPT_fno_finite_math_only,
3162 options::OPT_fhonor_nans,
3163 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003164 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3165 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003166 A->getOption().getID() != options::OPT_fhonor_nans)
3167 CmdArgs.push_back("-menable-no-nans");
3168
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003169 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3170 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003171 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003172 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003173 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003174 options::OPT_fno_math_errno)) {
3175 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3176 // However, turning *off* -ffast_math merely restores the toolchain default
3177 // (which may be false).
3178 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3179 A->getOption().getID() == options::OPT_ffast_math ||
3180 A->getOption().getID() == options::OPT_Ofast)
3181 MathErrno = false;
3182 else if (A->getOption().getID() == options::OPT_fmath_errno)
3183 MathErrno = true;
3184 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003185 if (MathErrno)
3186 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003187
3188 // There are several flags which require disabling very specific
3189 // optimizations. Any of these being disabled forces us to turn off the
3190 // entire set of LLVM optimizations, so collect them through all the flag
3191 // madness.
3192 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003193 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003194 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003195 options::OPT_funsafe_math_optimizations,
3196 options::OPT_fno_unsafe_math_optimizations,
3197 options::OPT_fassociative_math,
3198 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003199 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3200 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003201 A->getOption().getID() != options::OPT_fno_associative_math)
3202 AssociativeMath = true;
3203 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003204 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003205 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003206 options::OPT_funsafe_math_optimizations,
3207 options::OPT_fno_unsafe_math_optimizations,
3208 options::OPT_freciprocal_math,
3209 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003210 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3211 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003212 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3213 ReciprocalMath = true;
3214 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003215 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003216 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003217 options::OPT_funsafe_math_optimizations,
3218 options::OPT_fno_unsafe_math_optimizations,
3219 options::OPT_fsigned_zeros,
3220 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003221 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3222 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003223 A->getOption().getID() != options::OPT_fsigned_zeros)
3224 SignedZeros = false;
3225 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003226 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003227 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003228 options::OPT_funsafe_math_optimizations,
3229 options::OPT_fno_unsafe_math_optimizations,
3230 options::OPT_ftrapping_math,
3231 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003232 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3233 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003234 A->getOption().getID() != options::OPT_ftrapping_math)
3235 TrappingMath = false;
3236 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3237 !TrappingMath)
3238 CmdArgs.push_back("-menable-unsafe-fp-math");
3239
Sanjay Patel76c9e092015-01-23 16:40:50 +00003240 if (!SignedZeros)
3241 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003242
Sanjay Patel359b1052015-04-09 15:03:23 +00003243 if (ReciprocalMath)
3244 CmdArgs.push_back("-freciprocal-math");
3245
Lang Hamesaa53b932012-07-06 00:59:19 +00003246 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003247 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003248 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003249 options::OPT_ffp_contract)) {
3250 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003251 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003252 if (Val == "fast" || Val == "on" || Val == "off") {
3253 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3254 } else {
3255 D.Diag(diag::err_drv_unsupported_option_argument)
3256 << A->getOption().getName() << Val;
3257 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003258 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3259 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003260 // If fast-math is set then set the fp-contract mode to fast.
3261 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3262 }
3263 }
Sanjay Patel2987c292015-06-11 14:53:41 +00003264
3265 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003266
Bob Wilson6a039162012-07-19 03:52:53 +00003267 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3268 // and if we find them, tell the frontend to provide the appropriate
3269 // preprocessor macros. This is distinct from enabling any optimizations as
3270 // these options induce language changes which must survive serialization
3271 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003272 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3273 options::OPT_fno_fast_math))
3274 if (!A->getOption().matches(options::OPT_fno_fast_math))
3275 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003276 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3277 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003278 if (A->getOption().matches(options::OPT_ffinite_math_only))
3279 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003280
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003281 // Decide whether to use verbose asm. Verbose assembly is the default on
3282 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003283 bool IsIntegratedAssemblerDefault =
3284 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003285 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003286 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003287 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003288 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003289
Rafael Espindolab8a12932015-05-22 20:44:03 +00003290 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3291 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003292 CmdArgs.push_back("-no-integrated-as");
3293
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003294 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3295 CmdArgs.push_back("-mdebug-pass");
3296 CmdArgs.push_back("Structure");
3297 }
3298 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3299 CmdArgs.push_back("-mdebug-pass");
3300 CmdArgs.push_back("Arguments");
3301 }
3302
John McCall8517abc2010-02-19 02:45:38 +00003303 // Enable -mconstructor-aliases except on darwin, where we have to
3304 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003305 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003306 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003307
John McCall7ef5cb32011-03-18 02:56:14 +00003308 // Darwin's kernel doesn't support guard variables; just die if we
3309 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003310 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003311 CmdArgs.push_back("-fforbid-guard-variables");
3312
Douglas Gregordbe39272011-02-01 15:15:22 +00003313 if (Args.hasArg(options::OPT_mms_bitfields)) {
3314 CmdArgs.push_back("-mms-bitfields");
3315 }
John McCall8517abc2010-02-19 02:45:38 +00003316
Daniel Dunbar306945d2009-09-16 06:17:29 +00003317 // This is a coarse approximation of what llvm-gcc actually does, both
3318 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3319 // complicated ways.
3320 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003321 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3322 options::OPT_fno_asynchronous_unwind_tables,
3323 (getToolChain().IsUnwindTablesDefault() ||
3324 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3325 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003326 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3327 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003328 CmdArgs.push_back("-munwind-tables");
3329
Chandler Carruth05fb5852012-11-21 23:40:23 +00003330 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003331
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003332 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3333 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003334 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003335 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003336
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003337 // FIXME: Handle -mtune=.
3338 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003339
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003340 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003341 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003342 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003343 }
3344
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003345 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003346 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003347 if (!CPU.empty()) {
3348 CmdArgs.push_back("-target-cpu");
3349 CmdArgs.push_back(Args.MakeArgString(CPU));
3350 }
3351
Rafael Espindolaeb265472013-08-21 21:59:03 +00003352 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3353 CmdArgs.push_back("-mfpmath");
3354 CmdArgs.push_back(A->getValue());
3355 }
3356
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003357 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003358 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003359
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003360 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003361 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003362 default:
3363 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003364
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003365 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003366 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003367 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003368 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003369 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003370 break;
3371
Tim Northover573cbee2014-05-24 12:52:07 +00003372 case llvm::Triple::aarch64:
3373 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003374 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003375 break;
3376
Eric Christopher0b26a612010-03-02 02:41:08 +00003377 case llvm::Triple::mips:
3378 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003379 case llvm::Triple::mips64:
3380 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003381 AddMIPSTargetArgs(Args, CmdArgs);
3382 break;
3383
Ulrich Weigand8afad612014-07-28 13:17:52 +00003384 case llvm::Triple::ppc:
3385 case llvm::Triple::ppc64:
3386 case llvm::Triple::ppc64le:
3387 AddPPCTargetArgs(Args, CmdArgs);
3388 break;
3389
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003390 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003391 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003392 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003393 AddSparcTargetArgs(Args, CmdArgs);
3394 break;
3395
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003396 case llvm::Triple::x86:
3397 case llvm::Triple::x86_64:
3398 AddX86TargetArgs(Args, CmdArgs);
3399 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003400
3401 case llvm::Triple::hexagon:
3402 AddHexagonTargetArgs(Args, CmdArgs);
3403 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003404 }
3405
Hans Wennborg75958c42013-08-08 00:17:41 +00003406 // Add clang-cl arguments.
3407 if (getToolChain().getDriver().IsCLMode())
3408 AddClangCLArgs(Args, CmdArgs);
3409
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003410 // Pass the linker version in use.
3411 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3412 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003413 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003414 }
3415
Eric Christopherb7d97e92013-04-03 01:58:53 +00003416 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003417 CmdArgs.push_back("-momit-leaf-frame-pointer");
3418
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003419 // Explicitly error on some things we know we don't support and can't just
3420 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003421 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003422 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3423 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003424 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003425 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003426 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003427 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3428 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003429 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003430 << Unsupported->getOption().getName();
3431 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003432 }
3433
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003434 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003435 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003436 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003437 CmdArgs.push_back("-header-include-file");
3438 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3439 D.CCPrintHeadersFilename : "-");
3440 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003441 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003442 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003443
Chad Rosierbe10f982011-08-02 17:58:04 +00003444 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003445 CmdArgs.push_back("-diagnostic-log-file");
3446 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3447 D.CCLogDiagnosticsFilename : "-");
3448 }
3449
Manman Ren17bdb0f2013-11-20 20:22:14 +00003450 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3451 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003452 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003453 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003454 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3455 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003456 // FIXME: we should support specifying dwarf version with
3457 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003458 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003459 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003460 const llvm::Triple &Triple = getToolChain().getTriple();
3461 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003462 Triple.getOS() == llvm::Triple::FreeBSD ||
3463 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003464 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003465 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003466 CmdArgs.push_back("-gdwarf-2");
3467 else if (A->getOption().matches(options::OPT_gdwarf_3))
3468 CmdArgs.push_back("-gdwarf-3");
3469 else if (A->getOption().matches(options::OPT_gdwarf_4))
3470 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003471 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003472 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003473 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003474 const llvm::Triple &Triple = getToolChain().getTriple();
3475 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003476 Triple.getOS() == llvm::Triple::FreeBSD ||
3477 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003478 CmdArgs.push_back("-gdwarf-2");
3479 else
3480 CmdArgs.push_back("-g");
3481 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003482 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003483
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003484 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3485 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003486 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3487 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003488 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003489
Eric Christopher138c32b2013-09-13 22:37:55 +00003490 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003491 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3492 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003493 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003494 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003495 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003496 CmdArgs.push_back("-g");
3497 CmdArgs.push_back("-backend-option");
3498 CmdArgs.push_back("-split-dwarf=Enable");
3499 }
3500
Eric Christopher138c32b2013-09-13 22:37:55 +00003501 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3502 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3503 CmdArgs.push_back("-backend-option");
3504 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3505 }
Eric Christophereec89c22013-06-18 00:03:50 +00003506
Eric Christopher0d403d22014-02-14 01:27:03 +00003507 // -gdwarf-aranges turns on the emission of the aranges section in the
3508 // backend.
3509 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3510 CmdArgs.push_back("-backend-option");
3511 CmdArgs.push_back("-generate-arange-section");
3512 }
3513
David Blaikief36d9ba2014-01-27 18:52:43 +00003514 if (Args.hasFlag(options::OPT_fdebug_types_section,
3515 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003516 CmdArgs.push_back("-backend-option");
3517 CmdArgs.push_back("-generate-type-units");
3518 }
Eric Christophereec89c22013-06-18 00:03:50 +00003519
Ed Schouten6e576152015-03-26 17:50:28 +00003520 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3521 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3522
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003523 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003524 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003525 CmdArgs.push_back("-ffunction-sections");
3526 }
3527
3528 if (Args.hasFlag(options::OPT_fdata_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003529 options::OPT_fno_data_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003530 CmdArgs.push_back("-fdata-sections");
3531 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003532
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003533 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003534 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003535 CmdArgs.push_back("-fno-unique-section-names");
3536
Chris Lattner3c77a352010-06-22 00:03:40 +00003537 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3538
Justin Bognera71e6812015-04-30 23:49:42 +00003539 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3540 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003541 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3542 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3543 D.Diag(diag::err_drv_argument_not_allowed_with)
3544 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3545
Justin Bognera71e6812015-04-30 23:49:42 +00003546 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3547 A->render(Args, CmdArgs);
3548 else
3549 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003550
3551 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3552 A->render(Args, CmdArgs);
3553 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3554 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3555
Nick Lewycky207bce32011-04-21 23:44:07 +00003556 if (Args.hasArg(options::OPT_ftest_coverage) ||
3557 Args.hasArg(options::OPT_coverage))
3558 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003559 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3560 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003561 Args.hasArg(options::OPT_coverage))
3562 CmdArgs.push_back("-femit-coverage-data");
3563
Alex Lorenzee024992014-08-04 18:41:51 +00003564 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003565 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3566 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003567 D.Diag(diag::err_drv_argument_only_allowed_with)
3568 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3569
3570 if (Args.hasArg(options::OPT_fcoverage_mapping))
3571 CmdArgs.push_back("-fcoverage-mapping");
3572
Nick Lewycky480cb992011-05-04 20:46:58 +00003573 if (C.getArgs().hasArg(options::OPT_c) ||
3574 C.getArgs().hasArg(options::OPT_S)) {
3575 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003576 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003577 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003578 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003579 CoverageFilename = FinalOutput->getValue();
3580 } else {
3581 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3582 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003583 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003584 SmallString<128> Pwd;
3585 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003586 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003587 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003588 }
3589 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003590 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003591 }
3592 }
3593
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003594 // Pass options for controlling the default header search paths.
3595 if (Args.hasArg(options::OPT_nostdinc)) {
3596 CmdArgs.push_back("-nostdsysteminc");
3597 CmdArgs.push_back("-nobuiltininc");
3598 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003599 if (Args.hasArg(options::OPT_nostdlibinc))
3600 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003601 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3602 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3603 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003604
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003605 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003606 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003607 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003608
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003609 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3610
Ted Kremenekf7639e12012-03-06 20:06:33 +00003611 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003612 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003613 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003614 options::OPT_ccc_arcmt_modify,
3615 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003616 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003617 switch (A->getOption().getID()) {
3618 default:
3619 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003620 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003621 CmdArgs.push_back("-arcmt-check");
3622 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003623 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003624 CmdArgs.push_back("-arcmt-modify");
3625 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003626 case options::OPT_ccc_arcmt_migrate:
3627 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003628 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003629 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003630
3631 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3632 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003633 break;
John McCalld70fb982011-06-15 23:25:17 +00003634 }
3635 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003636 } else {
3637 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3638 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3639 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003640 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003641
Ted Kremenekf7639e12012-03-06 20:06:33 +00003642 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3643 if (ARCMTEnabled) {
3644 D.Diag(diag::err_drv_argument_not_allowed_with)
3645 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3646 }
3647 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003648 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003649
3650 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003651 options::OPT_objcmt_migrate_subscripting,
3652 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003653 // None specified, means enable them all.
3654 CmdArgs.push_back("-objcmt-migrate-literals");
3655 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003656 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003657 } else {
3658 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3659 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003660 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003661 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003662 } else {
3663 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3664 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3665 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3666 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3667 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3668 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003669 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003670 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3671 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3672 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3673 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3674 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3675 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3676 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003677 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003678 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003679 }
3680
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003681 // Add preprocessing options like -I, -D, etc. if we are using the
3682 // preprocessor.
3683 //
3684 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003685 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003686 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003687
Rafael Espindolaa7431922011-07-21 23:40:37 +00003688 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3689 // that "The compiler can only warn and ignore the option if not recognized".
3690 // When building with ccache, it will pass -D options to clang even on
3691 // preprocessed inputs and configure concludes that -fPIC is not supported.
3692 Args.ClaimAllArgs(options::OPT_D);
3693
Alp Toker7874bdc2013-11-15 20:40:58 +00003694 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003695 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3696 if (A->getOption().matches(options::OPT_O4)) {
3697 CmdArgs.push_back("-O3");
3698 D.Diag(diag::warn_O4_is_O3);
3699 } else {
3700 A->render(Args, CmdArgs);
3701 }
3702 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003703
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003704 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003705 for (const Arg *A :
3706 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3707 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003708 }
3709
Rafael Espindola577637a2015-01-03 00:06:04 +00003710 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003711
Richard Smith3be1cb22014-08-07 00:24:21 +00003712 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003713 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003714 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3715 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003716 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003717 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003718
3719 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003720 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003721 //
3722 // If a std is supplied, only add -trigraphs if it follows the
3723 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003724 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003725 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3726 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003727 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003728 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003729 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003730 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003731 else
3732 Std->render(Args, CmdArgs);
3733
Nico Weber00721502014-12-23 22:32:37 +00003734 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003735 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003736 options::OPT_ftrigraphs,
3737 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003738 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003739 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003740 } else {
3741 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003742 //
3743 // FIXME: Clang doesn't correctly handle -std= when the input language
3744 // doesn't match. For the time being just ignore this for C++ inputs;
3745 // eventually we want to do all the standard defaulting here instead of
3746 // splitting it between the driver and clang -cc1.
3747 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003748 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3749 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003750 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003751 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003752
Nico Weber00721502014-12-23 22:32:37 +00003753 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3754 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003755 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003756
Richard Smith282b4492013-09-04 22:50:31 +00003757 // GCC's behavior for -Wwrite-strings is a bit strange:
3758 // * In C, this "warning flag" changes the types of string literals from
3759 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3760 // for the discarded qualifier.
3761 // * In C++, this is just a normal warning flag.
3762 //
3763 // Implementing this warning correctly in C is hard, so we follow GCC's
3764 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3765 // a non-const char* in C, rather than using this crude hack.
3766 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003767 // FIXME: This should behave just like a warning flag, and thus should also
3768 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3769 Arg *WriteStrings =
3770 Args.getLastArg(options::OPT_Wwrite_strings,
3771 options::OPT_Wno_write_strings, options::OPT_w);
3772 if (WriteStrings &&
3773 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003774 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003775 }
3776
Chandler Carruth61fbf622011-04-23 09:27:53 +00003777 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003778 // during C++ compilation, which it is by default. GCC keeps this define even
3779 // in the presence of '-w', match this behavior bug-for-bug.
3780 if (types::isCXX(InputType) &&
3781 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3782 true)) {
3783 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003784 }
3785
Chandler Carruthe0391482010-05-22 02:21:53 +00003786 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3787 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3788 if (Asm->getOption().matches(options::OPT_fasm))
3789 CmdArgs.push_back("-fgnu-keywords");
3790 else
3791 CmdArgs.push_back("-fno-gnu-keywords");
3792 }
3793
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003794 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3795 CmdArgs.push_back("-fno-dwarf-directory-asm");
3796
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003797 if (ShouldDisableAutolink(Args, getToolChain()))
3798 CmdArgs.push_back("-fno-autolink");
3799
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003800 // Add in -fdebug-compilation-dir if necessary.
3801 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003802
Richard Smith9a568822011-11-21 19:36:32 +00003803 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3804 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003805 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003806 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003807 }
3808
Richard Smith79c927b2013-11-06 19:31:51 +00003809 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3810 CmdArgs.push_back("-foperator-arrow-depth");
3811 CmdArgs.push_back(A->getValue());
3812 }
3813
Richard Smith9a568822011-11-21 19:36:32 +00003814 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3815 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003816 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003817 }
3818
Richard Smitha3d3bd22013-05-08 02:12:03 +00003819 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3820 CmdArgs.push_back("-fconstexpr-steps");
3821 CmdArgs.push_back(A->getValue());
3822 }
3823
Richard Smithb3a14522013-02-22 01:59:51 +00003824 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3825 CmdArgs.push_back("-fbracket-depth");
3826 CmdArgs.push_back(A->getValue());
3827 }
3828
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003829 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3830 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003831 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003832 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003833 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3834 } else
3835 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003836 }
3837
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003838
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003839 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003840 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003841
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003842 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3843 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003844 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003845 }
David Chisnall5778fce2009-08-31 16:41:57 +00003846
Chris Lattnere23003d2010-01-09 21:54:33 +00003847 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3848 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003849 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003850 }
3851
Chris Lattnerb35583d2010-04-07 20:49:23 +00003852 CmdArgs.push_back("-ferror-limit");
3853 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003854 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003855 else
3856 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003857
Chandler Carrutha77a7272010-05-06 04:55:18 +00003858 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3859 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003860 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003861 }
3862
3863 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3864 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003865 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003866 }
3867
Richard Smithf6f003a2011-12-16 19:06:07 +00003868 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3869 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003870 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003871 }
3872
Nick Lewycky24653262014-12-16 21:39:02 +00003873 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3874 CmdArgs.push_back("-fspell-checking-limit");
3875 CmdArgs.push_back(A->getValue());
3876 }
3877
Daniel Dunbar2c978472009-11-04 06:24:47 +00003878 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003879 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003880 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003881 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003882 } else {
3883 // If -fmessage-length=N was not specified, determine whether this is a
3884 // terminal and, if so, implicitly define -fmessage-length appropriately.
3885 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003886 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003887 }
3888
John McCallb4a99d32013-02-19 01:57:35 +00003889 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3890 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3891 options::OPT_fvisibility_ms_compat)) {
3892 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3893 CmdArgs.push_back("-fvisibility");
3894 CmdArgs.push_back(A->getValue());
3895 } else {
3896 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3897 CmdArgs.push_back("-fvisibility");
3898 CmdArgs.push_back("hidden");
3899 CmdArgs.push_back("-ftype-visibility");
3900 CmdArgs.push_back("default");
3901 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003902 }
3903
Douglas Gregor08329632010-06-15 17:05:35 +00003904 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003905
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003906 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3907
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003908 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003909 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3910 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003911 CmdArgs.push_back("-ffreestanding");
3912
Daniel Dunbare357d562009-12-03 18:42:11 +00003913 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003914 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003915 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003916 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3917 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003918 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003919 // AltiVec language extensions aren't relevant for assembling.
3920 if (!isa<PreprocessJobAction>(JA) ||
3921 Output.getType() != types::TY_PP_Asm)
3922 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003923 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3924 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003925
Alexey Bataevdb390212015-05-20 04:24:19 +00003926 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003927 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3928 options::OPT_fno_openmp, false))
3929 switch (getOpenMPRuntime(getToolChain(), Args)) {
3930 case OMPRT_OMP:
3931 case OMPRT_IOMP5:
3932 // Clang can generate useful OpenMP code for these two runtime libraries.
3933 CmdArgs.push_back("-fopenmp");
3934 break;
3935 default:
3936 // By default, if Clang doesn't know how to generate useful OpenMP code
3937 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3938 // down to the actual compilation.
3939 // FIXME: It would be better to have a mode which *only* omits IR
3940 // generation based on the OpenMP support so that we get consistent
3941 // semantic analysis, etc.
3942 break;
3943 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003944
Peter Collingbourne32701642013-11-01 18:16:25 +00003945 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3946 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003947
Eric Christopher459d2712013-02-19 06:16:53 +00003948 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003949 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3950 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3951 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3952 Arch == llvm::Triple::ppc64le))
3953 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3954 << "ppc/ppc64/ppc64le";
3955 }
Chad Rosier864dfe12012-03-13 23:45:51 +00003956
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003957 if (getToolChain().SupportsProfiling())
3958 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003959
3960 // -flax-vector-conversions is default.
3961 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3962 options::OPT_fno_lax_vector_conversions))
3963 CmdArgs.push_back("-fno-lax-vector-conversions");
3964
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003965 if (Args.getLastArg(options::OPT_fapple_kext))
3966 CmdArgs.push_back("-fapple-kext");
3967
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003968 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003969 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003970 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003971 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3972 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003973
3974 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3975 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003976 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003977 }
3978
Bob Wilson14adb362012-02-03 06:27:22 +00003979 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003980
Chandler Carruth6e501032011-03-27 00:04:55 +00003981 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3982 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3983 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3984 options::OPT_fno_wrapv)) {
3985 if (A->getOption().matches(options::OPT_fwrapv))
3986 CmdArgs.push_back("-fwrapv");
3987 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3988 options::OPT_fno_strict_overflow)) {
3989 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3990 CmdArgs.push_back("-fwrapv");
3991 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003992
3993 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3994 options::OPT_fno_reroll_loops))
3995 if (A->getOption().matches(options::OPT_freroll_loops))
3996 CmdArgs.push_back("-freroll-loops");
3997
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003998 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003999 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4000 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004001
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004002 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4003
Mahesha S6a682be42012-10-27 07:47:56 +00004004
Daniel Dunbar4930e332009-11-17 08:07:36 +00004005 // -stack-protector=0 is default.
4006 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004007 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4008 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4009 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4010 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4011 Args.ClaimAllArgs(options::OPT_fstack_protector);
4012 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004013 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00004014 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004015 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004016 if (A->getOption().matches(options::OPT_fstack_protector)) {
4017 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
4018 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
4019 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004020 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004021 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004022 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004023 } else {
4024 StackProtectorLevel =
4025 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
4026 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004027 if (StackProtectorLevel) {
4028 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004029 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004030 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004031
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004032 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004033 for (const Arg *A : Args.filtered(options::OPT__param)) {
4034 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004035 if (Str.startswith("ssp-buffer-size=")) {
4036 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004037 CmdArgs.push_back("-stack-protector-buffer-size");
4038 // FIXME: Verify the argument is a valid integer.
4039 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004040 }
Sean Silva14facf32015-06-09 01:57:17 +00004041 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004042 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004043 }
4044
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004045 // Translate -mstackrealign
4046 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4047 false)) {
4048 CmdArgs.push_back("-backend-option");
4049 CmdArgs.push_back("-force-align-stack");
4050 }
4051 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
4052 false)) {
4053 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4054 }
4055
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004056 if (Args.hasArg(options::OPT_mstack_alignment)) {
4057 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4058 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004059 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004060
Hans Wennborg77dc2362015-01-20 19:45:50 +00004061 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4062 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4063
4064 if (!Size.empty())
4065 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4066 else
4067 CmdArgs.push_back("-mstack-probe-size=0");
4068 }
4069
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004070 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4071 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004072 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4073
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004074 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4075 options::OPT_mno_restrict_it)) {
4076 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4077 CmdArgs.push_back("-backend-option");
4078 CmdArgs.push_back("-arm-restrict-it");
4079 } else {
4080 CmdArgs.push_back("-backend-option");
4081 CmdArgs.push_back("-arm-no-restrict-it");
4082 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004083 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4084 TT.getArch() == llvm::Triple::thumb)) {
4085 // Windows on ARM expects restricted IT blocks
4086 CmdArgs.push_back("-backend-option");
4087 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004088 }
4089
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004090 if (TT.getArch() == llvm::Triple::arm ||
4091 TT.getArch() == llvm::Triple::thumb) {
4092 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
4093 options::OPT_mno_long_calls)) {
4094 if (A->getOption().matches(options::OPT_mlong_calls)) {
4095 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00004096 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004097 }
4098 }
4099 }
4100
Daniel Dunbard18049a2009-04-07 21:16:11 +00004101 // Forward -f options with positive and negative forms; we translate
4102 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004103 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4104 StringRef fname = A->getValue();
4105 if (!llvm::sys::fs::exists(fname))
4106 D.Diag(diag::err_drv_no_such_file) << fname;
4107 else
4108 A->render(Args, CmdArgs);
4109 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004110
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004111 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004112 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004113 CmdArgs.push_back("-fapple-kext");
4114 if (!Args.hasArg(options::OPT_fbuiltin))
4115 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004116 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004117 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004118 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004119 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004120 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004121
Nuno Lopes13c88c72009-12-16 16:59:22 +00004122 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4123 options::OPT_fno_assume_sane_operator_new))
4124 CmdArgs.push_back("-fno-assume-sane-operator-new");
4125
Daniel Dunbar4930e332009-11-17 08:07:36 +00004126 // -fblocks=0 is default.
4127 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004128 getToolChain().IsBlocksDefault()) ||
4129 (Args.hasArg(options::OPT_fgnu_runtime) &&
4130 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4131 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004132 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004133
4134 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
4135 !getToolChain().hasBlocksRuntime())
4136 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004137 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004138
Richard Smith47972af2015-06-16 00:08:24 +00004139 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004140 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004141 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004142 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004143 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
4144 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4145 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00004146 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004147 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004148 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004149 HaveModules = true;
4150 }
4151 }
4152
Richard Smith47972af2015-06-16 00:08:24 +00004153 // -fmodule-maps enables implicit reading of module map files. By default,
4154 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004155 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4156 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004157 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004158 }
4159
Daniel Jasperac42b752013-10-21 06:34:34 +00004160 // -fmodules-decluse checks that modules used are declared so (off by
4161 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004162 if (Args.hasFlag(options::OPT_fmodules_decluse,
4163 options::OPT_fno_modules_decluse,
4164 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004165 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004166 }
4167
Daniel Jasper962b38e2014-04-11 11:47:45 +00004168 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4169 // all #included headers are part of modules.
4170 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
4171 options::OPT_fno_modules_strict_decluse,
4172 false)) {
4173 CmdArgs.push_back("-fmodules-strict-decluse");
4174 }
4175
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004176 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4177 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4178 options::OPT_fno_implicit_modules)) {
4179 CmdArgs.push_back("-fno-implicit-modules");
4180 }
4181
Daniel Jasperac42b752013-10-21 06:34:34 +00004182 // -fmodule-name specifies the module that is currently being built (or
4183 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004184 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004185
Richard Smith9887d792014-10-17 01:42:53 +00004186 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004187 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004188 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004189
Richard Smithe842a472014-10-22 02:05:46 +00004190 // -fmodule-file can be used to specify files containing precompiled modules.
4191 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4192
4193 // -fmodule-cache-path specifies where our implicitly-built module files
4194 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004195 SmallString<128> ModuleCachePath;
4196 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4197 ModuleCachePath = A->getValue();
4198 if (HaveModules) {
4199 if (C.isForDiagnostics()) {
4200 // When generating crash reports, we want to emit the modules along with
4201 // the reproduction sources, so we ignore any provided module path.
4202 ModuleCachePath = Output.getFilename();
4203 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4204 llvm::sys::path::append(ModuleCachePath, "modules");
4205 } else if (ModuleCachePath.empty()) {
4206 // No module path was provided: use the default.
4207 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4208 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004209 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4210 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004211 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4212 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004213 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004214 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4215 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4216 }
4217
4218 // When building modules and generating crashdumps, we need to dump a module
4219 // dependency VFS alongside the output.
4220 if (HaveModules && C.isForDiagnostics()) {
4221 SmallString<128> VFSDir(Output.getFilename());
4222 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004223 // Add the cache directory as a temp so the crash diagnostics pick it up.
4224 C.addTempFile(Args.MakeArgString(VFSDir));
4225
Justin Bognera88f0122014-06-20 22:59:50 +00004226 llvm::sys::path::append(VFSDir, "vfs");
4227 CmdArgs.push_back("-module-dependency-dir");
4228 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004229 }
4230
Richard Smith9887d792014-10-17 01:42:53 +00004231 if (HaveModules)
4232 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004233
Douglas Gregor35b04d62013-02-07 19:01:24 +00004234 // Pass through all -fmodules-ignore-macro arguments.
4235 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004236 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4237 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004238
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004239 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4240
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004241 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4242 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4243 D.Diag(diag::err_drv_argument_not_allowed_with)
4244 << A->getAsString(Args) << "-fbuild-session-timestamp";
4245
4246 llvm::sys::fs::file_status Status;
4247 if (llvm::sys::fs::status(A->getValue(), Status))
4248 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004249 CmdArgs.push_back(Args.MakeArgString(
4250 "-fbuild-session-timestamp=" +
4251 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004252 }
4253
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004254 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004255 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4256 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004257 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4258
4259 Args.AddLastArg(CmdArgs,
4260 options::OPT_fmodules_validate_once_per_build_session);
4261 }
4262
Ben Langmuirdcf73862014-03-12 00:06:17 +00004263 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4264
John McCalldfea9982010-04-09 19:12:06 +00004265 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004266 if (Args.hasFlag(options::OPT_fno_access_control,
4267 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00004268 false))
John McCall3155f572010-04-09 19:03:51 +00004269 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004270
Anders Carlssond470fef2010-11-21 00:09:52 +00004271 // -felide-constructors is the default.
4272 if (Args.hasFlag(options::OPT_fno_elide_constructors,
4273 options::OPT_felide_constructors,
4274 false))
4275 CmdArgs.push_back("-fno-elide-constructors");
4276
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004277 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004278
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004279 if (KernelOrKext || (types::isCXX(InputType) &&
4280 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4281 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004282 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004283
Tony Linthicum76329bf2011-12-12 21:14:55 +00004284 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004285 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004286 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004287 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004288 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004289 CmdArgs.push_back("-fshort-enums");
4290
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004291 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004292 if (Arg *A = Args.getLastArg(
4293 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4294 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4295 if (A->getOption().matches(options::OPT_funsigned_char) ||
4296 A->getOption().matches(options::OPT_fno_signed_char)) {
4297 CmdArgs.push_back("-fno-signed-char");
4298 }
4299 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004300 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004301 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004302
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004303 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004304 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4305 options::OPT_fno_use_cxa_atexit,
4306 !IsWindowsCygnus && !IsWindowsGNU &&
4307 getToolChain().getArch() != llvm::Triple::hexagon &&
4308 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004309 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004310 CmdArgs.push_back("-fno-use-cxa-atexit");
4311
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004312 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004313 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004314 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004315 CmdArgs.push_back("-fms-extensions");
4316
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004317 // -fno-use-line-directives is default.
4318 if (Args.hasFlag(options::OPT_fuse_line_directives,
4319 options::OPT_fno_use_line_directives, false))
4320 CmdArgs.push_back("-fuse-line-directives");
4321
Francois Pichet1b4f1632011-09-17 04:32:15 +00004322 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004323 if (Args.hasFlag(options::OPT_fms_compatibility,
4324 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004325 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4326 options::OPT_fno_ms_extensions,
4327 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004328 CmdArgs.push_back("-fms-compatibility");
4329
David Majnemerc371ff02015-03-22 08:39:22 +00004330 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004331 VersionTuple MSVT = visualstudio::getMSVCVersion(
4332 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4333 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004334 CmdArgs.push_back(
4335 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004336
David Majnemer8db91762015-05-18 04:49:30 +00004337 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4338 if (ImplyVCPPCXXVer) {
4339 if (IsMSVC2015Compatible)
4340 CmdArgs.push_back("-std=c++14");
4341 else
4342 CmdArgs.push_back("-std=c++11");
4343 }
4344
Eric Christopher5ecce122013-02-18 00:38:31 +00004345 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004346 if (Args.hasFlag(options::OPT_fborland_extensions,
4347 options::OPT_fno_borland_extensions, false))
4348 CmdArgs.push_back("-fborland-extensions");
4349
David Majnemerc371ff02015-03-22 08:39:22 +00004350 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4351 // than 19.
4352 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4353 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004354 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004355 CmdArgs.push_back("-fno-threadsafe-statics");
4356
Francois Pichet02744872011-09-01 16:38:08 +00004357 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4358 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004359 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004360 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004361 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004362
Chandler Carruthe03aa552010-04-17 20:17:31 +00004363 // -fgnu-keywords default varies depending on language; only pass if
4364 // specified.
4365 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004366 options::OPT_fno_gnu_keywords))
4367 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004368
Rafael Espindola922a6242011-06-02 17:30:53 +00004369 if (Args.hasFlag(options::OPT_fgnu89_inline,
4370 options::OPT_fno_gnu89_inline,
4371 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004372 CmdArgs.push_back("-fgnu89-inline");
4373
Chad Rosier9c76d242012-03-15 22:31:42 +00004374 if (Args.hasArg(options::OPT_fno_inline))
4375 CmdArgs.push_back("-fno-inline");
4376
Chad Rosier64d6be92012-03-06 21:17:19 +00004377 if (Args.hasArg(options::OPT_fno_inline_functions))
4378 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004379
John McCall5fb5df92012-06-20 06:18:46 +00004380 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004381
John McCall5fb5df92012-06-20 06:18:46 +00004382 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004383 // legacy is the default. Except for deployment taget of 10.5,
4384 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4385 // gets ignored silently.
4386 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004387 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4388 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004389 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004390 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004391 if (getToolChain().UseObjCMixedDispatch())
4392 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4393 else
4394 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4395 }
4396 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004397
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004398 // When ObjectiveC legacy runtime is in effect on MacOSX,
4399 // turn on the option to do Array/Dictionary subscripting
4400 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004401 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004402 getToolChain().getTriple().isMacOSX() &&
4403 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4404 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004405 objcRuntime.isNeXTFamily())
4406 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4407
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004408 // -fencode-extended-block-signature=1 is default.
4409 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4410 CmdArgs.push_back("-fencode-extended-block-signature");
4411 }
4412
John McCall24fc0de2011-07-06 00:26:06 +00004413 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4414 // NOTE: This logic is duplicated in ToolChains.cpp.
4415 bool ARC = isObjCAutoRefCount(Args);
4416 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004417 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004418
John McCall24fc0de2011-07-06 00:26:06 +00004419 CmdArgs.push_back("-fobjc-arc");
4420
Chandler Carruth491db322011-11-04 07:34:47 +00004421 // FIXME: It seems like this entire block, and several around it should be
4422 // wrapped in isObjC, but for now we just use it here as this is where it
4423 // was being used previously.
4424 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4425 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4426 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4427 else
4428 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4429 }
4430
John McCall24fc0de2011-07-06 00:26:06 +00004431 // Allow the user to enable full exceptions code emission.
4432 // We define off for Objective-CC, on for Objective-C++.
4433 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4434 options::OPT_fno_objc_arc_exceptions,
4435 /*default*/ types::isCXX(InputType)))
4436 CmdArgs.push_back("-fobjc-arc-exceptions");
4437 }
4438
4439 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4440 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004441 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004442 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004443
John McCall24fc0de2011-07-06 00:26:06 +00004444 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4445 // takes precedence.
4446 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4447 if (!GCArg)
4448 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4449 if (GCArg) {
4450 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004451 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004452 << GCArg->getAsString(Args);
4453 } else if (getToolChain().SupportsObjCGC()) {
4454 GCArg->render(Args, CmdArgs);
4455 } else {
4456 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004457 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004458 << GCArg->getAsString(Args);
4459 }
4460 }
4461
Bob Wilsonb111ec92015-03-02 19:01:14 +00004462 if (Args.hasFlag(options::OPT_fapplication_extension,
4463 options::OPT_fno_application_extension, false))
4464 CmdArgs.push_back("-fapplication-extension");
4465
Reid Klecknerc542d372014-06-27 17:02:02 +00004466 // Handle GCC-style exception args.
4467 if (!C.getDriver().IsCLMode())
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004468 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext,
Reid Klecknerc542d372014-06-27 17:02:02 +00004469 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004470
4471 if (getToolChain().UseSjLjExceptions())
4472 CmdArgs.push_back("-fsjlj-exceptions");
4473
4474 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004475 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4476 options::OPT_fno_assume_sane_operator_new))
4477 CmdArgs.push_back("-fno-assume-sane-operator-new");
4478
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004479 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4480 // most platforms.
4481 if (Args.hasFlag(options::OPT_fsized_deallocation,
4482 options::OPT_fno_sized_deallocation, false))
4483 CmdArgs.push_back("-fsized-deallocation");
4484
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004485 // -fconstant-cfstrings is default, and may be subject to argument translation
4486 // on Darwin.
4487 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4488 options::OPT_fno_constant_cfstrings) ||
4489 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4490 options::OPT_mno_constant_cfstrings))
4491 CmdArgs.push_back("-fno-constant-cfstrings");
4492
John Thompsoned4e2952009-11-05 20:14:16 +00004493 // -fshort-wchar default varies depending on platform; only
4494 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004495 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4496 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004497 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004498
Hans Wennborg28c96312013-07-31 23:39:13 +00004499 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004500 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004501 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004502 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004503 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004504
Daniel Dunbar096ed292011-10-05 21:04:55 +00004505 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4506 // -fno-pack-struct doesn't apply to -fpack-struct=.
4507 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004508 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004509 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004510 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004511 } else if (Args.hasFlag(options::OPT_fpack_struct,
4512 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004513 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004514 }
4515
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004516 // Handle -fmax-type-align=N and -fno-type-align
4517 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4518 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4519 if (!SkipMaxTypeAlign) {
4520 std::string MaxTypeAlignStr = "-fmax-type-align=";
4521 MaxTypeAlignStr += A->getValue();
4522 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4523 }
4524 } else if (getToolChain().getTriple().isOSDarwin()) {
4525 if (!SkipMaxTypeAlign) {
4526 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4527 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4528 }
4529 }
4530
Robert Lytton0e076492013-08-13 09:43:10 +00004531 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004532 if (!Args.hasArg(options::OPT_fcommon))
4533 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004534 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004535 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004536
Daniel Dunbard18049a2009-04-07 21:16:11 +00004537 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004538 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004539 CmdArgs.push_back("-fno-common");
4540
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004541 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004542 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004543 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004544 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004545 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004546 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4547
Daniel Dunbar6358d682010-10-15 22:30:42 +00004548 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4549 if (!Args.hasFlag(options::OPT_ffor_scope,
4550 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004551 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004552 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4553
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004554 // -finput_charset=UTF-8 is default. Reject others
4555 if (Arg *inputCharset = Args.getLastArg(
4556 options::OPT_finput_charset_EQ)) {
4557 StringRef value = inputCharset->getValue();
4558 if (value != "UTF-8")
4559 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4560 }
4561
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004562 // -fexec_charset=UTF-8 is default. Reject others
4563 if (Arg *execCharset = Args.getLastArg(
4564 options::OPT_fexec_charset_EQ)) {
4565 StringRef value = execCharset->getValue();
4566 if (value != "UTF-8")
4567 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4568 }
4569
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004570 // -fcaret-diagnostics is default.
4571 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4572 options::OPT_fno_caret_diagnostics, true))
4573 CmdArgs.push_back("-fno-caret-diagnostics");
4574
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004575 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004576 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004577 options::OPT_fno_diagnostics_fixit_info))
4578 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004579
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004580 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004581 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004582 options::OPT_fno_diagnostics_show_option))
4583 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004584
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004585 if (const Arg *A =
4586 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4587 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004588 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004589 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004590
Douglas Gregor643c9222011-05-21 17:07:29 +00004591 if (const Arg *A =
4592 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4593 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004594 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004595 }
4596
Chandler Carruthb6766f02011-03-27 01:50:55 +00004597 if (Arg *A = Args.getLastArg(
4598 options::OPT_fdiagnostics_show_note_include_stack,
4599 options::OPT_fno_diagnostics_show_note_include_stack)) {
4600 if (A->getOption().matches(
4601 options::OPT_fdiagnostics_show_note_include_stack))
4602 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4603 else
4604 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4605 }
4606
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004607 // Color diagnostics are the default, unless the terminal doesn't support
4608 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004609 // Support both clang's -f[no-]color-diagnostics and gcc's
4610 // -f[no-]diagnostics-colors[=never|always|auto].
4611 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004612 for (const auto &Arg : Args) {
4613 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004614 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4615 !O.matches(options::OPT_fdiagnostics_color) &&
4616 !O.matches(options::OPT_fno_color_diagnostics) &&
4617 !O.matches(options::OPT_fno_diagnostics_color) &&
4618 !O.matches(options::OPT_fdiagnostics_color_EQ))
4619 continue;
4620
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004621 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004622 if (O.matches(options::OPT_fcolor_diagnostics) ||
4623 O.matches(options::OPT_fdiagnostics_color)) {
4624 ShowColors = Colors_On;
4625 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4626 O.matches(options::OPT_fno_diagnostics_color)) {
4627 ShowColors = Colors_Off;
4628 } else {
4629 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004630 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004631 if (value == "always")
4632 ShowColors = Colors_On;
4633 else if (value == "never")
4634 ShowColors = Colors_Off;
4635 else if (value == "auto")
4636 ShowColors = Colors_Auto;
4637 else
4638 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4639 << ("-fdiagnostics-color=" + value).str();
4640 }
4641 }
4642 if (ShowColors == Colors_On ||
4643 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004644 CmdArgs.push_back("-fcolor-diagnostics");
4645
Nico Rieck7857d462013-09-11 00:38:02 +00004646 if (Args.hasArg(options::OPT_fansi_escape_codes))
4647 CmdArgs.push_back("-fansi-escape-codes");
4648
Daniel Dunbardb097022009-06-08 21:13:54 +00004649 if (!Args.hasFlag(options::OPT_fshow_source_location,
4650 options::OPT_fno_show_source_location))
4651 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004652
Douglas Gregor643c9222011-05-21 17:07:29 +00004653 if (!Args.hasFlag(options::OPT_fshow_column,
4654 options::OPT_fno_show_column,
4655 true))
4656 CmdArgs.push_back("-fno-show-column");
4657
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004658 if (!Args.hasFlag(options::OPT_fspell_checking,
4659 options::OPT_fno_spell_checking))
4660 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004661
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004662
Chad Rosierc8e56e82012-12-05 21:08:21 +00004663 // -fno-asm-blocks is default.
4664 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4665 false))
4666 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004667
Steven Wucb0d13f2015-01-16 23:05:28 +00004668 // -fgnu-inline-asm is default.
4669 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4670 options::OPT_fno_gnu_inline_asm, true))
4671 CmdArgs.push_back("-fno-gnu-inline-asm");
4672
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004673 // Enable vectorization per default according to the optimization level
4674 // selected. For optimization levels that want vectorization we use the alias
4675 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004676 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004677 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004678 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004679 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004680 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004681 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004682
Chad Rosier136d67d2014-04-28 19:30:57 +00004683 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004684 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4685 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004686 options::OPT_fslp_vectorize;
4687 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004688 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004689 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004690
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004691 // -fno-slp-vectorize-aggressive is default.
4692 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004693 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004694 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004695
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004696 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4697 A->render(Args, CmdArgs);
4698
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004699 // -fdollars-in-identifiers default varies depending on platform and
4700 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004701 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004702 options::OPT_fno_dollars_in_identifiers)) {
4703 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004704 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004705 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004706 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004707 }
4708
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004709 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4710 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004711 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004712 options::OPT_fno_unit_at_a_time)) {
4713 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004714 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004715 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004716
Eli Friedman055c9702011-11-02 01:53:16 +00004717 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4718 options::OPT_fno_apple_pragma_pack, false))
4719 CmdArgs.push_back("-fapple-pragma-pack");
4720
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004721 // le32-specific flags:
4722 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4723 // by default.
4724 if (getToolChain().getArch() == llvm::Triple::le32) {
4725 CmdArgs.push_back("-fno-math-builtin");
4726 }
4727
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004728 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004729 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004730 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004731#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004732 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004733 (getToolChain().getArch() == llvm::Triple::arm ||
4734 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004735 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4736 CmdArgs.push_back("-fno-builtin-strcat");
4737 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4738 CmdArgs.push_back("-fno-builtin-strcpy");
4739 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004740#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004741
Justin Bognera88f0122014-06-20 22:59:50 +00004742 // Enable rewrite includes if the user's asked for it or if we're generating
4743 // diagnostics.
4744 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4745 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004746 if (Args.hasFlag(options::OPT_frewrite_includes,
4747 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004748 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004749 CmdArgs.push_back("-frewrite-includes");
4750
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004751 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004752 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004753 options::OPT_traditional_cpp)) {
4754 if (isa<PreprocessJobAction>(JA))
4755 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004756 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004757 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004758 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004759
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004760 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004761 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004762
4763 // Handle serialized diagnostics.
4764 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4765 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004766 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004767 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004768
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004769 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4770 CmdArgs.push_back("-fretain-comments-from-system-headers");
4771
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004772 // Forward -fcomment-block-commands to -cc1.
4773 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004774 // Forward -fparse-all-comments to -cc1.
4775 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004776
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004777 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4778 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004779 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004780 bool OptDisabled = false;
Sean Silva14facf32015-06-09 01:57:17 +00004781 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4782 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004783
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004784 // We translate this by hand to the -cc1 argument, since nightly test uses
4785 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004786 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004787 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004788 OptDisabled = true;
4789 } else
Sean Silva14facf32015-06-09 01:57:17 +00004790 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004791 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004792
Bob Wilson23a55f12014-12-21 07:00:00 +00004793 // With -save-temps, we want to save the unoptimized bitcode output from the
4794 // CompileJobAction, so disable optimizations if they are not already
4795 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004796 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004797 isa<CompileJobAction>(JA))
4798 CmdArgs.push_back("-disable-llvm-optzns");
4799
Daniel Dunbard67a3222009-03-30 06:36:42 +00004800 if (Output.getType() == types::TY_Dependencies) {
4801 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004802 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004803 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004804 CmdArgs.push_back(Output.getFilename());
4805 } else {
4806 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004807 }
4808
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004809 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004810 addDashXForInput(Args, II, CmdArgs);
4811
Daniel Dunbarb440f562010-08-02 02:38:21 +00004812 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004813 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004814 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004815 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004816 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004817
Chris Lattnere9d7d782009-11-03 19:50:27 +00004818 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4819
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004820 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004821
4822 // Optionally embed the -cc1 level arguments into the debug info, for build
4823 // analysis.
4824 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004825 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004826 for (const auto &Arg : Args)
4827 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004828
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004829 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004830 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004831 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004832 SmallString<128> EscapedArg;
4833 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004834 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004835 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004836 }
4837 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004838 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004839 }
4840
Eric Christopherd3804002013-02-22 20:12:52 +00004841 // Add the split debug info name to the command lines here so we
4842 // can propagate it to the backend.
4843 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004844 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004845 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4846 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004847 const char *SplitDwarfOut;
4848 if (SplitDwarf) {
4849 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004850 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004851 CmdArgs.push_back(SplitDwarfOut);
4852 }
4853
4854 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004855 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004856 Output.getType() == types::TY_Object &&
4857 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004858 auto CLCommand =
4859 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4860 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4861 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004862 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004863 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004864 }
4865
Daniel Dunbar17731772009-03-23 19:03:36 +00004866
Eric Christopherf1545832013-02-22 23:50:16 +00004867 // Handle the debug info splitting at object creation time if we're
4868 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004869 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004870 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004871 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004872
Roman Divacky178e01602011-02-10 16:52:03 +00004873 if (Arg *A = Args.getLastArg(options::OPT_pg))
4874 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004875 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004876 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004877
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004878 // Claim some arguments which clang supports automatically.
4879
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004880 // -fpch-preprocess is used with gcc to add a special marker in the output to
4881 // include the PCH file. Clang's PTH solution is completely transparent, so we
4882 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004883 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004884
Daniel Dunbar17731772009-03-23 19:03:36 +00004885 // Claim some arguments which clang doesn't support, but we don't
4886 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004887 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4888 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004889
Rafael Espindolab0092d72013-09-04 19:37:35 +00004890 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004891 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004892}
4893
John McCall5fb5df92012-06-20 06:18:46 +00004894/// Add options related to the Objective-C runtime/ABI.
4895///
4896/// Returns true if the runtime is non-fragile.
4897ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4898 ArgStringList &cmdArgs,
4899 RewriteKind rewriteKind) const {
4900 // Look for the controlling runtime option.
4901 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4902 options::OPT_fgnu_runtime,
4903 options::OPT_fobjc_runtime_EQ);
4904
4905 // Just forward -fobjc-runtime= to the frontend. This supercedes
4906 // options about fragility.
4907 if (runtimeArg &&
4908 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4909 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004910 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004911 if (runtime.tryParse(value)) {
4912 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4913 << value;
4914 }
4915
4916 runtimeArg->render(args, cmdArgs);
4917 return runtime;
4918 }
4919
4920 // Otherwise, we'll need the ABI "version". Version numbers are
4921 // slightly confusing for historical reasons:
4922 // 1 - Traditional "fragile" ABI
4923 // 2 - Non-fragile ABI, version 1
4924 // 3 - Non-fragile ABI, version 2
4925 unsigned objcABIVersion = 1;
4926 // If -fobjc-abi-version= is present, use that to set the version.
4927 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004928 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004929 if (value == "1")
4930 objcABIVersion = 1;
4931 else if (value == "2")
4932 objcABIVersion = 2;
4933 else if (value == "3")
4934 objcABIVersion = 3;
4935 else
4936 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4937 << value;
4938 } else {
4939 // Otherwise, determine if we are using the non-fragile ABI.
4940 bool nonFragileABIIsDefault =
4941 (rewriteKind == RK_NonFragile ||
4942 (rewriteKind == RK_None &&
4943 getToolChain().IsObjCNonFragileABIDefault()));
4944 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4945 options::OPT_fno_objc_nonfragile_abi,
4946 nonFragileABIIsDefault)) {
4947 // Determine the non-fragile ABI version to use.
4948#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4949 unsigned nonFragileABIVersion = 1;
4950#else
4951 unsigned nonFragileABIVersion = 2;
4952#endif
4953
4954 if (Arg *abiArg = args.getLastArg(
4955 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004956 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004957 if (value == "1")
4958 nonFragileABIVersion = 1;
4959 else if (value == "2")
4960 nonFragileABIVersion = 2;
4961 else
4962 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4963 << value;
4964 }
4965
4966 objcABIVersion = 1 + nonFragileABIVersion;
4967 } else {
4968 objcABIVersion = 1;
4969 }
4970 }
4971
4972 // We don't actually care about the ABI version other than whether
4973 // it's non-fragile.
4974 bool isNonFragile = objcABIVersion != 1;
4975
4976 // If we have no runtime argument, ask the toolchain for its default runtime.
4977 // However, the rewriter only really supports the Mac runtime, so assume that.
4978 ObjCRuntime runtime;
4979 if (!runtimeArg) {
4980 switch (rewriteKind) {
4981 case RK_None:
4982 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4983 break;
4984 case RK_Fragile:
4985 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4986 break;
4987 case RK_NonFragile:
4988 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4989 break;
4990 }
4991
4992 // -fnext-runtime
4993 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4994 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004995 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004996 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4997
4998 // Otherwise, build for a generic macosx port.
4999 } else {
5000 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5001 }
5002
5003 // -fgnu-runtime
5004 } else {
5005 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005006 // Legacy behaviour is to target the gnustep runtime if we are i
5007 // non-fragile mode or the GCC runtime in fragile mode.
5008 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00005009 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00005010 else
5011 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005012 }
5013
5014 cmdArgs.push_back(args.MakeArgString(
5015 "-fobjc-runtime=" + runtime.getAsString()));
5016 return runtime;
5017}
5018
Reid Klecknerc542d372014-06-27 17:02:02 +00005019static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5020 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5021 I += HaveDash;
5022 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005023}
Reid Klecknerc542d372014-06-27 17:02:02 +00005024
5025struct EHFlags {
5026 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5027 bool Synch;
5028 bool Asynch;
5029 bool NoExceptC;
5030};
5031
5032/// /EH controls whether to run destructor cleanups when exceptions are
5033/// thrown. There are three modifiers:
5034/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5035/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5036/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5037/// - c: Assume that extern "C" functions are implicitly noexcept. This
5038/// modifier is an optimization, so we ignore it for now.
5039/// The default is /EHs-c-, meaning cleanups are disabled.
5040static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5041 EHFlags EH;
5042 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
5043 for (auto EHVal : EHArgs) {
5044 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5045 switch (EHVal[I]) {
5046 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
5047 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
5048 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
5049 default: break;
5050 }
5051 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5052 break;
5053 }
5054 }
5055 return EH;
5056}
5057
Hans Wennborg75958c42013-08-08 00:17:41 +00005058void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5059 unsigned RTOptionID = options::OPT__SLASH_MT;
5060
Hans Wennborgf1a74252013-09-10 20:18:04 +00005061 if (Args.hasArg(options::OPT__SLASH_LDd))
5062 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5063 // but defining _DEBUG is sticky.
5064 RTOptionID = options::OPT__SLASH_MTd;
5065
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005066 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005067 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005068
Hans Wennborg75958c42013-08-08 00:17:41 +00005069 switch(RTOptionID) {
5070 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00005071 if (Args.hasArg(options::OPT__SLASH_LDd))
5072 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00005073 CmdArgs.push_back("-D_MT");
5074 CmdArgs.push_back("-D_DLL");
5075 CmdArgs.push_back("--dependent-lib=msvcrt");
5076 break;
5077 case options::OPT__SLASH_MDd:
5078 CmdArgs.push_back("-D_DEBUG");
5079 CmdArgs.push_back("-D_MT");
5080 CmdArgs.push_back("-D_DLL");
5081 CmdArgs.push_back("--dependent-lib=msvcrtd");
5082 break;
5083 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00005084 if (Args.hasArg(options::OPT__SLASH_LDd))
5085 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00005086 CmdArgs.push_back("-D_MT");
5087 CmdArgs.push_back("--dependent-lib=libcmt");
5088 break;
5089 case options::OPT__SLASH_MTd:
5090 CmdArgs.push_back("-D_DEBUG");
5091 CmdArgs.push_back("-D_MT");
5092 CmdArgs.push_back("--dependent-lib=libcmtd");
5093 break;
5094 default:
5095 llvm_unreachable("Unexpected option ID.");
5096 }
5097
Reid Kleckner6beca0e2013-08-08 19:33:10 +00005098 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5099 // users want. The /Za flag to cl.exe turns this off, but it's not
5100 // implemented in clang.
5101 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00005102
Hans Wennborg8858a032014-07-21 23:42:07 +00005103 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5104 // would produce interleaved output, so ignore /showIncludes in such cases.
5105 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5106 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5107 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005108
David Majnemerf6072342014-07-01 22:24:56 +00005109 // This controls whether or not we emit RTTI data for polymorphic types.
5110 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5111 /*default=*/false))
5112 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005113
Reid Klecknerc542d372014-06-27 17:02:02 +00005114 const Driver &D = getToolChain().getDriver();
5115 EHFlags EH = parseClangCLEHFlags(D, Args);
5116 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005117 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005118 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005119 CmdArgs.push_back("-fexceptions");
5120 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005121
Hans Wennborge50cec32014-06-13 20:59:54 +00005122 // /EP should expand to -E -P.
5123 if (Args.hasArg(options::OPT__SLASH_EP)) {
5124 CmdArgs.push_back("-E");
5125 CmdArgs.push_back("-P");
5126 }
5127
David Majnemera5b195a2015-02-14 01:35:12 +00005128 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005129 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5130 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005131 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5132 else
5133 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5134
5135 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5136 VolatileOptionID = A->getOption().getID();
5137
5138 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5139 CmdArgs.push_back("-fms-volatile");
5140
David Majnemer86c318f2014-02-11 21:05:00 +00005141 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5142 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5143 if (MostGeneralArg && BestCaseArg)
5144 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5145 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5146
5147 if (MostGeneralArg) {
5148 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5149 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5150 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5151
5152 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5153 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5154 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5155 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5156 << FirstConflict->getAsString(Args)
5157 << SecondConflict->getAsString(Args);
5158
5159 if (SingleArg)
5160 CmdArgs.push_back("-fms-memptr-rep=single");
5161 else if (MultipleArg)
5162 CmdArgs.push_back("-fms-memptr-rep=multiple");
5163 else
5164 CmdArgs.push_back("-fms-memptr-rep=virtual");
5165 }
5166
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005167 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5168 A->render(Args, CmdArgs);
5169
Hans Wennborg81f74482013-09-10 01:07:07 +00005170 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5171 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005172 if (Args.hasArg(options::OPT__SLASH_fallback))
5173 CmdArgs.push_back("msvc-fallback");
5174 else
5175 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005176 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005177}
5178
Hans Wennborg1da044a2014-06-26 19:59:02 +00005179visualstudio::Compile *Clang::getCLFallback() const {
5180 if (!CLFallback)
5181 CLFallback.reset(new visualstudio::Compile(getToolChain()));
5182 return CLFallback.get();
5183}
5184
Daniel Sanders7f933f42015-01-30 17:35:23 +00005185void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5186 ArgStringList &CmdArgs) const {
5187 StringRef CPUName;
5188 StringRef ABIName;
5189 const llvm::Triple &Triple = getToolChain().getTriple();
5190 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5191
5192 CmdArgs.push_back("-target-abi");
5193 CmdArgs.push_back(ABIName.data());
5194}
5195
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005196void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005197 const InputInfo &Output,
5198 const InputInfoList &Inputs,
5199 const ArgList &Args,
5200 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005201 ArgStringList CmdArgs;
5202
5203 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5204 const InputInfo &Input = Inputs[0];
5205
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005206 // Don't warn about "clang -w -c foo.s"
5207 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005208 // and "clang -emit-llvm -c foo.s"
5209 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005210
Rafael Espindola577637a2015-01-03 00:06:04 +00005211 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005212
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005213 // Invoke ourselves in -cc1as mode.
5214 //
5215 // FIXME: Implement custom jobs for internal actions.
5216 CmdArgs.push_back("-cc1as");
5217
5218 // Add the "effective" target triple.
5219 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00005220 std::string TripleStr =
5221 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005222 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5223
5224 // Set the output mode, we currently only expect to be used as a real
5225 // assembler.
5226 CmdArgs.push_back("-filetype");
5227 CmdArgs.push_back("obj");
5228
Eric Christopher45f2e712012-12-18 00:31:10 +00005229 // Set the main file name, so that debug info works even with
5230 // -save-temps or preprocessed assembly.
5231 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005232 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005233
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005234 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005235 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005236 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005237 if (!CPU.empty()) {
5238 CmdArgs.push_back("-target-cpu");
5239 CmdArgs.push_back(Args.MakeArgString(CPU));
5240 }
5241
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005242 // Add the target features
5243 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005244 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005245
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005246 // Ignore explicit -force_cpusubtype_ALL option.
5247 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005248
Eric Christopherfc3ee562012-01-10 00:38:01 +00005249 // Determine the original source input.
5250 const Action *SourceAction = &JA;
5251 while (SourceAction->getKind() != Action::InputClass) {
5252 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5253 SourceAction = SourceAction->getInputs()[0];
5254 }
5255
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005256 // Forward -g and handle debug info related flags, assuming we are dealing
5257 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005258 if (SourceAction->getType() == types::TY_Asm ||
5259 SourceAction->getType() == types::TY_PP_Asm) {
5260 Args.ClaimAllArgs(options::OPT_g_Group);
5261 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5262 if (!A->getOption().matches(options::OPT_g0))
5263 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005264
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005265 if (Args.hasArg(options::OPT_gdwarf_2))
5266 CmdArgs.push_back("-gdwarf-2");
5267 if (Args.hasArg(options::OPT_gdwarf_3))
5268 CmdArgs.push_back("-gdwarf-3");
5269 if (Args.hasArg(options::OPT_gdwarf_4))
5270 CmdArgs.push_back("-gdwarf-4");
5271
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005272 // Add the -fdebug-compilation-dir flag if needed.
5273 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005274
5275 // Set the AT_producer to the clang version when using the integrated
5276 // assembler on assembly source files.
5277 CmdArgs.push_back("-dwarf-debug-producer");
5278 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005279 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005280
5281 // Optionally embed the -cc1as level arguments into the debug info, for build
5282 // analysis.
5283 if (getToolChain().UseDwarfDebugFlags()) {
5284 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005285 for (const auto &Arg : Args)
5286 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005287
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005288 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005289 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5290 Flags += Exec;
5291 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005292 SmallString<128> EscapedArg;
5293 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005294 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005295 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005296 }
5297 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005298 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005299 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005300
5301 // FIXME: Add -static support, once we have it.
5302
Daniel Sanders7f933f42015-01-30 17:35:23 +00005303 // Add target specific flags.
5304 switch(getToolChain().getArch()) {
5305 default:
5306 break;
5307
5308 case llvm::Triple::mips:
5309 case llvm::Triple::mipsel:
5310 case llvm::Triple::mips64:
5311 case llvm::Triple::mips64el:
5312 AddMIPSTargetArgs(Args, CmdArgs);
5313 break;
5314 }
5315
David Blaikie372d9502014-01-17 03:17:40 +00005316 // Consume all the warning flags. Usually this would be handled more
5317 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5318 // doesn't handle that so rather than warning about unused flags that are
5319 // actually used, we'll lie by omission instead.
5320 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005321 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5322 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005323
David Blaikie9260ed62013-07-25 21:19:01 +00005324 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5325 getToolChain().getDriver());
5326
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005327 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005328
5329 assert(Output.isFilename() && "Unexpected lipo output.");
5330 CmdArgs.push_back("-o");
5331 CmdArgs.push_back(Output.getFilename());
5332
Daniel Dunbarb440f562010-08-02 02:38:21 +00005333 assert(Input.isFilename() && "Invalid input.");
5334 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005335
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005336 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005337 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005338
5339 // Handle the debug info splitting at object creation time if we're
5340 // creating an object.
5341 // TODO: Currently only works on linux with newer objcopy.
5342 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005343 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005344 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005345 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005346}
5347
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005348void GnuTool::anchor() {}
5349
Daniel Dunbara3246a02009-03-18 08:07:30 +00005350void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005351 const InputInfo &Output,
5352 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005353 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005354 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005355 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005356 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005357
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005358 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005359 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005360 // Don't forward any -g arguments to assembly steps.
5361 if (isa<AssembleJobAction>(JA) &&
5362 A->getOption().matches(options::OPT_g_Group))
5363 continue;
5364
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005365 // Don't forward any -W arguments to assembly and link steps.
5366 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5367 A->getOption().matches(options::OPT_W_Group))
5368 continue;
5369
Daniel Dunbar2da02722009-03-19 07:55:12 +00005370 // It is unfortunate that we have to claim here, as this means
5371 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005372 // platforms using a generic gcc, even if we are just using gcc
5373 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005374 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005375 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005376 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005377 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005378
Daniel Dunbar4e295052010-01-25 22:35:08 +00005379 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005380
5381 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005382 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005383 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005384 CmdArgs.push_back(
5385 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005386 }
5387
Daniel Dunbar5716d872009-05-02 21:41:52 +00005388 // Try to force gcc to match the tool chain we want, if we recognize
5389 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005390 //
5391 // FIXME: The triple class should directly provide the information we want
5392 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005393 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005394 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005395 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005396 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5397 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005398 CmdArgs.push_back("-m64");
5399
Daniel Dunbarb440f562010-08-02 02:38:21 +00005400 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005401 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005402 CmdArgs.push_back(Output.getFilename());
5403 } else {
5404 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005405 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005406 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005407
Tony Linthicum76329bf2011-12-12 21:14:55 +00005408 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5409 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005410
5411 // Only pass -x if gcc will understand it; otherwise hope gcc
5412 // understands the suffix correctly. The main use case this would go
5413 // wrong in is for linker inputs if they happened to have an odd
5414 // suffix; really the only way to get this to happen is a command
5415 // like '-x foobar a.c' which will treat a.c like a linker input.
5416 //
5417 // FIXME: For the linker case specifically, can we safely convert
5418 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005419 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005420 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005421 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5422 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005423 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005424 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005425 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005426 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005427 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005428 else if (II.getType() == types::TY_ModuleFile)
5429 D.Diag(diag::err_drv_no_module_support)
5430 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005431
Daniel Dunbara3246a02009-03-18 08:07:30 +00005432 if (types::canTypeBeUserSpecified(II.getType())) {
5433 CmdArgs.push_back("-x");
5434 CmdArgs.push_back(types::getTypeName(II.getType()));
5435 }
5436
Daniel Dunbarb440f562010-08-02 02:38:21 +00005437 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005438 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005439 else {
5440 const Arg &A = II.getInputArg();
5441
5442 // Reverse translate some rewritten options.
5443 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5444 CmdArgs.push_back("-lstdc++");
5445 continue;
5446 }
5447
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005448 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005449 A.render(Args, CmdArgs);
5450 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005451 }
5452
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005453 const std::string customGCCName = D.getCCCGenericGCCName();
5454 const char *GCCName;
5455 if (!customGCCName.empty())
5456 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005457 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005458 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005459 } else
5460 GCCName = "gcc";
5461
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005462 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005463 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005464 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005465}
5466
Daniel Dunbar4e295052010-01-25 22:35:08 +00005467void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5468 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005469 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005470}
5471
Daniel Dunbar4e295052010-01-25 22:35:08 +00005472void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5473 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005474 const Driver &D = getToolChain().getDriver();
5475
Eric Christophercc7ff502015-01-29 00:56:17 +00005476 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005477 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005478 case types::TY_LLVM_IR:
5479 case types::TY_LTO_IR:
5480 case types::TY_LLVM_BC:
5481 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005482 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005483 break;
5484 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005485 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005486 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005487 case types::TY_Nothing:
5488 CmdArgs.push_back("-fsyntax-only");
5489 break;
5490 default:
5491 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005492 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005493}
5494
Daniel Dunbar4e295052010-01-25 22:35:08 +00005495void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5496 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005497 // The types are (hopefully) good enough.
5498}
5499
Tony Linthicum76329bf2011-12-12 21:14:55 +00005500// Hexagon tools start.
5501void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5502 ArgStringList &CmdArgs) const {
5503
5504}
5505void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5506 const InputInfo &Output,
5507 const InputInfoList &Inputs,
5508 const ArgList &Args,
5509 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005510 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005511
5512 const Driver &D = getToolChain().getDriver();
5513 ArgStringList CmdArgs;
5514
5515 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005516 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005517 CmdArgs.push_back(Args.MakeArgString(MarchString));
5518
5519 RenderExtraToolArgs(JA, CmdArgs);
5520
5521 if (Output.isFilename()) {
5522 CmdArgs.push_back("-o");
5523 CmdArgs.push_back(Output.getFilename());
5524 } else {
5525 assert(Output.isNothing() && "Unexpected output");
5526 CmdArgs.push_back("-fsyntax-only");
5527 }
5528
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005529 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
5530 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005531
Matthew Curtise5df3812012-12-07 17:23:04 +00005532 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5533 options::OPT_Xassembler);
5534
Tony Linthicum76329bf2011-12-12 21:14:55 +00005535 // Only pass -x if gcc will understand it; otherwise hope gcc
5536 // understands the suffix correctly. The main use case this would go
5537 // wrong in is for linker inputs if they happened to have an odd
5538 // suffix; really the only way to get this to happen is a command
5539 // like '-x foobar a.c' which will treat a.c like a linker input.
5540 //
5541 // FIXME: For the linker case specifically, can we safely convert
5542 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005543 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005544 // Don't try to pass LLVM or AST inputs to a generic gcc.
5545 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5546 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5547 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5548 << getToolChain().getTripleString();
5549 else if (II.getType() == types::TY_AST)
5550 D.Diag(clang::diag::err_drv_no_ast_support)
5551 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005552 else if (II.getType() == types::TY_ModuleFile)
5553 D.Diag(diag::err_drv_no_module_support)
5554 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005555
5556 if (II.isFilename())
5557 CmdArgs.push_back(II.getFilename());
5558 else
5559 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5560 II.getInputArg().render(Args, CmdArgs);
5561 }
5562
5563 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005564 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005565 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005566}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005567
Tony Linthicum76329bf2011-12-12 21:14:55 +00005568void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5569 ArgStringList &CmdArgs) const {
5570 // The types are (hopefully) good enough.
5571}
5572
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005573static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5574 const toolchains::Hexagon_TC& ToolChain,
5575 const InputInfo &Output,
5576 const InputInfoList &Inputs,
5577 const ArgList &Args,
5578 ArgStringList &CmdArgs,
5579 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005580
Matthew Curtise689b052012-12-06 15:46:07 +00005581 const Driver &D = ToolChain.getDriver();
5582
Tony Linthicum76329bf2011-12-12 21:14:55 +00005583
Matthew Curtise689b052012-12-06 15:46:07 +00005584 //----------------------------------------------------------------------------
5585 //
5586 //----------------------------------------------------------------------------
5587 bool hasStaticArg = Args.hasArg(options::OPT_static);
5588 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005589 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005590 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5591 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5592 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005593 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005594 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005595
Matthew Curtise689b052012-12-06 15:46:07 +00005596 //----------------------------------------------------------------------------
5597 // Silence warnings for various options
5598 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005599
Matthew Curtise689b052012-12-06 15:46:07 +00005600 Args.ClaimAllArgs(options::OPT_g_Group);
5601 Args.ClaimAllArgs(options::OPT_emit_llvm);
5602 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5603 // handled somewhere else.
5604 Args.ClaimAllArgs(options::OPT_static_libgcc);
5605
5606 //----------------------------------------------------------------------------
5607 //
5608 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005609 for (const auto &Opt : ToolChain.ExtraOpts)
5610 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005611
Matthew Curtisf10a5952012-12-06 14:16:43 +00005612 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5613 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005614
Matthew Curtise689b052012-12-06 15:46:07 +00005615 if (buildingLib) {
5616 CmdArgs.push_back("-shared");
5617 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5618 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005619 }
5620
Matthew Curtise689b052012-12-06 15:46:07 +00005621 if (hasStaticArg)
5622 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005623
Matthew Curtise8f80a12012-12-06 17:49:03 +00005624 if (buildPIE && !buildingLib)
5625 CmdArgs.push_back("-pie");
5626
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005627 if (const char* v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
5628 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5629 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005630 }
5631
Matthew Curtise689b052012-12-06 15:46:07 +00005632 //----------------------------------------------------------------------------
5633 //
5634 //----------------------------------------------------------------------------
5635 CmdArgs.push_back("-o");
5636 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005637
Matthew Curtise689b052012-12-06 15:46:07 +00005638 const std::string MarchSuffix = "/" + MarchString;
5639 const std::string G0Suffix = "/G0";
5640 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005641 const std::string RootDir =
5642 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005643 const std::string StartFilesDir = RootDir
5644 + "hexagon/lib"
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005645 + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005646
5647 //----------------------------------------------------------------------------
5648 // moslib
5649 //----------------------------------------------------------------------------
5650 std::vector<std::string> oslibs;
5651 bool hasStandalone= false;
5652
Sean Silva14facf32015-06-09 01:57:17 +00005653 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5654 A->claim();
5655 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005656 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005657 }
Matthew Curtise689b052012-12-06 15:46:07 +00005658 if (oslibs.empty()) {
5659 oslibs.push_back("standalone");
5660 hasStandalone = true;
5661 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005662
Matthew Curtise689b052012-12-06 15:46:07 +00005663 //----------------------------------------------------------------------------
5664 // Start Files
5665 //----------------------------------------------------------------------------
5666 if (incStdLib && incStartFiles) {
5667
5668 if (!buildingLib) {
5669 if (hasStandalone) {
5670 CmdArgs.push_back(
5671 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5672 }
5673 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5674 }
5675 std::string initObj = useShared ? "/initS.o" : "/init.o";
5676 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5677 }
5678
5679 //----------------------------------------------------------------------------
5680 // Library Search Paths
5681 //----------------------------------------------------------------------------
5682 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005683 for (const auto &LibPath : LibPaths)
5684 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005685
5686 //----------------------------------------------------------------------------
5687 //
5688 //----------------------------------------------------------------------------
5689 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5690 Args.AddAllArgs(CmdArgs, options::OPT_e);
5691 Args.AddAllArgs(CmdArgs, options::OPT_s);
5692 Args.AddAllArgs(CmdArgs, options::OPT_t);
5693 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5694
5695 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5696
5697 //----------------------------------------------------------------------------
5698 // Libraries
5699 //----------------------------------------------------------------------------
5700 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005701 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005702 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5703 CmdArgs.push_back("-lm");
5704 }
5705
5706 CmdArgs.push_back("--start-group");
5707
5708 if (!buildingLib) {
5709 for(std::vector<std::string>::iterator i = oslibs.begin(),
5710 e = oslibs.end(); i != e; ++i)
5711 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5712 CmdArgs.push_back("-lc");
5713 }
5714 CmdArgs.push_back("-lgcc");
5715
5716 CmdArgs.push_back("--end-group");
5717 }
5718
5719 //----------------------------------------------------------------------------
5720 // End files
5721 //----------------------------------------------------------------------------
5722 if (incStdLib && incStartFiles) {
5723 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5724 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5725 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005726}
5727
5728void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5729 const InputInfo &Output,
5730 const InputInfoList &Inputs,
5731 const ArgList &Args,
5732 const char *LinkingOutput) const {
5733
5734 const toolchains::Hexagon_TC& ToolChain =
5735 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5736
5737 ArgStringList CmdArgs;
5738 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5739 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005740
5741 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005742 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5743 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005744}
5745// Hexagon tools end.
5746
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005747const std::string arm::getARMArch(const ArgList &Args,
5748 const llvm::Triple &Triple) {
5749 std::string MArch;
Bernard Ogden31561762013-12-12 13:27:11 +00005750 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5751 // Otherwise, if we have -march= choose the base CPU for that arch.
5752 MArch = A->getValue();
5753 } else {
5754 // Otherwise, use the Arch from the triple.
5755 MArch = Triple.getArchName();
5756 }
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005757 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005758
5759 // Handle -march=native.
5760 if (MArch == "native") {
5761 std::string CPU = llvm::sys::getHostCPUName();
5762 if (CPU != "generic") {
5763 // Translate the native cpu into the architecture suffix for that CPU.
5764 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5765 // If there is no valid architecture suffix for this CPU we don't know how
5766 // to handle it, so return no architecture.
5767 if (strcmp(Suffix,"") == 0)
5768 MArch = "";
5769 else
5770 MArch = std::string("arm") + Suffix;
5771 }
5772 }
5773
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005774 return MArch;
5775}
5776/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5777const char *arm::getARMCPUForMArch(const ArgList &Args,
5778 const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005779 std::string MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005780 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5781 // here means an -march=native that we can't handle, so instead return no CPU.
5782 if (MArch.empty())
5783 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005784
John Brawna95c1a82015-05-08 12:52:18 +00005785 // We need to return an empty string here on invalid MArch values as the
5786 // various places that call this function can't cope with a null result.
5787 const char *result = Triple.getARMCPUForArch(MArch);
5788 if (result)
5789 return result;
5790 else
5791 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005792}
5793
5794/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Gabor Ballabas208826c2015-06-04 17:56:32 +00005795std::string arm::getARMTargetCPU(const ArgList &Args,
Rafael Espindola80d333b2013-12-12 15:48:19 +00005796 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005797 // FIXME: Warn on inconsistent use of -mcpu and -march.
5798 // If we have -mcpu=, use that.
5799 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +00005800 std::string MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005801 // Handle -mcpu=native.
5802 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005803 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005804 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005805 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005806 }
5807
5808 return getARMCPUForMArch(Args, Triple);
5809}
5810
5811/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005812/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005813// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005814const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005815 if (CPU == "generic" &&
5816 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5817 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005818
Renato Golin3c007252015-05-28 15:05:53 +00005819 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5820 if (ArchKind == llvm::ARM::AK_INVALID)
5821 return "";
5822 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005823}
5824
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005825void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
5826 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005827 if (Args.hasArg(options::OPT_r))
5828 return;
5829
John Brawn94fd9632015-05-21 12:19:49 +00005830 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5831 // to generate BE-8 executables.
5832 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5833 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005834}
5835
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005836mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5837 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5838 .Case("mips1", NanLegacy)
5839 .Case("mips2", NanLegacy)
5840 .Case("mips3", NanLegacy)
5841 .Case("mips4", NanLegacy)
5842 .Case("mips5", NanLegacy)
5843 .Case("mips32", NanLegacy)
5844 .Case("mips32r2", NanLegacy)
5845 .Case("mips32r3", NanLegacy | Nan2008)
5846 .Case("mips32r5", NanLegacy | Nan2008)
5847 .Case("mips32r6", Nan2008)
5848 .Case("mips64", NanLegacy)
5849 .Case("mips64r2", NanLegacy)
5850 .Case("mips64r3", NanLegacy | Nan2008)
5851 .Case("mips64r5", NanLegacy | Nan2008)
5852 .Case("mips64r6", Nan2008)
5853 .Default(NanLegacy);
5854}
5855
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005856bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5857 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5858 return A && (A->getValue() == StringRef(Value));
5859}
5860
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005861bool mips::isUCLibc(const ArgList &Args) {
5862 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005863 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005864}
5865
Daniel Sanders2bf13662014-07-10 14:40:57 +00005866bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005867 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5868 return llvm::StringSwitch<bool>(NaNArg->getValue())
5869 .Case("2008", true)
5870 .Case("legacy", false)
5871 .Default(false);
5872
5873 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005874 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5875 .Cases("mips32r6", "mips64r6", true)
5876 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005877
5878 return false;
5879}
5880
Daniel Sanders379d44b2014-07-16 11:52:23 +00005881bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00005882 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00005883 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005884 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005885 return false;
5886
5887 if (ABIName != "32")
5888 return false;
5889
Toma Tabacu94ea6862015-06-16 13:54:13 +00005890 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
5891 // present.
5892 if (FloatABI == "soft")
5893 return false;
5894
Daniel Sanders379d44b2014-07-16 11:52:23 +00005895 return llvm::StringSwitch<bool>(CPUName)
5896 .Cases("mips2", "mips3", "mips4", "mips5", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005897 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5898 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005899 .Default(false);
5900}
5901
Toma Tabacu94ea6862015-06-16 13:54:13 +00005902bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
5903 StringRef CPUName, StringRef ABIName,
5904 StringRef FloatABI) {
5905 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
5906
5907 // FPXX shouldn't be used if -msingle-float is present.
5908 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
5909 options::OPT_mdouble_float))
5910 if (A->getOption().matches(options::OPT_msingle_float))
5911 UseFPXX = false;
5912
5913 return UseFPXX;
5914}
5915
Tim Northover157d9112014-01-16 08:48:16 +00005916llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005917 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5918 // archs which Darwin doesn't use.
5919
5920 // The matching this routine does is fairly pointless, since it is neither the
5921 // complete architecture list, nor a reasonable subset. The problem is that
5922 // historically the driver driver accepts this and also ties its -march=
5923 // handling to the architecture name, so we need to be careful before removing
5924 // support for it.
5925
5926 // This code must be kept in sync with Clang's Darwin specific argument
5927 // translation.
5928
5929 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5930 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5931 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5932 .Case("ppc64", llvm::Triple::ppc64)
5933 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5934 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5935 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005936 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005937 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005938 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005939 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005940 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005941 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005942 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005943 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005944 .Case("nvptx", llvm::Triple::nvptx)
5945 .Case("nvptx64", llvm::Triple::nvptx64)
5946 .Case("amdil", llvm::Triple::amdil)
5947 .Case("spir", llvm::Triple::spir)
5948 .Default(llvm::Triple::UnknownArch);
5949}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005950
Tim Northover157d9112014-01-16 08:48:16 +00005951void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005952 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00005953 T.setArch(Arch);
5954
5955 if (Str == "x86_64h")
5956 T.setArchName(Str);
5957 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5958 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005959 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005960 }
5961}
5962
Bob Wilsondecc03e2012-11-23 06:14:39 +00005963const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005964 const InputInfo &Input) {
5965 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005966}
5967
Bob Wilsondecc03e2012-11-23 06:14:39 +00005968const char *Clang::getBaseInputStem(const ArgList &Args,
5969 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005970 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005971
Chris Lattner906bb902011-01-16 08:14:11 +00005972 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005973 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005974
5975 return Str;
5976}
5977
Bob Wilsondecc03e2012-11-23 06:14:39 +00005978const char *Clang::getDependencyFileName(const ArgList &Args,
5979 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005980 // FIXME: Think about this more.
5981 std::string Res;
5982
5983 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005984 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005985 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005986 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005987 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005988 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005989 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005990}
5991
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005992void cloudabi::Link::ConstructJob(Compilation &C, const JobAction &JA,
5993 const InputInfo &Output,
5994 const InputInfoList &Inputs,
5995 const ArgList &Args,
5996 const char *LinkingOutput) const {
5997 const ToolChain &ToolChain = getToolChain();
5998 const Driver &D = ToolChain.getDriver();
5999 ArgStringList CmdArgs;
6000
6001 // Silence warning for "clang -g foo.o -o foo"
6002 Args.ClaimAllArgs(options::OPT_g_Group);
6003 // and "clang -emit-llvm foo.o -o foo"
6004 Args.ClaimAllArgs(options::OPT_emit_llvm);
6005 // and for "clang -w foo.o -o foo". Other warning options are already
6006 // handled somewhere else.
6007 Args.ClaimAllArgs(options::OPT_w);
6008
6009 if (!D.SysRoot.empty())
6010 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6011
6012 // CloudABI only supports static linkage.
6013 CmdArgs.push_back("-Bstatic");
6014 CmdArgs.push_back("--eh-frame-hdr");
6015 CmdArgs.push_back("--gc-sections");
6016
6017 if (Output.isFilename()) {
6018 CmdArgs.push_back("-o");
6019 CmdArgs.push_back(Output.getFilename());
6020 } else {
6021 assert(Output.isNothing() && "Invalid output.");
6022 }
6023
6024 if (!Args.hasArg(options::OPT_nostdlib) &&
6025 !Args.hasArg(options::OPT_nostartfiles)) {
6026 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6027 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6028 }
6029
6030 Args.AddAllArgs(CmdArgs, options::OPT_L);
6031 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6032 for (const auto &Path : Paths)
6033 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
6034 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6035 Args.AddAllArgs(CmdArgs, options::OPT_e);
6036 Args.AddAllArgs(CmdArgs, options::OPT_s);
6037 Args.AddAllArgs(CmdArgs, options::OPT_t);
6038 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6039 Args.AddAllArgs(CmdArgs, options::OPT_r);
6040
Alexey Samsonov907880e2015-06-19 19:57:46 +00006041 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006042 AddGoldPlugin(ToolChain, Args, CmdArgs);
6043
6044 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6045
6046 if (!Args.hasArg(options::OPT_nostdlib) &&
6047 !Args.hasArg(options::OPT_nodefaultlibs)) {
6048 if (D.CCCIsCXX())
6049 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6050 CmdArgs.push_back("-lc");
6051 CmdArgs.push_back("-lcompiler_rt");
6052 }
6053
6054 if (!Args.hasArg(options::OPT_nostdlib) &&
6055 !Args.hasArg(options::OPT_nostartfiles))
6056 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6057
6058 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
6059 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
6060}
6061
Daniel Dunbarbe220842009-03-20 16:06:39 +00006062void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006063 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006064 const InputInfoList &Inputs,
6065 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00006066 const char *LinkingOutput) const {
6067 ArgStringList CmdArgs;
6068
6069 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6070 const InputInfo &Input = Inputs[0];
6071
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006072 // Determine the original source input.
6073 const Action *SourceAction = &JA;
6074 while (SourceAction->getKind() != Action::InputClass) {
6075 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6076 SourceAction = SourceAction->getInputs()[0];
6077 }
6078
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006079 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006080 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006081 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6082 // FIXME: at run-time detect assembler capabilities or rely on version
6083 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006084 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006085 const llvm::Triple &T(getToolChain().getTriple());
6086 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006087 CmdArgs.push_back("-Q");
6088 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006089
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006090 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006091 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006092 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006093 if (Args.hasArg(options::OPT_gstabs))
6094 CmdArgs.push_back("--gstabs");
6095 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006096 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006097 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006098
Daniel Dunbarbe220842009-03-20 16:06:39 +00006099 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006100 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006101
Daniel Dunbar6d484762010-07-22 01:47:22 +00006102 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006103 if (getToolChain().getArch() == llvm::Triple::x86 ||
6104 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006105 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6106 CmdArgs.push_back("-force_cpusubtype_ALL");
6107
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006108 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006109 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006110 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006111 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006112 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006113 CmdArgs.push_back("-static");
6114
Daniel Dunbarbe220842009-03-20 16:06:39 +00006115 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6116 options::OPT_Xassembler);
6117
6118 assert(Output.isFilename() && "Unexpected lipo output.");
6119 CmdArgs.push_back("-o");
6120 CmdArgs.push_back(Output.getFilename());
6121
Daniel Dunbarb440f562010-08-02 02:38:21 +00006122 assert(Input.isFilename() && "Invalid input.");
6123 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006124
6125 // asm_final spec is empty.
6126
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006127 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006128 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006129 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006130}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006131
Tim Northover157d9112014-01-16 08:48:16 +00006132void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006133
Tim Northover157d9112014-01-16 08:48:16 +00006134void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6135 ArgStringList &CmdArgs) const {
6136 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006137
Daniel Dunbarc1964212009-03-26 16:23:12 +00006138 // Derived from darwin_arch spec.
6139 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006140 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006141
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006142 // FIXME: Is this needed anymore?
6143 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006144 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006145}
6146
Bill Wendling3b2000f2012-10-02 18:02:50 +00006147bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
6148 // We only need to generate a temp path for LTO if we aren't compiling object
6149 // files. When compiling source files, we run 'dsymutil' after linking. We
6150 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006151 for (const auto &Input : Inputs)
6152 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006153 return true;
6154
6155 return false;
6156}
6157
Daniel Dunbarccbc4522010-09-09 21:51:05 +00006158void darwin::Link::AddLinkArgs(Compilation &C,
6159 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00006160 ArgStringList &CmdArgs,
6161 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006162 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006163 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006164
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006165 unsigned Version[3] = { 0, 0, 0 };
6166 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6167 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00006168 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006169 Version[1], Version[2], HadExtra) ||
6170 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006171 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006172 << A->getAsString(Args);
6173 }
6174
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006175 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006176 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006177 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6178 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006179
Bob Wilson3d27dad2013-08-02 22:25:34 +00006180 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6181 CmdArgs.push_back("-export_dynamic");
6182
Bob Wilsonb111ec92015-03-02 19:01:14 +00006183 // If we are using App Extension restrictions, pass a flag to the linker
6184 // telling it that the compiled code has been audited.
6185 if (Args.hasFlag(options::OPT_fapplication_extension,
6186 options::OPT_fno_application_extension, false))
6187 CmdArgs.push_back("-application_extension");
6188
Bill Wendling313b6bf2012-11-16 23:03:00 +00006189 // If we are using LTO, then automatically create a temporary file path for
6190 // the linker to use, so that it's lifetime will extend past a possible
6191 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006192 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006193 const char *TmpPath = C.getArgs().MakeArgString(
6194 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6195 C.addTempFile(TmpPath);
6196 CmdArgs.push_back("-object_path_lto");
6197 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006198 }
6199
Daniel Dunbarc1964212009-03-26 16:23:12 +00006200 // Derived from the "link" spec.
6201 Args.AddAllArgs(CmdArgs, options::OPT_static);
6202 if (!Args.hasArg(options::OPT_static))
6203 CmdArgs.push_back("-dynamic");
6204 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6205 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6206 // here. How do we wish to handle such things?
6207 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006208
Daniel Dunbarc1964212009-03-26 16:23:12 +00006209 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006210 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006211 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006212 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006213
6214 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6215 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6216 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6217
6218 Arg *A;
6219 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6220 (A = Args.getLastArg(options::OPT_current__version)) ||
6221 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006222 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006223 << A->getAsString(Args) << "-dynamiclib";
6224
6225 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6226 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6227 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6228 } else {
6229 CmdArgs.push_back("-dylib");
6230
6231 Arg *A;
6232 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6233 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6234 (A = Args.getLastArg(options::OPT_client__name)) ||
6235 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6236 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6237 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006238 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00006239 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006240
Daniel Dunbarc1964212009-03-26 16:23:12 +00006241 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6242 "-dylib_compatibility_version");
6243 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6244 "-dylib_current_version");
6245
Tim Northover157d9112014-01-16 08:48:16 +00006246 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006247
6248 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6249 "-dylib_install_name");
6250 }
6251
6252 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6253 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6254 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006255 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006256 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006257 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6258 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6259 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6260 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6261 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6262 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006263 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006264 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6265 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6266 Args.AddAllArgs(CmdArgs, options::OPT_init);
6267
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006268 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006269 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006270
Daniel Dunbarc1964212009-03-26 16:23:12 +00006271 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6272 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6273 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6274 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6275 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006276
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006277 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6278 options::OPT_fno_pie,
6279 options::OPT_fno_PIE)) {
6280 if (A->getOption().matches(options::OPT_fpie) ||
6281 A->getOption().matches(options::OPT_fPIE))
6282 CmdArgs.push_back("-pie");
6283 else
6284 CmdArgs.push_back("-no_pie");
6285 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006286
6287 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6288 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6289 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6290 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6291 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6292 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6293 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6294 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6295 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6296 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6297 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6298 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6299 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6300 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6301 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6302 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006303
Daniel Dunbar84384642011-05-02 21:03:47 +00006304 // Give --sysroot= preference, over the Apple specific behavior to also use
6305 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006306 StringRef sysroot = C.getSysRoot();
6307 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006308 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006309 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006310 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6311 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006312 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006313 }
6314
Daniel Dunbarc1964212009-03-26 16:23:12 +00006315 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6316 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6317 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6318 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6319 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006320 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006321 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6322 Args.AddAllArgs(CmdArgs, options::OPT_y);
6323 Args.AddLastArg(CmdArgs, options::OPT_w);
6324 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6325 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6326 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6327 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6328 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6329 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6330 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6331 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6332 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6333 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6334 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6335 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6336}
6337
6338void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006339 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006340 const InputInfoList &Inputs,
6341 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00006342 const char *LinkingOutput) const {
6343 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006344
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006345 // If the number of arguments surpasses the system limits, we will encode the
6346 // input files in a separate file, shortening the command line. To this end,
6347 // build a list of input file names that can be passed via a file with the
6348 // -filelist linker option.
6349 llvm::opt::ArgStringList InputFileList;
6350
Daniel Dunbarc1964212009-03-26 16:23:12 +00006351 // The logic here is derived from gcc's behavior; most of which
6352 // comes from specs (starting with link_command). Consult gcc for
6353 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006354 ArgStringList CmdArgs;
6355
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006356 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6357 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6358 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006359 for (const auto &Arg : Args)
6360 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006361 const char *Exec =
6362 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
6363 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006364 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006365 return;
6366 }
6367
Daniel Dunbarc1964212009-03-26 16:23:12 +00006368 // I'm not sure why this particular decomposition exists in gcc, but
6369 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006370 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006371
Daniel Dunbarc1964212009-03-26 16:23:12 +00006372 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6373 Args.AddAllArgs(CmdArgs, options::OPT_s);
6374 Args.AddAllArgs(CmdArgs, options::OPT_t);
6375 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6376 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006377 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006378 Args.AddAllArgs(CmdArgs, options::OPT_r);
6379
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006380 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6381 // members of static archive libraries which implement Objective-C classes or
6382 // categories.
6383 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6384 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006385
Daniel Dunbarc1964212009-03-26 16:23:12 +00006386 CmdArgs.push_back("-o");
6387 CmdArgs.push_back(Output.getFilename());
6388
Chad Rosier06fd3c62012-05-16 23:45:12 +00006389 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006390 !Args.hasArg(options::OPT_nostartfiles))
6391 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006392
Peter Collingbournec4122c12015-06-15 21:08:13 +00006393 // SafeStack requires its own runtime libraries
6394 // These libraries should be linked first, to make sure the
6395 // __safestack_init constructor executes before everything else
6396 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6397 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6398 "libclang_rt.safestack_osx.a",
6399 /*AlwaysLink=*/true);
6400 }
6401
Daniel Dunbarc1964212009-03-26 16:23:12 +00006402 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006403
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006404 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6405 options::OPT_fno_openmp, false)) {
6406 switch (getOpenMPRuntime(getToolChain(), Args)) {
6407 case OMPRT_OMP:
6408 CmdArgs.push_back("-lomp");
6409 break;
6410 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006411 CmdArgs.push_back("-lgomp");
6412 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006413 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006414 CmdArgs.push_back("-liomp5");
6415 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006416 case OMPRT_Unknown:
6417 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006418 break;
6419 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006420 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006421
Douglas Gregor9295df02012-05-15 21:00:27 +00006422 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006423 // Build the input file for -filelist (list of linker input files) in case we
6424 // need it later
6425 for (const auto &II : Inputs) {
6426 if (!II.isFilename()) {
6427 // This is a linker input argument.
6428 // We cannot mix input arguments and file names in a -filelist input, thus
6429 // we prematurely stop our list (remaining files shall be passed as
6430 // arguments).
6431 if (InputFileList.size() > 0)
6432 break;
6433
6434 continue;
6435 }
6436
6437 InputFileList.push_back(II.getFilename());
6438 }
6439
Bob Wilson16d93952012-05-15 18:57:39 +00006440 if (isObjCRuntimeLinked(Args) &&
6441 !Args.hasArg(options::OPT_nostdlib) &&
6442 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006443 // We use arclite library for both ARC and subscripting support.
6444 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6445
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006446 CmdArgs.push_back("-framework");
6447 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006448 // Link libobj.
6449 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006450 }
John McCall31168b02011-06-15 23:02:42 +00006451
Daniel Dunbarc1964212009-03-26 16:23:12 +00006452 if (LinkingOutput) {
6453 CmdArgs.push_back("-arch_multiple");
6454 CmdArgs.push_back("-final_output");
6455 CmdArgs.push_back(LinkingOutput);
6456 }
6457
Daniel Dunbarc1964212009-03-26 16:23:12 +00006458 if (Args.hasArg(options::OPT_fnested_functions))
6459 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006460
Justin Bognerc7701242015-05-12 05:44:36 +00006461 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6462 // paths are different enough from other toolchains that this needs a fair
6463 // amount of refactoring done first.
6464 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6465
Daniel Dunbarc1964212009-03-26 16:23:12 +00006466 if (!Args.hasArg(options::OPT_nostdlib) &&
6467 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006468 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006469 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006470
Daniel Dunbarc1964212009-03-26 16:23:12 +00006471 // link_ssp spec is empty.
6472
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006473 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006474 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006475 }
6476
Chad Rosier06fd3c62012-05-16 23:45:12 +00006477 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006478 !Args.hasArg(options::OPT_nostartfiles)) {
6479 // endfile_spec is empty.
6480 }
6481
6482 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6483 Args.AddAllArgs(CmdArgs, options::OPT_F);
6484
Steven Wu3ffb61b2015-02-06 18:08:29 +00006485 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006486 for (const Arg *A : Args.filtered(options::OPT_iframework))
6487 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006488
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006489 if (!Args.hasArg(options::OPT_nostdlib) &&
6490 !Args.hasArg(options::OPT_nodefaultlibs)) {
6491 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6492 if (A->getValue() == StringRef("Accelerate")) {
6493 CmdArgs.push_back("-framework");
6494 CmdArgs.push_back("Accelerate");
6495 }
6496 }
6497 }
6498
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006499 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006500 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006501 std::unique_ptr<Command> Cmd =
6502 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6503 Cmd->setInputFileList(std::move(InputFileList));
6504 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006505}
6506
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006507void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006508 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006509 const InputInfoList &Inputs,
6510 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006511 const char *LinkingOutput) const {
6512 ArgStringList CmdArgs;
6513
6514 CmdArgs.push_back("-create");
6515 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006516
6517 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006518 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006519
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006520 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006521 assert(II.isFilename() && "Unexpected lipo input.");
6522 CmdArgs.push_back(II.getFilename());
6523 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006524
6525 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006526 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006527}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006528
Daniel Dunbar88299622010-06-04 18:28:36 +00006529void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006530 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006531 const InputInfoList &Inputs,
6532 const ArgList &Args,
6533 const char *LinkingOutput) const {
6534 ArgStringList CmdArgs;
6535
Daniel Dunbareb86b042011-05-09 17:23:16 +00006536 CmdArgs.push_back("-o");
6537 CmdArgs.push_back(Output.getFilename());
6538
Daniel Dunbar88299622010-06-04 18:28:36 +00006539 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6540 const InputInfo &Input = Inputs[0];
6541 assert(Input.isFilename() && "Unexpected dsymutil input.");
6542 CmdArgs.push_back(Input.getFilename());
6543
Daniel Dunbar88299622010-06-04 18:28:36 +00006544 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006545 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006546 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006547}
6548
Eric Christopher551ef452011-08-23 17:56:55 +00006549void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006550 const InputInfo &Output,
6551 const InputInfoList &Inputs,
6552 const ArgList &Args,
6553 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006554 ArgStringList CmdArgs;
6555 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006556 CmdArgs.push_back("--debug-info");
6557 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006558 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006559
6560 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6561 const InputInfo &Input = Inputs[0];
6562 assert(Input.isFilename() && "Unexpected verify input");
6563
6564 // Grabbing the output of the earlier dsymutil run.
6565 CmdArgs.push_back(Input.getFilename());
6566
6567 const char *Exec =
6568 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006569 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006570}
6571
David Chisnallf571cde2012-02-15 13:39:01 +00006572void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6573 const InputInfo &Output,
6574 const InputInfoList &Inputs,
6575 const ArgList &Args,
6576 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006577 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006578 ArgStringList CmdArgs;
6579
6580 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6581 options::OPT_Xassembler);
6582
6583 CmdArgs.push_back("-o");
6584 CmdArgs.push_back(Output.getFilename());
6585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006586 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006587 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006588
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006589 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006590 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006591}
6592
David Chisnallf571cde2012-02-15 13:39:01 +00006593void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6594 const InputInfo &Output,
6595 const InputInfoList &Inputs,
6596 const ArgList &Args,
6597 const char *LinkingOutput) const {
6598 // FIXME: Find a real GCC, don't hard-code versions here
6599 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6600 const llvm::Triple &T = getToolChain().getTriple();
6601 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006602 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006603 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006604 case llvm::Triple::x86:
6605 GCCLibPath +=
6606 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6607 break;
6608 case llvm::Triple::x86_64:
6609 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6610 GCCLibPath += "/4.5.2/amd64/";
6611 LibPath += "amd64/";
6612 break;
6613 default:
6614 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006615 }
6616
6617 ArgStringList CmdArgs;
6618
David Chisnall272a0712012-02-29 15:06:12 +00006619 // Demangle C++ names in errors
6620 CmdArgs.push_back("-C");
6621
David Chisnallf571cde2012-02-15 13:39:01 +00006622 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6623 (!Args.hasArg(options::OPT_shared))) {
6624 CmdArgs.push_back("-e");
6625 CmdArgs.push_back("_start");
6626 }
6627
6628 if (Args.hasArg(options::OPT_static)) {
6629 CmdArgs.push_back("-Bstatic");
6630 CmdArgs.push_back("-dn");
6631 } else {
6632 CmdArgs.push_back("-Bdynamic");
6633 if (Args.hasArg(options::OPT_shared)) {
6634 CmdArgs.push_back("-shared");
6635 } else {
6636 CmdArgs.push_back("--dynamic-linker");
6637 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6638 }
6639 }
6640
6641 if (Output.isFilename()) {
6642 CmdArgs.push_back("-o");
6643 CmdArgs.push_back(Output.getFilename());
6644 } else {
6645 assert(Output.isNothing() && "Invalid output.");
6646 }
6647
6648 if (!Args.hasArg(options::OPT_nostdlib) &&
6649 !Args.hasArg(options::OPT_nostartfiles)) {
6650 if (!Args.hasArg(options::OPT_shared)) {
6651 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6652 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006653 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006654 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6655 } else {
6656 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006657 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6658 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006659 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006660 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006661 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006662 }
6663
6664 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6665
6666 Args.AddAllArgs(CmdArgs, options::OPT_L);
6667 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6668 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006669 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006670
6671 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6672
6673 if (!Args.hasArg(options::OPT_nostdlib) &&
6674 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006675 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006676 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006677 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006678 if (!Args.hasArg(options::OPT_shared)) {
6679 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006680 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006681 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006682 }
David Chisnallf571cde2012-02-15 13:39:01 +00006683 }
6684
6685 if (!Args.hasArg(options::OPT_nostdlib) &&
6686 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006687 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006688 }
David Chisnall96de9932012-02-16 16:00:47 +00006689 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006690
Alexey Samsonov7811d192014-02-20 13:57:37 +00006691 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006692
6693 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006694 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006695 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006696}
6697
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006698void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006699 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006700 const InputInfoList &Inputs,
6701 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006702 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006703 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006704 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006705 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006706
Rafael Espindolacc126272014-02-28 01:55:21 +00006707 switch (getToolChain().getArch()) {
6708 case llvm::Triple::x86:
6709 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6710 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006711 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006712 break;
6713
6714 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006715 CmdArgs.push_back("-mppc");
6716 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006717 break;
6718
6719 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006720 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006721 CmdArgs.push_back("-32");
6722 NeedsKPIC = true;
6723 break;
6724
6725 case llvm::Triple::sparcv9:
6726 CmdArgs.push_back("-64");
6727 CmdArgs.push_back("-Av9a");
6728 NeedsKPIC = true;
6729 break;
6730
6731 case llvm::Triple::mips64:
6732 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006733 StringRef CPUName;
6734 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006735 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006736
6737 CmdArgs.push_back("-mabi");
6738 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6739
6740 if (getToolChain().getArch() == llvm::Triple::mips64)
6741 CmdArgs.push_back("-EB");
6742 else
6743 CmdArgs.push_back("-EL");
6744
Rafael Espindolacc126272014-02-28 01:55:21 +00006745 NeedsKPIC = true;
6746 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006747 }
6748
Rafael Espindolacc126272014-02-28 01:55:21 +00006749 default:
6750 break;
6751 }
6752
6753 if (NeedsKPIC)
6754 addAssemblerKPIC(Args, CmdArgs);
6755
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006756 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6757 options::OPT_Xassembler);
6758
6759 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006760 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006761
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006762 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006763 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006764
6765 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006766 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006767 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006768}
6769
6770void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006771 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006772 const InputInfoList &Inputs,
6773 const ArgList &Args,
6774 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006775 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006776 ArgStringList CmdArgs;
6777
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006778 // Silence warning for "clang -g foo.o -o foo"
6779 Args.ClaimAllArgs(options::OPT_g_Group);
6780 // and "clang -emit-llvm foo.o -o foo"
6781 Args.ClaimAllArgs(options::OPT_emit_llvm);
6782 // and for "clang -w foo.o -o foo". Other warning options are already
6783 // handled somewhere else.
6784 Args.ClaimAllArgs(options::OPT_w);
6785
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006786 if (getToolChain().getArch() == llvm::Triple::mips64)
6787 CmdArgs.push_back("-EB");
6788 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6789 CmdArgs.push_back("-EL");
6790
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006791 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006792 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006793 CmdArgs.push_back("-e");
6794 CmdArgs.push_back("__start");
6795 }
6796
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006797 if (Args.hasArg(options::OPT_static)) {
6798 CmdArgs.push_back("-Bstatic");
6799 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006800 if (Args.hasArg(options::OPT_rdynamic))
6801 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006802 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006803 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006804 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006805 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006806 } else {
6807 CmdArgs.push_back("-dynamic-linker");
6808 CmdArgs.push_back("/usr/libexec/ld.so");
6809 }
6810 }
6811
Rafael Espindola044f7832013-06-05 04:28:55 +00006812 if (Args.hasArg(options::OPT_nopie))
6813 CmdArgs.push_back("-nopie");
6814
Daniel Dunbarb440f562010-08-02 02:38:21 +00006815 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006816 CmdArgs.push_back("-o");
6817 CmdArgs.push_back(Output.getFilename());
6818 } else {
6819 assert(Output.isNothing() && "Invalid output.");
6820 }
6821
6822 if (!Args.hasArg(options::OPT_nostdlib) &&
6823 !Args.hasArg(options::OPT_nostartfiles)) {
6824 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006825 if (Args.hasArg(options::OPT_pg))
6826 CmdArgs.push_back(Args.MakeArgString(
6827 getToolChain().GetFilePath("gcrt0.o")));
6828 else
6829 CmdArgs.push_back(Args.MakeArgString(
6830 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006831 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006832 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006833 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006834 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006835 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006836 }
6837 }
6838
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006839 std::string Triple = getToolChain().getTripleString();
6840 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006841 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006842 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006843 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006844
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006845 Args.AddAllArgs(CmdArgs, options::OPT_L);
6846 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6847 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006848 Args.AddAllArgs(CmdArgs, options::OPT_s);
6849 Args.AddAllArgs(CmdArgs, options::OPT_t);
6850 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6851 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006852
Daniel Dunbar54423b22010-09-17 00:24:54 +00006853 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006854
6855 if (!Args.hasArg(options::OPT_nostdlib) &&
6856 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006857 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006858 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006859 if (Args.hasArg(options::OPT_pg))
6860 CmdArgs.push_back("-lm_p");
6861 else
6862 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006863 }
6864
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006865 // FIXME: For some reason GCC passes -lgcc before adding
6866 // the default system libraries. Just mimic this for now.
6867 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006868
Eric Christopher17674ec2012-09-13 06:32:34 +00006869 if (Args.hasArg(options::OPT_pthread)) {
6870 if (!Args.hasArg(options::OPT_shared) &&
6871 Args.hasArg(options::OPT_pg))
6872 CmdArgs.push_back("-lpthread_p");
6873 else
6874 CmdArgs.push_back("-lpthread");
6875 }
6876
Chandler Carruth45661652011-12-17 22:32:42 +00006877 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006878 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006879 CmdArgs.push_back("-lc_p");
6880 else
6881 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006882 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006883
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006884 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006885 }
6886
6887 if (!Args.hasArg(options::OPT_nostdlib) &&
6888 !Args.hasArg(options::OPT_nostartfiles)) {
6889 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006890 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006891 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006892 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006893 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006894 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006895 }
6896
6897 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006898 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006899 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006900}
Ed Schoutene33194b2009-04-02 19:13:12 +00006901
Eli Friedman9fa28852012-08-08 23:57:20 +00006902void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6903 const InputInfo &Output,
6904 const InputInfoList &Inputs,
6905 const ArgList &Args,
6906 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006907 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006908 ArgStringList CmdArgs;
6909
6910 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6911 options::OPT_Xassembler);
6912
6913 CmdArgs.push_back("-o");
6914 CmdArgs.push_back(Output.getFilename());
6915
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006916 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006917 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006918
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006919 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006921}
6922
6923void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6924 const InputInfo &Output,
6925 const InputInfoList &Inputs,
6926 const ArgList &Args,
6927 const char *LinkingOutput) const {
6928 const Driver &D = getToolChain().getDriver();
6929 ArgStringList CmdArgs;
6930
6931 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6932 (!Args.hasArg(options::OPT_shared))) {
6933 CmdArgs.push_back("-e");
6934 CmdArgs.push_back("__start");
6935 }
6936
6937 if (Args.hasArg(options::OPT_static)) {
6938 CmdArgs.push_back("-Bstatic");
6939 } else {
6940 if (Args.hasArg(options::OPT_rdynamic))
6941 CmdArgs.push_back("-export-dynamic");
6942 CmdArgs.push_back("--eh-frame-hdr");
6943 CmdArgs.push_back("-Bdynamic");
6944 if (Args.hasArg(options::OPT_shared)) {
6945 CmdArgs.push_back("-shared");
6946 } else {
6947 CmdArgs.push_back("-dynamic-linker");
6948 CmdArgs.push_back("/usr/libexec/ld.so");
6949 }
6950 }
6951
6952 if (Output.isFilename()) {
6953 CmdArgs.push_back("-o");
6954 CmdArgs.push_back(Output.getFilename());
6955 } else {
6956 assert(Output.isNothing() && "Invalid output.");
6957 }
6958
6959 if (!Args.hasArg(options::OPT_nostdlib) &&
6960 !Args.hasArg(options::OPT_nostartfiles)) {
6961 if (!Args.hasArg(options::OPT_shared)) {
6962 if (Args.hasArg(options::OPT_pg))
6963 CmdArgs.push_back(Args.MakeArgString(
6964 getToolChain().GetFilePath("gcrt0.o")));
6965 else
6966 CmdArgs.push_back(Args.MakeArgString(
6967 getToolChain().GetFilePath("crt0.o")));
6968 CmdArgs.push_back(Args.MakeArgString(
6969 getToolChain().GetFilePath("crtbegin.o")));
6970 } else {
6971 CmdArgs.push_back(Args.MakeArgString(
6972 getToolChain().GetFilePath("crtbeginS.o")));
6973 }
6974 }
6975
6976 Args.AddAllArgs(CmdArgs, options::OPT_L);
6977 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6978 Args.AddAllArgs(CmdArgs, options::OPT_e);
6979
6980 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6981
6982 if (!Args.hasArg(options::OPT_nostdlib) &&
6983 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006984 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006985 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6986 if (Args.hasArg(options::OPT_pg))
6987 CmdArgs.push_back("-lm_p");
6988 else
6989 CmdArgs.push_back("-lm");
6990 }
6991
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006992 if (Args.hasArg(options::OPT_pthread)) {
6993 if (!Args.hasArg(options::OPT_shared) &&
6994 Args.hasArg(options::OPT_pg))
6995 CmdArgs.push_back("-lpthread_p");
6996 else
6997 CmdArgs.push_back("-lpthread");
6998 }
6999
Eli Friedman9fa28852012-08-08 23:57:20 +00007000 if (!Args.hasArg(options::OPT_shared)) {
7001 if (Args.hasArg(options::OPT_pg))
7002 CmdArgs.push_back("-lc_p");
7003 else
7004 CmdArgs.push_back("-lc");
7005 }
7006
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007007 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007008 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007009 case llvm::Triple::arm:
7010 MyArch = "arm";
7011 break;
7012 case llvm::Triple::x86:
7013 MyArch = "i386";
7014 break;
7015 case llvm::Triple::x86_64:
7016 MyArch = "amd64";
7017 break;
7018 default:
7019 llvm_unreachable("Unsupported architecture");
7020 }
7021 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007022 }
7023
7024 if (!Args.hasArg(options::OPT_nostdlib) &&
7025 !Args.hasArg(options::OPT_nostartfiles)) {
7026 if (!Args.hasArg(options::OPT_shared))
7027 CmdArgs.push_back(Args.MakeArgString(
7028 getToolChain().GetFilePath("crtend.o")));
7029 else
7030 CmdArgs.push_back(Args.MakeArgString(
7031 getToolChain().GetFilePath("crtendS.o")));
7032 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007033
7034 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007035 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007036 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007037}
7038
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007039void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007040 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007041 const InputInfoList &Inputs,
7042 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00007043 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007044 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007045 ArgStringList CmdArgs;
7046
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007047 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7048 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007049 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007050 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007051 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007052 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007053 else if (getToolChain().getArch() == llvm::Triple::mips ||
7054 getToolChain().getArch() == llvm::Triple::mipsel ||
7055 getToolChain().getArch() == llvm::Triple::mips64 ||
7056 getToolChain().getArch() == llvm::Triple::mips64el) {
7057 StringRef CPUName;
7058 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007059 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007060
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007061 CmdArgs.push_back("-march");
7062 CmdArgs.push_back(CPUName.data());
7063
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007064 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007065 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007066
7067 if (getToolChain().getArch() == llvm::Triple::mips ||
7068 getToolChain().getArch() == llvm::Triple::mips64)
7069 CmdArgs.push_back("-EB");
7070 else
7071 CmdArgs.push_back("-EL");
7072
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007073 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007074 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007075 getToolChain().getArch() == llvm::Triple::armeb ||
7076 getToolChain().getArch() == llvm::Triple::thumb ||
7077 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007078 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007079 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007080 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7081
7082 if (FloatABI == "hard") {
7083 CmdArgs.push_back("-mfpu=vfp");
7084 } else {
7085 CmdArgs.push_back("-mfpu=softvfp");
7086 }
7087
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007088 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007089 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007090 case llvm::Triple::GNUEABI:
7091 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007092 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007093 break;
7094
7095 default:
7096 CmdArgs.push_back("-matpcs");
7097 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007098 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007099 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007100 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007101 if (getToolChain().getArch() == llvm::Triple::sparc)
7102 CmdArgs.push_back("-Av8plusa");
7103 else
7104 CmdArgs.push_back("-Av9a");
7105
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007106 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007107 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007108
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007109 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7110 options::OPT_Xassembler);
7111
7112 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007113 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007114
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007115 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007116 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007117
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007118 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007119 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007120}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007121
7122void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007123 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007124 const InputInfoList &Inputs,
7125 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00007126 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007127 const toolchains::FreeBSD &ToolChain =
7128 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007129 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007130 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007131 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007132 !Args.hasArg(options::OPT_shared) &&
7133 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007134 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007135
7136 // Silence warning for "clang -g foo.o -o foo"
7137 Args.ClaimAllArgs(options::OPT_g_Group);
7138 // and "clang -emit-llvm foo.o -o foo"
7139 Args.ClaimAllArgs(options::OPT_emit_llvm);
7140 // and for "clang -w foo.o -o foo". Other warning options are already
7141 // handled somewhere else.
7142 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007143
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007144 if (!D.SysRoot.empty())
7145 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7146
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007147 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007148 CmdArgs.push_back("-pie");
7149
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007150 if (Args.hasArg(options::OPT_static)) {
7151 CmdArgs.push_back("-Bstatic");
7152 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007153 if (Args.hasArg(options::OPT_rdynamic))
7154 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007155 CmdArgs.push_back("--eh-frame-hdr");
7156 if (Args.hasArg(options::OPT_shared)) {
7157 CmdArgs.push_back("-Bshareable");
7158 } else {
7159 CmdArgs.push_back("-dynamic-linker");
7160 CmdArgs.push_back("/libexec/ld-elf.so.1");
7161 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007162 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007163 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7164 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7165 CmdArgs.push_back("--hash-style=both");
7166 }
7167 }
7168 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007169 }
7170
7171 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7172 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007173 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007174 CmdArgs.push_back("-m");
7175 CmdArgs.push_back("elf_i386_fbsd");
7176 }
7177
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007178 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007179 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007180 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007181 }
7182
Daniel Dunbarb440f562010-08-02 02:38:21 +00007183 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007184 CmdArgs.push_back("-o");
7185 CmdArgs.push_back(Output.getFilename());
7186 } else {
7187 assert(Output.isNothing() && "Invalid output.");
7188 }
7189
7190 if (!Args.hasArg(options::OPT_nostdlib) &&
7191 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007192 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007193 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007194 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007195 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007196 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007197 crt1 = "Scrt1.o";
7198 else
7199 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007200 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007201 if (crt1)
7202 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7203
7204 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7205
Craig Topper92fc2df2014-05-17 16:56:41 +00007206 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007207 if (Args.hasArg(options::OPT_static))
7208 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007209 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007210 crtbegin = "crtbeginS.o";
7211 else
7212 crtbegin = "crtbegin.o";
7213
7214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007215 }
7216
7217 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007218 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007219 for (const auto &Path : Paths)
7220 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007221 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7222 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007223 Args.AddAllArgs(CmdArgs, options::OPT_s);
7224 Args.AddAllArgs(CmdArgs, options::OPT_t);
7225 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7226 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007227
Alexey Samsonov907880e2015-06-19 19:57:46 +00007228 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007229 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007230
Alexey Samsonov52550342014-09-15 19:58:40 +00007231 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007232 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007233
7234 if (!Args.hasArg(options::OPT_nostdlib) &&
7235 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007236 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007237 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007238 if (Args.hasArg(options::OPT_pg))
7239 CmdArgs.push_back("-lm_p");
7240 else
7241 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007242 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007243 if (NeedsSanitizerDeps)
7244 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007245 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7246 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007247 if (Args.hasArg(options::OPT_pg))
7248 CmdArgs.push_back("-lgcc_p");
7249 else
7250 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007251 if (Args.hasArg(options::OPT_static)) {
7252 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007253 } else if (Args.hasArg(options::OPT_pg)) {
7254 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007255 } else {
7256 CmdArgs.push_back("--as-needed");
7257 CmdArgs.push_back("-lgcc_s");
7258 CmdArgs.push_back("--no-as-needed");
7259 }
7260
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007261 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007262 if (Args.hasArg(options::OPT_pg))
7263 CmdArgs.push_back("-lpthread_p");
7264 else
7265 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007266 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007267
Roman Divacky66f22762011-02-10 16:59:40 +00007268 if (Args.hasArg(options::OPT_pg)) {
7269 if (Args.hasArg(options::OPT_shared))
7270 CmdArgs.push_back("-lc");
7271 else
7272 CmdArgs.push_back("-lc_p");
7273 CmdArgs.push_back("-lgcc_p");
7274 } else {
7275 CmdArgs.push_back("-lc");
7276 CmdArgs.push_back("-lgcc");
7277 }
7278
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007279 if (Args.hasArg(options::OPT_static)) {
7280 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007281 } else if (Args.hasArg(options::OPT_pg)) {
7282 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007283 } else {
7284 CmdArgs.push_back("--as-needed");
7285 CmdArgs.push_back("-lgcc_s");
7286 CmdArgs.push_back("--no-as-needed");
7287 }
7288 }
7289
7290 if (!Args.hasArg(options::OPT_nostdlib) &&
7291 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007292 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007293 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007294 else
7295 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007296 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007297 }
7298
Alexey Samsonov7811d192014-02-20 13:57:37 +00007299 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007300
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007301 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00007302 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007303 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007304}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007305
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007306void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7307 const InputInfo &Output,
7308 const InputInfoList &Inputs,
7309 const ArgList &Args,
7310 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007311 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007312 ArgStringList CmdArgs;
7313
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007314 // GNU as needs different flags for creating the correct output format
7315 // on architectures with different ABIs or optional feature sets.
7316 switch (getToolChain().getArch()) {
7317 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007318 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007319 break;
7320 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007321 case llvm::Triple::armeb:
7322 case llvm::Triple::thumb:
7323 case llvm::Triple::thumbeb: {
Gabor Ballabas208826c2015-06-04 17:56:32 +00007324 std::string MArch = arm::getARMTargetCPU(Args, getToolChain().getTriple());
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007325 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007326 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007327 }
7328
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007329 case llvm::Triple::mips:
7330 case llvm::Triple::mipsel:
7331 case llvm::Triple::mips64:
7332 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007333 StringRef CPUName;
7334 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007335 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007336
7337 CmdArgs.push_back("-march");
7338 CmdArgs.push_back(CPUName.data());
7339
7340 CmdArgs.push_back("-mabi");
7341 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7342
7343 if (getToolChain().getArch() == llvm::Triple::mips ||
7344 getToolChain().getArch() == llvm::Triple::mips64)
7345 CmdArgs.push_back("-EB");
7346 else
7347 CmdArgs.push_back("-EL");
7348
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007349 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007350 break;
7351 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007352
7353 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007354 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007355 CmdArgs.push_back("-32");
7356 addAssemblerKPIC(Args, CmdArgs);
7357 break;
7358
7359 case llvm::Triple::sparcv9:
7360 CmdArgs.push_back("-64");
7361 CmdArgs.push_back("-Av9");
7362 addAssemblerKPIC(Args, CmdArgs);
7363 break;
7364
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007365 default:
7366 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007367 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007368
7369 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7370 options::OPT_Xassembler);
7371
7372 CmdArgs.push_back("-o");
7373 CmdArgs.push_back(Output.getFilename());
7374
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007375 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007376 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007377
David Chisnallddbd68f2011-09-27 22:03:18 +00007378 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007379 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007380}
7381
7382void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
7383 const InputInfo &Output,
7384 const InputInfoList &Inputs,
7385 const ArgList &Args,
7386 const char *LinkingOutput) const {
7387 const Driver &D = getToolChain().getDriver();
7388 ArgStringList CmdArgs;
7389
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007390 if (!D.SysRoot.empty())
7391 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7392
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007393 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007394 if (Args.hasArg(options::OPT_static)) {
7395 CmdArgs.push_back("-Bstatic");
7396 } else {
7397 if (Args.hasArg(options::OPT_rdynamic))
7398 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007399 if (Args.hasArg(options::OPT_shared)) {
7400 CmdArgs.push_back("-Bshareable");
7401 } else {
7402 CmdArgs.push_back("-dynamic-linker");
7403 CmdArgs.push_back("/libexec/ld.elf_so");
7404 }
7405 }
7406
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007407 // Many NetBSD architectures support more than one ABI.
7408 // Determine the correct emulation for ld.
7409 switch (getToolChain().getArch()) {
7410 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007411 CmdArgs.push_back("-m");
7412 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007413 break;
7414 case llvm::Triple::arm:
7415 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007416 CmdArgs.push_back("-m");
7417 switch (getToolChain().getTriple().getEnvironment()) {
7418 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007419 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007420 CmdArgs.push_back("armelf_nbsd_eabi");
7421 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007422 case llvm::Triple::EABIHF:
7423 case llvm::Triple::GNUEABIHF:
7424 CmdArgs.push_back("armelf_nbsd_eabihf");
7425 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007426 default:
7427 CmdArgs.push_back("armelf_nbsd");
7428 break;
7429 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007430 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007431 case llvm::Triple::armeb:
7432 case llvm::Triple::thumbeb:
John Brawn94fd9632015-05-21 12:19:49 +00007433 arm::appendEBLinkFlags(Args, CmdArgs,
7434 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007435 CmdArgs.push_back("-m");
7436 switch (getToolChain().getTriple().getEnvironment()) {
7437 case llvm::Triple::EABI:
7438 case llvm::Triple::GNUEABI:
7439 CmdArgs.push_back("armelfb_nbsd_eabi");
7440 break;
7441 case llvm::Triple::EABIHF:
7442 case llvm::Triple::GNUEABIHF:
7443 CmdArgs.push_back("armelfb_nbsd_eabihf");
7444 break;
7445 default:
7446 CmdArgs.push_back("armelfb_nbsd");
7447 break;
7448 }
7449 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007450 case llvm::Triple::mips64:
7451 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007452 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007453 CmdArgs.push_back("-m");
7454 if (getToolChain().getArch() == llvm::Triple::mips64)
7455 CmdArgs.push_back("elf32btsmip");
7456 else
7457 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007458 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007459 CmdArgs.push_back("-m");
7460 if (getToolChain().getArch() == llvm::Triple::mips64)
7461 CmdArgs.push_back("elf64btsmip");
7462 else
7463 CmdArgs.push_back("elf64ltsmip");
7464 }
7465 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007466 case llvm::Triple::ppc:
7467 CmdArgs.push_back("-m");
7468 CmdArgs.push_back("elf32ppc_nbsd");
7469 break;
7470
7471 case llvm::Triple::ppc64:
7472 case llvm::Triple::ppc64le:
7473 CmdArgs.push_back("-m");
7474 CmdArgs.push_back("elf64ppc");
7475 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007476
7477 case llvm::Triple::sparc:
7478 CmdArgs.push_back("-m");
7479 CmdArgs.push_back("elf32_sparc");
7480 break;
7481
7482 case llvm::Triple::sparcv9:
7483 CmdArgs.push_back("-m");
7484 CmdArgs.push_back("elf64_sparc");
7485 break;
7486
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007487 default:
7488 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007489 }
7490
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007491 if (Output.isFilename()) {
7492 CmdArgs.push_back("-o");
7493 CmdArgs.push_back(Output.getFilename());
7494 } else {
7495 assert(Output.isNothing() && "Invalid output.");
7496 }
7497
7498 if (!Args.hasArg(options::OPT_nostdlib) &&
7499 !Args.hasArg(options::OPT_nostartfiles)) {
7500 if (!Args.hasArg(options::OPT_shared)) {
7501 CmdArgs.push_back(Args.MakeArgString(
7502 getToolChain().GetFilePath("crt0.o")));
7503 CmdArgs.push_back(Args.MakeArgString(
7504 getToolChain().GetFilePath("crti.o")));
7505 CmdArgs.push_back(Args.MakeArgString(
7506 getToolChain().GetFilePath("crtbegin.o")));
7507 } else {
7508 CmdArgs.push_back(Args.MakeArgString(
7509 getToolChain().GetFilePath("crti.o")));
7510 CmdArgs.push_back(Args.MakeArgString(
7511 getToolChain().GetFilePath("crtbeginS.o")));
7512 }
7513 }
7514
7515 Args.AddAllArgs(CmdArgs, options::OPT_L);
7516 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7517 Args.AddAllArgs(CmdArgs, options::OPT_e);
7518 Args.AddAllArgs(CmdArgs, options::OPT_s);
7519 Args.AddAllArgs(CmdArgs, options::OPT_t);
7520 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7521 Args.AddAllArgs(CmdArgs, options::OPT_r);
7522
7523 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7524
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007525 unsigned Major, Minor, Micro;
7526 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7527 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007528 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007529 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007530 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007531 case llvm::Triple::arm:
7532 case llvm::Triple::armeb:
7533 case llvm::Triple::thumb:
7534 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007535 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007536 case llvm::Triple::ppc64:
7537 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007538 case llvm::Triple::x86:
7539 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007540 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007541 break;
7542 default:
7543 break;
7544 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007545 }
7546
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007547 if (!Args.hasArg(options::OPT_nostdlib) &&
7548 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007549 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007550 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7551 CmdArgs.push_back("-lm");
7552 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007553 if (Args.hasArg(options::OPT_pthread))
7554 CmdArgs.push_back("-lpthread");
7555 CmdArgs.push_back("-lc");
7556
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007557 if (useLibgcc) {
7558 if (Args.hasArg(options::OPT_static)) {
7559 // libgcc_eh depends on libc, so resolve as much as possible,
7560 // pull in any new requirements from libc and then get the rest
7561 // of libgcc.
7562 CmdArgs.push_back("-lgcc_eh");
7563 CmdArgs.push_back("-lc");
7564 CmdArgs.push_back("-lgcc");
7565 } else {
7566 CmdArgs.push_back("-lgcc");
7567 CmdArgs.push_back("--as-needed");
7568 CmdArgs.push_back("-lgcc_s");
7569 CmdArgs.push_back("--no-as-needed");
7570 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007571 }
7572 }
7573
7574 if (!Args.hasArg(options::OPT_nostdlib) &&
7575 !Args.hasArg(options::OPT_nostartfiles)) {
7576 if (!Args.hasArg(options::OPT_shared))
7577 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7578 "crtend.o")));
7579 else
7580 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7581 "crtendS.o")));
7582 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7583 "crtn.o")));
7584 }
7585
Alexey Samsonov7811d192014-02-20 13:57:37 +00007586 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007587
Logan Chieneb9162f2014-06-26 14:23:45 +00007588 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007589 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007590}
7591
Thomas Schwinge4e555262013-03-28 19:04:25 +00007592void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7593 const InputInfo &Output,
7594 const InputInfoList &Inputs,
7595 const ArgList &Args,
7596 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007597 claimNoWarnArgs(Args);
7598
Rafael Espindola92b00932010-08-10 00:25:48 +00007599 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007600 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007601
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007602 switch (getToolChain().getArch()) {
7603 default:
7604 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007605 // Add --32/--64 to make sure we get the format we want.
7606 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007607 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007608 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007609 break;
7610 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007611 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7612 CmdArgs.push_back("--x32");
7613 else
7614 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007615 break;
7616 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007617 CmdArgs.push_back("-a32");
7618 CmdArgs.push_back("-mppc");
7619 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007620 break;
7621 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007622 CmdArgs.push_back("-a64");
7623 CmdArgs.push_back("-mppc64");
7624 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007625 break;
7626 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007627 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007628 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007629 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007630 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007631 break;
7632 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007633 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007634 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007635 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007636 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007637 break;
7638 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007639 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007640 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007641 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007642 break;
7643 case llvm::Triple::arm:
7644 case llvm::Triple::armeb:
7645 case llvm::Triple::thumb:
7646 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007647 const llvm::Triple &Triple = getToolChain().getTriple();
7648 switch (Triple.getSubArch()) {
7649 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007650 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007651 break;
7652 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007653 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007654 break;
7655 default:
7656 break;
7657 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007658
Tim Northover9c7e0352013-12-12 11:55:52 +00007659 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007660 getToolChain().getDriver(), Args,
7661 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007662 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007663
7664 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007665
7666 // FIXME: remove krait check when GNU tools support krait cpu
7667 // for now replace it with -march=armv7-a to avoid a lower
7668 // march from being picked in the absence of a cpu flag.
7669 Arg *A;
7670 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Gabor Ballabas208826c2015-06-04 17:56:32 +00007671 StringRef(A->getValue()).lower() == "krait")
Ana Pazosdd6068d2013-12-06 22:43:17 +00007672 CmdArgs.push_back("-march=armv7-a");
7673 else
7674 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007675 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007676 break;
7677 }
7678 case llvm::Triple::mips:
7679 case llvm::Triple::mipsel:
7680 case llvm::Triple::mips64:
7681 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007682 StringRef CPUName;
7683 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007684 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007685 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007686
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007687 CmdArgs.push_back("-march");
7688 CmdArgs.push_back(CPUName.data());
7689
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007690 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007691 CmdArgs.push_back(ABIName.data());
7692
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007693 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7694 // or -mshared (not implemented) is in effect.
7695 bool IsPicOrPie = false;
7696 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7697 options::OPT_fpic, options::OPT_fno_pic,
7698 options::OPT_fPIE, options::OPT_fno_PIE,
7699 options::OPT_fpie, options::OPT_fno_pie)) {
7700 if (A->getOption().matches(options::OPT_fPIC) ||
7701 A->getOption().matches(options::OPT_fpic) ||
7702 A->getOption().matches(options::OPT_fPIE) ||
7703 A->getOption().matches(options::OPT_fpie))
7704 IsPicOrPie = true;
7705 }
7706 if (!IsPicOrPie)
7707 CmdArgs.push_back("-mno-shared");
7708
Daniel Sanders379d44b2014-07-16 11:52:23 +00007709 // LLVM doesn't support -mplt yet and acts as if it is always given.
7710 // However, -mplt has no effect with the N64 ABI.
7711 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007712
7713 if (getToolChain().getArch() == llvm::Triple::mips ||
7714 getToolChain().getArch() == llvm::Triple::mips64)
7715 CmdArgs.push_back("-EB");
7716 else
7717 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007718
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007719 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7720 if (StringRef(A->getValue()) == "2008")
7721 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7722 }
7723
Daniel Sanders379d44b2014-07-16 11:52:23 +00007724 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007725 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007726 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7727 options::OPT_mfp64)) {
7728 A->claim();
7729 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007730 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7731 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007732 CmdArgs.push_back("-mfpxx");
7733
7734 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7735 // -mno-mips16 is actually -no-mips16.
7736 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7737 options::OPT_mno_mips16)) {
7738 if (A->getOption().matches(options::OPT_mips16)) {
7739 A->claim();
7740 A->render(Args, CmdArgs);
7741 } else {
7742 A->claim();
7743 CmdArgs.push_back("-no-mips16");
7744 }
7745 }
7746
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007747 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7748 options::OPT_mno_micromips);
7749 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7750 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7751
Simon Atanasyanbd986632013-11-26 11:58:04 +00007752 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7753 // Do not use AddLastArg because not all versions of MIPS assembler
7754 // support -mmsa / -mno-msa options.
7755 if (A->getOption().matches(options::OPT_mmsa))
7756 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7757 }
7758
Daniel Sanders379d44b2014-07-16 11:52:23 +00007759 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7760 options::OPT_msoft_float);
7761
Toma Tabacub36d6102015-06-11 12:13:18 +00007762 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7763 options::OPT_msingle_float);
7764
Daniel Sanders379d44b2014-07-16 11:52:23 +00007765 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7766 options::OPT_mno_odd_spreg);
7767
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007768 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007769 break;
7770 }
7771 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007772 // Always pass an -march option, since our default of z10 is later
7773 // than the GNU assembler's default.
7774 StringRef CPUName = getSystemZTargetCPU(Args);
7775 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007776 break;
7777 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007778 }
7779
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007780 if (NeedsKPIC)
7781 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007782
7783 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7784 options::OPT_Xassembler);
7785
7786 CmdArgs.push_back("-o");
7787 CmdArgs.push_back(Output.getFilename());
7788
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007789 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007790 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007791
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007792 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007793 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007794
7795 // Handle the debug info splitting at object creation time if we're
7796 // creating an object.
7797 // TODO: Currently only works on linux with newer objcopy.
7798 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007799 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007800 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007801 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007802}
7803
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007804static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007805 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007806 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007807 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7808 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007809 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007810 CmdArgs.push_back("-lgcc");
7811
Logan Chien3d3373c2012-11-19 12:04:11 +00007812 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007813 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007814 CmdArgs.push_back("-lgcc");
7815 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007816 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007817 CmdArgs.push_back("--as-needed");
7818 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007819 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007820 CmdArgs.push_back("--no-as-needed");
7821 }
7822
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007823 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007824 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007825 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007826 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007827
7828 // According to Android ABI, we have to link with libdl if we are
7829 // linking with non-static libgcc.
7830 //
7831 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7832 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7833 if (isAndroid && !StaticLibgcc)
7834 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007835}
7836
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007837static std::string getLinuxDynamicLinker(const ArgList &Args,
7838 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007839 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7840
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007841 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7842 if (ToolChain.getTriple().isArch64Bit())
7843 return "/system/bin/linker64";
7844 else
7845 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007846 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7847 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007848 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007849 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007850 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007851 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007852 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007853 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007854 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7855 return "/lib/ld-linux-armhf.so.3";
7856 else
7857 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007858 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7859 // TODO: check which dynamic linker name.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007860 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007861 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007862 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007863 return "/lib/ld-linux.so.3";
7864 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7865 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007866 StringRef CPUName;
7867 StringRef ABIName;
7868 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7869 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7870
7871 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7872 .Case("o32", "/lib")
7873 .Case("n32", "/lib32")
7874 .Case("n64", "/lib64")
7875 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007876 StringRef LibName;
7877 if (mips::isUCLibc(Args))
7878 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7879 else
7880 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007881
7882 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007883 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007884 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007885 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007886 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7887 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007888 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007889 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007890 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7891 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007892 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007893 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007894 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007895 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007896 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007897 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007898 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7899 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007900 else
7901 return "/lib64/ld-linux-x86-64.so.2";
7902}
7903
Renato Golinc4b49242014-02-13 10:01:16 +00007904static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007905 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007906 // Make use of compiler-rt if --rtlib option is used
7907 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7908
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007909 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007910 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007911 switch (TC.getTriple().getOS()) {
7912 default: llvm_unreachable("unsupported OS");
7913 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007914 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007915 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007916 break;
7917 }
Renato Golinc4b49242014-02-13 10:01:16 +00007918 break;
7919 case ToolChain::RLT_Libgcc:
7920 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7921 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007922 }
7923}
7924
Rafael Espindola1e085772014-08-15 17:14:35 +00007925static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7926 switch (T.getArch()) {
7927 case llvm::Triple::x86:
7928 return "elf_i386";
7929 case llvm::Triple::aarch64:
7930 return "aarch64linux";
7931 case llvm::Triple::aarch64_be:
7932 return "aarch64_be_linux";
7933 case llvm::Triple::arm:
7934 case llvm::Triple::thumb:
7935 return "armelf_linux_eabi";
7936 case llvm::Triple::armeb:
7937 case llvm::Triple::thumbeb:
7938 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7939 case llvm::Triple::ppc:
7940 return "elf32ppclinux";
7941 case llvm::Triple::ppc64:
7942 return "elf64ppc";
7943 case llvm::Triple::ppc64le:
7944 return "elf64lppc";
7945 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007946 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007947 return "elf32_sparc";
7948 case llvm::Triple::sparcv9:
7949 return "elf64_sparc";
7950 case llvm::Triple::mips:
7951 return "elf32btsmip";
7952 case llvm::Triple::mipsel:
7953 return "elf32ltsmip";
7954 case llvm::Triple::mips64:
7955 if (mips::hasMipsAbiArg(Args, "n32"))
7956 return "elf32btsmipn32";
7957 return "elf64btsmip";
7958 case llvm::Triple::mips64el:
7959 if (mips::hasMipsAbiArg(Args, "n32"))
7960 return "elf32ltsmipn32";
7961 return "elf64ltsmip";
7962 case llvm::Triple::systemz:
7963 return "elf64_s390";
7964 case llvm::Triple::x86_64:
7965 if (T.getEnvironment() == llvm::Triple::GNUX32)
7966 return "elf32_x86_64";
7967 return "elf_x86_64";
7968 default:
7969 llvm_unreachable("Unexpected arch");
7970 }
7971}
7972
Thomas Schwinge4e555262013-03-28 19:04:25 +00007973void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7974 const InputInfo &Output,
7975 const InputInfoList &Inputs,
7976 const ArgList &Args,
7977 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007978 const toolchains::Linux &ToolChain =
7979 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007980 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007981 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007982 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007983 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007984 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007985 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
7986 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007987
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007988 ArgStringList CmdArgs;
7989
Rafael Espindolad1002f62010-11-15 18:28:16 +00007990 // Silence warning for "clang -g foo.o -o foo"
7991 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007992 // and "clang -emit-llvm foo.o -o foo"
7993 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007994 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007995 // handled somewhere else.
7996 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007997
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007998 if (!D.SysRoot.empty())
7999 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008000
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008001 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008002 CmdArgs.push_back("-pie");
8003
Rafael Espindola1c76c592010-11-07 22:57:16 +00008004 if (Args.hasArg(options::OPT_rdynamic))
8005 CmdArgs.push_back("-export-dynamic");
8006
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008007 if (Args.hasArg(options::OPT_s))
8008 CmdArgs.push_back("-s");
8009
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008010 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
8011 arm::appendEBLinkFlags(
8012 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008013 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008014
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008015 for (const auto &Opt : ToolChain.ExtraOpts)
8016 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008017
8018 if (!Args.hasArg(options::OPT_static)) {
8019 CmdArgs.push_back("--eh-frame-hdr");
8020 }
8021
8022 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008023 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008024
8025 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008026 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8027 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008028 CmdArgs.push_back("-Bstatic");
8029 else
8030 CmdArgs.push_back("-static");
8031 } else if (Args.hasArg(options::OPT_shared)) {
8032 CmdArgs.push_back("-shared");
8033 }
8034
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008035 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8036 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008037 (!Args.hasArg(options::OPT_static) &&
8038 !Args.hasArg(options::OPT_shared))) {
8039 CmdArgs.push_back("-dynamic-linker");
8040 CmdArgs.push_back(Args.MakeArgString(
8041 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8042 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008043
8044 CmdArgs.push_back("-o");
8045 CmdArgs.push_back(Output.getFilename());
8046
Rafael Espindola81937ec2010-12-01 01:52:43 +00008047 if (!Args.hasArg(options::OPT_nostdlib) &&
8048 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008049 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008050 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008051 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00008052 if (Args.hasArg(options::OPT_pg))
8053 crt1 = "gcrt1.o";
8054 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008055 crt1 = "Scrt1.o";
8056 else
8057 crt1 = "crt1.o";
8058 }
8059 if (crt1)
8060 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008061
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008062 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8063 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008064
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008065 const char *crtbegin;
8066 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008067 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008068 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008069 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008070 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008071 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008072 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008073 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008074 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008075
8076 // Add crtfastmath.o if available and fast math is enabled.
8077 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008078 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008079
8080 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008081 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008082
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008083 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008084
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008085 for (const auto &Path : Paths)
8086 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008087
Alexey Samsonov907880e2015-06-19 19:57:46 +00008088 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008089 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008090
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008091 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8092 CmdArgs.push_back("--no-demangle");
8093
Alexey Samsonov52550342014-09-15 19:58:40 +00008094 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008095 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008096 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008097 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008098
Hans Wennborg70850d82013-07-18 20:29:38 +00008099 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008100 !Args.hasArg(options::OPT_nostdlib) &&
8101 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008102 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8103 !Args.hasArg(options::OPT_static);
8104 if (OnlyLibstdcxxStatic)
8105 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008106 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008107 if (OnlyLibstdcxxStatic)
8108 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008109 CmdArgs.push_back("-lm");
8110 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008111 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8112 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008113
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008114 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008115 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8116 if (Args.hasArg(options::OPT_static))
8117 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008118
Alexey Samsonov52550342014-09-15 19:58:40 +00008119 if (NeedsSanitizerDeps)
8120 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8121
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008122 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8123 Args.hasArg(options::OPT_pthreads);
8124
8125 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8126 options::OPT_fno_openmp, false)) {
8127 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8128 // FIXME: Does this really make sense for all GNU toolchains?
8129 WantPthread = true;
8130
8131 // Also link the particular OpenMP runtimes.
8132 switch (getOpenMPRuntime(ToolChain, Args)) {
8133 case OMPRT_OMP:
8134 CmdArgs.push_back("-lomp");
8135 break;
8136 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008137 CmdArgs.push_back("-lgomp");
8138
8139 // FIXME: Exclude this for platforms with libgomp that don't require
8140 // librt. Most modern Linux platforms require it, but some may not.
8141 CmdArgs.push_back("-lrt");
8142 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008143 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008144 CmdArgs.push_back("-liomp5");
8145 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008146 case OMPRT_Unknown:
8147 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008148 break;
8149 }
Chandler Carruth01538002013-01-17 13:19:29 +00008150 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008151
Renato Golinc4b49242014-02-13 10:01:16 +00008152 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008153
Richard Smith31d1de22015-05-20 22:48:44 +00008154 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008155 CmdArgs.push_back("-lpthread");
8156
8157 CmdArgs.push_back("-lc");
8158
8159 if (Args.hasArg(options::OPT_static))
8160 CmdArgs.push_back("--end-group");
8161 else
Renato Golinc4b49242014-02-13 10:01:16 +00008162 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008163 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008164
Rafael Espindola81937ec2010-12-01 01:52:43 +00008165 if (!Args.hasArg(options::OPT_nostartfiles)) {
8166 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008167 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008168 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008169 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008170 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008171 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008172 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008173
Rafael Espindola81937ec2010-12-01 01:52:43 +00008174 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008175 if (!isAndroid)
8176 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008177 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008178 }
8179
David Blaikiec11bf802014-09-04 16:04:28 +00008180 C.addCommand(
8181 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008182}
8183
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008184
8185// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8186// for the various SFI requirements like register masking. The assembly tool
8187// inserts the file containing the macros as an input into all the assembly
8188// jobs.
8189void nacltools::AssembleARM::ConstructJob(Compilation &C, const JobAction &JA,
8190 const InputInfo &Output,
8191 const InputInfoList &Inputs,
8192 const ArgList &Args,
8193 const char *LinkingOutput) const {
8194 const toolchains::NaCl_TC& ToolChain =
8195 static_cast<const toolchains::NaCl_TC&>(getToolChain());
8196 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8197 "nacl-arm-macros.s");
8198 InputInfoList NewInputs;
8199 NewInputs.push_back(NaClMacros);
8200 NewInputs.append(Inputs.begin(), Inputs.end());
8201 gnutools::Assemble::ConstructJob(C, JA, Output, NewInputs, Args,
8202 LinkingOutput);
8203}
8204
8205
8206// This is quite similar to gnutools::link::ConstructJob with changes that
8207// we use static by default, do not yet support sanitizers or LTO, and a few
8208// others. Eventually we can support more of that and hopefully migrate back
8209// to gnutools::link.
8210void nacltools::Link::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008211 const InputInfo &Output,
8212 const InputInfoList &Inputs,
8213 const ArgList &Args,
8214 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008215
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008216 const toolchains::NaCl_TC &ToolChain =
8217 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008218 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008219 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008220 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008221 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008222
8223 ArgStringList CmdArgs;
8224
8225 // Silence warning for "clang -g foo.o -o foo"
8226 Args.ClaimAllArgs(options::OPT_g_Group);
8227 // and "clang -emit-llvm foo.o -o foo"
8228 Args.ClaimAllArgs(options::OPT_emit_llvm);
8229 // and for "clang -w foo.o -o foo". Other warning options are already
8230 // handled somewhere else.
8231 Args.ClaimAllArgs(options::OPT_w);
8232
8233 if (!D.SysRoot.empty())
8234 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8235
8236 if (Args.hasArg(options::OPT_rdynamic))
8237 CmdArgs.push_back("-export-dynamic");
8238
8239 if (Args.hasArg(options::OPT_s))
8240 CmdArgs.push_back("-s");
8241
8242 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8243 // there is --build-id, which we do want.
8244 CmdArgs.push_back("--build-id");
8245
8246 if (!IsStatic)
8247 CmdArgs.push_back("--eh-frame-hdr");
8248
8249 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008250 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008251 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008252 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008253 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008254 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008255 CmdArgs.push_back("elf_x86_64_nacl");
8256 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008257 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8258 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008259
8260 if (IsStatic)
8261 CmdArgs.push_back("-static");
8262 else if (Args.hasArg(options::OPT_shared))
8263 CmdArgs.push_back("-shared");
8264
8265 CmdArgs.push_back("-o");
8266 CmdArgs.push_back(Output.getFilename());
8267 if (!Args.hasArg(options::OPT_nostdlib) &&
8268 !Args.hasArg(options::OPT_nostartfiles)) {
8269 if (!Args.hasArg(options::OPT_shared))
8270 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8271 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8272
8273 const char *crtbegin;
8274 if (IsStatic)
8275 crtbegin = "crtbeginT.o";
8276 else if (Args.hasArg(options::OPT_shared))
8277 crtbegin = "crtbeginS.o";
8278 else
8279 crtbegin = "crtbegin.o";
8280 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8281 }
8282
8283 Args.AddAllArgs(CmdArgs, options::OPT_L);
8284 Args.AddAllArgs(CmdArgs, options::OPT_u);
8285
8286 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8287
8288 for (const auto &Path : Paths)
8289 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8290
8291 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8292 CmdArgs.push_back("--no-demangle");
8293
8294 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8295
8296 if (D.CCCIsCXX() &&
8297 !Args.hasArg(options::OPT_nostdlib) &&
8298 !Args.hasArg(options::OPT_nodefaultlibs)) {
8299 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8300 !IsStatic;
8301 if (OnlyLibstdcxxStatic)
8302 CmdArgs.push_back("-Bstatic");
8303 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8304 if (OnlyLibstdcxxStatic)
8305 CmdArgs.push_back("-Bdynamic");
8306 CmdArgs.push_back("-lm");
8307 }
8308
8309 if (!Args.hasArg(options::OPT_nostdlib)) {
8310 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8311 // Always use groups, since it has no effect on dynamic libraries.
8312 CmdArgs.push_back("--start-group");
8313 CmdArgs.push_back("-lc");
8314 // NaCl's libc++ currently requires libpthread, so just always include it
8315 // in the group for C++.
8316 if (Args.hasArg(options::OPT_pthread) ||
8317 Args.hasArg(options::OPT_pthreads) ||
8318 D.CCCIsCXX()) {
8319 CmdArgs.push_back("-lpthread");
8320 }
8321
8322 CmdArgs.push_back("-lgcc");
8323 CmdArgs.push_back("--as-needed");
8324 if (IsStatic)
8325 CmdArgs.push_back("-lgcc_eh");
8326 else
8327 CmdArgs.push_back("-lgcc_s");
8328 CmdArgs.push_back("--no-as-needed");
8329 CmdArgs.push_back("--end-group");
8330 }
8331
8332 if (!Args.hasArg(options::OPT_nostartfiles)) {
8333 const char *crtend;
8334 if (Args.hasArg(options::OPT_shared))
8335 crtend = "crtendS.o";
8336 else
8337 crtend = "crtend.o";
8338
8339 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8340 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8341 }
8342 }
8343
8344 C.addCommand(llvm::make_unique<Command>(JA, *this,
8345 ToolChain.Linker.c_str(), CmdArgs));
8346}
8347
8348
Chris Lattner3e2ee142010-07-07 16:01:42 +00008349void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008350 const InputInfo &Output,
8351 const InputInfoList &Inputs,
8352 const ArgList &Args,
8353 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008354 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008355 ArgStringList CmdArgs;
8356
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008357 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008358
8359 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008360 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008361
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008362 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008363 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008364
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008365 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008366 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008367}
8368
8369void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008370 const InputInfo &Output,
8371 const InputInfoList &Inputs,
8372 const ArgList &Args,
8373 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008374 const Driver &D = getToolChain().getDriver();
8375 ArgStringList CmdArgs;
8376
Daniel Dunbarb440f562010-08-02 02:38:21 +00008377 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008378 CmdArgs.push_back("-o");
8379 CmdArgs.push_back(Output.getFilename());
8380 } else {
8381 assert(Output.isNothing() && "Invalid output.");
8382 }
8383
8384 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008385 !Args.hasArg(options::OPT_nostartfiles)) {
8386 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8387 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8388 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8389 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
8390 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008391
8392 Args.AddAllArgs(CmdArgs, options::OPT_L);
8393 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8394 Args.AddAllArgs(CmdArgs, options::OPT_e);
8395
Daniel Dunbar54423b22010-09-17 00:24:54 +00008396 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008397
Alexey Samsonov7811d192014-02-20 13:57:37 +00008398 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008399
Chris Lattner3e2ee142010-07-07 16:01:42 +00008400 if (!Args.hasArg(options::OPT_nostdlib) &&
8401 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008402 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008403 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008404 CmdArgs.push_back("-lm");
8405 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008406 }
8407
8408 if (!Args.hasArg(options::OPT_nostdlib) &&
8409 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008410 if (Args.hasArg(options::OPT_pthread))
8411 CmdArgs.push_back("-lpthread");
8412 CmdArgs.push_back("-lc");
8413 CmdArgs.push_back("-lCompilerRT-Generic");
8414 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8415 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00008416 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008417 }
8418
Logan Chieneb9162f2014-06-26 14:23:45 +00008419 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008421}
8422
Daniel Dunbarcc912342009-05-02 18:28:39 +00008423/// DragonFly Tools
8424
8425// For now, DragonFly Assemble does just about the same as for
8426// FreeBSD, but this may change soon.
8427void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008428 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008429 const InputInfoList &Inputs,
8430 const ArgList &Args,
8431 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008432 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008433 ArgStringList CmdArgs;
8434
8435 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8436 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008437 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008438 CmdArgs.push_back("--32");
8439
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008440 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008441
8442 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008443 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008444
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008445 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008446 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008447
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008448 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008449 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008450}
8451
8452void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008453 const InputInfo &Output,
8454 const InputInfoList &Inputs,
8455 const ArgList &Args,
8456 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008457 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008458 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008459 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008460
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008461 if (!D.SysRoot.empty())
8462 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8463
John McCall65b8da02013-04-11 22:55:55 +00008464 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008465 if (Args.hasArg(options::OPT_static)) {
8466 CmdArgs.push_back("-Bstatic");
8467 } else {
John McCall65b8da02013-04-11 22:55:55 +00008468 if (Args.hasArg(options::OPT_rdynamic))
8469 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008470 if (Args.hasArg(options::OPT_shared))
8471 CmdArgs.push_back("-Bshareable");
8472 else {
8473 CmdArgs.push_back("-dynamic-linker");
8474 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8475 }
John McCall65b8da02013-04-11 22:55:55 +00008476 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008477 }
8478
8479 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8480 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008481 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008482 CmdArgs.push_back("-m");
8483 CmdArgs.push_back("elf_i386");
8484 }
8485
Daniel Dunbarb440f562010-08-02 02:38:21 +00008486 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008487 CmdArgs.push_back("-o");
8488 CmdArgs.push_back(Output.getFilename());
8489 } else {
8490 assert(Output.isNothing() && "Invalid output.");
8491 }
8492
8493 if (!Args.hasArg(options::OPT_nostdlib) &&
8494 !Args.hasArg(options::OPT_nostartfiles)) {
8495 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008496 if (Args.hasArg(options::OPT_pg))
8497 CmdArgs.push_back(Args.MakeArgString(
8498 getToolChain().GetFilePath("gcrt1.o")));
8499 else {
8500 if (Args.hasArg(options::OPT_pie))
8501 CmdArgs.push_back(Args.MakeArgString(
8502 getToolChain().GetFilePath("Scrt1.o")));
8503 else
8504 CmdArgs.push_back(Args.MakeArgString(
8505 getToolChain().GetFilePath("crt1.o")));
8506 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008507 }
John McCall65b8da02013-04-11 22:55:55 +00008508 CmdArgs.push_back(Args.MakeArgString(
8509 getToolChain().GetFilePath("crti.o")));
8510 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
8511 CmdArgs.push_back(Args.MakeArgString(
8512 getToolChain().GetFilePath("crtbeginS.o")));
8513 else
8514 CmdArgs.push_back(Args.MakeArgString(
8515 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008516 }
8517
8518 Args.AddAllArgs(CmdArgs, options::OPT_L);
8519 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8520 Args.AddAllArgs(CmdArgs, options::OPT_e);
8521
Daniel Dunbar54423b22010-09-17 00:24:54 +00008522 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008523
8524 if (!Args.hasArg(options::OPT_nostdlib) &&
8525 !Args.hasArg(options::OPT_nodefaultlibs)) {
8526 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8527 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008528 if (UseGCC47)
8529 CmdArgs.push_back("-L/usr/lib/gcc47");
8530 else
8531 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008532
8533 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008534 if (UseGCC47) {
8535 CmdArgs.push_back("-rpath");
8536 CmdArgs.push_back("/usr/lib/gcc47");
8537 } else {
8538 CmdArgs.push_back("-rpath");
8539 CmdArgs.push_back("/usr/lib/gcc44");
8540 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008541 }
8542
Hans Wennborg70850d82013-07-18 20:29:38 +00008543 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008544 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008545 CmdArgs.push_back("-lm");
8546 }
8547
Daniel Dunbarcc912342009-05-02 18:28:39 +00008548 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008549 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008550
8551 if (!Args.hasArg(options::OPT_nolibc)) {
8552 CmdArgs.push_back("-lc");
8553 }
8554
John McCall65b8da02013-04-11 22:55:55 +00008555 if (UseGCC47) {
8556 if (Args.hasArg(options::OPT_static) ||
8557 Args.hasArg(options::OPT_static_libgcc)) {
8558 CmdArgs.push_back("-lgcc");
8559 CmdArgs.push_back("-lgcc_eh");
8560 } else {
8561 if (Args.hasArg(options::OPT_shared_libgcc)) {
8562 CmdArgs.push_back("-lgcc_pic");
8563 if (!Args.hasArg(options::OPT_shared))
8564 CmdArgs.push_back("-lgcc");
8565 } else {
8566 CmdArgs.push_back("-lgcc");
8567 CmdArgs.push_back("--as-needed");
8568 CmdArgs.push_back("-lgcc_pic");
8569 CmdArgs.push_back("--no-as-needed");
8570 }
8571 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008572 } else {
John McCall65b8da02013-04-11 22:55:55 +00008573 if (Args.hasArg(options::OPT_shared)) {
8574 CmdArgs.push_back("-lgcc_pic");
8575 } else {
8576 CmdArgs.push_back("-lgcc");
8577 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008578 }
8579 }
8580
8581 if (!Args.hasArg(options::OPT_nostdlib) &&
8582 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008583 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00008584 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00008585 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008586 else
8587 CmdArgs.push_back(Args.MakeArgString(
8588 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008589 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00008590 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008591 }
8592
Alexey Samsonov7811d192014-02-20 13:57:37 +00008593 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008594
Logan Chieneb9162f2014-06-26 14:23:45 +00008595 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008596 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008597}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008598
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008599// Try to find Exe from a Visual Studio distribution. This first tries to find
8600// an installed copy of Visual Studio and, failing that, looks in the PATH,
8601// making sure that whatever executable that's found is not a same-named exe
8602// from clang itself to prevent clang from falling back to itself.
8603static std::string FindVisualStudioExecutable(const ToolChain &TC,
8604 const char *Exe,
8605 const char *ClangProgramPath) {
8606 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8607 std::string visualStudioBinDir;
8608 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8609 visualStudioBinDir)) {
8610 SmallString<128> FilePath(visualStudioBinDir);
8611 llvm::sys::path::append(FilePath, Exe);
8612 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8613 return FilePath.str();
8614 }
8615
8616 return Exe;
8617}
8618
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008619void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
8620 const InputInfo &Output,
8621 const InputInfoList &Inputs,
8622 const ArgList &Args,
8623 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008624 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008625 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008626
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008627 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8628 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00008629 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
8630 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008631
8632 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008633 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008634 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008635
Zachary Turner10d75b22014-10-22 20:40:43 +00008636 if (!llvm::sys::Process::GetEnv("LIB")) {
8637 // If the VC environment hasn't been configured (perhaps because the user
8638 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008639 // the environment variable is set however, assume the user knows what
8640 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008641 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008642 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008643 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8644 SmallString<128> LibDir(VisualStudioDir);
8645 llvm::sys::path::append(LibDir, "VC", "lib");
8646 switch (MSVC.getArch()) {
8647 case llvm::Triple::x86:
8648 // x86 just puts the libraries directly in lib
8649 break;
8650 case llvm::Triple::x86_64:
8651 llvm::sys::path::append(LibDir, "amd64");
8652 break;
8653 case llvm::Triple::arm:
8654 llvm::sys::path::append(LibDir, "arm");
8655 break;
8656 default:
8657 break;
8658 }
8659 CmdArgs.push_back(
8660 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8661 }
8662
8663 std::string WindowsSdkLibPath;
8664 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8665 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8666 WindowsSdkLibPath.c_str()));
8667 }
8668
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008669 CmdArgs.push_back("-nologo");
8670
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008671 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008672 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008673
Hans Wennborge4c47f22015-03-04 23:16:21 +00008674 bool DLL = Args.hasArg(options::OPT__SLASH_LD,
8675 options::OPT__SLASH_LDd,
8676 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008677 if (DLL) {
8678 CmdArgs.push_back(Args.MakeArgString("-dll"));
8679
8680 SmallString<128> ImplibName(Output.getFilename());
8681 llvm::sys::path::replace_extension(ImplibName, "lib");
8682 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
Yaron Keren92e1b622015-03-18 10:17:07 +00008683 ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008684 }
8685
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008686 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008687 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008688 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008689 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008690 static const char *CompilerRTComponents[] = {
8691 "asan_dynamic",
8692 "asan_dynamic_runtime_thunk",
8693 };
8694 for (const auto &Component : CompilerRTComponents)
8695 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008696 // Make sure the dynamic runtime thunk is not optimized out at link time
8697 // to ensure proper SEH handling.
8698 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008699 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008700 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008701 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008702 static const char *CompilerRTComponents[] = {
8703 "asan",
8704 "asan_cxx",
8705 };
8706 for (const auto &Component : CompilerRTComponents)
8707 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008708 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008709 }
8710
Hans Wennborg2e274592013-08-13 23:38:57 +00008711 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008712
Reid Kleckner337188f2014-09-16 19:22:00 +00008713 // Add filenames, libraries, and other linker inputs.
8714 for (const auto &Input : Inputs) {
8715 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008716 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008717 continue;
8718 }
8719
8720 const Arg &A = Input.getInputArg();
8721
8722 // Render -l options differently for the MSVC linker.
8723 if (A.getOption().matches(options::OPT_l)) {
8724 StringRef Lib = A.getValue();
8725 const char *LinkLibArg;
8726 if (Lib.endswith(".lib"))
8727 LinkLibArg = Args.MakeArgString(Lib);
8728 else
8729 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8730 CmdArgs.push_back(LinkLibArg);
8731 continue;
8732 }
8733
8734 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8735 // or -L. Render it, even if MSVC doesn't understand it.
8736 A.renderAsInput(Args, CmdArgs);
8737 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008738
Zachary Turner719f58c2014-12-01 23:06:47 +00008739 // We need to special case some linker paths. In the case of lld, we need to
8740 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8741 // linker, we need to use a special search algorithm.
8742 llvm::SmallString<128> linkPath;
8743 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8744 if (Linker.equals_lower("lld"))
8745 Linker = "lld-link";
8746
8747 if (Linker.equals_lower("link")) {
8748 // If we're using the MSVC linker, it's not sufficient to just use link
8749 // from the program PATH, because other environments like GnuWin32 install
8750 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008751 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008752 C.getDriver().getClangProgramPath());
8753 } else {
8754 linkPath = Linker;
8755 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008756 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008757 }
8758
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008759 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008760 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008761}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008762
8763void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8764 const InputInfo &Output,
8765 const InputInfoList &Inputs,
8766 const ArgList &Args,
8767 const char *LinkingOutput) const {
8768 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8769}
8770
David Blaikiec11bf802014-09-04 16:04:28 +00008771std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8772 Compilation &C, const JobAction &JA, const InputInfo &Output,
8773 const InputInfoList &Inputs, const ArgList &Args,
8774 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008775 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008776 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008777 CmdArgs.push_back("/c"); // Compile only.
8778 CmdArgs.push_back("/W0"); // No warnings.
8779
8780 // The goal is to be able to invoke this tool correctly based on
8781 // any flag accepted by clang-cl.
8782
8783 // These are spelled the same way in clang and cl.exe,.
8784 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8785 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008786
8787 // Optimization level.
8788 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8789 if (A->getOption().getID() == options::OPT_O0) {
8790 CmdArgs.push_back("/Od");
8791 } else {
8792 StringRef OptLevel = A->getValue();
8793 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8794 A->render(Args, CmdArgs);
8795 else if (OptLevel == "3")
8796 CmdArgs.push_back("/Ox");
8797 }
8798 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008799
Nico Weber3f8dafb2015-03-12 19:37:10 +00008800 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008801 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8802
David Majnemerf6072342014-07-01 22:24:56 +00008803 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8804 /*default=*/false))
8805 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008806 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8807 options::OPT_fno_function_sections))
8808 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8809 ? "/Gy"
8810 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008811 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8812 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008813 CmdArgs.push_back(
8814 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008815 if (Args.hasArg(options::OPT_fsyntax_only))
8816 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008817 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8818 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008819
Nico Weber3f8dafb2015-03-12 19:37:10 +00008820 std::vector<std::string> Includes =
8821 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008822 for (const auto &Include : Includes)
8823 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008824
Hans Wennborg87cfa712013-09-19 20:32:16 +00008825 // Flags that can simply be passed through.
8826 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8827 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008828 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008829
8830 // The order of these flags is relevant, so pick the last one.
8831 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8832 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8833 A->render(Args, CmdArgs);
8834
8835
8836 // Input filename.
8837 assert(Inputs.size() == 1);
8838 const InputInfo &II = Inputs[0];
8839 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8840 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8841 if (II.isFilename())
8842 CmdArgs.push_back(II.getFilename());
8843 else
8844 II.getInputArg().renderAsInput(Args, CmdArgs);
8845
8846 // Output filename.
8847 assert(Output.getType() == types::TY_Object);
8848 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8849 Output.getFilename());
8850 CmdArgs.push_back(Fo);
8851
Hans Wennborg188382e2013-09-20 18:16:35 +00008852 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008853 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8854 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008855 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8856 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008857}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008858
8859
8860/// XCore Tools
8861// We pass assemble and link construction to the xcc tool.
8862
8863void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8864 const InputInfo &Output,
8865 const InputInfoList &Inputs,
8866 const ArgList &Args,
8867 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008868 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008869 ArgStringList CmdArgs;
8870
8871 CmdArgs.push_back("-o");
8872 CmdArgs.push_back(Output.getFilename());
8873
8874 CmdArgs.push_back("-c");
8875
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008876 if (Args.hasArg(options::OPT_v))
8877 CmdArgs.push_back("-v");
8878
Robert Lytton894d25c2014-05-02 09:33:25 +00008879 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8880 if (!A->getOption().matches(options::OPT_g0))
8881 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008882
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008883 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8884 false))
8885 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008886
8887 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8888 options::OPT_Xassembler);
8889
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008890 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008891 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008892
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008893 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008894 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008895}
8896
8897void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8898 const InputInfo &Output,
8899 const InputInfoList &Inputs,
8900 const ArgList &Args,
8901 const char *LinkingOutput) const {
8902 ArgStringList CmdArgs;
8903
8904 if (Output.isFilename()) {
8905 CmdArgs.push_back("-o");
8906 CmdArgs.push_back(Output.getFilename());
8907 } else {
8908 assert(Output.isNothing() && "Invalid output.");
8909 }
8910
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008911 if (Args.hasArg(options::OPT_v))
8912 CmdArgs.push_back("-v");
8913
David Majnemer8de68642014-12-05 08:11:58 +00008914 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008915 CmdArgs.push_back("-fexceptions");
8916
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008917 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8918
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008919 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008921}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008922
8923void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8924 const InputInfo &Output,
8925 const InputInfoList &Inputs,
8926 const ArgList &Args,
8927 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008928 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008929 const auto &TC =
8930 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8931 ArgStringList CmdArgs;
8932 const char *Exec;
8933
8934 switch (TC.getArch()) {
8935 default: llvm_unreachable("unsupported architecture");
8936 case llvm::Triple::arm:
8937 case llvm::Triple::thumb:
8938 break;
8939 case llvm::Triple::x86:
8940 CmdArgs.push_back("--32");
8941 break;
8942 case llvm::Triple::x86_64:
8943 CmdArgs.push_back("--64");
8944 break;
8945 }
8946
8947 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8948
8949 CmdArgs.push_back("-o");
8950 CmdArgs.push_back(Output.getFilename());
8951
8952 for (const auto &Input : Inputs)
8953 CmdArgs.push_back(Input.getFilename());
8954
8955 const std::string Assembler = TC.GetProgramPath("as");
8956 Exec = Args.MakeArgString(Assembler);
8957
8958 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8959}
8960
8961void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8962 const InputInfo &Output,
8963 const InputInfoList &Inputs,
8964 const ArgList &Args,
8965 const char *LinkingOutput) const {
8966 const auto &TC =
8967 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8968 const llvm::Triple &T = TC.getTriple();
8969 const Driver &D = TC.getDriver();
8970 SmallString<128> EntryPoint;
8971 ArgStringList CmdArgs;
8972 const char *Exec;
8973
8974 // Silence warning for "clang -g foo.o -o foo"
8975 Args.ClaimAllArgs(options::OPT_g_Group);
8976 // and "clang -emit-llvm foo.o -o foo"
8977 Args.ClaimAllArgs(options::OPT_emit_llvm);
8978 // and for "clang -w foo.o -o foo"
8979 Args.ClaimAllArgs(options::OPT_w);
8980 // Other warning options are already handled somewhere else.
8981
8982 if (!D.SysRoot.empty())
8983 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8984
8985 if (Args.hasArg(options::OPT_pie))
8986 CmdArgs.push_back("-pie");
8987 if (Args.hasArg(options::OPT_rdynamic))
8988 CmdArgs.push_back("-export-dynamic");
8989 if (Args.hasArg(options::OPT_s))
8990 CmdArgs.push_back("--strip-all");
8991
8992 CmdArgs.push_back("-m");
8993 switch (TC.getArch()) {
8994 default: llvm_unreachable("unsupported architecture");
8995 case llvm::Triple::arm:
8996 case llvm::Triple::thumb:
8997 // FIXME: this is incorrect for WinCE
8998 CmdArgs.push_back("thumb2pe");
8999 break;
9000 case llvm::Triple::x86:
9001 CmdArgs.push_back("i386pe");
9002 EntryPoint.append("_");
9003 break;
9004 case llvm::Triple::x86_64:
9005 CmdArgs.push_back("i386pep");
9006 break;
9007 }
9008
9009 if (Args.hasArg(options::OPT_shared)) {
9010 switch (T.getArch()) {
9011 default: llvm_unreachable("unsupported architecture");
9012 case llvm::Triple::arm:
9013 case llvm::Triple::thumb:
9014 case llvm::Triple::x86_64:
9015 EntryPoint.append("_DllMainCRTStartup");
9016 break;
9017 case llvm::Triple::x86:
9018 EntryPoint.append("_DllMainCRTStartup@12");
9019 break;
9020 }
9021
9022 CmdArgs.push_back("-shared");
9023 CmdArgs.push_back("-Bdynamic");
9024
9025 CmdArgs.push_back("--enable-auto-image-base");
9026
9027 CmdArgs.push_back("--entry");
9028 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9029 } else {
9030 EntryPoint.append("mainCRTStartup");
9031
9032 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9033 : "-Bdynamic");
9034
9035 if (!Args.hasArg(options::OPT_nostdlib) &&
9036 !Args.hasArg(options::OPT_nostartfiles)) {
9037 CmdArgs.push_back("--entry");
9038 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9039 }
9040
9041 // FIXME: handle subsystem
9042 }
9043
9044 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009045 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009046
9047 CmdArgs.push_back("-o");
9048 CmdArgs.push_back(Output.getFilename());
9049
9050 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9051 SmallString<261> ImpLib(Output.getFilename());
9052 llvm::sys::path::replace_extension(ImpLib, ".lib");
9053
9054 CmdArgs.push_back("--out-implib");
9055 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9056 }
9057
9058 if (!Args.hasArg(options::OPT_nostdlib) &&
9059 !Args.hasArg(options::OPT_nostartfiles)) {
9060 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9061 const char *CRTBegin;
9062
9063 CRTBegin =
9064 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9065 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9066 }
9067
9068 Args.AddAllArgs(CmdArgs, options::OPT_L);
9069
9070 const auto &Paths = TC.getFilePaths();
9071 for (const auto &Path : Paths)
9072 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9073
9074 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9075
9076 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9077 !Args.hasArg(options::OPT_nodefaultlibs)) {
9078 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9079 !Args.hasArg(options::OPT_static);
9080 if (StaticCXX)
9081 CmdArgs.push_back("-Bstatic");
9082 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9083 if (StaticCXX)
9084 CmdArgs.push_back("-Bdynamic");
9085 }
9086
9087 if (!Args.hasArg(options::OPT_nostdlib)) {
9088 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9089 // TODO handle /MT[d] /MD[d]
9090 CmdArgs.push_back("-lmsvcrt");
9091 AddRunTimeLibs(TC, D, CmdArgs, Args);
9092 }
9093 }
9094
9095 const std::string Linker = TC.GetProgramPath("ld");
9096 Exec = Args.MakeArgString(Linker);
9097
9098 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9099}
Douglas Katzman84a75642015-06-19 14:55:19 +00009100
9101void tools::SHAVE::Compile::ConstructJob(Compilation &C, const JobAction &JA,
9102 const InputInfo &Output,
9103 const InputInfoList &Inputs,
9104 const ArgList &Args,
9105 const char *LinkingOutput) const {
9106
9107 ArgStringList CmdArgs;
9108
9109 assert(Inputs.size() == 1);
9110 const InputInfo &II = Inputs[0];
9111 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9112 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9113
9114 // Append all -I, -iquote, -isystem paths.
9115 Args.AddAllArgs(CmdArgs, options::OPT_clang_i_Group);
9116 // These are spelled the same way in clang and moviCompile.
9117 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
9118
9119 CmdArgs.push_back("-DMYRIAD2");
9120 CmdArgs.push_back("-mcpu=myriad2");
9121 CmdArgs.push_back("-S");
9122
9123 // Any -O option passes through without translation. What about -Ofast ?
9124 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9125 A->render(Args, CmdArgs);
9126
9127 if (Args.hasFlag(options::OPT_ffunction_sections,
9128 options::OPT_fno_function_sections)) {
9129 CmdArgs.push_back("-ffunction-sections");
9130 }
9131 if (Args.hasArg(options::OPT_fno_inline_functions))
9132 CmdArgs.push_back("-fno-inline-functions");
9133
9134 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9135
9136 CmdArgs.push_back(II.getFilename());
9137 CmdArgs.push_back("-o");
9138 CmdArgs.push_back(Output.getFilename());
9139
9140 std::string Exec =
9141 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
9142 C.addCommand(
9143 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9144}
9145
9146void tools::SHAVE::Assemble::ConstructJob(Compilation &C,
9147 const JobAction &JA,
9148 const InputInfo &Output,
9149 const InputInfoList &Inputs,
9150 const ArgList &Args,
9151 const char *LinkingOutput) const {
9152 ArgStringList CmdArgs;
9153
9154 assert(Inputs.size() == 1);
9155 const InputInfo &II = Inputs[0];
9156 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9157 assert(Output.getType() == types::TY_Object);
9158
9159 CmdArgs.push_back("-no6thSlotCompression");
9160 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9161 CmdArgs.push_back("-noSPrefixing");
9162 CmdArgs.push_back("-a"); // Mystery option.
9163 for (auto Arg : Args.filtered(options::OPT_I)) {
9164 Arg->claim();
9165 CmdArgs.push_back(
9166 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9167 }
9168 CmdArgs.push_back("-elf"); // Output format.
9169 CmdArgs.push_back(II.getFilename());
9170 CmdArgs.push_back(
9171 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9172
9173 std::string Exec =
9174 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
9175 C.addCommand(
9176 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9177}