blob: 20c88aecc3c20962ddc0505cf270b4f8d03a5f06 [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"
Josh Mageee0fc1a82014-02-11 01:35:14 +000013#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000032#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000039#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000041
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042using namespace clang::driver;
43using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000045using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000046
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000047static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
48 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
49 options::OPT_fpic, options::OPT_fno_pic,
50 options::OPT_fPIE, options::OPT_fno_PIE,
51 options::OPT_fpie, options::OPT_fno_pie);
52 if (!LastPICArg)
53 return;
54 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
55 LastPICArg->getOption().matches(options::OPT_fpic) ||
56 LastPICArg->getOption().matches(options::OPT_fPIE) ||
57 LastPICArg->getOption().matches(options::OPT_fpie)) {
58 CmdArgs.push_back("-KPIC");
59 }
60}
61
Daniel Dunbar64198ef2009-09-10 01:21:05 +000062/// CheckPreprocessingOptions - Perform some validation of preprocessing
63/// arguments that is shared with gcc.
64static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000065 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
66 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
67 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000069 << A->getBaseArg().getAsString(Args)
70 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
71 }
72 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000073}
74
Daniel Dunbar4eadb602009-09-10 01:21:12 +000075/// CheckCodeGenerationOptions - Perform some validation of code generation
76/// arguments that is shared with gcc.
77static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
78 // In gcc, only ARM checks this, but it seems reasonable to check universally.
79 if (Args.hasArg(options::OPT_static))
80 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
81 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000082 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000083 << A->getAsString(Args) << "-static";
84}
85
Chris Lattnerbf2803f2010-03-29 17:55:58 +000086// Quote target names for inclusion in GNU Make dependency files.
87// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000088static void QuoteTarget(StringRef Target,
89 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000090 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
91 switch (Target[i]) {
92 case ' ':
93 case '\t':
94 // Escape the preceding backslashes
95 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
96 Res.push_back('\\');
97
98 // Escape the space/tab
99 Res.push_back('\\');
100 break;
101 case '$':
102 Res.push_back('$');
103 break;
104 case '#':
105 Res.push_back('\\');
106 break;
107 default:
108 break;
109 }
110
111 Res.push_back(Target[i]);
112 }
113}
114
Bill Wendlingc0938f32012-03-12 22:10:06 +0000115static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000116 ArgStringList &CmdArgs,
117 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000118 const char *EnvVar) {
119 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000120 bool CombinedArg = false;
121
Bill Wendling281ca292012-03-12 21:22:35 +0000122 if (!DirList)
123 return; // Nothing to do.
124
Chad Rosier616e8a52012-10-30 21:42:09 +0000125 StringRef Name(ArgName);
126 if (Name.equals("-I") || Name.equals("-L"))
127 CombinedArg = true;
128
Bill Wendling281ca292012-03-12 21:22:35 +0000129 StringRef Dirs(DirList);
130 if (Dirs.empty()) // Empty string should not add '.'.
131 return;
132
133 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000134 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000135 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(".");
141 }
Bill Wendling281ca292012-03-12 21:22:35 +0000142 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 if (CombinedArg) {
144 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
145 } else {
146 CmdArgs.push_back(ArgName);
147 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
148 }
Bill Wendling281ca292012-03-12 21:22:35 +0000149 }
Nico Weber89355782012-03-19 15:00:03 +0000150 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000151 }
152
153 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 if (CombinedArg) {
155 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
156 } else {
157 CmdArgs.push_back(ArgName);
158 CmdArgs.push_back(".");
159 }
Bill Wendling281ca292012-03-12 21:22:35 +0000160 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000161 if (CombinedArg) {
162 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
163 } else {
164 CmdArgs.push_back(ArgName);
165 CmdArgs.push_back(Args.MakeArgString(Dirs));
166 }
Bill Wendling281ca292012-03-12 21:22:35 +0000167 }
168}
169
Daniel Dunbar54423b22010-09-17 00:24:54 +0000170static void AddLinkerInputs(const ToolChain &TC,
171 const InputInfoList &Inputs, const ArgList &Args,
172 ArgStringList &CmdArgs) {
173 const Driver &D = TC.getDriver();
174
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000175 // Add extra linker input arguments which are not treated as inputs
176 // (constructed via -Xarch_).
177 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
178
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000179 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000180 if (!TC.HasNativeLLVMSupport()) {
181 // Don't try to pass LLVM inputs unless we have native support.
182 if (II.getType() == types::TY_LLVM_IR ||
183 II.getType() == types::TY_LTO_IR ||
184 II.getType() == types::TY_LLVM_BC ||
185 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000186 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000187 << TC.getTripleString();
188 }
189
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000190 // Add filenames immediately.
191 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000192 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000193 continue;
194 }
195
196 // Otherwise, this is a linker input argument.
197 const Arg &A = II.getInputArg();
198
199 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000200 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000201 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000202 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000203 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000204 else if (A.getOption().matches(options::OPT_z)) {
205 // Pass -z prefix for gcc linker compatibility.
206 A.claim();
207 A.render(Args, CmdArgs);
208 } else {
209 A.renderAsInput(Args, CmdArgs);
210 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 }
Bill Wendling281ca292012-03-12 21:22:35 +0000212
213 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000214 // and only supported on native toolchains.
215 if (!TC.isCrossCompiling())
216 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217}
218
John McCall31168b02011-06-15 23:02:42 +0000219/// \brief Determine whether Objective-C automated reference counting is
220/// enabled.
221static bool isObjCAutoRefCount(const ArgList &Args) {
222 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
223}
224
Ted Kremeneke65b0862012-03-06 20:05:56 +0000225/// \brief Determine whether we are linking the ObjC runtime.
226static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000227 if (isObjCAutoRefCount(Args)) {
228 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000229 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000230 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231 return Args.hasArg(options::OPT_fobjc_link_runtime);
232}
233
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000234static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000235 // Don't forward inputs from the original command line. They are added from
236 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000237 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000238 !O.hasFlag(options::DriverOption) &&
239 !O.hasFlag(options::LinkerInput);
240}
241
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000242void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000243 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000244 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000245 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000246 ArgStringList &CmdArgs,
247 const InputInfo &Output,
248 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000250
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000251 CheckPreprocessingOptions(D, Args);
252
253 Args.AddLastArg(CmdArgs, options::OPT_C);
254 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000255
256 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000257 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000258 (A = Args.getLastArg(options::OPT_MD)) ||
259 (A = Args.getLastArg(options::OPT_MMD))) {
260 // Determine the output location.
261 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000262 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000263 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000264 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 } else if (Output.getType() == types::TY_Dependencies) {
266 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000267 } else if (A->getOption().matches(options::OPT_M) ||
268 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 DepFile = "-";
270 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000271 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000272 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 }
274 CmdArgs.push_back("-dependency-file");
275 CmdArgs.push_back(DepFile);
276
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000277 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000278 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
279 const char *DepTarget;
280
281 // If user provided -o, that is the dependency target, except
282 // when we are only generating a dependency file.
283 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
284 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000285 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000286 } else {
287 // Otherwise derive from the base input.
288 //
289 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000290 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000291 llvm::sys::path::replace_extension(P, "o");
292 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 }
294
295 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000296 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000297 QuoteTarget(DepTarget, Quoted);
298 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 }
300
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000301 if (A->getOption().matches(options::OPT_M) ||
302 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000304
305 if (isa<PrecompileJobAction>(JA))
306 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 }
308
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000309 if (Args.hasArg(options::OPT_MG)) {
310 if (!A || A->getOption().matches(options::OPT_MD) ||
311 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000312 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 CmdArgs.push_back("-MG");
314 }
315
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000317
318 // Convert all -MQ <target> args to -MT <quoted target>
319 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
320 options::OPT_MQ),
321 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000322 const Arg *A = *it;
323 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000324
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000327 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000328 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000329 CmdArgs.push_back(Args.MakeArgString(Quoted));
330
331 // -MT flag - no change
332 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000333 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 }
335 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000336
Douglas Gregor111af7d2009-04-18 00:34:01 +0000337 // Add -i* options, and automatically translate to
338 // -include-pch/-include-pth for transparent PCH support. It's
339 // wonky, but we include looking for .gch so we can support seamless
340 // replacement into a build system already set up to be generating
341 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000343 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
344 ie = Args.filtered_end(); it != ie; ++it) {
345 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346
347 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000348 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
349 RenderedImplicitInclude = true;
350
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000351 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000353
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000354 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000356 SmallString<128> P(A->getValue());
357 // We want the files to have a name like foo.h.pch. Add a dummy extension
358 // so that replace_extension does the right thing.
359 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000360 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000361 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000362 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000364 }
365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000367 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000368 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000370 }
371
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000373 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000374 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000375 FoundPCH = UsePCH;
376 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000378 }
379
380 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000381 if (IsFirstImplicitInclude) {
382 A->claim();
383 if (UsePCH)
384 CmdArgs.push_back("-include-pch");
385 else
386 CmdArgs.push_back("-include-pth");
387 CmdArgs.push_back(Args.MakeArgString(P.str()));
388 continue;
389 } else {
390 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000391 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 << P.str() << A->getAsString(Args);
393 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394 }
395 }
396
397 // Not translated, render as usual.
398 A->claim();
399 A->render(Args, CmdArgs);
400 }
401
402 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000403 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
404 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000405
406 // Add -Wp, and -Xassembler if using the preprocessor.
407
408 // FIXME: There is a very unfortunate problem here, some troubled
409 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
410 // really support that we would have to parse and then translate
411 // those options. :(
412 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
413 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000414
415 // -I- is a deprecated GCC feature, reject it.
416 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418
419 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
420 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000421 StringRef sysroot = C.getSysRoot();
422 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000423 if (!Args.hasArg(options::OPT_isysroot)) {
424 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000425 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000426 }
427 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000428
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000430 // FIXME: We should probably sink the logic for handling these from the
431 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // CPATH - included following the user specified includes (but prior to
433 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000436 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000437 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000438 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000439 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000440 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000441 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000442 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000444 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000445 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000446 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000447
448 // Add system include arguments.
449 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000450}
451
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000452// FIXME: Move to target hook.
453static bool isSignedCharDefault(const llvm::Triple &Triple) {
454 switch (Triple.getArch()) {
455 default:
456 return true;
457
Tim Northover9bb857a2013-01-31 12:13:10 +0000458 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000459 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000460 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000461 case llvm::Triple::armeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000462 if (Triple.isOSDarwin() || Triple.isOSWindows())
463 return true;
464 return false;
465
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000466 case llvm::Triple::ppc:
467 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000468 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000469 return true;
470 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000471
Bill Schmidt778d3872013-07-26 01:36:11 +0000472 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000473 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000474 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000476 }
477}
478
Robert Lytton0e076492013-08-13 09:43:10 +0000479static bool isNoCommonDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return false;
483
484 case llvm::Triple::xcore:
485 return true;
486 }
487}
488
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000489// Handle -mhwdiv=.
490static void getARMHWDivFeatures(const Driver &D, const Arg *A,
491 const ArgList &Args,
492 std::vector<const char *> &Features) {
493 StringRef HWDiv = A->getValue();
494 if (HWDiv == "arm") {
495 Features.push_back("+hwdiv-arm");
496 Features.push_back("-hwdiv");
497 } else if (HWDiv == "thumb") {
498 Features.push_back("-hwdiv-arm");
499 Features.push_back("+hwdiv");
500 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
501 Features.push_back("+hwdiv-arm");
502 Features.push_back("+hwdiv");
503 } else if (HWDiv == "none") {
504 Features.push_back("-hwdiv-arm");
505 Features.push_back("-hwdiv");
506 } else
507 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
508}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000509
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000510// Handle -mfpu=.
511//
512// FIXME: Centralize feature selection, defaulting shouldn't be also in the
513// frontend target.
514static void getARMFPUFeatures(const Driver &D, const Arg *A,
515 const ArgList &Args,
516 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000517 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000518
519 // Set the target features based on the FPU.
520 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
521 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000522 Features.push_back("-vfp2");
523 Features.push_back("-vfp3");
524 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000525 } else if (FPU == "vfp") {
526 Features.push_back("+vfp2");
527 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000528 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000529 Features.push_back("+vfp3");
530 Features.push_back("+d16");
531 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000532 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000533 Features.push_back("+vfp3");
534 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000535 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
536 Features.push_back("+vfp4");
537 Features.push_back("+d16");
538 Features.push_back("-neon");
539 } else if (FPU == "vfp4" || FPU == "vfpv4") {
540 Features.push_back("+vfp4");
541 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000542 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
543 Features.push_back("+vfp4");
544 Features.push_back("+d16");
545 Features.push_back("+fp-only-sp");
546 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000547 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000548 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000549 Features.push_back("-neon");
550 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000551 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000552 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000553 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000554 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000555 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000556 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000557 Features.push_back("+neon");
558 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000559 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000560 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000561 } else if (FPU == "none") {
562 Features.push_back("-vfp2");
563 Features.push_back("-vfp3");
564 Features.push_back("-vfp4");
565 Features.push_back("-fp-armv8");
566 Features.push_back("-crypto");
567 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000568 } else
569 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
570}
571
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000572// Select the float ABI as determined by -msoft-float, -mhard-float, and
573// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000574StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
575 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000576 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000577 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
578 options::OPT_mhard_float,
579 options::OPT_mfloat_abi_EQ)) {
580 if (A->getOption().matches(options::OPT_msoft_float))
581 FloatABI = "soft";
582 else if (A->getOption().matches(options::OPT_mhard_float))
583 FloatABI = "hard";
584 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000585 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000586 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000587 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000588 << A->getAsString(Args);
589 FloatABI = "soft";
590 }
591 }
592 }
593
594 // If unspecified, choose the default based on the platform.
595 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000596 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000597 case llvm::Triple::Darwin:
598 case llvm::Triple::MacOSX:
599 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000600 // Darwin defaults to "softfp" for v6 and v7.
601 //
602 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000603 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000604 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000605 if (StringRef(ArchName).startswith("v6") ||
606 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 FloatABI = "softfp";
608 else
609 FloatABI = "soft";
610 break;
611 }
612
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000613 // FIXME: this is invalid for WindowsCE
614 case llvm::Triple::Win32:
615 FloatABI = "hard";
616 break;
617
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000618 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000619 switch(Triple.getEnvironment()) {
620 case llvm::Triple::GNUEABIHF:
621 FloatABI = "hard";
622 break;
623 default:
624 // FreeBSD defaults to soft float
625 FloatABI = "soft";
626 break;
627 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000628 break;
629
Daniel Dunbar78485922009-09-10 23:00:09 +0000630 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000631 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000632 case llvm::Triple::GNUEABIHF:
633 FloatABI = "hard";
634 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000635 case llvm::Triple::GNUEABI:
636 FloatABI = "softfp";
637 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000638 case llvm::Triple::EABIHF:
639 FloatABI = "hard";
640 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000641 case llvm::Triple::EABI:
642 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
643 FloatABI = "softfp";
644 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000645 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000646 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000647 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000649 FloatABI = "softfp";
650 else
651 FloatABI = "soft";
652 break;
653 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000654 default:
655 // Assume "soft", but warn the user we are guessing.
656 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000657 if (Triple.getOS() != llvm::Triple::UnknownOS ||
658 !Triple.isOSBinFormatMachO())
659 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 break;
661 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 }
663 }
664
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000665 return FloatABI;
666}
667
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000668static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
669 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000670 std::vector<const char *> &Features,
671 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000672 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000673 if (!ForAS) {
674 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
675 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
676 // stripped out by the ARM target. We should probably pass this a new
677 // -target-option, which is handled by the -cc1/-cc1as invocation.
678 //
679 // FIXME2: For consistency, it would be ideal if we set up the target
680 // machine state the same when using the frontend or the assembler. We don't
681 // currently do that for the assembler, we pass the options directly to the
682 // backend and never even instantiate the frontend TargetInfo. If we did,
683 // and used its handleTargetFeatures hook, then we could ensure the
684 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000685
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000686 // Use software floating point operations?
687 if (FloatABI == "soft")
688 Features.push_back("+soft-float");
689
690 // Use software floating point argument passing?
691 if (FloatABI != "hard")
692 Features.push_back("+soft-float-abi");
693 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000694
695 // Honor -mfpu=.
696 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000697 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000698 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
699 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000700
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000701 // Setting -msoft-float effectively disables NEON because of the GCC
702 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000703 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000704 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000705 // Also need to explicitly disable features which imply NEON.
706 Features.push_back("-crypto");
707 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000708
709 // En/disable crc
710 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
711 options::OPT_mnocrc)) {
712 if (A->getOption().matches(options::OPT_mcrc))
713 Features.push_back("+crc");
714 else
715 Features.push_back("-crc");
716 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000717}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000718
719void Clang::AddARMTargetArgs(const ArgList &Args,
720 ArgStringList &CmdArgs,
721 bool KernelOrKext) const {
722 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000723 // Get the effective triple, which takes into account the deployment target.
724 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
725 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000726 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000727
728 // Select the ABI to use.
729 //
730 // FIXME: Support -meabi.
Craig Topper92fc2df2014-05-17 16:56:41 +0000731 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000732 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000733 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000734 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000735 // The backend is hardwired to assume AAPCS for M-class processors, ensure
736 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000737 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000738 (Triple.getOS() == llvm::Triple::UnknownOS &&
739 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northovere66c9462013-10-03 14:23:28 +0000740 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000741 ABIName = "aapcs";
742 } else {
743 ABIName = "apcs-gnu";
744 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000745 } else if (Triple.isOSWindows()) {
746 // FIXME: this is invalid for WindowsCE
747 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000748 } else {
749 // Select the default based on the platform.
750 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000751 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000753 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000754 ABIName = "aapcs-linux";
755 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000756 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000757 case llvm::Triple::EABI:
758 ABIName = "aapcs";
759 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000760 default:
761 if (Triple.getOS() == llvm::Triple::NetBSD)
762 ABIName = "apcs-gnu";
763 else
764 ABIName = "aapcs";
765 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000766 }
767 }
768 CmdArgs.push_back("-target-abi");
769 CmdArgs.push_back(ABIName);
770
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000771 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000772 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000773 if (FloatABI == "soft") {
774 // Floating point operations and argument passing are soft.
775 //
776 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000777 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000778 CmdArgs.push_back("-mfloat-abi");
779 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000780 } else if (FloatABI == "softfp") {
781 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000782 CmdArgs.push_back("-mfloat-abi");
783 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000784 } else {
785 // Floating point operations and argument passing are hard.
786 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000787 CmdArgs.push_back("-mfloat-abi");
788 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000789 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000790
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000791 // Kernel code has more strict alignment requirements.
792 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000793 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000794 CmdArgs.push_back("-backend-option");
795 CmdArgs.push_back("-arm-long-calls");
796 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000797
Daniel Dunbar12100e22011-03-22 16:48:17 +0000798 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000799 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000800
801 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000802 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000803 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000804 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000805
Bob Wilson0874e532014-07-29 00:23:18 +0000806 // -mkernel implies -mstrict-align; don't add the redundant option.
807 if (!KernelOrKext) {
808 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
809 options::OPT_munaligned_access)) {
810 CmdArgs.push_back("-backend-option");
811 if (A->getOption().matches(options::OPT_mno_unaligned_access))
812 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000813 else {
814 if (getToolChain().getTriple().getSubArch() ==
815 llvm::Triple::SubArchType::ARMSubArch_v6m)
816 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000817 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000818 }
Bob Wilson0874e532014-07-29 00:23:18 +0000819 }
820 }
821
Chad Rosierba3df1d2011-08-26 00:26:29 +0000822 // Setting -mno-global-merge disables the codegen global merge pass. Setting
823 // -mglobal-merge has no effect as the pass is enabled by default.
824 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
825 options::OPT_mno_global_merge)) {
826 if (A->getOption().matches(options::OPT_mno_global_merge))
827 CmdArgs.push_back("-mno-global-merge");
828 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000829
Bob Wilson9c8af452013-04-11 18:53:25 +0000830 if (!Args.hasFlag(options::OPT_mimplicit_float,
831 options::OPT_mno_implicit_float,
832 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000833 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000834
Logan Chien749763e2014-04-03 13:12:44 +0000835 // llvm does not support reserving registers in general. There is support
836 // for reserving r9 on ARM though (defined as a platform-specific register
837 // in ARM EABI).
838 if (Args.hasArg(options::OPT_ffixed_r9)) {
839 CmdArgs.push_back("-backend-option");
840 CmdArgs.push_back("-arm-reserve-r9");
841 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000842}
843
Tim Northover573cbee2014-05-24 12:52:07 +0000844/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
845/// targeting.
846static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000847 Arg *A;
848 std::string CPU;
849 // If we have -mtune or -mcpu, use that.
850 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
851 CPU = A->getValue();
852 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
853 StringRef Mcpu = A->getValue();
854 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000855 }
856
Kevin Qin110db6f2014-07-18 07:03:22 +0000857 // Handle CPU name is 'native'.
858 if (CPU == "native")
859 return llvm::sys::getHostCPUName();
860 else if (CPU.size())
861 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000862
James Molloy9b1586b2014-04-17 12:51:17 +0000863 // Make sure we pick "cyclone" if -arch is used.
864 // FIXME: Should this be picked by checking the target triple instead?
865 if (Args.getLastArg(options::OPT_arch))
866 return "cyclone";
867
868 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000869}
870
Tim Northover573cbee2014-05-24 12:52:07 +0000871void Clang::AddAArch64TargetArgs(const ArgList &Args,
872 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000873 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
874 llvm::Triple Triple(TripleStr);
875
876 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
877 Args.hasArg(options::OPT_mkernel) ||
878 Args.hasArg(options::OPT_fapple_kext))
879 CmdArgs.push_back("-disable-red-zone");
880
881 if (!Args.hasFlag(options::OPT_mimplicit_float,
882 options::OPT_mno_implicit_float, true))
883 CmdArgs.push_back("-no-implicit-float");
884
Craig Topper92fc2df2014-05-17 16:56:41 +0000885 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000886 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
887 ABIName = A->getValue();
888 else if (Triple.isOSDarwin())
889 ABIName = "darwinpcs";
890 else
891 ABIName = "aapcs";
892
893 CmdArgs.push_back("-target-abi");
894 CmdArgs.push_back(ABIName);
895
Bob Wilson0874e532014-07-29 00:23:18 +0000896 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
897 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000898 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000899 if (A->getOption().matches(options::OPT_mno_unaligned_access))
900 CmdArgs.push_back("-aarch64-strict-align");
901 else
902 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000903 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000904
905 // Setting -mno-global-merge disables the codegen global merge pass. Setting
906 // -mglobal-merge has no effect as the pass is enabled by default.
907 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
908 options::OPT_mno_global_merge)) {
909 if (A->getOption().matches(options::OPT_mno_global_merge))
910 CmdArgs.push_back("-mno-global-merge");
911 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000912}
913
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000914// Get CPU and ABI names. They are not independent
915// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000916void mips::getMipsCPUAndABI(const ArgList &Args,
917 const llvm::Triple &Triple,
918 StringRef &CPUName,
919 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000920 const char *DefMips32CPU = "mips32r2";
921 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000922
Daniel Sanders2bf13662014-07-10 14:40:57 +0000923 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
924 // default for mips64(el)?-img-linux-gnu.
925 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
926 Triple.getEnvironment() == llvm::Triple::GNU) {
927 DefMips32CPU = "mips32r6";
928 DefMips64CPU = "mips64r6";
929 }
930
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000931 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000932 options::OPT_mcpu_EQ))
933 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000934
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000935 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000936 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000937 // Convert a GNU style Mips ABI name to the name
938 // accepted by LLVM Mips backend.
939 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
940 .Case("32", "o32")
941 .Case("64", "n64")
942 .Default(ABIName);
943 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000944
945 // Setup default CPU and ABI names.
946 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000947 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000948 default:
949 llvm_unreachable("Unexpected triple arch name");
950 case llvm::Triple::mips:
951 case llvm::Triple::mipsel:
952 CPUName = DefMips32CPU;
953 break;
954 case llvm::Triple::mips64:
955 case llvm::Triple::mips64el:
956 CPUName = DefMips64CPU;
957 break;
958 }
959 }
960
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000961 if (ABIName.empty()) {
962 // Deduce ABI name from the target triple.
963 if (Triple.getArch() == llvm::Triple::mips ||
964 Triple.getArch() == llvm::Triple::mipsel)
965 ABIName = "o32";
966 else
967 ABIName = "n64";
968 }
969
970 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000971 // Deduce CPU name from ABI name.
972 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +0000973 .Cases("o32", "eabi", DefMips32CPU)
974 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000975 .Default("");
976 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +0000977
978 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000979}
980
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000981// Convert ABI name to the GNU tools acceptable variant.
982static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
983 return llvm::StringSwitch<llvm::StringRef>(ABI)
984 .Case("o32", "32")
985 .Case("n64", "64")
986 .Default(ABI);
987}
988
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000989// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
990// and -mfloat-abi=.
991static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000992 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000993 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000994 options::OPT_mhard_float,
995 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000996 if (A->getOption().matches(options::OPT_msoft_float))
997 FloatABI = "soft";
998 else if (A->getOption().matches(options::OPT_mhard_float))
999 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001000 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001001 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001002 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001003 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001004 FloatABI = "hard";
1005 }
1006 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001007 }
1008
1009 // If unspecified, choose the default based on the platform.
1010 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001011 // Assume "hard", because it's a default value used by gcc.
1012 // When we start to recognize specific target MIPS processors,
1013 // we will be able to select the default more correctly.
1014 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001015 }
1016
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001017 return FloatABI;
1018}
1019
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001020static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001021 std::vector<const char *> &Features,
1022 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001023 StringRef FeatureName) {
1024 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001025 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001026 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001027 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001028 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001029 }
1030}
1031
Daniel Sanders379d44b2014-07-16 11:52:23 +00001032static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1033 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001034 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001035 StringRef CPUName;
1036 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001037 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001038 ABIName = getGnuCompatibleMipsABIName(ABIName);
1039
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001040 // Always override the backend's default ABI.
Aaron Ballman9eef74232014-07-17 13:28:50 +00001041 std::string ABIFeature = llvm::StringSwitch<StringRef>(ABIName)
1042 .Case("32", "+o32")
1043 .Case("n32", "+n32")
1044 .Case("64", "+n64")
1045 .Case("eabi", "+eabi")
1046 .Default(("+" + ABIName).str());
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001047 Features.push_back("-o32");
1048 Features.push_back("-n64");
1049 Features.push_back(Args.MakeArgString(ABIFeature));
1050
Daniel Sandersfeb61302014-08-08 15:47:17 +00001051 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1052 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001053
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001054 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001055 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001056 // FIXME: Note, this is a hack. We need to pass the selected float
1057 // mode to the MipsTargetInfoBase to define appropriate macros there.
1058 // Now it is the only method.
1059 Features.push_back("+soft-float");
1060 }
1061
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001062 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001063 StringRef Val = StringRef(A->getValue());
1064 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001065 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001066 else if (Val == "legacy")
1067 Features.push_back("-nan2008");
1068 else
1069 D.Diag(diag::err_drv_unsupported_option_argument)
1070 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001071 }
1072
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001073 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1074 options::OPT_mdouble_float, "single-float");
1075 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1076 "mips16");
1077 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1078 options::OPT_mno_micromips, "micromips");
1079 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1080 "dsp");
1081 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1082 "dspr2");
1083 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1084 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001085
1086 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1087 // pass -mfpxx
1088 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1089 options::OPT_mfp64)) {
1090 if (A->getOption().matches(options::OPT_mfp32))
1091 Features.push_back(Args.MakeArgString("-fp64"));
1092 else if (A->getOption().matches(options::OPT_mfpxx)) {
1093 Features.push_back(Args.MakeArgString("+fpxx"));
1094 Features.push_back(Args.MakeArgString("+nooddspreg"));
1095 } else
1096 Features.push_back(Args.MakeArgString("+fp64"));
1097 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001098 Features.push_back(Args.MakeArgString("+fpxx"));
1099 Features.push_back(Args.MakeArgString("+nooddspreg"));
1100 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001101
Daniel Sanders28e5d392014-07-10 10:39:51 +00001102 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1103 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001104}
1105
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001106void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001107 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001108 const Driver &D = getToolChain().getDriver();
1109 StringRef CPUName;
1110 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001111 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001112 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001113
1114 CmdArgs.push_back("-target-abi");
1115 CmdArgs.push_back(ABIName.data());
1116
1117 StringRef FloatABI = getMipsFloatABI(D, Args);
1118
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001119 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001120 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001121 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001122 CmdArgs.push_back("-mfloat-abi");
1123 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001124 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001125 else {
1126 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001127 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001128 CmdArgs.push_back("-mfloat-abi");
1129 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001130 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001131
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001132 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1133 if (A->getOption().matches(options::OPT_mxgot)) {
1134 CmdArgs.push_back("-mllvm");
1135 CmdArgs.push_back("-mxgot");
1136 }
1137 }
1138
Simon Atanasyanc580b322013-05-11 06:33:44 +00001139 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1140 options::OPT_mno_ldc1_sdc1)) {
1141 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1142 CmdArgs.push_back("-mllvm");
1143 CmdArgs.push_back("-mno-ldc1-sdc1");
1144 }
1145 }
1146
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001147 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1148 options::OPT_mno_check_zero_division)) {
1149 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1150 CmdArgs.push_back("-mllvm");
1151 CmdArgs.push_back("-mno-check-zero-division");
1152 }
1153 }
1154
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001155 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001156 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001157 CmdArgs.push_back("-mllvm");
1158 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1159 A->claim();
1160 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001161}
1162
Hal Finkel8eb59282012-06-11 22:35:19 +00001163/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1164static std::string getPPCTargetCPU(const ArgList &Args) {
1165 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001166 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001167
1168 if (CPUName == "native") {
1169 std::string CPU = llvm::sys::getHostCPUName();
1170 if (!CPU.empty() && CPU != "generic")
1171 return CPU;
1172 else
1173 return "";
1174 }
1175
1176 return llvm::StringSwitch<const char *>(CPUName)
1177 .Case("common", "generic")
1178 .Case("440", "440")
1179 .Case("440fp", "440")
1180 .Case("450", "450")
1181 .Case("601", "601")
1182 .Case("602", "602")
1183 .Case("603", "603")
1184 .Case("603e", "603e")
1185 .Case("603ev", "603ev")
1186 .Case("604", "604")
1187 .Case("604e", "604e")
1188 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001189 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001190 .Case("G3", "g3")
1191 .Case("7400", "7400")
1192 .Case("G4", "g4")
1193 .Case("7450", "7450")
1194 .Case("G4+", "g4+")
1195 .Case("750", "750")
1196 .Case("970", "970")
1197 .Case("G5", "g5")
1198 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001199 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001200 .Case("e500mc", "e500mc")
1201 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001202 .Case("power3", "pwr3")
1203 .Case("power4", "pwr4")
1204 .Case("power5", "pwr5")
1205 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001206 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001207 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001208 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001209 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001210 .Case("pwr3", "pwr3")
1211 .Case("pwr4", "pwr4")
1212 .Case("pwr5", "pwr5")
1213 .Case("pwr5x", "pwr5x")
1214 .Case("pwr6", "pwr6")
1215 .Case("pwr6x", "pwr6x")
1216 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001217 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001218 .Case("powerpc", "ppc")
1219 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001220 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001221 .Default("");
1222 }
1223
1224 return "";
1225}
1226
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001227static void getPPCTargetFeatures(const ArgList &Args,
1228 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001229 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1230 ie = Args.filtered_end();
1231 it != ie; ++it) {
1232 StringRef Name = (*it)->getOption().getName();
1233 (*it)->claim();
1234
1235 // Skip over "-m".
1236 assert(Name.startswith("m") && "Invalid feature name.");
1237 Name = Name.substr(1);
1238
1239 bool IsNegative = Name.startswith("no-");
1240 if (IsNegative)
1241 Name = Name.substr(3);
1242
1243 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1244 // pass the correct option to the backend while calling the frontend
1245 // option the same.
1246 // TODO: Change the LLVM backend option maybe?
1247 if (Name == "mfcrf")
1248 Name = "mfocrf";
1249
1250 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1251 }
1252
1253 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001254 AddTargetFeature(Args, Features, options::OPT_faltivec,
1255 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001256}
1257
Ulrich Weigand8afad612014-07-28 13:17:52 +00001258void Clang::AddPPCTargetArgs(const ArgList &Args,
1259 ArgStringList &CmdArgs) const {
1260 // Select the ABI to use.
1261 const char *ABIName = nullptr;
1262 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1263 ABIName = A->getValue();
1264 } else if (getToolChain().getTriple().isOSLinux())
1265 switch(getToolChain().getArch()) {
1266 case llvm::Triple::ppc64:
1267 ABIName = "elfv1";
1268 break;
1269 case llvm::Triple::ppc64le:
1270 ABIName = "elfv2";
1271 break;
1272 default:
1273 break;
1274 }
1275
1276 if (ABIName) {
1277 CmdArgs.push_back("-target-abi");
1278 CmdArgs.push_back(ABIName);
1279 }
1280}
1281
1282bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1283 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1284 return A && (A->getValue() == StringRef(Value));
1285}
1286
Tom Stellard6674c702013-04-01 20:56:53 +00001287/// Get the (LLVM) name of the R600 gpu we are targeting.
1288static std::string getR600TargetGPU(const ArgList &Args) {
1289 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001290 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001291 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001292 .Cases("rv630", "rv635", "r600")
1293 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001294 .Case("rv740", "rv770")
1295 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001296 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001297 .Case("hemlock", "cypress")
1298 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001299 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001300 }
1301 return "";
1302}
1303
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001305 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001306 bool SoftFloatABI = true;
1307 if (Arg *A =
1308 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1309 if (A->getOption().matches(options::OPT_mhard_float))
1310 SoftFloatABI = false;
1311 }
1312 if (SoftFloatABI)
1313 Features.push_back("+soft-float");
1314}
1315
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001316void Clang::AddSparcTargetArgs(const ArgList &Args,
1317 ArgStringList &CmdArgs) const {
1318 const Driver &D = getToolChain().getDriver();
1319
Brad Smith10cd0f42014-07-11 20:12:08 +00001320 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001321 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001322 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1323 options::OPT_mhard_float)) {
1324 if (A->getOption().matches(options::OPT_msoft_float))
1325 FloatABI = "soft";
1326 else if (A->getOption().matches(options::OPT_mhard_float))
1327 FloatABI = "hard";
1328 }
1329
1330 // If unspecified, choose the default based on the platform.
1331 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001332 // Assume "soft", but warn the user we are guessing.
1333 FloatABI = "soft";
1334 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001335 }
1336
1337 if (FloatABI == "soft") {
1338 // Floating point operations and argument passing are soft.
1339 //
1340 // FIXME: This changes CPP defines, we need -target-soft-float.
1341 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001342 } else {
1343 assert(FloatABI == "hard" && "Invalid float abi!");
1344 CmdArgs.push_back("-mhard-float");
1345 }
1346}
1347
Richard Sandiford4652d892013-07-19 16:51:51 +00001348static const char *getSystemZTargetCPU(const ArgList &Args) {
1349 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1350 return A->getValue();
1351 return "z10";
1352}
1353
Chandler Carruth953fb082013-01-13 11:46:33 +00001354static const char *getX86TargetCPU(const ArgList &Args,
1355 const llvm::Triple &Triple) {
1356 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001357 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001358 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001359 return "core-avx2";
1360
Chandler Carruth953fb082013-01-13 11:46:33 +00001361 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001362 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001363
1364 // FIXME: Reject attempts to use -march=native unless the target matches
1365 // the host.
1366 //
1367 // FIXME: We should also incorporate the detected target features for use
1368 // with -native.
1369 std::string CPU = llvm::sys::getHostCPUName();
1370 if (!CPU.empty() && CPU != "generic")
1371 return Args.MakeArgString(CPU);
1372 }
1373
1374 // Select the default CPU if none was given (or detection failed).
1375
1376 if (Triple.getArch() != llvm::Triple::x86_64 &&
1377 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001378 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001379
1380 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1381
1382 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001383 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001384 if (Triple.getArchName() == "x86_64h")
1385 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001386 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001387 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001388
Alexey Bataev286d1b92014-01-31 04:07:13 +00001389 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001390 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001391 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001392
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001393 // Everything else goes to x86-64 in 64-bit mode.
1394 if (Is64Bit)
1395 return "x86-64";
1396
1397 switch (Triple.getOS()) {
1398 case llvm::Triple::FreeBSD:
1399 case llvm::Triple::NetBSD:
1400 case llvm::Triple::OpenBSD:
1401 return "i486";
1402 case llvm::Triple::Haiku:
1403 return "i586";
1404 case llvm::Triple::Bitrig:
1405 return "i686";
1406 default:
1407 // Fallback to p4.
1408 return "pentium4";
1409 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001410}
1411
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001412static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1413 switch(T.getArch()) {
1414 default:
1415 return "";
1416
Amara Emerson703da2e2013-10-31 09:32:33 +00001417 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001418 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001419 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001420
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001421 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001422 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001423 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001424 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001425 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001426
1427 case llvm::Triple::mips:
1428 case llvm::Triple::mipsel:
1429 case llvm::Triple::mips64:
1430 case llvm::Triple::mips64el: {
1431 StringRef CPUName;
1432 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001433 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001434 return CPUName;
1435 }
1436
1437 case llvm::Triple::ppc:
1438 case llvm::Triple::ppc64:
1439 case llvm::Triple::ppc64le: {
1440 std::string TargetCPUName = getPPCTargetCPU(Args);
1441 // LLVM may default to generating code for the native CPU,
1442 // but, like gcc, we default to a more generic option for
1443 // each architecture. (except on Darwin)
1444 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1445 if (T.getArch() == llvm::Triple::ppc64)
1446 TargetCPUName = "ppc64";
1447 else if (T.getArch() == llvm::Triple::ppc64le)
1448 TargetCPUName = "ppc64le";
1449 else
1450 TargetCPUName = "ppc";
1451 }
1452 return TargetCPUName;
1453 }
1454
1455 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001456 case llvm::Triple::sparcv9:
1457 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001458 return A->getValue();
1459 return "";
1460
1461 case llvm::Triple::x86:
1462 case llvm::Triple::x86_64:
1463 return getX86TargetCPU(Args, T);
1464
1465 case llvm::Triple::hexagon:
1466 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1467
1468 case llvm::Triple::systemz:
1469 return getSystemZTargetCPU(Args);
1470
1471 case llvm::Triple::r600:
1472 return getR600TargetGPU(Args);
1473 }
1474}
1475
Alp Tokerce365ca2013-12-02 12:43:03 +00001476static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1477 ArgStringList &CmdArgs) {
1478 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1479 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1480 // forward.
1481 CmdArgs.push_back("-plugin");
1482 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1483 CmdArgs.push_back(Args.MakeArgString(Plugin));
1484
1485 // Try to pass driver level flags relevant to LTO code generation down to
1486 // the plugin.
1487
1488 // Handle flags for selecting CPU variants.
1489 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1490 if (!CPU.empty())
1491 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1492}
1493
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001494static void getX86TargetFeatures(const Driver & D,
1495 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001496 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001497 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001498 if (Triple.getArchName() == "x86_64h") {
1499 // x86_64h implies quite a few of the more modern subtarget features
1500 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1501 Features.push_back("-rdrnd");
1502 Features.push_back("-aes");
1503 Features.push_back("-pclmul");
1504 Features.push_back("-rtm");
1505 Features.push_back("-hle");
1506 Features.push_back("-fsgsbase");
1507 }
1508
Alexey Volkov54ff0802014-06-25 12:15:36 +00001509 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001510 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001511 if (Triple.getArch() == llvm::Triple::x86_64) {
1512 Features.push_back("+sse4.2");
1513 Features.push_back("+popcnt");
1514 } else
1515 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001516 }
1517
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001518 // Set features according to the -arch flag on MSVC
1519 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1520 StringRef Arch = A->getValue();
1521 bool ArchUsed = false;
1522 // First, look for flags that are shared in x86 and x86-64.
1523 if (Triple.getArch() == llvm::Triple::x86_64 ||
1524 Triple.getArch() == llvm::Triple::x86) {
1525 if (Arch == "AVX" || Arch == "AVX2") {
1526 ArchUsed = true;
1527 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1528 }
1529 }
1530 // Then, look for x86-specific flags.
1531 if (Triple.getArch() == llvm::Triple::x86) {
1532 if (Arch == "IA32") {
1533 ArchUsed = true;
1534 } else if (Arch == "SSE" || Arch == "SSE2") {
1535 ArchUsed = true;
1536 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1537 }
1538 }
1539 if (!ArchUsed)
1540 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1541 }
1542
Jim Grosbach82eee262013-11-16 00:53:35 +00001543 // Now add any that the user explicitly requested on the command line,
1544 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001545 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1546 ie = Args.filtered_end();
1547 it != ie; ++it) {
1548 StringRef Name = (*it)->getOption().getName();
1549 (*it)->claim();
1550
1551 // Skip over "-m".
1552 assert(Name.startswith("m") && "Invalid feature name.");
1553 Name = Name.substr(1);
1554
1555 bool IsNegative = Name.startswith("no-");
1556 if (IsNegative)
1557 Name = Name.substr(3);
1558
1559 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1560 }
1561}
1562
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001563void Clang::AddX86TargetArgs(const ArgList &Args,
1564 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001565 if (!Args.hasFlag(options::OPT_mred_zone,
1566 options::OPT_mno_red_zone,
1567 true) ||
1568 Args.hasArg(options::OPT_mkernel) ||
1569 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001570 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001571
Bob Wilson2616e2e2013-02-10 16:01:41 +00001572 // Default to avoid implicit floating-point for kernel/kext code, but allow
1573 // that to be overridden with -mno-soft-float.
1574 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1575 Args.hasArg(options::OPT_fapple_kext));
1576 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1577 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001578 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001579 options::OPT_mno_implicit_float)) {
1580 const Option &O = A->getOption();
1581 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1582 O.matches(options::OPT_msoft_float));
1583 }
1584 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001585 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001586
1587 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1588 StringRef Value = A->getValue();
1589 if (Value == "intel" || Value == "att") {
1590 CmdArgs.push_back("-mllvm");
1591 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1592 } else {
1593 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1594 << A->getOption().getName() << Value;
1595 }
1596 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001597}
1598
Matthew Curtise8f80a12012-12-06 17:49:03 +00001599static inline bool HasPICArg(const ArgList &Args) {
1600 return Args.hasArg(options::OPT_fPIC)
1601 || Args.hasArg(options::OPT_fpic);
1602}
1603
1604static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1605 return Args.getLastArg(options::OPT_G,
1606 options::OPT_G_EQ,
1607 options::OPT_msmall_data_threshold_EQ);
1608}
1609
1610static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1611 std::string value;
1612 if (HasPICArg(Args))
1613 value = "0";
1614 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1615 value = A->getValue();
1616 A->claim();
1617 }
1618 return value;
1619}
1620
Tony Linthicum76329bf2011-12-12 21:14:55 +00001621void Clang::AddHexagonTargetArgs(const ArgList &Args,
1622 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001623 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001624 CmdArgs.push_back("-mqdsp6-compat");
1625 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001626
Matthew Curtise8f80a12012-12-06 17:49:03 +00001627 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1628 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001629 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001630 CmdArgs.push_back(Args.MakeArgString(
1631 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001632 }
1633
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001634 if (!Args.hasArg(options::OPT_fno_short_enums))
1635 CmdArgs.push_back("-fshort-enums");
1636 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1637 CmdArgs.push_back ("-mllvm");
1638 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1639 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001640 CmdArgs.push_back ("-mllvm");
1641 CmdArgs.push_back ("-machine-sink-split=0");
1642}
1643
Kevin Qin110db6f2014-07-18 07:03:22 +00001644// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001645static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001646 std::vector<const char *> &Features) {
1647 SmallVector<StringRef, 8> Split;
1648 text.split(Split, StringRef("+"), -1, false);
1649
1650 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1651 const char *result = llvm::StringSwitch<const char *>(Split[I])
1652 .Case("fp", "+fp-armv8")
1653 .Case("simd", "+neon")
1654 .Case("crc", "+crc")
1655 .Case("crypto", "+crypto")
1656 .Case("nofp", "-fp-armv8")
1657 .Case("nosimd", "-neon")
1658 .Case("nocrc", "-crc")
1659 .Case("nocrypto", "-crypto")
1660 .Default(nullptr);
1661 if (result)
1662 Features.push_back(result);
1663 else if (Split[I] == "neon" || Split[I] == "noneon")
1664 D.Diag(diag::err_drv_no_neon_modifier);
1665 else
1666 return false;
1667 }
1668 return true;
1669}
1670
1671// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1672// decode CPU and feature.
1673static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1674 std::vector<const char *> &Features) {
1675 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1676 CPU = Split.first;
1677 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1678 Features.push_back("+neon");
1679 Features.push_back("+crc");
1680 Features.push_back("+crypto");
1681 } else if (CPU == "generic") {
1682 Features.push_back("+neon");
1683 } else {
1684 return false;
1685 }
1686
1687 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1688 return false;
1689
1690 return true;
1691}
1692
1693static bool
1694getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1695 const ArgList &Args,
1696 std::vector<const char *> &Features) {
1697 std::pair<StringRef, StringRef> Split = March.split("+");
1698 if (Split.first != "armv8-a")
1699 return false;
1700
1701 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1702 return false;
1703
1704 return true;
1705}
1706
1707static bool
1708getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1709 const ArgList &Args,
1710 std::vector<const char *> &Features) {
1711 StringRef CPU;
1712 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1713 return false;
1714
1715 return true;
1716}
1717
1718static bool
1719getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1720 const ArgList &Args,
1721 std::vector<const char *> &Features) {
1722 // Handle CPU name is 'native'.
1723 if (Mtune == "native")
1724 Mtune = llvm::sys::getHostCPUName();
1725 if (Mtune == "cyclone") {
1726 Features.push_back("+zcm");
1727 Features.push_back("+zcz");
1728 }
1729 return true;
1730}
1731
1732static bool
1733getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1734 const ArgList &Args,
1735 std::vector<const char *> &Features) {
1736 StringRef CPU;
1737 std::vector<const char *> DecodedFeature;
1738 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1739 return false;
1740
1741 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1742}
1743
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001744static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1745 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001746 Arg *A;
1747 bool success = true;
1748 // Enable NEON by default.
1749 Features.push_back("+neon");
1750 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1751 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1752 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1753 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1754
1755 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1756 success =
1757 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1758 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1759 success =
1760 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1761
1762 if (!success)
1763 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001764
1765 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1766 Features.push_back("-fp-armv8");
1767 Features.push_back("-crypto");
1768 Features.push_back("-neon");
1769 }
Bradley Smith418c5932014-05-02 15:17:51 +00001770
1771 // En/disable crc
1772 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1773 options::OPT_mnocrc)) {
1774 if (A->getOption().matches(options::OPT_mcrc))
1775 Features.push_back("+crc");
1776 else
1777 Features.push_back("-crc");
1778 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001779}
1780
1781static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001782 const ArgList &Args, ArgStringList &CmdArgs,
1783 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001784 std::vector<const char *> Features;
1785 switch (Triple.getArch()) {
1786 default:
1787 break;
1788 case llvm::Triple::mips:
1789 case llvm::Triple::mipsel:
1790 case llvm::Triple::mips64:
1791 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001792 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001793 break;
1794
1795 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001796 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001797 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001798 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001799 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001800 break;
1801
1802 case llvm::Triple::ppc:
1803 case llvm::Triple::ppc64:
1804 case llvm::Triple::ppc64le:
1805 getPPCTargetFeatures(Args, Features);
1806 break;
1807 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001808 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001809 getSparcTargetFeatures(Args, Features);
1810 break;
1811 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001812 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001813 getAArch64TargetFeatures(D, Args, Features);
1814 break;
1815 case llvm::Triple::x86:
1816 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001817 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001818 break;
1819 }
Rafael Espindola43964802013-08-21 17:34:32 +00001820
1821 // Find the last of each feature.
1822 llvm::StringMap<unsigned> LastOpt;
1823 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1824 const char *Name = Features[I];
1825 assert(Name[0] == '-' || Name[0] == '+');
1826 LastOpt[Name + 1] = I;
1827 }
1828
1829 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1830 // If this feature was overridden, ignore it.
1831 const char *Name = Features[I];
1832 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1833 assert(LastI != LastOpt.end());
1834 unsigned Last = LastI->second;
1835 if (Last != I)
1836 continue;
1837
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001838 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001839 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001840 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001841}
1842
Eric Christopher84fbdb42011-08-19 00:30:14 +00001843static bool
John McCall5fb5df92012-06-20 06:18:46 +00001844shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001845 const llvm::Triple &Triple) {
1846 // We use the zero-cost exception tables for Objective-C if the non-fragile
1847 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1848 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001849 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001850 return true;
1851
Bob Wilson83e723a2013-12-05 19:38:42 +00001852 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001853 return false;
1854
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001855 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001856 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001857 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001858}
1859
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001860namespace {
1861 struct ExceptionSettings {
1862 bool ExceptionsEnabled;
1863 bool ShouldUseExceptionTables;
1864 ExceptionSettings() : ExceptionsEnabled(false),
1865 ShouldUseExceptionTables(false) {}
1866 };
1867} // end anonymous namespace.
1868
Nico Webere8e53112014-05-11 01:04:02 +00001869// exceptionSettings() exists to share the logic between -cc1 and linker
1870// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001871static ExceptionSettings exceptionSettings(const ArgList &Args,
1872 const llvm::Triple &Triple) {
1873 ExceptionSettings ES;
1874
1875 // Are exceptions enabled by default?
1876 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1877
1878 // This keeps track of whether exceptions were explicitly turned on or off.
1879 bool DidHaveExplicitExceptionFlag = false;
1880
1881 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1882 options::OPT_fno_exceptions)) {
1883 if (A->getOption().matches(options::OPT_fexceptions))
1884 ES.ExceptionsEnabled = true;
1885 else
1886 ES.ExceptionsEnabled = false;
1887
1888 DidHaveExplicitExceptionFlag = true;
1889 }
1890
1891 // Exception tables and cleanups can be enabled with -fexceptions even if the
1892 // language itself doesn't support exceptions.
1893 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1894 ES.ShouldUseExceptionTables = true;
1895
1896 return ES;
1897}
1898
Anders Carlssone96ab552011-02-28 02:27:16 +00001899/// addExceptionArgs - Adds exception related arguments to the driver command
1900/// arguments. There's a master flag, -fexceptions and also language specific
1901/// flags to enable/disable C++ and Objective-C exceptions.
1902/// This makes it possible to for example disable C++ exceptions but enable
1903/// Objective-C exceptions.
1904static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1905 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001906 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001907 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001908 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001909 if (KernelOrKext) {
1910 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1911 // arguments now to avoid warnings about unused arguments.
1912 Args.ClaimAllArgs(options::OPT_fexceptions);
1913 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1914 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1915 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1916 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1917 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001918 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001919 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001920
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001921 // Gather the exception settings from the command line arguments.
1922 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001923
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001924 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1925 // is not necessarily sensible, but follows GCC.
1926 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001927 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001928 options::OPT_fno_objc_exceptions,
1929 true)) {
1930 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001931
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001932 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001933 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001934 }
1935
1936 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001937 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001938
Eric Christopher84fbdb42011-08-19 00:30:14 +00001939 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1940 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001941 options::OPT_fexceptions,
1942 options::OPT_fno_exceptions)) {
1943 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1944 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001945 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001946 CXXExceptionsEnabled = false;
1947 }
1948
1949 if (CXXExceptionsEnabled) {
1950 CmdArgs.push_back("-fcxx-exceptions");
1951
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001952 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001953 }
1954 }
1955
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001956 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001957 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001958}
1959
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001960static bool ShouldDisableAutolink(const ArgList &Args,
1961 const ToolChain &TC) {
1962 bool Default = true;
1963 if (TC.getTriple().isOSDarwin()) {
1964 // The native darwin assembler doesn't support the linker_option directives,
1965 // so we disable them if we think the .s file will be passed to it.
1966 Default = TC.useIntegratedAs();
1967 }
1968 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1969 Default);
1970}
1971
Ted Kremenek62093662013-03-12 17:02:12 +00001972static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1973 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001974 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1975 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001976 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001977 return !UseDwarfDirectory;
1978}
1979
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001980/// \brief Check whether the given input tree contains any compilation actions.
1981static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001982 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001983 return true;
1984
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001985 for (const auto &Act : *A)
1986 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001987 return true;
1988
1989 return false;
1990}
1991
1992/// \brief Check if -relax-all should be passed to the internal assembler.
1993/// This is done by default when compiling non-assembler source with -O0.
1994static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1995 bool RelaxDefault = true;
1996
1997 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1998 RelaxDefault = A->getOption().matches(options::OPT_O0);
1999
2000 if (RelaxDefault) {
2001 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002002 for (const auto &Act : C.getActions()) {
2003 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002004 RelaxDefault = true;
2005 break;
2006 }
2007 }
2008 }
2009
2010 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2011 RelaxDefault);
2012}
2013
David Blaikie9260ed62013-07-25 21:19:01 +00002014static void CollectArgsForIntegratedAssembler(Compilation &C,
2015 const ArgList &Args,
2016 ArgStringList &CmdArgs,
2017 const Driver &D) {
2018 if (UseRelaxAll(C, Args))
2019 CmdArgs.push_back("-mrelax-all");
2020
David Peixottodfb66142013-11-14 22:52:58 +00002021 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002022 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002023 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2024 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2025 // arg after parsing the '-I' arg.
2026 bool TakeNextArg = false;
2027
David Blaikie9260ed62013-07-25 21:19:01 +00002028 // When using an integrated assembler, translate -Wa, and -Xassembler
2029 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002030 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002031 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2032 options::OPT_Xassembler),
2033 ie = Args.filtered_end(); it != ie; ++it) {
2034 const Arg *A = *it;
2035 A->claim();
2036
2037 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2038 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002039 if (TakeNextArg) {
2040 CmdArgs.push_back(Value.data());
2041 TakeNextArg = false;
2042 continue;
2043 }
David Blaikie9260ed62013-07-25 21:19:01 +00002044
2045 if (Value == "-force_cpusubtype_ALL") {
2046 // Do nothing, this is the default and we don't support anything else.
2047 } else if (Value == "-L") {
2048 CmdArgs.push_back("-msave-temp-labels");
2049 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002050 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002051 } else if (Value == "--noexecstack") {
2052 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002053 } else if (Value == "-compress-debug-sections" ||
2054 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002055 CompressDebugSections = true;
2056 } else if (Value == "-nocompress-debug-sections" ||
2057 Value == "--nocompress-debug-sections") {
2058 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002059 } else if (Value.startswith("-I")) {
2060 CmdArgs.push_back(Value.data());
2061 // We need to consume the next argument if the current arg is a plain
2062 // -I. The next arg will be the include directory.
2063 if (Value == "-I")
2064 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002065 } else if (Value.startswith("-gdwarf-")) {
2066 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002067 } else {
2068 D.Diag(diag::err_drv_unsupported_option_argument)
2069 << A->getOption().getName() << Value;
2070 }
2071 }
2072 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002073 if (CompressDebugSections) {
2074 if (llvm::zlib::isAvailable())
2075 CmdArgs.push_back("-compress-debug-sections");
2076 else
2077 D.Diag(diag::warn_debug_compression_unavailable);
2078 }
David Blaikie9260ed62013-07-25 21:19:01 +00002079}
2080
Renato Goline807c122014-01-31 11:47:28 +00002081// Until ARM libraries are build separately, we have them all in one library
2082static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002083 if (TC.getArch() == llvm::Triple::arm ||
2084 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002085 return "arm";
2086 else
2087 return TC.getArchName();
2088}
2089
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002090static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2091 // The runtimes are located in the OS-specific resource directory.
2092 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002093 const llvm::Triple &Triple = TC.getTriple();
2094 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
2095 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
2096 "freebsd" : TC.getOS();
2097 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002098 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002099}
2100
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002101// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002102// FIXME: Make sure we can also emit shared objects if they're requested
2103// and available, check for possible errors, etc.
2104static void addClangRTLinux(
2105 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002106 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002107 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2108 getArchNameForCompilerRTLib(TC) +
2109 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00002110
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002111 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00002112 CmdArgs.push_back("-lgcc_s");
2113 if (TC.getDriver().CCCIsCXX())
2114 CmdArgs.push_back("-lgcc_eh");
2115}
2116
Alexey Samsonov7811d192014-02-20 13:57:37 +00002117static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00002118 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002119 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2120 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002121 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002122 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002123 Args.hasArg(options::OPT_fcreate_profile) ||
2124 Args.hasArg(options::OPT_coverage)))
2125 return;
2126
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002127 // -fprofile-instr-generate requires position-independent code to build with
2128 // shared objects. Link against the right archive.
2129 const char *Lib = "libclang_rt.profile-";
2130 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2131 Args.hasArg(options::OPT_shared))
2132 Lib = "libclang_rt.profile-pic-";
2133
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002134 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
2135 llvm::sys::path::append(LibProfile,
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002136 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00002137
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00002138 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00002139}
2140
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002141static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
Craig Topperbf3e3272014-08-30 16:55:52 +00002142 StringRef Sanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002143 bool Shared) {
2144 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
2145 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
2146 const char *EnvSuffix =
2147 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002148 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
2149 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002150 Twine("libclang_rt.") + Sanitizer + "-" +
2151 getArchNameForCompilerRTLib(TC) + EnvSuffix +
2152 (Shared ? ".so" : ".a"));
2153 return LibSanitizer;
2154}
2155
Alexey Samsonov52550342014-09-15 19:58:40 +00002156static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2157 ArgStringList &CmdArgs, StringRef Sanitizer,
2158 bool IsShared) {
2159 SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, IsShared);
2160 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002161 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002162 if (!IsShared)
2163 CmdArgs.push_back("-whole-archive");
2164 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
2165 if (!IsShared)
2166 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002167}
2168
Alexey Samsonov52550342014-09-15 19:58:40 +00002169// Tries to use a file with the list of dynamic symbols that need to be exported
2170// from the runtime library. Returns true if the file was found.
2171static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2172 ArgStringList &CmdArgs,
2173 StringRef Sanitizer) {
2174 SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, false);
2175 if (llvm::sys::fs::exists(LibSanitizer + ".syms")) {
2176 CmdArgs.push_back(
2177 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2178 return true;
2179 }
2180 return false;
2181}
2182
2183static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2184 ArgStringList &CmdArgs) {
2185 // Force linking against the system libraries sanitizers depends on
2186 // (see PR15823 why this is necessary).
2187 CmdArgs.push_back("--no-as-needed");
2188 CmdArgs.push_back("-lpthread");
2189 CmdArgs.push_back("-lrt");
2190 CmdArgs.push_back("-lm");
2191 // There's no libdl on FreeBSD.
2192 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2193 CmdArgs.push_back("-ldl");
2194}
2195
2196static void
2197collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2198 SmallVectorImpl<StringRef> &SharedRuntimes,
2199 SmallVectorImpl<StringRef> &StaticRuntimes,
2200 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2201 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2202 // Collect shared runtimes.
2203 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2204 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002205 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002206
Alexey Samsonov52550342014-09-15 19:58:40 +00002207 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002208 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002209 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2210 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002211 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002212 }
2213 if (SanArgs.needsAsanRt()) {
2214 if (SanArgs.needsSharedAsanRt()) {
2215 HelperStaticRuntimes.push_back("asan-preinit");
2216 } else {
2217 StaticRuntimes.push_back("asan");
2218 if (SanArgs.linkCXXRuntimes())
2219 StaticRuntimes.push_back("asan_cxx");
2220 }
2221 }
2222 if (SanArgs.needsDfsanRt())
2223 StaticRuntimes.push_back("dfsan");
2224 if (SanArgs.needsLsanRt())
2225 StaticRuntimes.push_back("lsan");
2226 if (SanArgs.needsMsanRt())
2227 StaticRuntimes.push_back("msan");
2228 if (SanArgs.needsTsanRt())
2229 StaticRuntimes.push_back("tsan");
2230 // WARNING: UBSan should always go last.
2231 if (SanArgs.needsUbsanRt()) {
2232 // If UBSan is not combined with another sanitizer, we need to pull in
2233 // sanitizer_common explicitly.
2234 if (StaticRuntimes.empty())
2235 HelperStaticRuntimes.push_back("san");
2236 StaticRuntimes.push_back("ubsan");
2237 if (SanArgs.linkCXXRuntimes())
2238 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002239 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002240}
2241
Alexey Samsonov52550342014-09-15 19:58:40 +00002242// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2243// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2244static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002245 ArgStringList &CmdArgs) {
Alexey Samsonov58ae9ae2014-09-26 21:22:08 +00002246 // Don't link in any sanitizer runtimes if we have no system libraries.
2247 if (Args.hasArg(options::OPT_nostdlib) ||
2248 Args.hasArg(options::OPT_nodefaultlibs))
2249 return false;
Alexey Samsonov52550342014-09-15 19:58:40 +00002250 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2251 HelperStaticRuntimes;
2252 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2253 HelperStaticRuntimes);
2254 for (auto RT : SharedRuntimes)
2255 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2256 for (auto RT : HelperStaticRuntimes)
2257 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2258 bool AddExportDynamic = false;
2259 for (auto RT : StaticRuntimes) {
2260 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2261 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2262 }
2263 // If there is a static runtime with no dynamic list, force all the symbols
2264 // to be dynamic to be sure we export sanitizer interface functions.
2265 if (AddExportDynamic)
2266 CmdArgs.push_back("-export-dynamic");
2267 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002268}
2269
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002270static bool shouldUseFramePointerForTarget(const ArgList &Args,
2271 const llvm::Triple &Triple) {
2272 switch (Triple.getArch()) {
2273 // Don't use a frame pointer on linux if optimizing for certain targets.
2274 case llvm::Triple::mips64:
2275 case llvm::Triple::mips64el:
2276 case llvm::Triple::mips:
2277 case llvm::Triple::mipsel:
2278 case llvm::Triple::systemz:
2279 case llvm::Triple::x86:
2280 case llvm::Triple::x86_64:
2281 if (Triple.isOSLinux())
2282 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2283 if (!A->getOption().matches(options::OPT_O0))
2284 return false;
2285 return true;
2286 case llvm::Triple::xcore:
2287 return false;
2288 default:
2289 return true;
2290 }
2291}
2292
Rafael Espindola224dd632011-12-14 21:02:23 +00002293static bool shouldUseFramePointer(const ArgList &Args,
2294 const llvm::Triple &Triple) {
2295 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2296 options::OPT_fomit_frame_pointer))
2297 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2298
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002299 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002300}
2301
Eric Christopherb7d97e92013-04-03 01:58:53 +00002302static bool shouldUseLeafFramePointer(const ArgList &Args,
2303 const llvm::Triple &Triple) {
2304 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2305 options::OPT_momit_leaf_frame_pointer))
2306 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2307
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002308 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002309}
2310
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002311/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002312static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002313 SmallString<128> cwd;
2314 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002315 CmdArgs.push_back("-fdebug-compilation-dir");
2316 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002317 }
2318}
2319
Eric Christopherd3804002013-02-22 20:12:52 +00002320static const char *SplitDebugName(const ArgList &Args,
2321 const InputInfoList &Inputs) {
2322 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2323 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2324 SmallString<128> T(FinalOutput->getValue());
2325 llvm::sys::path::replace_extension(T, "dwo");
2326 return Args.MakeArgString(T);
2327 } else {
2328 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002329 SmallString<128> T(
2330 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002331 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2332 llvm::sys::path::replace_extension(F, "dwo");
2333 T += F;
2334 return Args.MakeArgString(F);
2335 }
2336}
2337
2338static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2339 const Tool &T, const JobAction &JA,
2340 const ArgList &Args, const InputInfo &Output,
2341 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002342 ArgStringList ExtractArgs;
2343 ExtractArgs.push_back("--extract-dwo");
2344
2345 ArgStringList StripArgs;
2346 StripArgs.push_back("--strip-dwo");
2347
2348 // Grabbing the output of the earlier compile step.
2349 StripArgs.push_back(Output.getFilename());
2350 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002351 ExtractArgs.push_back(OutFile);
2352
2353 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002354 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002355
2356 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002357 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002358
2359 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002360 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002361}
2362
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002363/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002364/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2365static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002366 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002367 if (A->getOption().matches(options::OPT_O4) ||
2368 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002369 return true;
2370
2371 if (A->getOption().matches(options::OPT_O0))
2372 return false;
2373
2374 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2375
Rafael Espindola91780de2013-08-26 14:05:41 +00002376 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002377 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002378 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002379 return true;
2380
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002381 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002382 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002383 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002384
2385 unsigned OptLevel = 0;
2386 if (S.getAsInteger(10, OptLevel))
2387 return false;
2388
2389 return OptLevel > 1;
2390 }
2391
2392 return false;
2393}
2394
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002395/// Add -x lang to \p CmdArgs for \p Input.
2396static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2397 ArgStringList &CmdArgs) {
2398 // When using -verify-pch, we don't want to provide the type
2399 // 'precompiled-header' if it was inferred from the file extension
2400 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2401 return;
2402
2403 CmdArgs.push_back("-x");
2404 if (Args.hasArg(options::OPT_rewrite_objc))
2405 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2406 else
2407 CmdArgs.push_back(types::getTypeName(Input.getType()));
2408}
2409
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002410static std::string getMSCompatibilityVersion(const char *VersionStr) {
2411 unsigned Version;
2412 if (StringRef(VersionStr).getAsInteger(10, Version))
2413 return "0";
2414
2415 if (Version < 100)
2416 return llvm::utostr_32(Version) + ".0";
2417
2418 if (Version < 10000)
2419 return llvm::utostr_32(Version / 100) + "." +
2420 llvm::utostr_32(Version % 100);
2421
2422 unsigned Build = 0, Factor = 1;
2423 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2424 Build = Build + (Version % 10) * Factor;
2425 return llvm::utostr_32(Version / 100) + "." +
2426 llvm::utostr_32(Version % 100) + "." +
2427 llvm::utostr_32(Build);
2428}
2429
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002430void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002431 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002432 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002433 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002434 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002435 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2436 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002437 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002438 ArgStringList CmdArgs;
2439
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002440 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002441 bool IsWindowsCygnus =
2442 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002443 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2444
Daniel Dunbare521a892009-03-31 20:53:55 +00002445 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2446
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002447 // Invoke ourselves in -cc1 mode.
2448 //
2449 // FIXME: Implement custom jobs for internal actions.
2450 CmdArgs.push_back("-cc1");
2451
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002452 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002453 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002454 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002455 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002456
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002457 const llvm::Triple TT(TripleStr);
2458 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2459 TT.getArch() == llvm::Triple::thumb)) {
2460 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2461 unsigned Version;
2462 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2463 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002464 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2465 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002466 }
2467
Tim Northover336f1892014-03-29 13:16:12 +00002468 // Push all default warning arguments that are specific to
2469 // the given target. These come before user provided warning options
2470 // are provided.
2471 getToolChain().addClangWarningOptions(CmdArgs);
2472
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002473 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002474 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002475
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002476 if (isa<AnalyzeJobAction>(JA)) {
2477 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2478 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002479 } else if (isa<MigrateJobAction>(JA)) {
2480 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002481 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002482 if (Output.getType() == types::TY_Dependencies)
2483 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002484 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002485 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002486 if (Args.hasArg(options::OPT_rewrite_objc) &&
2487 !Args.hasArg(options::OPT_g_Group))
2488 CmdArgs.push_back("-P");
2489 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002490 } else if (isa<AssembleJobAction>(JA)) {
2491 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002492
David Blaikie9260ed62013-07-25 21:19:01 +00002493 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002494
2495 // Also ignore explicit -force_cpusubtype_ALL option.
2496 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002497 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002498 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002499 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002500
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002501 if (JA.getType() == types::TY_Nothing)
2502 CmdArgs.push_back("-fsyntax-only");
2503 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002504 CmdArgs.push_back("-emit-pch");
2505 else
2506 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002507 } else if (isa<VerifyPCHJobAction>(JA)) {
2508 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002509 } else {
2510 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002511
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002512 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002513 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002514 } else if (JA.getType() == types::TY_LLVM_IR ||
2515 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002516 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002517 } else if (JA.getType() == types::TY_LLVM_BC ||
2518 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002519 CmdArgs.push_back("-emit-llvm-bc");
2520 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002521 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002522 } else if (JA.getType() == types::TY_AST) {
2523 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002524 } else if (JA.getType() == types::TY_ModuleFile) {
2525 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002526 } else if (JA.getType() == types::TY_RewrittenObjC) {
2527 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002528 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002529 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2530 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002531 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002532 } else {
2533 assert(JA.getType() == types::TY_PP_Asm &&
2534 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002535 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002536 }
2537
Justin Bognera88f0122014-06-20 22:59:50 +00002538 // We normally speed up the clang process a bit by skipping destructors at
2539 // exit, but when we're generating diagnostics we can rely on some of the
2540 // cleanup.
2541 if (!C.isForDiagnostics())
2542 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002543
John McCallbb79b5f2010-02-13 03:50:24 +00002544 // Disable the verification pass in -asserts builds.
2545#ifdef NDEBUG
2546 CmdArgs.push_back("-disable-llvm-verifier");
2547#endif
2548
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002549 // Set the main file name, so that debug info works even with
2550 // -save-temps.
2551 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002552 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002553
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002554 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002555 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002556 if (Args.hasArg(options::OPT_static))
2557 CmdArgs.push_back("-static-define");
2558
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002559 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002560 // Enable region store model by default.
2561 CmdArgs.push_back("-analyzer-store=region");
2562
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002563 // Treat blocks as analysis entry points.
2564 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2565
Ted Kremenek49c79792011-03-24 00:28:47 +00002566 CmdArgs.push_back("-analyzer-eagerly-assume");
2567
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002568 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002569 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002570 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002571
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002572 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002573 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002574
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002575 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002576 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002577
2578 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002579
Jordan Rose10ad0812013-04-05 17:55:07 +00002580 if (types::isCXX(Inputs[0].getType()))
2581 CmdArgs.push_back("-analyzer-checker=cplusplus");
2582
Nico Webere8e53112014-05-11 01:04:02 +00002583 // Enable the following experimental checkers for testing.
2584 CmdArgs.push_back(
2585 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002586 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2587 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2588 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2589 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2590 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002591 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002592
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002593 // Set the output format. The default is plist, for (lame) historical
2594 // reasons.
2595 CmdArgs.push_back("-analyzer-output");
2596 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002597 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002598 else
2599 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002600
Ted Kremenekfe449a22010-03-22 22:32:05 +00002601 // Disable the presentation of standard compiler warnings when
2602 // using --analyze. We only want to show static analyzer diagnostics
2603 // or frontend errors.
2604 CmdArgs.push_back("-w");
2605
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002606 // Add -Xanalyzer arguments when running as analyzer.
2607 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002608 }
2609
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002610 CheckCodeGenerationOptions(D, Args);
2611
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002612 bool PIE = getToolChain().isPIEDefault();
2613 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002614 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002615
Alexey Bataev40e75222014-01-28 06:30:35 +00002616 // Android-specific defaults for PIC/PIE
2617 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2618 switch (getToolChain().getTriple().getArch()) {
2619 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002620 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002621 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002622 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002623 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002624 case llvm::Triple::mips:
2625 case llvm::Triple::mipsel:
2626 case llvm::Triple::mips64:
2627 case llvm::Triple::mips64el:
2628 PIC = true; // "-fpic"
2629 break;
2630
2631 case llvm::Triple::x86:
2632 case llvm::Triple::x86_64:
2633 PIC = true; // "-fPIC"
2634 IsPICLevelTwo = true;
2635 break;
2636
2637 default:
2638 break;
2639 }
2640 }
2641
Brad Smith5b05db82014-06-24 19:51:29 +00002642 // OpenBSD-specific defaults for PIE
2643 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2644 switch (getToolChain().getTriple().getArch()) {
2645 case llvm::Triple::mips64:
2646 case llvm::Triple::mips64el:
2647 case llvm::Triple::sparc:
2648 case llvm::Triple::x86:
2649 case llvm::Triple::x86_64:
2650 IsPICLevelTwo = false; // "-fpie"
2651 break;
2652
2653 case llvm::Triple::ppc:
2654 case llvm::Triple::sparcv9:
2655 IsPICLevelTwo = true; // "-fPIE"
2656 break;
2657
2658 default:
2659 break;
2660 }
2661 }
2662
Alexey Samsonov090301e2013-04-09 12:28:19 +00002663 // For the PIC and PIE flag options, this logic is different from the
2664 // legacy logic in very old versions of GCC, as that logic was just
2665 // a bug no one had ever fixed. This logic is both more rational and
2666 // consistent with GCC's new logic now that the bugs are fixed. The last
2667 // argument relating to either PIC or PIE wins, and no other argument is
2668 // used. If the last argument is any flavor of the '-fno-...' arguments,
2669 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2670 // at the same level.
2671 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2672 options::OPT_fpic, options::OPT_fno_pic,
2673 options::OPT_fPIE, options::OPT_fno_PIE,
2674 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002675 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2676 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002677 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002678 if (LastPICArg) {
2679 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002680 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2681 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2682 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2683 PIC = PIE || O.matches(options::OPT_fPIC) ||
2684 O.matches(options::OPT_fpic);
2685 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2686 O.matches(options::OPT_fPIC);
2687 } else {
2688 PIE = PIC = false;
2689 }
2690 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002691 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002692
Nick Lewycky609dd662013-10-11 03:33:53 +00002693 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002694 // specified while enabling PIC enabled level 1 PIC, just force it back to
2695 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2696 // informal testing).
2697 if (PIC && getToolChain().getTriple().isOSDarwin())
2698 IsPICLevelTwo |= getToolChain().isPICDefault();
2699
Chandler Carruthc0c04552012-04-08 16:40:35 +00002700 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2701 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002702 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002703 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002704 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002705 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002706 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002707 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002708
Chandler Carruth76a943b2012-11-19 03:52:03 +00002709 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2710 // This is a very special mode. It trumps the other modes, almost no one
2711 // uses it, and it isn't even valid on any OS but Darwin.
2712 if (!getToolChain().getTriple().isOSDarwin())
2713 D.Diag(diag::err_drv_unsupported_opt_for_target)
2714 << A->getSpelling() << getToolChain().getTriple().str();
2715
2716 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2717
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002718 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002719 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002720
Chandler Carruth76a943b2012-11-19 03:52:03 +00002721 // Only a forced PIC mode can cause the actual compile to have PIC defines
2722 // etc., no flags are sufficient. This behavior was selected to closely
2723 // match that of llvm-gcc and Apple GCC before that.
2724 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2725 CmdArgs.push_back("-pic-level");
2726 CmdArgs.push_back("2");
2727 }
2728 } else {
2729 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2730 // handled in Clang's IRGen by the -pie-level flag.
2731 CmdArgs.push_back("-mrelocation-model");
2732 CmdArgs.push_back(PIC ? "pic" : "static");
2733
2734 if (PIC) {
2735 CmdArgs.push_back("-pic-level");
2736 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2737 if (PIE) {
2738 CmdArgs.push_back("-pie-level");
2739 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2740 }
2741 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002742 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002743
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002744 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2745 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002746 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002747
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002748 // LLVM Code Generator Options.
2749
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002750 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2751 StringRef v = A->getValue();
2752 CmdArgs.push_back("-mllvm");
2753 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2754 A->claim();
2755 }
2756
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002757 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2758 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002759 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002760 }
2761
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002762 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2763 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002764 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002765 D.Diag(diag::err_drv_unsupported_opt_for_target)
2766 << A->getSpelling() << getToolChain().getTriple().str();
2767 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2768 CmdArgs.push_back("-fpcc-struct-return");
2769 } else {
2770 assert(A->getOption().matches(options::OPT_freg_struct_return));
2771 CmdArgs.push_back("-freg-struct-return");
2772 }
2773 }
2774
Roman Divacky65b88cd2011-03-01 17:40:53 +00002775 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2776 CmdArgs.push_back("-mrtd");
2777
Rafael Espindola224dd632011-12-14 21:02:23 +00002778 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002779 CmdArgs.push_back("-mdisable-fp-elim");
2780 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2781 options::OPT_fno_zero_initialized_in_bss))
2782 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002783
2784 bool OFastEnabled = isOptimizationLevelFast(Args);
2785 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2786 // enabled. This alias option is being used to simplify the hasFlag logic.
2787 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2788 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002789 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2790 // doesn't do any TBAA.
2791 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002792 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002793 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002794 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002795 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2796 options::OPT_fno_struct_path_tbaa))
2797 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002798 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2799 false))
2800 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002801 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2802 options::OPT_fno_optimize_sibling_calls))
2803 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002804
Eric Christopher006208c2013-04-04 06:29:47 +00002805 // Handle segmented stacks.
2806 if (Args.hasArg(options::OPT_fsplit_stack))
2807 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002808
2809 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2810 // This alias option is being used to simplify the getLastArg logic.
2811 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2812 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002813
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002814 // Handle various floating point optimization flags, mapping them to the
2815 // appropriate LLVM code generation flags. The pattern for all of these is to
2816 // default off the codegen optimizations, and if any flag enables them and no
2817 // flag disables them after the flag enabling them, enable the codegen
2818 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002819 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002820 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002821 options::OPT_ffinite_math_only,
2822 options::OPT_fno_finite_math_only,
2823 options::OPT_fhonor_infinities,
2824 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002825 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2826 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002827 A->getOption().getID() != options::OPT_fhonor_infinities)
2828 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002829 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002830 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002831 options::OPT_ffinite_math_only,
2832 options::OPT_fno_finite_math_only,
2833 options::OPT_fhonor_nans,
2834 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002835 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2836 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002837 A->getOption().getID() != options::OPT_fhonor_nans)
2838 CmdArgs.push_back("-menable-no-nans");
2839
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002840 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2841 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002842 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002843 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002844 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002845 options::OPT_fno_math_errno)) {
2846 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2847 // However, turning *off* -ffast_math merely restores the toolchain default
2848 // (which may be false).
2849 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2850 A->getOption().getID() == options::OPT_ffast_math ||
2851 A->getOption().getID() == options::OPT_Ofast)
2852 MathErrno = false;
2853 else if (A->getOption().getID() == options::OPT_fmath_errno)
2854 MathErrno = true;
2855 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002856 if (MathErrno)
2857 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002858
2859 // There are several flags which require disabling very specific
2860 // optimizations. Any of these being disabled forces us to turn off the
2861 // entire set of LLVM optimizations, so collect them through all the flag
2862 // madness.
2863 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002864 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002865 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002866 options::OPT_funsafe_math_optimizations,
2867 options::OPT_fno_unsafe_math_optimizations,
2868 options::OPT_fassociative_math,
2869 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002870 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2871 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002872 A->getOption().getID() != options::OPT_fno_associative_math)
2873 AssociativeMath = true;
2874 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002875 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002876 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002877 options::OPT_funsafe_math_optimizations,
2878 options::OPT_fno_unsafe_math_optimizations,
2879 options::OPT_freciprocal_math,
2880 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002881 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2882 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002883 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2884 ReciprocalMath = true;
2885 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002886 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002887 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002888 options::OPT_funsafe_math_optimizations,
2889 options::OPT_fno_unsafe_math_optimizations,
2890 options::OPT_fsigned_zeros,
2891 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002892 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2893 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002894 A->getOption().getID() != options::OPT_fsigned_zeros)
2895 SignedZeros = false;
2896 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002897 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002898 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002899 options::OPT_funsafe_math_optimizations,
2900 options::OPT_fno_unsafe_math_optimizations,
2901 options::OPT_ftrapping_math,
2902 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002903 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2904 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002905 A->getOption().getID() != options::OPT_ftrapping_math)
2906 TrappingMath = false;
2907 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2908 !TrappingMath)
2909 CmdArgs.push_back("-menable-unsafe-fp-math");
2910
Lang Hamesaa53b932012-07-06 00:59:19 +00002911
2912 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002913 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002914 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002915 options::OPT_ffp_contract)) {
2916 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002917 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002918 if (Val == "fast" || Val == "on" || Val == "off") {
2919 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2920 } else {
2921 D.Diag(diag::err_drv_unsupported_option_argument)
2922 << A->getOption().getName() << Val;
2923 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002924 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2925 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002926 // If fast-math is set then set the fp-contract mode to fast.
2927 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2928 }
2929 }
2930
Bob Wilson6a039162012-07-19 03:52:53 +00002931 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2932 // and if we find them, tell the frontend to provide the appropriate
2933 // preprocessor macros. This is distinct from enabling any optimizations as
2934 // these options induce language changes which must survive serialization
2935 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002936 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2937 options::OPT_fno_fast_math))
2938 if (!A->getOption().matches(options::OPT_fno_fast_math))
2939 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002940 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2941 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002942 if (A->getOption().matches(options::OPT_ffinite_math_only))
2943 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002944
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002945 // Decide whether to use verbose asm. Verbose assembly is the default on
2946 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002947 bool IsIntegratedAssemblerDefault =
2948 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002949 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002950 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002951 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002952 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002953
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002954 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002955 IsIntegratedAssemblerDefault))
2956 CmdArgs.push_back("-no-integrated-as");
2957
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002958 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2959 CmdArgs.push_back("-mdebug-pass");
2960 CmdArgs.push_back("Structure");
2961 }
2962 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2963 CmdArgs.push_back("-mdebug-pass");
2964 CmdArgs.push_back("Arguments");
2965 }
2966
John McCall8517abc2010-02-19 02:45:38 +00002967 // Enable -mconstructor-aliases except on darwin, where we have to
2968 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002969 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002970 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002971
John McCall7ef5cb32011-03-18 02:56:14 +00002972 // Darwin's kernel doesn't support guard variables; just die if we
2973 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002974 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002975 CmdArgs.push_back("-fforbid-guard-variables");
2976
Douglas Gregordbe39272011-02-01 15:15:22 +00002977 if (Args.hasArg(options::OPT_mms_bitfields)) {
2978 CmdArgs.push_back("-mms-bitfields");
2979 }
John McCall8517abc2010-02-19 02:45:38 +00002980
Daniel Dunbar306945d2009-09-16 06:17:29 +00002981 // This is a coarse approximation of what llvm-gcc actually does, both
2982 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2983 // complicated ways.
2984 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002985 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2986 options::OPT_fno_asynchronous_unwind_tables,
2987 (getToolChain().IsUnwindTablesDefault() ||
2988 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2989 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002990 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2991 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002992 CmdArgs.push_back("-munwind-tables");
2993
Chandler Carruth05fb5852012-11-21 23:40:23 +00002994 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002995
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002996 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2997 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002998 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002999 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003000
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003001 // FIXME: Handle -mtune=.
3002 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003003
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003004 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003005 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003006 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003007 }
3008
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003009 // Add the target cpu
3010 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3011 llvm::Triple ETriple(ETripleStr);
3012 std::string CPU = getCPUName(Args, ETriple);
3013 if (!CPU.empty()) {
3014 CmdArgs.push_back("-target-cpu");
3015 CmdArgs.push_back(Args.MakeArgString(CPU));
3016 }
3017
Rafael Espindolaeb265472013-08-21 21:59:03 +00003018 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3019 CmdArgs.push_back("-mfpmath");
3020 CmdArgs.push_back(A->getValue());
3021 }
3022
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003023 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003024 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003025
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003026 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003027 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003028 default:
3029 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003030
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003031 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003032 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003033 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003034 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003035 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003036 break;
3037
Tim Northover573cbee2014-05-24 12:52:07 +00003038 case llvm::Triple::aarch64:
3039 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003040 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003041 break;
3042
Eric Christopher0b26a612010-03-02 02:41:08 +00003043 case llvm::Triple::mips:
3044 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003045 case llvm::Triple::mips64:
3046 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003047 AddMIPSTargetArgs(Args, CmdArgs);
3048 break;
3049
Ulrich Weigand8afad612014-07-28 13:17:52 +00003050 case llvm::Triple::ppc:
3051 case llvm::Triple::ppc64:
3052 case llvm::Triple::ppc64le:
3053 AddPPCTargetArgs(Args, CmdArgs);
3054 break;
3055
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003056 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003057 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003058 AddSparcTargetArgs(Args, CmdArgs);
3059 break;
3060
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003061 case llvm::Triple::x86:
3062 case llvm::Triple::x86_64:
3063 AddX86TargetArgs(Args, CmdArgs);
3064 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003065
3066 case llvm::Triple::hexagon:
3067 AddHexagonTargetArgs(Args, CmdArgs);
3068 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003069 }
3070
Hans Wennborg75958c42013-08-08 00:17:41 +00003071 // Add clang-cl arguments.
3072 if (getToolChain().getDriver().IsCLMode())
3073 AddClangCLArgs(Args, CmdArgs);
3074
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003075 // Pass the linker version in use.
3076 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3077 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003078 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003079 }
3080
Eric Christopherb7d97e92013-04-03 01:58:53 +00003081 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003082 CmdArgs.push_back("-momit-leaf-frame-pointer");
3083
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003084 // Explicitly error on some things we know we don't support and can't just
3085 // ignore.
3086 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003087 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3088 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003089 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003090 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003091 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003092 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3093 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003094 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003095 << Unsupported->getOption().getName();
3096 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003097 }
3098
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003099 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003100 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003101 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003102 CmdArgs.push_back("-header-include-file");
3103 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3104 D.CCPrintHeadersFilename : "-");
3105 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003106 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003107 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003108
Chad Rosierbe10f982011-08-02 17:58:04 +00003109 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003110 CmdArgs.push_back("-diagnostic-log-file");
3111 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3112 D.CCLogDiagnosticsFilename : "-");
3113 }
3114
Manman Ren17bdb0f2013-11-20 20:22:14 +00003115 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3116 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003117 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003118 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00003119 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003120 // FIXME: we should support specifying dwarf version with
3121 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003122 CmdArgs.push_back("-gline-tables-only");
Brad Smith378e7f9b2014-06-13 03:35:37 +00003123 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3124 const llvm::Triple &Triple = getToolChain().getTriple();
3125 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3126 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003127 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003128 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003129 CmdArgs.push_back("-gdwarf-2");
3130 else if (A->getOption().matches(options::OPT_gdwarf_3))
3131 CmdArgs.push_back("-gdwarf-3");
3132 else if (A->getOption().matches(options::OPT_gdwarf_4))
3133 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003134 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003135 !A->getOption().matches(options::OPT_ggdb0)) {
Brad Smith378e7f9b2014-06-13 03:35:37 +00003136 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3137 const llvm::Triple &Triple = getToolChain().getTriple();
3138 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3139 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003140 CmdArgs.push_back("-gdwarf-2");
3141 else
3142 CmdArgs.push_back("-g");
3143 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003144 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003145
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003146 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3147 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003148 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3149 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003150 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003151
Eric Christopher138c32b2013-09-13 22:37:55 +00003152 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003153 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3154 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003155 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003156 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003157 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003158 CmdArgs.push_back("-g");
3159 CmdArgs.push_back("-backend-option");
3160 CmdArgs.push_back("-split-dwarf=Enable");
3161 }
3162
Eric Christopher138c32b2013-09-13 22:37:55 +00003163 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3164 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3165 CmdArgs.push_back("-backend-option");
3166 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3167 }
Eric Christophereec89c22013-06-18 00:03:50 +00003168
Eric Christopher0d403d22014-02-14 01:27:03 +00003169 // -gdwarf-aranges turns on the emission of the aranges section in the
3170 // backend.
3171 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3172 CmdArgs.push_back("-backend-option");
3173 CmdArgs.push_back("-generate-arange-section");
3174 }
3175
David Blaikief36d9ba2014-01-27 18:52:43 +00003176 if (Args.hasFlag(options::OPT_fdebug_types_section,
3177 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003178 CmdArgs.push_back("-backend-option");
3179 CmdArgs.push_back("-generate-type-units");
3180 }
Eric Christophereec89c22013-06-18 00:03:50 +00003181
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003182 if (Args.hasFlag(options::OPT_ffunction_sections,
3183 options::OPT_fno_function_sections, false)) {
3184 CmdArgs.push_back("-ffunction-sections");
3185 }
3186
3187 if (Args.hasFlag(options::OPT_fdata_sections,
3188 options::OPT_fno_data_sections, false)) {
3189 CmdArgs.push_back("-fdata-sections");
3190 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003191
Chris Lattner3c77a352010-06-22 00:03:40 +00003192 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3193
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003194 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3195 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3196 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3197 D.Diag(diag::err_drv_argument_not_allowed_with)
3198 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3199
3200 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3201
3202 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3203 A->render(Args, CmdArgs);
3204 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3205 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3206
Nick Lewycky207bce32011-04-21 23:44:07 +00003207 if (Args.hasArg(options::OPT_ftest_coverage) ||
3208 Args.hasArg(options::OPT_coverage))
3209 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003210 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3211 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003212 Args.hasArg(options::OPT_coverage))
3213 CmdArgs.push_back("-femit-coverage-data");
3214
Alex Lorenzee024992014-08-04 18:41:51 +00003215 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3216 !Args.hasArg(options::OPT_fprofile_instr_generate))
3217 D.Diag(diag::err_drv_argument_only_allowed_with)
3218 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3219
3220 if (Args.hasArg(options::OPT_fcoverage_mapping))
3221 CmdArgs.push_back("-fcoverage-mapping");
3222
Nick Lewycky480cb992011-05-04 20:46:58 +00003223 if (C.getArgs().hasArg(options::OPT_c) ||
3224 C.getArgs().hasArg(options::OPT_S)) {
3225 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003226 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00003227 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00003228 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003229 SmallString<128> Pwd;
3230 if (!llvm::sys::fs::current_path(Pwd)) {
3231 llvm::sys::path::append(Pwd, CoverageFilename.str());
3232 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003233 }
3234 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003235 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003236 }
3237 }
3238
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003239 // Pass options for controlling the default header search paths.
3240 if (Args.hasArg(options::OPT_nostdinc)) {
3241 CmdArgs.push_back("-nostdsysteminc");
3242 CmdArgs.push_back("-nobuiltininc");
3243 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003244 if (Args.hasArg(options::OPT_nostdlibinc))
3245 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003246 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3247 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3248 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003249
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003250 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003251 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003252 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003253
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003254 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3255
Ted Kremenekf7639e12012-03-06 20:06:33 +00003256 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003257 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003258 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003259 options::OPT_ccc_arcmt_modify,
3260 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003261 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003262 switch (A->getOption().getID()) {
3263 default:
3264 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003265 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003266 CmdArgs.push_back("-arcmt-check");
3267 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003268 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003269 CmdArgs.push_back("-arcmt-modify");
3270 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003271 case options::OPT_ccc_arcmt_migrate:
3272 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003273 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003274 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003275
3276 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3277 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003278 break;
John McCalld70fb982011-06-15 23:25:17 +00003279 }
3280 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003281 } else {
3282 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3283 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3284 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003285 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003286
Ted Kremenekf7639e12012-03-06 20:06:33 +00003287 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3288 if (ARCMTEnabled) {
3289 D.Diag(diag::err_drv_argument_not_allowed_with)
3290 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3291 }
3292 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003293 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003294
3295 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003296 options::OPT_objcmt_migrate_subscripting,
3297 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003298 // None specified, means enable them all.
3299 CmdArgs.push_back("-objcmt-migrate-literals");
3300 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003301 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003302 } else {
3303 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3304 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003305 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003306 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003307 } else {
3308 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3309 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3310 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3311 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3312 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3313 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3314 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3315 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3316 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3317 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3318 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3319 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3320 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003321 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003322 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003323 }
3324
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003325 // Add preprocessing options like -I, -D, etc. if we are using the
3326 // preprocessor.
3327 //
3328 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003329 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003330 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003331
Rafael Espindolaa7431922011-07-21 23:40:37 +00003332 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3333 // that "The compiler can only warn and ignore the option if not recognized".
3334 // When building with ccache, it will pass -D options to clang even on
3335 // preprocessed inputs and configure concludes that -fPIC is not supported.
3336 Args.ClaimAllArgs(options::OPT_D);
3337
Alp Toker7874bdc2013-11-15 20:40:58 +00003338 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003339 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3340 if (A->getOption().matches(options::OPT_O4)) {
3341 CmdArgs.push_back("-O3");
3342 D.Diag(diag::warn_O4_is_O3);
3343 } else {
3344 A->render(Args, CmdArgs);
3345 }
3346 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003347
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003348 // Warn about ignored options to clang.
3349 for (arg_iterator it = Args.filtered_begin(
3350 options::OPT_clang_ignored_gcc_optimization_f_Group),
3351 ie = Args.filtered_end(); it != ie; ++it) {
3352 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3353 }
3354
Chad Rosier86b82082012-12-12 20:06:31 +00003355 // Don't warn about unused -flto. This can happen when we're preprocessing or
3356 // precompiling.
3357 Args.ClaimAllArgs(options::OPT_flto);
3358
Richard Smith3be1cb22014-08-07 00:24:21 +00003359 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003360 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003361 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3362 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003363 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003364 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003365
3366 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003367 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003368 //
3369 // If a std is supplied, only add -trigraphs if it follows the
3370 // option.
3371 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3372 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003373 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003374 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003375 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003376 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003377 else
3378 Std->render(Args, CmdArgs);
3379
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003380 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3381 options::OPT_trigraphs))
3382 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003383 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003384 } else {
3385 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003386 //
3387 // FIXME: Clang doesn't correctly handle -std= when the input language
3388 // doesn't match. For the time being just ignore this for C++ inputs;
3389 // eventually we want to do all the standard defaulting here instead of
3390 // splitting it between the driver and clang -cc1.
3391 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003392 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3393 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003394 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003395 CmdArgs.push_back("-std=c++11");
3396
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003397 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003398 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003399
Richard Smith282b4492013-09-04 22:50:31 +00003400 // GCC's behavior for -Wwrite-strings is a bit strange:
3401 // * In C, this "warning flag" changes the types of string literals from
3402 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3403 // for the discarded qualifier.
3404 // * In C++, this is just a normal warning flag.
3405 //
3406 // Implementing this warning correctly in C is hard, so we follow GCC's
3407 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3408 // a non-const char* in C, rather than using this crude hack.
3409 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003410 // FIXME: This should behave just like a warning flag, and thus should also
3411 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3412 Arg *WriteStrings =
3413 Args.getLastArg(options::OPT_Wwrite_strings,
3414 options::OPT_Wno_write_strings, options::OPT_w);
3415 if (WriteStrings &&
3416 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003417 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003418 }
3419
Chandler Carruth61fbf622011-04-23 09:27:53 +00003420 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003421 // during C++ compilation, which it is by default. GCC keeps this define even
3422 // in the presence of '-w', match this behavior bug-for-bug.
3423 if (types::isCXX(InputType) &&
3424 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3425 true)) {
3426 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003427 }
3428
Chandler Carruthe0391482010-05-22 02:21:53 +00003429 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3430 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3431 if (Asm->getOption().matches(options::OPT_fasm))
3432 CmdArgs.push_back("-fgnu-keywords");
3433 else
3434 CmdArgs.push_back("-fno-gnu-keywords");
3435 }
3436
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003437 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3438 CmdArgs.push_back("-fno-dwarf-directory-asm");
3439
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003440 if (ShouldDisableAutolink(Args, getToolChain()))
3441 CmdArgs.push_back("-fno-autolink");
3442
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003443 // Add in -fdebug-compilation-dir if necessary.
3444 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003445
Richard Smith9a568822011-11-21 19:36:32 +00003446 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3447 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003448 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003449 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003450 }
3451
Richard Smith79c927b2013-11-06 19:31:51 +00003452 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3453 CmdArgs.push_back("-foperator-arrow-depth");
3454 CmdArgs.push_back(A->getValue());
3455 }
3456
Richard Smith9a568822011-11-21 19:36:32 +00003457 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3458 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003459 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003460 }
3461
Richard Smitha3d3bd22013-05-08 02:12:03 +00003462 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3463 CmdArgs.push_back("-fconstexpr-steps");
3464 CmdArgs.push_back(A->getValue());
3465 }
3466
Richard Smithb3a14522013-02-22 01:59:51 +00003467 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3468 CmdArgs.push_back("-fbracket-depth");
3469 CmdArgs.push_back(A->getValue());
3470 }
3471
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003472 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3473 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003474 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003475 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003476 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3477 } else
3478 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003479 }
3480
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003481
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003482 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003483 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003484
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003485 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3486 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003487 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003488 }
David Chisnall5778fce2009-08-31 16:41:57 +00003489
Chris Lattnere23003d2010-01-09 21:54:33 +00003490 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3491 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003492 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003493 }
3494
Chris Lattnerb35583d2010-04-07 20:49:23 +00003495 CmdArgs.push_back("-ferror-limit");
3496 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003497 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003498 else
3499 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003500
Chandler Carrutha77a7272010-05-06 04:55:18 +00003501 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3502 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003503 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003504 }
3505
3506 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3507 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003508 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003509 }
3510
Richard Smithf6f003a2011-12-16 19:06:07 +00003511 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3512 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003513 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003514 }
3515
Daniel Dunbar2c978472009-11-04 06:24:47 +00003516 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003517 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003518 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003519 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003520 } else {
3521 // If -fmessage-length=N was not specified, determine whether this is a
3522 // terminal and, if so, implicitly define -fmessage-length appropriately.
3523 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003524 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003525 }
3526
John McCallb4a99d32013-02-19 01:57:35 +00003527 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3528 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3529 options::OPT_fvisibility_ms_compat)) {
3530 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3531 CmdArgs.push_back("-fvisibility");
3532 CmdArgs.push_back(A->getValue());
3533 } else {
3534 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3535 CmdArgs.push_back("-fvisibility");
3536 CmdArgs.push_back("hidden");
3537 CmdArgs.push_back("-ftype-visibility");
3538 CmdArgs.push_back("default");
3539 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003540 }
3541
Douglas Gregor08329632010-06-15 17:05:35 +00003542 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003543
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003544 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3545
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003546 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003547 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3548 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003549 CmdArgs.push_back("-ffreestanding");
3550
Daniel Dunbare357d562009-12-03 18:42:11 +00003551 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003552 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003553 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003554 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3555 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003556 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003557 // AltiVec language extensions aren't relevant for assembling.
3558 if (!isa<PreprocessJobAction>(JA) ||
3559 Output.getType() != types::TY_PP_Asm)
3560 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003561 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3562 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003563
Peter Collingbourne32701642013-11-01 18:16:25 +00003564 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3565 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003566
Will Dietz3676d562012-12-30 20:53:28 +00003567 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3568 options::OPT_fno_sanitize_recover,
3569 true))
3570 CmdArgs.push_back("-fno-sanitize-recover");
3571
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003572 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003573 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3574 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3575
Eric Christopher459d2712013-02-19 06:16:53 +00003576 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003577 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003578 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003579 getToolChain().getArch() == llvm::Triple::ppc64 ||
3580 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003581 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003582 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003583
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003584 if (getToolChain().SupportsProfiling())
3585 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003586
3587 // -flax-vector-conversions is default.
3588 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3589 options::OPT_fno_lax_vector_conversions))
3590 CmdArgs.push_back("-fno-lax-vector-conversions");
3591
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003592 if (Args.getLastArg(options::OPT_fapple_kext))
3593 CmdArgs.push_back("-fapple-kext");
3594
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003595 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003596 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003597 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003598 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3599 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003600
3601 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3602 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003603 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003604 }
3605
Bob Wilson14adb362012-02-03 06:27:22 +00003606 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003607
Chandler Carruth6e501032011-03-27 00:04:55 +00003608 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3609 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3610 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3611 options::OPT_fno_wrapv)) {
3612 if (A->getOption().matches(options::OPT_fwrapv))
3613 CmdArgs.push_back("-fwrapv");
3614 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3615 options::OPT_fno_strict_overflow)) {
3616 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3617 CmdArgs.push_back("-fwrapv");
3618 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003619
3620 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3621 options::OPT_fno_reroll_loops))
3622 if (A->getOption().matches(options::OPT_freroll_loops))
3623 CmdArgs.push_back("-freroll-loops");
3624
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003625 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003626 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3627 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003628
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003629 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3630
Mahesha S6a682be42012-10-27 07:47:56 +00003631
Daniel Dunbar4930e332009-11-17 08:07:36 +00003632 // -stack-protector=0 is default.
3633 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003634 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3635 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003636 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003637 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003638 if (A->getOption().matches(options::OPT_fstack_protector)) {
3639 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3640 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3641 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003642 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003643 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003644 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003645 } else {
3646 StackProtectorLevel =
3647 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3648 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003649 if (StackProtectorLevel) {
3650 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003651 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003652 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003653
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003654 // --param ssp-buffer-size=
3655 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3656 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003657 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003658 if (Str.startswith("ssp-buffer-size=")) {
3659 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003660 CmdArgs.push_back("-stack-protector-buffer-size");
3661 // FIXME: Verify the argument is a valid integer.
3662 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003663 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003664 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003665 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003666 }
3667
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003668 // Translate -mstackrealign
3669 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3670 false)) {
3671 CmdArgs.push_back("-backend-option");
3672 CmdArgs.push_back("-force-align-stack");
3673 }
3674 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3675 false)) {
3676 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3677 }
3678
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003679 if (Args.hasArg(options::OPT_mstack_alignment)) {
3680 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3681 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003682 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003683
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003684 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3685 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3686 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3687
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003688 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3689 options::OPT_mno_restrict_it)) {
3690 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3691 CmdArgs.push_back("-backend-option");
3692 CmdArgs.push_back("-arm-restrict-it");
3693 } else {
3694 CmdArgs.push_back("-backend-option");
3695 CmdArgs.push_back("-arm-no-restrict-it");
3696 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003697 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3698 TT.getArch() == llvm::Triple::thumb)) {
3699 // Windows on ARM expects restricted IT blocks
3700 CmdArgs.push_back("-backend-option");
3701 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003702 }
3703
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003704 if (TT.getArch() == llvm::Triple::arm ||
3705 TT.getArch() == llvm::Triple::thumb) {
3706 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3707 options::OPT_mno_long_calls)) {
3708 if (A->getOption().matches(options::OPT_mlong_calls)) {
3709 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003710 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003711 }
3712 }
3713 }
3714
Daniel Dunbard18049a2009-04-07 21:16:11 +00003715 // Forward -f options with positive and negative forms; we translate
3716 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003717 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3718 StringRef fname = A->getValue();
3719 if (!llvm::sys::fs::exists(fname))
3720 D.Diag(diag::err_drv_no_such_file) << fname;
3721 else
3722 A->render(Args, CmdArgs);
3723 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003724
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003725 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003726 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003727 CmdArgs.push_back("-fapple-kext");
3728 if (!Args.hasArg(options::OPT_fbuiltin))
3729 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003730 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003731 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003732 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003733 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003734 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003735
Nuno Lopes13c88c72009-12-16 16:59:22 +00003736 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3737 options::OPT_fno_assume_sane_operator_new))
3738 CmdArgs.push_back("-fno-assume-sane-operator-new");
3739
Daniel Dunbar4930e332009-11-17 08:07:36 +00003740 // -fblocks=0 is default.
3741 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003742 getToolChain().IsBlocksDefault()) ||
3743 (Args.hasArg(options::OPT_fgnu_runtime) &&
3744 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3745 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003746 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003747
3748 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3749 !getToolChain().hasBlocksRuntime())
3750 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003751 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003752
Douglas Gregor226173a2012-01-18 15:19:58 +00003753 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3754 // users must also pass -fcxx-modules. The latter flag will disappear once the
3755 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003756 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003757 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3758 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3759 options::OPT_fno_cxx_modules,
3760 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003761 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003762 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003763 HaveModules = true;
3764 }
3765 }
3766
Daniel Jasper07e6c402013-08-05 20:26:17 +00003767 // -fmodule-maps enables module map processing (off by default) for header
3768 // checking. It is implied by -fmodules.
3769 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3770 false)) {
3771 CmdArgs.push_back("-fmodule-maps");
3772 }
3773
Daniel Jasperac42b752013-10-21 06:34:34 +00003774 // -fmodules-decluse checks that modules used are declared so (off by
3775 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003776 if (Args.hasFlag(options::OPT_fmodules_decluse,
3777 options::OPT_fno_modules_decluse,
3778 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003779 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003780 }
3781
Daniel Jasper962b38e2014-04-11 11:47:45 +00003782 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3783 // all #included headers are part of modules.
3784 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3785 options::OPT_fno_modules_strict_decluse,
3786 false)) {
3787 CmdArgs.push_back("-fmodules-strict-decluse");
3788 }
3789
Daniel Jasperac42b752013-10-21 06:34:34 +00003790 // -fmodule-name specifies the module that is currently being built (or
3791 // used for header checking by -fmodule-maps).
Justin Bogner5443ad52014-06-20 21:12:53 +00003792 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasperac42b752013-10-21 06:34:34 +00003793 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003794
3795 // -fmodule-map-file can be used to specify a file containing module
3796 // definitions.
Justin Bogner5443ad52014-06-20 21:12:53 +00003797 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasperac42b752013-10-21 06:34:34 +00003798 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003799
Justin Bognera88f0122014-06-20 22:59:50 +00003800 // -fmodule-cache-path specifies where our module files should be written.
3801 SmallString<128> ModuleCachePath;
3802 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3803 ModuleCachePath = A->getValue();
3804 if (HaveModules) {
3805 if (C.isForDiagnostics()) {
3806 // When generating crash reports, we want to emit the modules along with
3807 // the reproduction sources, so we ignore any provided module path.
3808 ModuleCachePath = Output.getFilename();
3809 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3810 llvm::sys::path::append(ModuleCachePath, "modules");
3811 } else if (ModuleCachePath.empty()) {
3812 // No module path was provided: use the default.
3813 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3814 ModuleCachePath);
3815 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3816 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3817 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003818 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003819 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3820 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3821 }
3822
3823 // When building modules and generating crashdumps, we need to dump a module
3824 // dependency VFS alongside the output.
3825 if (HaveModules && C.isForDiagnostics()) {
3826 SmallString<128> VFSDir(Output.getFilename());
3827 llvm::sys::path::replace_extension(VFSDir, ".cache");
3828 llvm::sys::path::append(VFSDir, "vfs");
3829 CmdArgs.push_back("-module-dependency-dir");
3830 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003831 }
3832
Justin Bogner5443ad52014-06-20 21:12:53 +00003833 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3834 if (HaveModules)
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003835 A->render(Args, CmdArgs);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003836
Douglas Gregor35b04d62013-02-07 19:01:24 +00003837 // Pass through all -fmodules-ignore-macro arguments.
3838 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003839 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3840 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003841
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003842 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3843
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003844 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3845 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3846 D.Diag(diag::err_drv_argument_not_allowed_with)
3847 << A->getAsString(Args) << "-fbuild-session-timestamp";
3848
3849 llvm::sys::fs::file_status Status;
3850 if (llvm::sys::fs::status(A->getValue(), Status))
3851 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003852 char TimeStamp[48];
3853 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3854 (uint64_t)Status.getLastModificationTime().toEpochTime());
3855 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003856 }
3857
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003858 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003859 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3860 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003861 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3862
3863 Args.AddLastArg(CmdArgs,
3864 options::OPT_fmodules_validate_once_per_build_session);
3865 }
3866
Ben Langmuirdcf73862014-03-12 00:06:17 +00003867 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3868
John McCalldfea9982010-04-09 19:12:06 +00003869 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003870 if (Args.hasFlag(options::OPT_fno_access_control,
3871 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003872 false))
John McCall3155f572010-04-09 19:03:51 +00003873 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003874
Anders Carlssond470fef2010-11-21 00:09:52 +00003875 // -felide-constructors is the default.
3876 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3877 options::OPT_felide_constructors,
3878 false))
3879 CmdArgs.push_back("-fno-elide-constructors");
3880
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003881 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003882 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003883 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003884 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003885
Richard Smith52be6192012-11-05 22:04:41 +00003886 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003887 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003888 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003889 Args.getLastArg(options::OPT_mkernel,
3890 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003891 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003892 D.Diag(diag::err_drv_argument_not_allowed_with)
3893 << "-fsanitize=vptr" << NoRttiArg;
3894 }
3895 }
3896
Tony Linthicum76329bf2011-12-12 21:14:55 +00003897 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003898 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003899 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003900 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003901 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003902 CmdArgs.push_back("-fshort-enums");
3903
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003904 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003905 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003906 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003907 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003908
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003909 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003910 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003911 options::OPT_fno_threadsafe_statics))
3912 CmdArgs.push_back("-fno-threadsafe-statics");
3913
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003914 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003915 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3916 options::OPT_fno_use_cxa_atexit,
3917 !IsWindowsCygnus && !IsWindowsGNU &&
3918 getToolChain().getArch() != llvm::Triple::hexagon &&
3919 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003920 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003921 CmdArgs.push_back("-fno-use-cxa-atexit");
3922
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003923 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003924 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003925 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003926 CmdArgs.push_back("-fms-extensions");
3927
Francois Pichet1b4f1632011-09-17 04:32:15 +00003928 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003929 if (Args.hasFlag(options::OPT_fms_compatibility,
3930 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003931 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3932 options::OPT_fno_ms_extensions,
3933 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003934 CmdArgs.push_back("-fms-compatibility");
3935
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003936 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003937 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003938 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
3939 Args.hasArg(options::OPT_fms_compatibility_version)) {
3940 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3941 const Arg *MSCompatibilityVersion =
3942 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003943
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003944 if (MSCVersion && MSCompatibilityVersion)
3945 D.Diag(diag::err_drv_argument_not_allowed_with)
3946 << MSCVersion->getAsString(Args)
3947 << MSCompatibilityVersion->getAsString(Args);
3948
3949 std::string Ver;
3950 if (MSCompatibilityVersion)
3951 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
3952 else if (MSCVersion)
3953 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
3954
3955 if (Ver.empty())
3956 CmdArgs.push_back("-fms-compatibility-version=17.00");
3957 else
3958 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
3959 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003960
Eric Christopher5ecce122013-02-18 00:38:31 +00003961 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003962 if (Args.hasFlag(options::OPT_fborland_extensions,
3963 options::OPT_fno_borland_extensions, false))
3964 CmdArgs.push_back("-fborland-extensions");
3965
Francois Pichet02744872011-09-01 16:38:08 +00003966 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3967 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003968 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003969 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003970 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003971
Chandler Carruthe03aa552010-04-17 20:17:31 +00003972 // -fgnu-keywords default varies depending on language; only pass if
3973 // specified.
3974 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003975 options::OPT_fno_gnu_keywords))
3976 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003977
Rafael Espindola922a6242011-06-02 17:30:53 +00003978 if (Args.hasFlag(options::OPT_fgnu89_inline,
3979 options::OPT_fno_gnu89_inline,
3980 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003981 CmdArgs.push_back("-fgnu89-inline");
3982
Chad Rosier9c76d242012-03-15 22:31:42 +00003983 if (Args.hasArg(options::OPT_fno_inline))
3984 CmdArgs.push_back("-fno-inline");
3985
Chad Rosier64d6be92012-03-06 21:17:19 +00003986 if (Args.hasArg(options::OPT_fno_inline_functions))
3987 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003988
John McCall5fb5df92012-06-20 06:18:46 +00003989 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003990
John McCall5fb5df92012-06-20 06:18:46 +00003991 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003992 // legacy is the default. Except for deployment taget of 10.5,
3993 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3994 // gets ignored silently.
3995 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003996 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3997 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003998 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003999 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004000 if (getToolChain().UseObjCMixedDispatch())
4001 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4002 else
4003 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4004 }
4005 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004006
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004007 // When ObjectiveC legacy runtime is in effect on MacOSX,
4008 // turn on the option to do Array/Dictionary subscripting
4009 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004010 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4011 getToolChain().getTriple().isMacOSX() &&
4012 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4013 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004014 objcRuntime.isNeXTFamily())
4015 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4016
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004017 // -fencode-extended-block-signature=1 is default.
4018 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4019 CmdArgs.push_back("-fencode-extended-block-signature");
4020 }
4021
John McCall24fc0de2011-07-06 00:26:06 +00004022 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4023 // NOTE: This logic is duplicated in ToolChains.cpp.
4024 bool ARC = isObjCAutoRefCount(Args);
4025 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004026 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004027
John McCall24fc0de2011-07-06 00:26:06 +00004028 CmdArgs.push_back("-fobjc-arc");
4029
Chandler Carruth491db322011-11-04 07:34:47 +00004030 // FIXME: It seems like this entire block, and several around it should be
4031 // wrapped in isObjC, but for now we just use it here as this is where it
4032 // was being used previously.
4033 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4034 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4035 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4036 else
4037 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4038 }
4039
John McCall24fc0de2011-07-06 00:26:06 +00004040 // Allow the user to enable full exceptions code emission.
4041 // We define off for Objective-CC, on for Objective-C++.
4042 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4043 options::OPT_fno_objc_arc_exceptions,
4044 /*default*/ types::isCXX(InputType)))
4045 CmdArgs.push_back("-fobjc-arc-exceptions");
4046 }
4047
4048 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4049 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004050 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004051 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004052
John McCall24fc0de2011-07-06 00:26:06 +00004053 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4054 // takes precedence.
4055 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4056 if (!GCArg)
4057 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4058 if (GCArg) {
4059 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004060 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004061 << GCArg->getAsString(Args);
4062 } else if (getToolChain().SupportsObjCGC()) {
4063 GCArg->render(Args, CmdArgs);
4064 } else {
4065 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004066 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004067 << GCArg->getAsString(Args);
4068 }
4069 }
4070
Reid Klecknerc542d372014-06-27 17:02:02 +00004071 // Handle GCC-style exception args.
4072 if (!C.getDriver().IsCLMode())
4073 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4074 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004075
4076 if (getToolChain().UseSjLjExceptions())
4077 CmdArgs.push_back("-fsjlj-exceptions");
Reid Kleckner8f45c9c2014-09-15 17:19:16 +00004078 else if (getToolChain().UseSEHExceptions())
4079 CmdArgs.push_back("-fseh-exceptions");
John McCallb5f652e2011-06-22 00:53:57 +00004080
4081 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004082 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4083 options::OPT_fno_assume_sane_operator_new))
4084 CmdArgs.push_back("-fno-assume-sane-operator-new");
4085
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004086 // -fconstant-cfstrings is default, and may be subject to argument translation
4087 // on Darwin.
4088 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4089 options::OPT_fno_constant_cfstrings) ||
4090 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4091 options::OPT_mno_constant_cfstrings))
4092 CmdArgs.push_back("-fno-constant-cfstrings");
4093
John Thompsoned4e2952009-11-05 20:14:16 +00004094 // -fshort-wchar default varies depending on platform; only
4095 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004096 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4097 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004098 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004099
Hans Wennborg28c96312013-07-31 23:39:13 +00004100 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004101 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004102 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004103 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004104 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004105
Daniel Dunbar096ed292011-10-05 21:04:55 +00004106 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4107 // -fno-pack-struct doesn't apply to -fpack-struct=.
4108 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004109 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004110 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004111 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004112 } else if (Args.hasFlag(options::OPT_fpack_struct,
4113 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004114 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004115 }
4116
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004117 // Handle -fmax-type-align=N and -fno-type-align
4118 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4119 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4120 if (!SkipMaxTypeAlign) {
4121 std::string MaxTypeAlignStr = "-fmax-type-align=";
4122 MaxTypeAlignStr += A->getValue();
4123 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4124 }
4125 } else if (getToolChain().getTriple().isOSDarwin()) {
4126 if (!SkipMaxTypeAlign) {
4127 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4128 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4129 }
4130 }
4131
Robert Lytton0e076492013-08-13 09:43:10 +00004132 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004133 if (!Args.hasArg(options::OPT_fcommon))
4134 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004135 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004136 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004137
Daniel Dunbard18049a2009-04-07 21:16:11 +00004138 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004139 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004140 CmdArgs.push_back("-fno-common");
4141
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004142 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004143 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004144 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004145 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004146 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004147 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4148
Daniel Dunbar6358d682010-10-15 22:30:42 +00004149 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4150 if (!Args.hasFlag(options::OPT_ffor_scope,
4151 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004152 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004153 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4154
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004155 // -finput_charset=UTF-8 is default. Reject others
4156 if (Arg *inputCharset = Args.getLastArg(
4157 options::OPT_finput_charset_EQ)) {
4158 StringRef value = inputCharset->getValue();
4159 if (value != "UTF-8")
4160 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4161 }
4162
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004163 // -fexec_charset=UTF-8 is default. Reject others
4164 if (Arg *execCharset = Args.getLastArg(
4165 options::OPT_fexec_charset_EQ)) {
4166 StringRef value = execCharset->getValue();
4167 if (value != "UTF-8")
4168 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4169 }
4170
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004171 // -fcaret-diagnostics is default.
4172 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4173 options::OPT_fno_caret_diagnostics, true))
4174 CmdArgs.push_back("-fno-caret-diagnostics");
4175
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004176 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004177 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004178 options::OPT_fno_diagnostics_fixit_info))
4179 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004180
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004181 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004182 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004183 options::OPT_fno_diagnostics_show_option))
4184 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004185
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004186 if (const Arg *A =
4187 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4188 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004189 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004190 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004191
Douglas Gregor643c9222011-05-21 17:07:29 +00004192 if (const Arg *A =
4193 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4194 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004195 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004196 }
4197
Chandler Carruthb6766f02011-03-27 01:50:55 +00004198 if (Arg *A = Args.getLastArg(
4199 options::OPT_fdiagnostics_show_note_include_stack,
4200 options::OPT_fno_diagnostics_show_note_include_stack)) {
4201 if (A->getOption().matches(
4202 options::OPT_fdiagnostics_show_note_include_stack))
4203 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4204 else
4205 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4206 }
4207
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004208 // Color diagnostics are the default, unless the terminal doesn't support
4209 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004210 // Support both clang's -f[no-]color-diagnostics and gcc's
4211 // -f[no-]diagnostics-colors[=never|always|auto].
4212 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004213 for (const auto &Arg : Args) {
4214 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004215 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4216 !O.matches(options::OPT_fdiagnostics_color) &&
4217 !O.matches(options::OPT_fno_color_diagnostics) &&
4218 !O.matches(options::OPT_fno_diagnostics_color) &&
4219 !O.matches(options::OPT_fdiagnostics_color_EQ))
4220 continue;
4221
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004222 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004223 if (O.matches(options::OPT_fcolor_diagnostics) ||
4224 O.matches(options::OPT_fdiagnostics_color)) {
4225 ShowColors = Colors_On;
4226 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4227 O.matches(options::OPT_fno_diagnostics_color)) {
4228 ShowColors = Colors_Off;
4229 } else {
4230 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004231 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004232 if (value == "always")
4233 ShowColors = Colors_On;
4234 else if (value == "never")
4235 ShowColors = Colors_Off;
4236 else if (value == "auto")
4237 ShowColors = Colors_Auto;
4238 else
4239 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4240 << ("-fdiagnostics-color=" + value).str();
4241 }
4242 }
4243 if (ShowColors == Colors_On ||
4244 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004245 CmdArgs.push_back("-fcolor-diagnostics");
4246
Nico Rieck7857d462013-09-11 00:38:02 +00004247 if (Args.hasArg(options::OPT_fansi_escape_codes))
4248 CmdArgs.push_back("-fansi-escape-codes");
4249
Daniel Dunbardb097022009-06-08 21:13:54 +00004250 if (!Args.hasFlag(options::OPT_fshow_source_location,
4251 options::OPT_fno_show_source_location))
4252 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004253
Douglas Gregor643c9222011-05-21 17:07:29 +00004254 if (!Args.hasFlag(options::OPT_fshow_column,
4255 options::OPT_fno_show_column,
4256 true))
4257 CmdArgs.push_back("-fno-show-column");
4258
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004259 if (!Args.hasFlag(options::OPT_fspell_checking,
4260 options::OPT_fno_spell_checking))
4261 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004262
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004263
Chad Rosierc8e56e82012-12-05 21:08:21 +00004264 // -fno-asm-blocks is default.
4265 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4266 false))
4267 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004268
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004269 // Enable vectorization per default according to the optimization level
4270 // selected. For optimization levels that want vectorization we use the alias
4271 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004272 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004273 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004274 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004275 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004276 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004277 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004278
Chad Rosier136d67d2014-04-28 19:30:57 +00004279 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004280 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4281 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004282 options::OPT_fslp_vectorize;
4283 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004284 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004285 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004286
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004287 // -fno-slp-vectorize-aggressive is default.
4288 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004289 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004290 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004291
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004292 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4293 A->render(Args, CmdArgs);
4294
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004295 // -fdollars-in-identifiers default varies depending on platform and
4296 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004297 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004298 options::OPT_fno_dollars_in_identifiers)) {
4299 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004300 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004301 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004302 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004303 }
4304
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004305 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4306 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004307 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004308 options::OPT_fno_unit_at_a_time)) {
4309 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004310 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004311 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004312
Eli Friedman055c9702011-11-02 01:53:16 +00004313 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4314 options::OPT_fno_apple_pragma_pack, false))
4315 CmdArgs.push_back("-fapple-pragma-pack");
4316
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004317 // le32-specific flags:
4318 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4319 // by default.
4320 if (getToolChain().getArch() == llvm::Triple::le32) {
4321 CmdArgs.push_back("-fno-math-builtin");
4322 }
4323
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004324 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004325 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004326 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004327#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004328 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004329 (getToolChain().getArch() == llvm::Triple::arm ||
4330 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004331 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4332 CmdArgs.push_back("-fno-builtin-strcat");
4333 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4334 CmdArgs.push_back("-fno-builtin-strcpy");
4335 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004336#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004337
Justin Bognera88f0122014-06-20 22:59:50 +00004338 // Enable rewrite includes if the user's asked for it or if we're generating
4339 // diagnostics.
4340 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4341 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004342 if (Args.hasFlag(options::OPT_frewrite_includes,
4343 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004344 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004345 CmdArgs.push_back("-frewrite-includes");
4346
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004347 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004348 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004349 options::OPT_traditional_cpp)) {
4350 if (isa<PreprocessJobAction>(JA))
4351 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004352 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004353 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004354 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004355
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004356 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004357 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004358
4359 // Handle serialized diagnostics.
4360 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4361 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004362 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004363 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004364
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004365 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4366 CmdArgs.push_back("-fretain-comments-from-system-headers");
4367
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004368 // Forward -fcomment-block-commands to -cc1.
4369 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004370 // Forward -fparse-all-comments to -cc1.
4371 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004372
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004373 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4374 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004375 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004376 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4377 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004378 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004379
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004380 // We translate this by hand to the -cc1 argument, since nightly test uses
4381 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004382 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004383 CmdArgs.push_back("-disable-llvm-optzns");
4384 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004385 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004386 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004387
Daniel Dunbard67a3222009-03-30 06:36:42 +00004388 if (Output.getType() == types::TY_Dependencies) {
4389 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004390 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004391 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004392 CmdArgs.push_back(Output.getFilename());
4393 } else {
4394 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004395 }
4396
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004397 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004398 addDashXForInput(Args, II, CmdArgs);
4399
Daniel Dunbarb440f562010-08-02 02:38:21 +00004400 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004401 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004402 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004403 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004404 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004405
Chris Lattnere9d7d782009-11-03 19:50:27 +00004406 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4407
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004408 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004409
4410 // Optionally embed the -cc1 level arguments into the debug info, for build
4411 // analysis.
4412 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004413 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004414 for (const auto &Arg : Args)
4415 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004416
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004417 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004418 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004419 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004420 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004421 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004422 }
4423 CmdArgs.push_back("-dwarf-debug-flags");
4424 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4425 }
4426
Eric Christopherd3804002013-02-22 20:12:52 +00004427 // Add the split debug info name to the command lines here so we
4428 // can propagate it to the backend.
4429 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004430 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004431 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004432 const char *SplitDwarfOut;
4433 if (SplitDwarf) {
4434 CmdArgs.push_back("-split-dwarf-file");
4435 SplitDwarfOut = SplitDebugName(Args, Inputs);
4436 CmdArgs.push_back(SplitDwarfOut);
4437 }
4438
4439 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004440 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004441 Output.getType() == types::TY_Object &&
4442 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004443 auto CLCommand =
4444 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4445 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4446 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004447 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004448 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004449 }
4450
Daniel Dunbar17731772009-03-23 19:03:36 +00004451
Eric Christopherf1545832013-02-22 23:50:16 +00004452 // Handle the debug info splitting at object creation time if we're
4453 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004454 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004455 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004456 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004457
Roman Divacky178e01602011-02-10 16:52:03 +00004458 if (Arg *A = Args.getLastArg(options::OPT_pg))
4459 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004460 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004461 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004462
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004463 // Claim some arguments which clang supports automatically.
4464
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004465 // -fpch-preprocess is used with gcc to add a special marker in the output to
4466 // include the PCH file. Clang's PTH solution is completely transparent, so we
4467 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004468 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004469
Daniel Dunbar17731772009-03-23 19:03:36 +00004470 // Claim some arguments which clang doesn't support, but we don't
4471 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004472 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4473 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004474
Rafael Espindolab0092d72013-09-04 19:37:35 +00004475 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004476 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004477}
4478
John McCall5fb5df92012-06-20 06:18:46 +00004479/// Add options related to the Objective-C runtime/ABI.
4480///
4481/// Returns true if the runtime is non-fragile.
4482ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4483 ArgStringList &cmdArgs,
4484 RewriteKind rewriteKind) const {
4485 // Look for the controlling runtime option.
4486 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4487 options::OPT_fgnu_runtime,
4488 options::OPT_fobjc_runtime_EQ);
4489
4490 // Just forward -fobjc-runtime= to the frontend. This supercedes
4491 // options about fragility.
4492 if (runtimeArg &&
4493 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4494 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004495 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004496 if (runtime.tryParse(value)) {
4497 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4498 << value;
4499 }
4500
4501 runtimeArg->render(args, cmdArgs);
4502 return runtime;
4503 }
4504
4505 // Otherwise, we'll need the ABI "version". Version numbers are
4506 // slightly confusing for historical reasons:
4507 // 1 - Traditional "fragile" ABI
4508 // 2 - Non-fragile ABI, version 1
4509 // 3 - Non-fragile ABI, version 2
4510 unsigned objcABIVersion = 1;
4511 // If -fobjc-abi-version= is present, use that to set the version.
4512 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004513 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004514 if (value == "1")
4515 objcABIVersion = 1;
4516 else if (value == "2")
4517 objcABIVersion = 2;
4518 else if (value == "3")
4519 objcABIVersion = 3;
4520 else
4521 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4522 << value;
4523 } else {
4524 // Otherwise, determine if we are using the non-fragile ABI.
4525 bool nonFragileABIIsDefault =
4526 (rewriteKind == RK_NonFragile ||
4527 (rewriteKind == RK_None &&
4528 getToolChain().IsObjCNonFragileABIDefault()));
4529 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4530 options::OPT_fno_objc_nonfragile_abi,
4531 nonFragileABIIsDefault)) {
4532 // Determine the non-fragile ABI version to use.
4533#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4534 unsigned nonFragileABIVersion = 1;
4535#else
4536 unsigned nonFragileABIVersion = 2;
4537#endif
4538
4539 if (Arg *abiArg = args.getLastArg(
4540 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004541 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004542 if (value == "1")
4543 nonFragileABIVersion = 1;
4544 else if (value == "2")
4545 nonFragileABIVersion = 2;
4546 else
4547 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4548 << value;
4549 }
4550
4551 objcABIVersion = 1 + nonFragileABIVersion;
4552 } else {
4553 objcABIVersion = 1;
4554 }
4555 }
4556
4557 // We don't actually care about the ABI version other than whether
4558 // it's non-fragile.
4559 bool isNonFragile = objcABIVersion != 1;
4560
4561 // If we have no runtime argument, ask the toolchain for its default runtime.
4562 // However, the rewriter only really supports the Mac runtime, so assume that.
4563 ObjCRuntime runtime;
4564 if (!runtimeArg) {
4565 switch (rewriteKind) {
4566 case RK_None:
4567 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4568 break;
4569 case RK_Fragile:
4570 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4571 break;
4572 case RK_NonFragile:
4573 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4574 break;
4575 }
4576
4577 // -fnext-runtime
4578 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4579 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004580 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004581 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4582
4583 // Otherwise, build for a generic macosx port.
4584 } else {
4585 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4586 }
4587
4588 // -fgnu-runtime
4589 } else {
4590 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004591 // Legacy behaviour is to target the gnustep runtime if we are i
4592 // non-fragile mode or the GCC runtime in fragile mode.
4593 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004594 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004595 else
4596 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004597 }
4598
4599 cmdArgs.push_back(args.MakeArgString(
4600 "-fobjc-runtime=" + runtime.getAsString()));
4601 return runtime;
4602}
4603
Reid Klecknerc542d372014-06-27 17:02:02 +00004604static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4605 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4606 I += HaveDash;
4607 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004608}
Reid Klecknerc542d372014-06-27 17:02:02 +00004609
4610struct EHFlags {
4611 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4612 bool Synch;
4613 bool Asynch;
4614 bool NoExceptC;
4615};
4616
4617/// /EH controls whether to run destructor cleanups when exceptions are
4618/// thrown. There are three modifiers:
4619/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4620/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4621/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4622/// - c: Assume that extern "C" functions are implicitly noexcept. This
4623/// modifier is an optimization, so we ignore it for now.
4624/// The default is /EHs-c-, meaning cleanups are disabled.
4625static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4626 EHFlags EH;
4627 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4628 for (auto EHVal : EHArgs) {
4629 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4630 switch (EHVal[I]) {
4631 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4632 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4633 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4634 default: break;
4635 }
4636 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4637 break;
4638 }
4639 }
4640 return EH;
4641}
4642
Hans Wennborg75958c42013-08-08 00:17:41 +00004643void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4644 unsigned RTOptionID = options::OPT__SLASH_MT;
4645
Hans Wennborgf1a74252013-09-10 20:18:04 +00004646 if (Args.hasArg(options::OPT__SLASH_LDd))
4647 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4648 // but defining _DEBUG is sticky.
4649 RTOptionID = options::OPT__SLASH_MTd;
4650
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004651 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004652 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004653
Hans Wennborg75958c42013-08-08 00:17:41 +00004654 switch(RTOptionID) {
4655 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004656 if (Args.hasArg(options::OPT__SLASH_LDd))
4657 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004658 CmdArgs.push_back("-D_MT");
4659 CmdArgs.push_back("-D_DLL");
4660 CmdArgs.push_back("--dependent-lib=msvcrt");
4661 break;
4662 case options::OPT__SLASH_MDd:
4663 CmdArgs.push_back("-D_DEBUG");
4664 CmdArgs.push_back("-D_MT");
4665 CmdArgs.push_back("-D_DLL");
4666 CmdArgs.push_back("--dependent-lib=msvcrtd");
4667 break;
4668 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004669 if (Args.hasArg(options::OPT__SLASH_LDd))
4670 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004671 CmdArgs.push_back("-D_MT");
4672 CmdArgs.push_back("--dependent-lib=libcmt");
4673 break;
4674 case options::OPT__SLASH_MTd:
4675 CmdArgs.push_back("-D_DEBUG");
4676 CmdArgs.push_back("-D_MT");
4677 CmdArgs.push_back("--dependent-lib=libcmtd");
4678 break;
4679 default:
4680 llvm_unreachable("Unexpected option ID.");
4681 }
4682
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004683 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4684 // users want. The /Za flag to cl.exe turns this off, but it's not
4685 // implemented in clang.
4686 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004687
Hans Wennborg8858a032014-07-21 23:42:07 +00004688 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4689 // would produce interleaved output, so ignore /showIncludes in such cases.
4690 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4691 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4692 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004693
David Majnemerf6072342014-07-01 22:24:56 +00004694 // This controls whether or not we emit RTTI data for polymorphic types.
4695 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4696 /*default=*/false))
4697 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004698
Reid Klecknerc542d372014-06-27 17:02:02 +00004699 const Driver &D = getToolChain().getDriver();
4700 EHFlags EH = parseClangCLEHFlags(D, Args);
4701 // FIXME: Do something with NoExceptC.
4702 if (EH.Synch || EH.Asynch) {
4703 CmdArgs.push_back("-fexceptions");
4704 CmdArgs.push_back("-fcxx-exceptions");
4705 }
4706
Hans Wennborge50cec32014-06-13 20:59:54 +00004707 // /EP should expand to -E -P.
4708 if (Args.hasArg(options::OPT__SLASH_EP)) {
4709 CmdArgs.push_back("-E");
4710 CmdArgs.push_back("-P");
4711 }
4712
David Majnemer86c318f2014-02-11 21:05:00 +00004713 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4714 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4715 if (MostGeneralArg && BestCaseArg)
4716 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4717 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4718
4719 if (MostGeneralArg) {
4720 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4721 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4722 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4723
4724 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4725 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4726 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4727 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4728 << FirstConflict->getAsString(Args)
4729 << SecondConflict->getAsString(Args);
4730
4731 if (SingleArg)
4732 CmdArgs.push_back("-fms-memptr-rep=single");
4733 else if (MultipleArg)
4734 CmdArgs.push_back("-fms-memptr-rep=multiple");
4735 else
4736 CmdArgs.push_back("-fms-memptr-rep=virtual");
4737 }
4738
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004739 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4740 A->render(Args, CmdArgs);
4741
Hans Wennborg81f74482013-09-10 01:07:07 +00004742 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4743 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004744 if (Args.hasArg(options::OPT__SLASH_fallback))
4745 CmdArgs.push_back("msvc-fallback");
4746 else
4747 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004748 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004749}
4750
Hans Wennborg1da044a2014-06-26 19:59:02 +00004751visualstudio::Compile *Clang::getCLFallback() const {
4752 if (!CLFallback)
4753 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4754 return CLFallback.get();
4755}
4756
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004757void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004758 const InputInfo &Output,
4759 const InputInfoList &Inputs,
4760 const ArgList &Args,
4761 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004762 ArgStringList CmdArgs;
4763
4764 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4765 const InputInfo &Input = Inputs[0];
4766
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004767 // Don't warn about "clang -w -c foo.s"
4768 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004769 // and "clang -emit-llvm -c foo.s"
4770 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004771
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004772 // Invoke ourselves in -cc1as mode.
4773 //
4774 // FIXME: Implement custom jobs for internal actions.
4775 CmdArgs.push_back("-cc1as");
4776
4777 // Add the "effective" target triple.
4778 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004779 std::string TripleStr =
4780 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004781 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4782
4783 // Set the output mode, we currently only expect to be used as a real
4784 // assembler.
4785 CmdArgs.push_back("-filetype");
4786 CmdArgs.push_back("obj");
4787
Eric Christopher45f2e712012-12-18 00:31:10 +00004788 // Set the main file name, so that debug info works even with
4789 // -save-temps or preprocessed assembly.
4790 CmdArgs.push_back("-main-file-name");
4791 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4792
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004793 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004794 const llvm::Triple &Triple = getToolChain().getTriple();
4795 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004796 if (!CPU.empty()) {
4797 CmdArgs.push_back("-target-cpu");
4798 CmdArgs.push_back(Args.MakeArgString(CPU));
4799 }
4800
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004801 // Add the target features
4802 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004803 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004804
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004805 // Ignore explicit -force_cpusubtype_ALL option.
4806 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004807
Eric Christopherfc3ee562012-01-10 00:38:01 +00004808 // Determine the original source input.
4809 const Action *SourceAction = &JA;
4810 while (SourceAction->getKind() != Action::InputClass) {
4811 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4812 SourceAction = SourceAction->getInputs()[0];
4813 }
4814
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004815 // Forward -g and handle debug info related flags, assuming we are dealing
4816 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004817 if (SourceAction->getType() == types::TY_Asm ||
4818 SourceAction->getType() == types::TY_PP_Asm) {
4819 Args.ClaimAllArgs(options::OPT_g_Group);
4820 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4821 if (!A->getOption().matches(options::OPT_g0))
4822 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004823
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004824 if (Args.hasArg(options::OPT_gdwarf_2))
4825 CmdArgs.push_back("-gdwarf-2");
4826 if (Args.hasArg(options::OPT_gdwarf_3))
4827 CmdArgs.push_back("-gdwarf-3");
4828 if (Args.hasArg(options::OPT_gdwarf_4))
4829 CmdArgs.push_back("-gdwarf-4");
4830
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004831 // Add the -fdebug-compilation-dir flag if needed.
4832 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004833
4834 // Set the AT_producer to the clang version when using the integrated
4835 // assembler on assembly source files.
4836 CmdArgs.push_back("-dwarf-debug-producer");
4837 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004838 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004839
4840 // Optionally embed the -cc1as level arguments into the debug info, for build
4841 // analysis.
4842 if (getToolChain().UseDwarfDebugFlags()) {
4843 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004844 for (const auto &Arg : Args)
4845 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004846
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004847 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004848 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4849 Flags += Exec;
4850 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4851 Flags += " ";
4852 Flags += OriginalArgs[i];
4853 }
4854 CmdArgs.push_back("-dwarf-debug-flags");
4855 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4856 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004857
4858 // FIXME: Add -static support, once we have it.
4859
David Blaikie372d9502014-01-17 03:17:40 +00004860 // Consume all the warning flags. Usually this would be handled more
4861 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4862 // doesn't handle that so rather than warning about unused flags that are
4863 // actually used, we'll lie by omission instead.
4864 // FIXME: Stop lying and consume only the appropriate driver flags
4865 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4866 ie = Args.filtered_end();
4867 it != ie; ++it)
4868 (*it)->claim();
4869
David Blaikie9260ed62013-07-25 21:19:01 +00004870 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4871 getToolChain().getDriver());
4872
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004873 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004874
4875 assert(Output.isFilename() && "Unexpected lipo output.");
4876 CmdArgs.push_back("-o");
4877 CmdArgs.push_back(Output.getFilename());
4878
Daniel Dunbarb440f562010-08-02 02:38:21 +00004879 assert(Input.isFilename() && "Invalid input.");
4880 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004881
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004882 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00004883 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004884
4885 // Handle the debug info splitting at object creation time if we're
4886 // creating an object.
4887 // TODO: Currently only works on linux with newer objcopy.
4888 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004889 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004890 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4891 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004892}
4893
Reid Kleckner0290c9c2014-09-15 17:45:39 +00004894void GnuTool::anchor() {}
4895
Daniel Dunbara3246a02009-03-18 08:07:30 +00004896void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004897 const InputInfo &Output,
4898 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004899 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004900 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004901 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004902 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004903
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004904 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004905 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004906 // Don't forward any -g arguments to assembly steps.
4907 if (isa<AssembleJobAction>(JA) &&
4908 A->getOption().matches(options::OPT_g_Group))
4909 continue;
4910
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004911 // Don't forward any -W arguments to assembly and link steps.
4912 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4913 A->getOption().matches(options::OPT_W_Group))
4914 continue;
4915
Daniel Dunbar2da02722009-03-19 07:55:12 +00004916 // It is unfortunate that we have to claim here, as this means
4917 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004918 // platforms using a generic gcc, even if we are just using gcc
4919 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004920 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004921 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004922 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004923 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004924
Daniel Dunbar4e295052010-01-25 22:35:08 +00004925 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004926
4927 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004928 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004929 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00004930 CmdArgs.push_back(
4931 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004932 }
4933
Daniel Dunbar5716d872009-05-02 21:41:52 +00004934 // Try to force gcc to match the tool chain we want, if we recognize
4935 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004936 //
4937 // FIXME: The triple class should directly provide the information we want
4938 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00004939 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004940 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004941 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004942 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4943 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004944 CmdArgs.push_back("-m64");
4945
Daniel Dunbarb440f562010-08-02 02:38:21 +00004946 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004947 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004948 CmdArgs.push_back(Output.getFilename());
4949 } else {
4950 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004951 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004952 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004953
Tony Linthicum76329bf2011-12-12 21:14:55 +00004954 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4955 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004956
4957 // Only pass -x if gcc will understand it; otherwise hope gcc
4958 // understands the suffix correctly. The main use case this would go
4959 // wrong in is for linker inputs if they happened to have an odd
4960 // suffix; really the only way to get this to happen is a command
4961 // like '-x foobar a.c' which will treat a.c like a linker input.
4962 //
4963 // FIXME: For the linker case specifically, can we safely convert
4964 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004965 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004966 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004967 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4968 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004969 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004970 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004971 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004972 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004973 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004974 else if (II.getType() == types::TY_ModuleFile)
4975 D.Diag(diag::err_drv_no_module_support)
4976 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004977
Daniel Dunbara3246a02009-03-18 08:07:30 +00004978 if (types::canTypeBeUserSpecified(II.getType())) {
4979 CmdArgs.push_back("-x");
4980 CmdArgs.push_back(types::getTypeName(II.getType()));
4981 }
4982
Daniel Dunbarb440f562010-08-02 02:38:21 +00004983 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004984 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004985 else {
4986 const Arg &A = II.getInputArg();
4987
4988 // Reverse translate some rewritten options.
4989 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4990 CmdArgs.push_back("-lstdc++");
4991 continue;
4992 }
4993
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004994 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004995 A.render(Args, CmdArgs);
4996 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004997 }
4998
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004999 const std::string customGCCName = D.getCCCGenericGCCName();
5000 const char *GCCName;
5001 if (!customGCCName.empty())
5002 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005003 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005004 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005005 } else
5006 GCCName = "gcc";
5007
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005008 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005009 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005010 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005011}
5012
Daniel Dunbar4e295052010-01-25 22:35:08 +00005013void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5014 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005015 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005016}
5017
Daniel Dunbar4e295052010-01-25 22:35:08 +00005018void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5019 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005020 const Driver &D = getToolChain().getDriver();
5021
Daniel Dunbar4e295052010-01-25 22:35:08 +00005022 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005023 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
5024 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00005025 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005026 else {
5027 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005028 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005029 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005030
Daniel Dunbar4e295052010-01-25 22:35:08 +00005031 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005032 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005033}
5034
Daniel Dunbar4e295052010-01-25 22:35:08 +00005035void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5036 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005037 // The types are (hopefully) good enough.
5038}
5039
Tony Linthicum76329bf2011-12-12 21:14:55 +00005040// Hexagon tools start.
5041void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5042 ArgStringList &CmdArgs) const {
5043
5044}
5045void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5046 const InputInfo &Output,
5047 const InputInfoList &Inputs,
5048 const ArgList &Args,
5049 const char *LinkingOutput) const {
5050
5051 const Driver &D = getToolChain().getDriver();
5052 ArgStringList CmdArgs;
5053
5054 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005055 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005056 CmdArgs.push_back(Args.MakeArgString(MarchString));
5057
5058 RenderExtraToolArgs(JA, CmdArgs);
5059
5060 if (Output.isFilename()) {
5061 CmdArgs.push_back("-o");
5062 CmdArgs.push_back(Output.getFilename());
5063 } else {
5064 assert(Output.isNothing() && "Unexpected output");
5065 CmdArgs.push_back("-fsyntax-only");
5066 }
5067
Matthew Curtise8f80a12012-12-06 17:49:03 +00005068 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5069 if (!SmallDataThreshold.empty())
5070 CmdArgs.push_back(
5071 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005072
Matthew Curtise5df3812012-12-07 17:23:04 +00005073 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5074 options::OPT_Xassembler);
5075
Tony Linthicum76329bf2011-12-12 21:14:55 +00005076 // Only pass -x if gcc will understand it; otherwise hope gcc
5077 // understands the suffix correctly. The main use case this would go
5078 // wrong in is for linker inputs if they happened to have an odd
5079 // suffix; really the only way to get this to happen is a command
5080 // like '-x foobar a.c' which will treat a.c like a linker input.
5081 //
5082 // FIXME: For the linker case specifically, can we safely convert
5083 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005084 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005085 // Don't try to pass LLVM or AST inputs to a generic gcc.
5086 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5087 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5088 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5089 << getToolChain().getTripleString();
5090 else if (II.getType() == types::TY_AST)
5091 D.Diag(clang::diag::err_drv_no_ast_support)
5092 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005093 else if (II.getType() == types::TY_ModuleFile)
5094 D.Diag(diag::err_drv_no_module_support)
5095 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005096
5097 if (II.isFilename())
5098 CmdArgs.push_back(II.getFilename());
5099 else
5100 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5101 II.getInputArg().render(Args, CmdArgs);
5102 }
5103
5104 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005105 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005106 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005107}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005108
Tony Linthicum76329bf2011-12-12 21:14:55 +00005109void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5110 ArgStringList &CmdArgs) const {
5111 // The types are (hopefully) good enough.
5112}
5113
5114void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5115 const InputInfo &Output,
5116 const InputInfoList &Inputs,
5117 const ArgList &Args,
5118 const char *LinkingOutput) const {
5119
Matthew Curtise689b052012-12-06 15:46:07 +00005120 const toolchains::Hexagon_TC& ToolChain =
5121 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5122 const Driver &D = ToolChain.getDriver();
5123
Tony Linthicum76329bf2011-12-12 21:14:55 +00005124 ArgStringList CmdArgs;
5125
Matthew Curtise689b052012-12-06 15:46:07 +00005126 //----------------------------------------------------------------------------
5127 //
5128 //----------------------------------------------------------------------------
5129 bool hasStaticArg = Args.hasArg(options::OPT_static);
5130 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005131 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005132 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5133 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5134 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5135 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005136
Matthew Curtise689b052012-12-06 15:46:07 +00005137 //----------------------------------------------------------------------------
5138 // Silence warnings for various options
5139 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005140
Matthew Curtise689b052012-12-06 15:46:07 +00005141 Args.ClaimAllArgs(options::OPT_g_Group);
5142 Args.ClaimAllArgs(options::OPT_emit_llvm);
5143 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5144 // handled somewhere else.
5145 Args.ClaimAllArgs(options::OPT_static_libgcc);
5146
5147 //----------------------------------------------------------------------------
5148 //
5149 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005150 for (const auto &Opt : ToolChain.ExtraOpts)
5151 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005152
Matthew Curtisf10a5952012-12-06 14:16:43 +00005153 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5154 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005155
Matthew Curtise689b052012-12-06 15:46:07 +00005156 if (buildingLib) {
5157 CmdArgs.push_back("-shared");
5158 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5159 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005160 }
5161
Matthew Curtise689b052012-12-06 15:46:07 +00005162 if (hasStaticArg)
5163 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005164
Matthew Curtise8f80a12012-12-06 17:49:03 +00005165 if (buildPIE && !buildingLib)
5166 CmdArgs.push_back("-pie");
5167
5168 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5169 if (!SmallDataThreshold.empty()) {
5170 CmdArgs.push_back(
5171 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5172 }
5173
Matthew Curtise689b052012-12-06 15:46:07 +00005174 //----------------------------------------------------------------------------
5175 //
5176 //----------------------------------------------------------------------------
5177 CmdArgs.push_back("-o");
5178 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005179
Matthew Curtise689b052012-12-06 15:46:07 +00005180 const std::string MarchSuffix = "/" + MarchString;
5181 const std::string G0Suffix = "/G0";
5182 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
5183 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
5184 + "/";
5185 const std::string StartFilesDir = RootDir
5186 + "hexagon/lib"
5187 + (buildingLib
5188 ? MarchG0Suffix : MarchSuffix);
5189
5190 //----------------------------------------------------------------------------
5191 // moslib
5192 //----------------------------------------------------------------------------
5193 std::vector<std::string> oslibs;
5194 bool hasStandalone= false;
5195
5196 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5197 ie = Args.filtered_end(); it != ie; ++it) {
5198 (*it)->claim();
5199 oslibs.push_back((*it)->getValue());
5200 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005201 }
Matthew Curtise689b052012-12-06 15:46:07 +00005202 if (oslibs.empty()) {
5203 oslibs.push_back("standalone");
5204 hasStandalone = true;
5205 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005206
Matthew Curtise689b052012-12-06 15:46:07 +00005207 //----------------------------------------------------------------------------
5208 // Start Files
5209 //----------------------------------------------------------------------------
5210 if (incStdLib && incStartFiles) {
5211
5212 if (!buildingLib) {
5213 if (hasStandalone) {
5214 CmdArgs.push_back(
5215 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5216 }
5217 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5218 }
5219 std::string initObj = useShared ? "/initS.o" : "/init.o";
5220 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5221 }
5222
5223 //----------------------------------------------------------------------------
5224 // Library Search Paths
5225 //----------------------------------------------------------------------------
5226 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005227 for (const auto &LibPath : LibPaths)
5228 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005229
5230 //----------------------------------------------------------------------------
5231 //
5232 //----------------------------------------------------------------------------
5233 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5234 Args.AddAllArgs(CmdArgs, options::OPT_e);
5235 Args.AddAllArgs(CmdArgs, options::OPT_s);
5236 Args.AddAllArgs(CmdArgs, options::OPT_t);
5237 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5238
5239 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5240
5241 //----------------------------------------------------------------------------
5242 // Libraries
5243 //----------------------------------------------------------------------------
5244 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005245 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005246 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5247 CmdArgs.push_back("-lm");
5248 }
5249
5250 CmdArgs.push_back("--start-group");
5251
5252 if (!buildingLib) {
5253 for(std::vector<std::string>::iterator i = oslibs.begin(),
5254 e = oslibs.end(); i != e; ++i)
5255 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5256 CmdArgs.push_back("-lc");
5257 }
5258 CmdArgs.push_back("-lgcc");
5259
5260 CmdArgs.push_back("--end-group");
5261 }
5262
5263 //----------------------------------------------------------------------------
5264 // End files
5265 //----------------------------------------------------------------------------
5266 if (incStdLib && incStartFiles) {
5267 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5268 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5269 }
5270
5271 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005272 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5273 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005274}
5275// Hexagon tools end.
5276
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005277/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005278const char *arm::getARMCPUForMArch(const ArgList &Args,
5279 const llvm::Triple &Triple) {
5280 StringRef MArch;
5281 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5282 // Otherwise, if we have -march= choose the base CPU for that arch.
5283 MArch = A->getValue();
5284 } else {
5285 // Otherwise, use the Arch from the triple.
5286 MArch = Triple.getArchName();
5287 }
5288
5289 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005290 if (MArch == "native") {
5291 std::string CPU = llvm::sys::getHostCPUName();
5292 if (CPU != "generic") {
5293 // Translate the native cpu into the architecture. The switch below will
5294 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005295 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005296 }
5297 }
5298
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005299 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005300}
5301
5302/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005303StringRef arm::getARMTargetCPU(const ArgList &Args,
5304 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005305 // FIXME: Warn on inconsistent use of -mcpu and -march.
5306 // If we have -mcpu=, use that.
5307 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5308 StringRef MCPU = A->getValue();
5309 // Handle -mcpu=native.
5310 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005311 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005312 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005313 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005314 }
5315
5316 return getARMCPUForMArch(Args, Triple);
5317}
5318
5319/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5320/// CPU.
5321//
5322// FIXME: This is redundant with -mcpu, why does LLVM use this.
5323// FIXME: tblgen this, or kill it!
5324const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5325 return llvm::StringSwitch<const char *>(CPU)
5326 .Case("strongarm", "v4")
5327 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5328 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5329 .Cases("arm920", "arm920t", "arm922t", "v4t")
5330 .Cases("arm940t", "ep9312","v4t")
5331 .Cases("arm10tdmi", "arm1020t", "v5")
5332 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5333 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5334 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5335 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5336 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5337 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00005338 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005339 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5340 .Cases("cortex-r4", "cortex-r5", "v7r")
5341 .Case("cortex-m0", "v6m")
5342 .Case("cortex-m3", "v7m")
5343 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005344 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005345 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005346 .Cases("cortex-a53", "cortex-a57", "v8")
5347 .Default("");
5348}
5349
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005350bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5351 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5352 return A && (A->getValue() == StringRef(Value));
5353}
5354
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005355bool mips::isUCLibc(const ArgList &Args) {
5356 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005357 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005358}
5359
Daniel Sanders2bf13662014-07-10 14:40:57 +00005360bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005361 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5362 return llvm::StringSwitch<bool>(NaNArg->getValue())
5363 .Case("2008", true)
5364 .Case("legacy", false)
5365 .Default(false);
5366
5367 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005368 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5369 .Cases("mips32r6", "mips64r6", true)
5370 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005371
5372 return false;
5373}
5374
Daniel Sanders379d44b2014-07-16 11:52:23 +00005375bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5376 StringRef ABIName) {
5377 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005378 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005379 return false;
5380
5381 if (ABIName != "32")
5382 return false;
5383
5384 return llvm::StringSwitch<bool>(CPUName)
5385 .Cases("mips2", "mips3", "mips4", "mips5", true)
5386 .Cases("mips32", "mips32r2", true)
5387 .Cases("mips64", "mips64r2", true)
5388 .Default(false);
5389}
5390
Tim Northover157d9112014-01-16 08:48:16 +00005391llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005392 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5393 // archs which Darwin doesn't use.
5394
5395 // The matching this routine does is fairly pointless, since it is neither the
5396 // complete architecture list, nor a reasonable subset. The problem is that
5397 // historically the driver driver accepts this and also ties its -march=
5398 // handling to the architecture name, so we need to be careful before removing
5399 // support for it.
5400
5401 // This code must be kept in sync with Clang's Darwin specific argument
5402 // translation.
5403
5404 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5405 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5406 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5407 .Case("ppc64", llvm::Triple::ppc64)
5408 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5409 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5410 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005411 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005412 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005413 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005414 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005415 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005416 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005417 .Case("r600", llvm::Triple::r600)
5418 .Case("nvptx", llvm::Triple::nvptx)
5419 .Case("nvptx64", llvm::Triple::nvptx64)
5420 .Case("amdil", llvm::Triple::amdil)
5421 .Case("spir", llvm::Triple::spir)
5422 .Default(llvm::Triple::UnknownArch);
5423}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005424
Tim Northover157d9112014-01-16 08:48:16 +00005425void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5426 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5427 T.setArch(Arch);
5428
5429 if (Str == "x86_64h")
5430 T.setArchName(Str);
5431 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5432 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005433 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005434 }
5435}
5436
Bob Wilsondecc03e2012-11-23 06:14:39 +00005437const char *Clang::getBaseInputName(const ArgList &Args,
5438 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005439 return Args.MakeArgString(
5440 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005441}
5442
Bob Wilsondecc03e2012-11-23 06:14:39 +00005443const char *Clang::getBaseInputStem(const ArgList &Args,
5444 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005445 const char *Str = getBaseInputName(Args, Inputs);
5446
Chris Lattner906bb902011-01-16 08:14:11 +00005447 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005448 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005449
5450 return Str;
5451}
5452
Bob Wilsondecc03e2012-11-23 06:14:39 +00005453const char *Clang::getDependencyFileName(const ArgList &Args,
5454 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005455 // FIXME: Think about this more.
5456 std::string Res;
5457
5458 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005459 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005460 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005461 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005462 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005463 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005464 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005465}
5466
Daniel Dunbarbe220842009-03-20 16:06:39 +00005467void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005468 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005469 const InputInfoList &Inputs,
5470 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005471 const char *LinkingOutput) const {
5472 ArgStringList CmdArgs;
5473
5474 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5475 const InputInfo &Input = Inputs[0];
5476
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005477 // Determine the original source input.
5478 const Action *SourceAction = &JA;
5479 while (SourceAction->getKind() != Action::InputClass) {
5480 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5481 SourceAction = SourceAction->getInputs()[0];
5482 }
5483
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005484 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005485 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005486 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5487 // FIXME: at run-time detect assembler capabilities or rely on version
5488 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005489 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005490 const llvm::Triple &T(getToolChain().getTriple());
5491 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005492 CmdArgs.push_back("-Q");
5493 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005494
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005495 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005496 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005497 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005498 if (Args.hasArg(options::OPT_gstabs))
5499 CmdArgs.push_back("--gstabs");
5500 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005501 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005503
Daniel Dunbarbe220842009-03-20 16:06:39 +00005504 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005505 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005506
Daniel Dunbar6d484762010-07-22 01:47:22 +00005507 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005508 if (getToolChain().getArch() == llvm::Triple::x86 ||
5509 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005510 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5511 CmdArgs.push_back("-force_cpusubtype_ALL");
5512
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005513 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005514 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005515 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005516 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005517 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005518 CmdArgs.push_back("-static");
5519
Daniel Dunbarbe220842009-03-20 16:06:39 +00005520 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5521 options::OPT_Xassembler);
5522
5523 assert(Output.isFilename() && "Unexpected lipo output.");
5524 CmdArgs.push_back("-o");
5525 CmdArgs.push_back(Output.getFilename());
5526
Daniel Dunbarb440f562010-08-02 02:38:21 +00005527 assert(Input.isFilename() && "Invalid input.");
5528 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005529
5530 // asm_final spec is empty.
5531
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005532 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005533 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005534 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005535}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005536
Tim Northover157d9112014-01-16 08:48:16 +00005537void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005538
Tim Northover157d9112014-01-16 08:48:16 +00005539void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5540 ArgStringList &CmdArgs) const {
5541 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005542
Daniel Dunbarc1964212009-03-26 16:23:12 +00005543 // Derived from darwin_arch spec.
5544 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005545 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005546
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005547 // FIXME: Is this needed anymore?
5548 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005549 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005550}
5551
Bill Wendling3b2000f2012-10-02 18:02:50 +00005552bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5553 // We only need to generate a temp path for LTO if we aren't compiling object
5554 // files. When compiling source files, we run 'dsymutil' after linking. We
5555 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005556 for (const auto &Input : Inputs)
5557 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005558 return true;
5559
5560 return false;
5561}
5562
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005563void darwin::Link::AddLinkArgs(Compilation &C,
5564 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005565 ArgStringList &CmdArgs,
5566 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005567 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005568 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005569
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005570 unsigned Version[3] = { 0, 0, 0 };
5571 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5572 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005573 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005574 Version[1], Version[2], HadExtra) ||
5575 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005576 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005577 << A->getAsString(Args);
5578 }
5579
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005580 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005581 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005582 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5583 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005584
Bob Wilson3d27dad2013-08-02 22:25:34 +00005585 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5586 CmdArgs.push_back("-export_dynamic");
5587
Bill Wendling313b6bf2012-11-16 23:03:00 +00005588 // If we are using LTO, then automatically create a temporary file path for
5589 // the linker to use, so that it's lifetime will extend past a possible
5590 // dsymutil step.
5591 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5592 const char *TmpPath = C.getArgs().MakeArgString(
5593 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5594 C.addTempFile(TmpPath);
5595 CmdArgs.push_back("-object_path_lto");
5596 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005597 }
5598
Daniel Dunbarc1964212009-03-26 16:23:12 +00005599 // Derived from the "link" spec.
5600 Args.AddAllArgs(CmdArgs, options::OPT_static);
5601 if (!Args.hasArg(options::OPT_static))
5602 CmdArgs.push_back("-dynamic");
5603 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5604 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5605 // here. How do we wish to handle such things?
5606 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005607
Daniel Dunbarc1964212009-03-26 16:23:12 +00005608 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005609 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005610 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005611 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005612
5613 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5614 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5615 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5616
5617 Arg *A;
5618 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5619 (A = Args.getLastArg(options::OPT_current__version)) ||
5620 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005621 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005622 << A->getAsString(Args) << "-dynamiclib";
5623
5624 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5625 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5626 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5627 } else {
5628 CmdArgs.push_back("-dylib");
5629
5630 Arg *A;
5631 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5632 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5633 (A = Args.getLastArg(options::OPT_client__name)) ||
5634 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5635 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5636 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005637 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005638 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005639
Daniel Dunbarc1964212009-03-26 16:23:12 +00005640 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5641 "-dylib_compatibility_version");
5642 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5643 "-dylib_current_version");
5644
Tim Northover157d9112014-01-16 08:48:16 +00005645 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005646
5647 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5648 "-dylib_install_name");
5649 }
5650
5651 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5652 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5653 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005654 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005655 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005656 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5657 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5658 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5659 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5660 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5661 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005662 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005663 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5664 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5665 Args.AddAllArgs(CmdArgs, options::OPT_init);
5666
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005667 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005668 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005669
Daniel Dunbarc1964212009-03-26 16:23:12 +00005670 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5671 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5672 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5673 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5674 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005675
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005676 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5677 options::OPT_fno_pie,
5678 options::OPT_fno_PIE)) {
5679 if (A->getOption().matches(options::OPT_fpie) ||
5680 A->getOption().matches(options::OPT_fPIE))
5681 CmdArgs.push_back("-pie");
5682 else
5683 CmdArgs.push_back("-no_pie");
5684 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005685
5686 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5687 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5688 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5689 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5690 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5691 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5692 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5693 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5694 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5695 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5696 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5697 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5698 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5699 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5700 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5701 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005702
Daniel Dunbar84384642011-05-02 21:03:47 +00005703 // Give --sysroot= preference, over the Apple specific behavior to also use
5704 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005705 StringRef sysroot = C.getSysRoot();
5706 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005707 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005708 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005709 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5710 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005711 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005712 }
5713
Daniel Dunbarc1964212009-03-26 16:23:12 +00005714 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5715 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5716 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5717 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5718 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005719 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005720 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5721 Args.AddAllArgs(CmdArgs, options::OPT_y);
5722 Args.AddLastArg(CmdArgs, options::OPT_w);
5723 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5724 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5725 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5726 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5727 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5728 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5729 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5730 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5731 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5732 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5733 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5734 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5735}
5736
Alexey Bataev186b28a2014-03-06 05:43:53 +00005737enum LibOpenMP {
5738 LibUnknown,
5739 LibGOMP,
5740 LibIOMP5
5741};
5742
Daniel Dunbarc1964212009-03-26 16:23:12 +00005743void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005744 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005745 const InputInfoList &Inputs,
5746 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005747 const char *LinkingOutput) const {
5748 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005749
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005750 // If the number of arguments surpasses the system limits, we will encode the
5751 // input files in a separate file, shortening the command line. To this end,
5752 // build a list of input file names that can be passed via a file with the
5753 // -filelist linker option.
5754 llvm::opt::ArgStringList InputFileList;
5755
Daniel Dunbarc1964212009-03-26 16:23:12 +00005756 // The logic here is derived from gcc's behavior; most of which
5757 // comes from specs (starting with link_command). Consult gcc for
5758 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005759 ArgStringList CmdArgs;
5760
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005761 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5762 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5763 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005764 for (const auto &Arg : Args)
5765 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005766 const char *Exec =
5767 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5768 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005769 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005770 return;
5771 }
5772
Daniel Dunbarc1964212009-03-26 16:23:12 +00005773 // I'm not sure why this particular decomposition exists in gcc, but
5774 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005775 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005776
Daniel Dunbarc1964212009-03-26 16:23:12 +00005777 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5778 Args.AddAllArgs(CmdArgs, options::OPT_s);
5779 Args.AddAllArgs(CmdArgs, options::OPT_t);
5780 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5781 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005782 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005783 Args.AddAllArgs(CmdArgs, options::OPT_r);
5784
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005785 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5786 // members of static archive libraries which implement Objective-C classes or
5787 // categories.
5788 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5789 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005790
Daniel Dunbarc1964212009-03-26 16:23:12 +00005791 CmdArgs.push_back("-o");
5792 CmdArgs.push_back(Output.getFilename());
5793
Chad Rosier06fd3c62012-05-16 23:45:12 +00005794 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005795 !Args.hasArg(options::OPT_nostartfiles))
5796 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005797
5798 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005799
Alexey Bataev186b28a2014-03-06 05:43:53 +00005800 LibOpenMP UsedOpenMPLib = LibUnknown;
5801 if (Args.hasArg(options::OPT_fopenmp)) {
5802 UsedOpenMPLib = LibGOMP;
5803 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5804 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5805 .Case("libgomp", LibGOMP)
5806 .Case("libiomp5", LibIOMP5)
5807 .Default(LibUnknown);
5808 if (UsedOpenMPLib == LibUnknown)
5809 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5810 << A->getOption().getName() << A->getValue();
5811 }
5812 switch (UsedOpenMPLib) {
5813 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005814 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005815 break;
5816 case LibIOMP5:
5817 CmdArgs.push_back("-liomp5");
5818 break;
5819 case LibUnknown:
5820 break;
5821 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005822
Douglas Gregor9295df02012-05-15 21:00:27 +00005823 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005824 // Build the input file for -filelist (list of linker input files) in case we
5825 // need it later
5826 for (const auto &II : Inputs) {
5827 if (!II.isFilename()) {
5828 // This is a linker input argument.
5829 // We cannot mix input arguments and file names in a -filelist input, thus
5830 // we prematurely stop our list (remaining files shall be passed as
5831 // arguments).
5832 if (InputFileList.size() > 0)
5833 break;
5834
5835 continue;
5836 }
5837
5838 InputFileList.push_back(II.getFilename());
5839 }
5840
Bob Wilson16d93952012-05-15 18:57:39 +00005841 if (isObjCRuntimeLinked(Args) &&
5842 !Args.hasArg(options::OPT_nostdlib) &&
5843 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005844 // We use arclite library for both ARC and subscripting support.
5845 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5846
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005847 CmdArgs.push_back("-framework");
5848 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005849 // Link libobj.
5850 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005851 }
John McCall31168b02011-06-15 23:02:42 +00005852
Daniel Dunbarc1964212009-03-26 16:23:12 +00005853 if (LinkingOutput) {
5854 CmdArgs.push_back("-arch_multiple");
5855 CmdArgs.push_back("-final_output");
5856 CmdArgs.push_back(LinkingOutput);
5857 }
5858
Daniel Dunbarc1964212009-03-26 16:23:12 +00005859 if (Args.hasArg(options::OPT_fnested_functions))
5860 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005861
Daniel Dunbarc1964212009-03-26 16:23:12 +00005862 if (!Args.hasArg(options::OPT_nostdlib) &&
5863 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005864 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005865 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005866
Daniel Dunbarc1964212009-03-26 16:23:12 +00005867 // link_ssp spec is empty.
5868
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005869 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005870 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005871 }
5872
Chad Rosier06fd3c62012-05-16 23:45:12 +00005873 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005874 !Args.hasArg(options::OPT_nostartfiles)) {
5875 // endfile_spec is empty.
5876 }
5877
5878 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5879 Args.AddAllArgs(CmdArgs, options::OPT_F);
5880
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005881 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00005882 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005883 std::unique_ptr<Command> Cmd =
5884 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
5885 Cmd->setInputFileList(std::move(InputFileList));
5886 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005887}
5888
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005889void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005890 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005891 const InputInfoList &Inputs,
5892 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005893 const char *LinkingOutput) const {
5894 ArgStringList CmdArgs;
5895
5896 CmdArgs.push_back("-create");
5897 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005898
5899 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005900 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005901
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005902 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005903 assert(II.isFilename() && "Unexpected lipo input.");
5904 CmdArgs.push_back(II.getFilename());
5905 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005906
5907 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00005908 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005909}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005910
Daniel Dunbar88299622010-06-04 18:28:36 +00005911void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005912 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005913 const InputInfoList &Inputs,
5914 const ArgList &Args,
5915 const char *LinkingOutput) const {
5916 ArgStringList CmdArgs;
5917
Daniel Dunbareb86b042011-05-09 17:23:16 +00005918 CmdArgs.push_back("-o");
5919 CmdArgs.push_back(Output.getFilename());
5920
Daniel Dunbar88299622010-06-04 18:28:36 +00005921 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5922 const InputInfo &Input = Inputs[0];
5923 assert(Input.isFilename() && "Unexpected dsymutil input.");
5924 CmdArgs.push_back(Input.getFilename());
5925
Daniel Dunbar88299622010-06-04 18:28:36 +00005926 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005927 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00005928 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005929}
5930
Eric Christopher551ef452011-08-23 17:56:55 +00005931void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005932 const InputInfo &Output,
5933 const InputInfoList &Inputs,
5934 const ArgList &Args,
5935 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005936 ArgStringList CmdArgs;
5937 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005938 CmdArgs.push_back("--debug-info");
5939 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005940 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005941
5942 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5943 const InputInfo &Input = Inputs[0];
5944 assert(Input.isFilename() && "Unexpected verify input");
5945
5946 // Grabbing the output of the earlier dsymutil run.
5947 CmdArgs.push_back(Input.getFilename());
5948
5949 const char *Exec =
5950 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00005951 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00005952}
5953
David Chisnallf571cde2012-02-15 13:39:01 +00005954void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5955 const InputInfo &Output,
5956 const InputInfoList &Inputs,
5957 const ArgList &Args,
5958 const char *LinkingOutput) const {
5959 ArgStringList CmdArgs;
5960
5961 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5962 options::OPT_Xassembler);
5963
5964 CmdArgs.push_back("-o");
5965 CmdArgs.push_back(Output.getFilename());
5966
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005967 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00005968 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00005969
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005970 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005971 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00005972}
5973
David Chisnallf571cde2012-02-15 13:39:01 +00005974void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5975 const InputInfo &Output,
5976 const InputInfoList &Inputs,
5977 const ArgList &Args,
5978 const char *LinkingOutput) const {
5979 // FIXME: Find a real GCC, don't hard-code versions here
5980 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5981 const llvm::Triple &T = getToolChain().getTriple();
5982 std::string LibPath = "/usr/lib/";
5983 llvm::Triple::ArchType Arch = T.getArch();
5984 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005985 case llvm::Triple::x86:
5986 GCCLibPath +=
5987 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5988 break;
5989 case llvm::Triple::x86_64:
5990 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5991 GCCLibPath += "/4.5.2/amd64/";
5992 LibPath += "amd64/";
5993 break;
5994 default:
5995 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005996 }
5997
5998 ArgStringList CmdArgs;
5999
David Chisnall272a0712012-02-29 15:06:12 +00006000 // Demangle C++ names in errors
6001 CmdArgs.push_back("-C");
6002
David Chisnallf571cde2012-02-15 13:39:01 +00006003 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6004 (!Args.hasArg(options::OPT_shared))) {
6005 CmdArgs.push_back("-e");
6006 CmdArgs.push_back("_start");
6007 }
6008
6009 if (Args.hasArg(options::OPT_static)) {
6010 CmdArgs.push_back("-Bstatic");
6011 CmdArgs.push_back("-dn");
6012 } else {
6013 CmdArgs.push_back("-Bdynamic");
6014 if (Args.hasArg(options::OPT_shared)) {
6015 CmdArgs.push_back("-shared");
6016 } else {
6017 CmdArgs.push_back("--dynamic-linker");
6018 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6019 }
6020 }
6021
6022 if (Output.isFilename()) {
6023 CmdArgs.push_back("-o");
6024 CmdArgs.push_back(Output.getFilename());
6025 } else {
6026 assert(Output.isNothing() && "Invalid output.");
6027 }
6028
6029 if (!Args.hasArg(options::OPT_nostdlib) &&
6030 !Args.hasArg(options::OPT_nostartfiles)) {
6031 if (!Args.hasArg(options::OPT_shared)) {
6032 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6033 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006034 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006035 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6036 } else {
6037 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006038 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6039 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006040 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006041 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006042 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006043 }
6044
6045 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6046
6047 Args.AddAllArgs(CmdArgs, options::OPT_L);
6048 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6049 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006050 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006051
6052 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6053
6054 if (!Args.hasArg(options::OPT_nostdlib) &&
6055 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006056 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006057 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006058 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006059 if (!Args.hasArg(options::OPT_shared)) {
6060 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006061 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006062 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006063 }
David Chisnallf571cde2012-02-15 13:39:01 +00006064 }
6065
6066 if (!Args.hasArg(options::OPT_nostdlib) &&
6067 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006068 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006069 }
David Chisnall96de9932012-02-16 16:00:47 +00006070 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006071
Alexey Samsonov7811d192014-02-20 13:57:37 +00006072 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006073
6074 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006075 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006076 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006077}
6078
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006079void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006080 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006081 const InputInfoList &Inputs,
6082 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006083 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006084 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006085 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006086
Rafael Espindolacc126272014-02-28 01:55:21 +00006087 switch (getToolChain().getArch()) {
6088 case llvm::Triple::x86:
6089 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6090 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006091 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006092 break;
6093
6094 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006095 CmdArgs.push_back("-mppc");
6096 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006097 break;
6098
6099 case llvm::Triple::sparc:
6100 CmdArgs.push_back("-32");
6101 NeedsKPIC = true;
6102 break;
6103
6104 case llvm::Triple::sparcv9:
6105 CmdArgs.push_back("-64");
6106 CmdArgs.push_back("-Av9a");
6107 NeedsKPIC = true;
6108 break;
6109
6110 case llvm::Triple::mips64:
6111 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006112 StringRef CPUName;
6113 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006114 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006115
6116 CmdArgs.push_back("-mabi");
6117 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6118
6119 if (getToolChain().getArch() == llvm::Triple::mips64)
6120 CmdArgs.push_back("-EB");
6121 else
6122 CmdArgs.push_back("-EL");
6123
Rafael Espindolacc126272014-02-28 01:55:21 +00006124 NeedsKPIC = true;
6125 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006126 }
6127
Rafael Espindolacc126272014-02-28 01:55:21 +00006128 default:
6129 break;
6130 }
6131
6132 if (NeedsKPIC)
6133 addAssemblerKPIC(Args, CmdArgs);
6134
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006135 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6136 options::OPT_Xassembler);
6137
6138 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006139 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006140
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006141 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006142 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006143
6144 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006145 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006147}
6148
6149void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006150 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006151 const InputInfoList &Inputs,
6152 const ArgList &Args,
6153 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006154 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006155 ArgStringList CmdArgs;
6156
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006157 // Silence warning for "clang -g foo.o -o foo"
6158 Args.ClaimAllArgs(options::OPT_g_Group);
6159 // and "clang -emit-llvm foo.o -o foo"
6160 Args.ClaimAllArgs(options::OPT_emit_llvm);
6161 // and for "clang -w foo.o -o foo". Other warning options are already
6162 // handled somewhere else.
6163 Args.ClaimAllArgs(options::OPT_w);
6164
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006165 if (getToolChain().getArch() == llvm::Triple::mips64)
6166 CmdArgs.push_back("-EB");
6167 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6168 CmdArgs.push_back("-EL");
6169
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006170 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006171 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006172 CmdArgs.push_back("-e");
6173 CmdArgs.push_back("__start");
6174 }
6175
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006176 if (Args.hasArg(options::OPT_static)) {
6177 CmdArgs.push_back("-Bstatic");
6178 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006179 if (Args.hasArg(options::OPT_rdynamic))
6180 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006181 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006182 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006183 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006184 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006185 } else {
6186 CmdArgs.push_back("-dynamic-linker");
6187 CmdArgs.push_back("/usr/libexec/ld.so");
6188 }
6189 }
6190
Rafael Espindola044f7832013-06-05 04:28:55 +00006191 if (Args.hasArg(options::OPT_nopie))
6192 CmdArgs.push_back("-nopie");
6193
Daniel Dunbarb440f562010-08-02 02:38:21 +00006194 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006195 CmdArgs.push_back("-o");
6196 CmdArgs.push_back(Output.getFilename());
6197 } else {
6198 assert(Output.isNothing() && "Invalid output.");
6199 }
6200
6201 if (!Args.hasArg(options::OPT_nostdlib) &&
6202 !Args.hasArg(options::OPT_nostartfiles)) {
6203 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006204 if (Args.hasArg(options::OPT_pg))
6205 CmdArgs.push_back(Args.MakeArgString(
6206 getToolChain().GetFilePath("gcrt0.o")));
6207 else
6208 CmdArgs.push_back(Args.MakeArgString(
6209 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006210 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006211 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006212 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006213 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006214 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006215 }
6216 }
6217
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006218 std::string Triple = getToolChain().getTripleString();
6219 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006220 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006221 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006222 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006223
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006224 Args.AddAllArgs(CmdArgs, options::OPT_L);
6225 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6226 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006227 Args.AddAllArgs(CmdArgs, options::OPT_s);
6228 Args.AddAllArgs(CmdArgs, options::OPT_t);
6229 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6230 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006231
Daniel Dunbar54423b22010-09-17 00:24:54 +00006232 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006233
6234 if (!Args.hasArg(options::OPT_nostdlib) &&
6235 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006236 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006237 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006238 if (Args.hasArg(options::OPT_pg))
6239 CmdArgs.push_back("-lm_p");
6240 else
6241 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006242 }
6243
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006244 // FIXME: For some reason GCC passes -lgcc before adding
6245 // the default system libraries. Just mimic this for now.
6246 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006247
Eric Christopher17674ec2012-09-13 06:32:34 +00006248 if (Args.hasArg(options::OPT_pthread)) {
6249 if (!Args.hasArg(options::OPT_shared) &&
6250 Args.hasArg(options::OPT_pg))
6251 CmdArgs.push_back("-lpthread_p");
6252 else
6253 CmdArgs.push_back("-lpthread");
6254 }
6255
Chandler Carruth45661652011-12-17 22:32:42 +00006256 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006257 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006258 CmdArgs.push_back("-lc_p");
6259 else
6260 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006261 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006262
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006263 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006264 }
6265
6266 if (!Args.hasArg(options::OPT_nostdlib) &&
6267 !Args.hasArg(options::OPT_nostartfiles)) {
6268 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006269 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006270 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006271 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006272 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006273 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006274 }
6275
6276 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006277 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006279}
Ed Schoutene33194b2009-04-02 19:13:12 +00006280
Eli Friedman9fa28852012-08-08 23:57:20 +00006281void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6282 const InputInfo &Output,
6283 const InputInfoList &Inputs,
6284 const ArgList &Args,
6285 const char *LinkingOutput) const {
6286 ArgStringList CmdArgs;
6287
6288 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6289 options::OPT_Xassembler);
6290
6291 CmdArgs.push_back("-o");
6292 CmdArgs.push_back(Output.getFilename());
6293
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006294 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006295 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006296
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006297 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006298 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006299}
6300
6301void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6302 const InputInfo &Output,
6303 const InputInfoList &Inputs,
6304 const ArgList &Args,
6305 const char *LinkingOutput) const {
6306 const Driver &D = getToolChain().getDriver();
6307 ArgStringList CmdArgs;
6308
6309 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6310 (!Args.hasArg(options::OPT_shared))) {
6311 CmdArgs.push_back("-e");
6312 CmdArgs.push_back("__start");
6313 }
6314
6315 if (Args.hasArg(options::OPT_static)) {
6316 CmdArgs.push_back("-Bstatic");
6317 } else {
6318 if (Args.hasArg(options::OPT_rdynamic))
6319 CmdArgs.push_back("-export-dynamic");
6320 CmdArgs.push_back("--eh-frame-hdr");
6321 CmdArgs.push_back("-Bdynamic");
6322 if (Args.hasArg(options::OPT_shared)) {
6323 CmdArgs.push_back("-shared");
6324 } else {
6325 CmdArgs.push_back("-dynamic-linker");
6326 CmdArgs.push_back("/usr/libexec/ld.so");
6327 }
6328 }
6329
6330 if (Output.isFilename()) {
6331 CmdArgs.push_back("-o");
6332 CmdArgs.push_back(Output.getFilename());
6333 } else {
6334 assert(Output.isNothing() && "Invalid output.");
6335 }
6336
6337 if (!Args.hasArg(options::OPT_nostdlib) &&
6338 !Args.hasArg(options::OPT_nostartfiles)) {
6339 if (!Args.hasArg(options::OPT_shared)) {
6340 if (Args.hasArg(options::OPT_pg))
6341 CmdArgs.push_back(Args.MakeArgString(
6342 getToolChain().GetFilePath("gcrt0.o")));
6343 else
6344 CmdArgs.push_back(Args.MakeArgString(
6345 getToolChain().GetFilePath("crt0.o")));
6346 CmdArgs.push_back(Args.MakeArgString(
6347 getToolChain().GetFilePath("crtbegin.o")));
6348 } else {
6349 CmdArgs.push_back(Args.MakeArgString(
6350 getToolChain().GetFilePath("crtbeginS.o")));
6351 }
6352 }
6353
6354 Args.AddAllArgs(CmdArgs, options::OPT_L);
6355 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6356 Args.AddAllArgs(CmdArgs, options::OPT_e);
6357
6358 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6359
6360 if (!Args.hasArg(options::OPT_nostdlib) &&
6361 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006362 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006363 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6364 if (Args.hasArg(options::OPT_pg))
6365 CmdArgs.push_back("-lm_p");
6366 else
6367 CmdArgs.push_back("-lm");
6368 }
6369
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006370 if (Args.hasArg(options::OPT_pthread)) {
6371 if (!Args.hasArg(options::OPT_shared) &&
6372 Args.hasArg(options::OPT_pg))
6373 CmdArgs.push_back("-lpthread_p");
6374 else
6375 CmdArgs.push_back("-lpthread");
6376 }
6377
Eli Friedman9fa28852012-08-08 23:57:20 +00006378 if (!Args.hasArg(options::OPT_shared)) {
6379 if (Args.hasArg(options::OPT_pg))
6380 CmdArgs.push_back("-lc_p");
6381 else
6382 CmdArgs.push_back("-lc");
6383 }
6384
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006385 StringRef MyArch;
6386 switch (getToolChain().getTriple().getArch()) {
6387 case llvm::Triple::arm:
6388 MyArch = "arm";
6389 break;
6390 case llvm::Triple::x86:
6391 MyArch = "i386";
6392 break;
6393 case llvm::Triple::x86_64:
6394 MyArch = "amd64";
6395 break;
6396 default:
6397 llvm_unreachable("Unsupported architecture");
6398 }
6399 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006400 }
6401
6402 if (!Args.hasArg(options::OPT_nostdlib) &&
6403 !Args.hasArg(options::OPT_nostartfiles)) {
6404 if (!Args.hasArg(options::OPT_shared))
6405 CmdArgs.push_back(Args.MakeArgString(
6406 getToolChain().GetFilePath("crtend.o")));
6407 else
6408 CmdArgs.push_back(Args.MakeArgString(
6409 getToolChain().GetFilePath("crtendS.o")));
6410 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006411
6412 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006413 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006414 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006415}
6416
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006417void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006418 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006419 const InputInfoList &Inputs,
6420 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006421 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006422 ArgStringList CmdArgs;
6423
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006424 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6425 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006426 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006427 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006428 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006429 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006430 else if (getToolChain().getArch() == llvm::Triple::mips ||
6431 getToolChain().getArch() == llvm::Triple::mipsel ||
6432 getToolChain().getArch() == llvm::Triple::mips64 ||
6433 getToolChain().getArch() == llvm::Triple::mips64el) {
6434 StringRef CPUName;
6435 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006436 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006437
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006438 CmdArgs.push_back("-march");
6439 CmdArgs.push_back(CPUName.data());
6440
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006441 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006442 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006443
6444 if (getToolChain().getArch() == llvm::Triple::mips ||
6445 getToolChain().getArch() == llvm::Triple::mips64)
6446 CmdArgs.push_back("-EB");
6447 else
6448 CmdArgs.push_back("-EL");
6449
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006450 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006451 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006452 getToolChain().getArch() == llvm::Triple::armeb ||
6453 getToolChain().getArch() == llvm::Triple::thumb ||
6454 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006455 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006456 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006457 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6458
6459 if (FloatABI == "hard") {
6460 CmdArgs.push_back("-mfpu=vfp");
6461 } else {
6462 CmdArgs.push_back("-mfpu=softvfp");
6463 }
6464
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006465 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006466 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006467 case llvm::Triple::GNUEABI:
6468 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006469 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006470 break;
6471
6472 default:
6473 CmdArgs.push_back("-matpcs");
6474 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006475 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006476 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006477 if (getToolChain().getArch() == llvm::Triple::sparc)
6478 CmdArgs.push_back("-Av8plusa");
6479 else
6480 CmdArgs.push_back("-Av9a");
6481
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006482 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006483 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006484
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006485 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6486 options::OPT_Xassembler);
6487
6488 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006489 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006490
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006491 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006492 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006493
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006494 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006495 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006496}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006497
6498void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006499 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006500 const InputInfoList &Inputs,
6501 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006502 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006503 const toolchains::FreeBSD& ToolChain =
6504 static_cast<const toolchains::FreeBSD&>(getToolChain());
6505 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006506 const bool IsPIE =
6507 !Args.hasArg(options::OPT_shared) &&
6508 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006509 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006510
6511 // Silence warning for "clang -g foo.o -o foo"
6512 Args.ClaimAllArgs(options::OPT_g_Group);
6513 // and "clang -emit-llvm foo.o -o foo"
6514 Args.ClaimAllArgs(options::OPT_emit_llvm);
6515 // and for "clang -w foo.o -o foo". Other warning options are already
6516 // handled somewhere else.
6517 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006518
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006519 if (!D.SysRoot.empty())
6520 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6521
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006522 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006523 CmdArgs.push_back("-pie");
6524
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006525 if (Args.hasArg(options::OPT_static)) {
6526 CmdArgs.push_back("-Bstatic");
6527 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006528 if (Args.hasArg(options::OPT_rdynamic))
6529 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006530 CmdArgs.push_back("--eh-frame-hdr");
6531 if (Args.hasArg(options::OPT_shared)) {
6532 CmdArgs.push_back("-Bshareable");
6533 } else {
6534 CmdArgs.push_back("-dynamic-linker");
6535 CmdArgs.push_back("/libexec/ld-elf.so.1");
6536 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006537 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6538 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006539 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6540 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6541 CmdArgs.push_back("--hash-style=both");
6542 }
6543 }
6544 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006545 }
6546
6547 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6548 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006549 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006550 CmdArgs.push_back("-m");
6551 CmdArgs.push_back("elf_i386_fbsd");
6552 }
6553
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006554 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006555 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006556 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006557 }
6558
Daniel Dunbarb440f562010-08-02 02:38:21 +00006559 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006560 CmdArgs.push_back("-o");
6561 CmdArgs.push_back(Output.getFilename());
6562 } else {
6563 assert(Output.isNothing() && "Invalid output.");
6564 }
6565
6566 if (!Args.hasArg(options::OPT_nostdlib) &&
6567 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006568 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006569 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006570 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006571 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006572 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006573 crt1 = "Scrt1.o";
6574 else
6575 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006576 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006577 if (crt1)
6578 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6579
6580 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6581
Craig Topper92fc2df2014-05-17 16:56:41 +00006582 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006583 if (Args.hasArg(options::OPT_static))
6584 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006585 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006586 crtbegin = "crtbeginS.o";
6587 else
6588 crtbegin = "crtbegin.o";
6589
6590 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006591 }
6592
6593 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006594 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006595 for (const auto &Path : Paths)
6596 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006597 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6598 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006599 Args.AddAllArgs(CmdArgs, options::OPT_s);
6600 Args.AddAllArgs(CmdArgs, options::OPT_t);
6601 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6602 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006603
Alp Tokerce365ca2013-12-02 12:43:03 +00006604 if (D.IsUsingLTO(Args))
6605 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006606
Alexey Samsonov52550342014-09-15 19:58:40 +00006607 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006608 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006609
6610 if (!Args.hasArg(options::OPT_nostdlib) &&
6611 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006612 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006613 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006614 if (Args.hasArg(options::OPT_pg))
6615 CmdArgs.push_back("-lm_p");
6616 else
6617 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006618 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006619 if (NeedsSanitizerDeps)
6620 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006621 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6622 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006623 if (Args.hasArg(options::OPT_pg))
6624 CmdArgs.push_back("-lgcc_p");
6625 else
6626 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006627 if (Args.hasArg(options::OPT_static)) {
6628 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006629 } else if (Args.hasArg(options::OPT_pg)) {
6630 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006631 } else {
6632 CmdArgs.push_back("--as-needed");
6633 CmdArgs.push_back("-lgcc_s");
6634 CmdArgs.push_back("--no-as-needed");
6635 }
6636
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006637 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006638 if (Args.hasArg(options::OPT_pg))
6639 CmdArgs.push_back("-lpthread_p");
6640 else
6641 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006642 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006643
Roman Divacky66f22762011-02-10 16:59:40 +00006644 if (Args.hasArg(options::OPT_pg)) {
6645 if (Args.hasArg(options::OPT_shared))
6646 CmdArgs.push_back("-lc");
6647 else
6648 CmdArgs.push_back("-lc_p");
6649 CmdArgs.push_back("-lgcc_p");
6650 } else {
6651 CmdArgs.push_back("-lc");
6652 CmdArgs.push_back("-lgcc");
6653 }
6654
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006655 if (Args.hasArg(options::OPT_static)) {
6656 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006657 } else if (Args.hasArg(options::OPT_pg)) {
6658 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006659 } else {
6660 CmdArgs.push_back("--as-needed");
6661 CmdArgs.push_back("-lgcc_s");
6662 CmdArgs.push_back("--no-as-needed");
6663 }
6664 }
6665
6666 if (!Args.hasArg(options::OPT_nostdlib) &&
6667 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006668 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006669 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006670 else
6671 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006672 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006673 }
6674
Alexey Samsonov7811d192014-02-20 13:57:37 +00006675 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006676
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006677 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006678 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006679 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006680}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006681
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006682void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6683 const InputInfo &Output,
6684 const InputInfoList &Inputs,
6685 const ArgList &Args,
6686 const char *LinkingOutput) const {
6687 ArgStringList CmdArgs;
6688
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006689 // GNU as needs different flags for creating the correct output format
6690 // on architectures with different ABIs or optional feature sets.
6691 switch (getToolChain().getArch()) {
6692 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006693 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006694 break;
6695 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006696 case llvm::Triple::armeb:
6697 case llvm::Triple::thumb:
6698 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006699 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006700 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006701 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006702 }
6703
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006704 case llvm::Triple::mips:
6705 case llvm::Triple::mipsel:
6706 case llvm::Triple::mips64:
6707 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006708 StringRef CPUName;
6709 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006710 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006711
6712 CmdArgs.push_back("-march");
6713 CmdArgs.push_back(CPUName.data());
6714
6715 CmdArgs.push_back("-mabi");
6716 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6717
6718 if (getToolChain().getArch() == llvm::Triple::mips ||
6719 getToolChain().getArch() == llvm::Triple::mips64)
6720 CmdArgs.push_back("-EB");
6721 else
6722 CmdArgs.push_back("-EL");
6723
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006724 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006725 break;
6726 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006727
6728 case llvm::Triple::sparc:
6729 CmdArgs.push_back("-32");
6730 addAssemblerKPIC(Args, CmdArgs);
6731 break;
6732
6733 case llvm::Triple::sparcv9:
6734 CmdArgs.push_back("-64");
6735 CmdArgs.push_back("-Av9");
6736 addAssemblerKPIC(Args, CmdArgs);
6737 break;
6738
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006739 default:
6740 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006741 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006742
6743 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6744 options::OPT_Xassembler);
6745
6746 CmdArgs.push_back("-o");
6747 CmdArgs.push_back(Output.getFilename());
6748
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006749 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006750 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006751
David Chisnallddbd68f2011-09-27 22:03:18 +00006752 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006754}
6755
6756void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6757 const InputInfo &Output,
6758 const InputInfoList &Inputs,
6759 const ArgList &Args,
6760 const char *LinkingOutput) const {
6761 const Driver &D = getToolChain().getDriver();
6762 ArgStringList CmdArgs;
6763
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006764 if (!D.SysRoot.empty())
6765 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6766
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006767 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006768 if (Args.hasArg(options::OPT_static)) {
6769 CmdArgs.push_back("-Bstatic");
6770 } else {
6771 if (Args.hasArg(options::OPT_rdynamic))
6772 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006773 if (Args.hasArg(options::OPT_shared)) {
6774 CmdArgs.push_back("-Bshareable");
6775 } else {
6776 CmdArgs.push_back("-dynamic-linker");
6777 CmdArgs.push_back("/libexec/ld.elf_so");
6778 }
6779 }
6780
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006781 // Many NetBSD architectures support more than one ABI.
6782 // Determine the correct emulation for ld.
6783 switch (getToolChain().getArch()) {
6784 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006785 CmdArgs.push_back("-m");
6786 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006787 break;
6788 case llvm::Triple::arm:
6789 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006790 CmdArgs.push_back("-m");
6791 switch (getToolChain().getTriple().getEnvironment()) {
6792 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006793 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006794 CmdArgs.push_back("armelf_nbsd_eabi");
6795 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006796 case llvm::Triple::EABIHF:
6797 case llvm::Triple::GNUEABIHF:
6798 CmdArgs.push_back("armelf_nbsd_eabihf");
6799 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006800 default:
6801 CmdArgs.push_back("armelf_nbsd");
6802 break;
6803 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006804 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006805 case llvm::Triple::armeb:
6806 case llvm::Triple::thumbeb:
6807 CmdArgs.push_back("-m");
6808 switch (getToolChain().getTriple().getEnvironment()) {
6809 case llvm::Triple::EABI:
6810 case llvm::Triple::GNUEABI:
6811 CmdArgs.push_back("armelfb_nbsd_eabi");
6812 break;
6813 case llvm::Triple::EABIHF:
6814 case llvm::Triple::GNUEABIHF:
6815 CmdArgs.push_back("armelfb_nbsd_eabihf");
6816 break;
6817 default:
6818 CmdArgs.push_back("armelfb_nbsd");
6819 break;
6820 }
6821 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006822 case llvm::Triple::mips64:
6823 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006824 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006825 CmdArgs.push_back("-m");
6826 if (getToolChain().getArch() == llvm::Triple::mips64)
6827 CmdArgs.push_back("elf32btsmip");
6828 else
6829 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006830 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006831 CmdArgs.push_back("-m");
6832 if (getToolChain().getArch() == llvm::Triple::mips64)
6833 CmdArgs.push_back("elf64btsmip");
6834 else
6835 CmdArgs.push_back("elf64ltsmip");
6836 }
6837 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00006838 case llvm::Triple::ppc:
6839 CmdArgs.push_back("-m");
6840 CmdArgs.push_back("elf32ppc_nbsd");
6841 break;
6842
6843 case llvm::Triple::ppc64:
6844 case llvm::Triple::ppc64le:
6845 CmdArgs.push_back("-m");
6846 CmdArgs.push_back("elf64ppc");
6847 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006848
6849 case llvm::Triple::sparc:
6850 CmdArgs.push_back("-m");
6851 CmdArgs.push_back("elf32_sparc");
6852 break;
6853
6854 case llvm::Triple::sparcv9:
6855 CmdArgs.push_back("-m");
6856 CmdArgs.push_back("elf64_sparc");
6857 break;
6858
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006859 default:
6860 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006861 }
6862
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006863 if (Output.isFilename()) {
6864 CmdArgs.push_back("-o");
6865 CmdArgs.push_back(Output.getFilename());
6866 } else {
6867 assert(Output.isNothing() && "Invalid output.");
6868 }
6869
6870 if (!Args.hasArg(options::OPT_nostdlib) &&
6871 !Args.hasArg(options::OPT_nostartfiles)) {
6872 if (!Args.hasArg(options::OPT_shared)) {
6873 CmdArgs.push_back(Args.MakeArgString(
6874 getToolChain().GetFilePath("crt0.o")));
6875 CmdArgs.push_back(Args.MakeArgString(
6876 getToolChain().GetFilePath("crti.o")));
6877 CmdArgs.push_back(Args.MakeArgString(
6878 getToolChain().GetFilePath("crtbegin.o")));
6879 } else {
6880 CmdArgs.push_back(Args.MakeArgString(
6881 getToolChain().GetFilePath("crti.o")));
6882 CmdArgs.push_back(Args.MakeArgString(
6883 getToolChain().GetFilePath("crtbeginS.o")));
6884 }
6885 }
6886
6887 Args.AddAllArgs(CmdArgs, options::OPT_L);
6888 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6889 Args.AddAllArgs(CmdArgs, options::OPT_e);
6890 Args.AddAllArgs(CmdArgs, options::OPT_s);
6891 Args.AddAllArgs(CmdArgs, options::OPT_t);
6892 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6893 Args.AddAllArgs(CmdArgs, options::OPT_r);
6894
6895 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6896
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006897 unsigned Major, Minor, Micro;
6898 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6899 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006900 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006901 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00006902 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006903 case llvm::Triple::arm:
6904 case llvm::Triple::armeb:
6905 case llvm::Triple::thumb:
6906 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006907 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00006908 case llvm::Triple::ppc64:
6909 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006910 case llvm::Triple::x86:
6911 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006912 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006913 break;
6914 default:
6915 break;
6916 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006917 }
6918
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006919 if (!Args.hasArg(options::OPT_nostdlib) &&
6920 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006921 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006922 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6923 CmdArgs.push_back("-lm");
6924 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006925 if (Args.hasArg(options::OPT_pthread))
6926 CmdArgs.push_back("-lpthread");
6927 CmdArgs.push_back("-lc");
6928
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006929 if (useLibgcc) {
6930 if (Args.hasArg(options::OPT_static)) {
6931 // libgcc_eh depends on libc, so resolve as much as possible,
6932 // pull in any new requirements from libc and then get the rest
6933 // of libgcc.
6934 CmdArgs.push_back("-lgcc_eh");
6935 CmdArgs.push_back("-lc");
6936 CmdArgs.push_back("-lgcc");
6937 } else {
6938 CmdArgs.push_back("-lgcc");
6939 CmdArgs.push_back("--as-needed");
6940 CmdArgs.push_back("-lgcc_s");
6941 CmdArgs.push_back("--no-as-needed");
6942 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006943 }
6944 }
6945
6946 if (!Args.hasArg(options::OPT_nostdlib) &&
6947 !Args.hasArg(options::OPT_nostartfiles)) {
6948 if (!Args.hasArg(options::OPT_shared))
6949 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6950 "crtend.o")));
6951 else
6952 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6953 "crtendS.o")));
6954 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6955 "crtn.o")));
6956 }
6957
Alexey Samsonov7811d192014-02-20 13:57:37 +00006958 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006959
Logan Chieneb9162f2014-06-26 14:23:45 +00006960 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006961 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006962}
6963
Thomas Schwinge4e555262013-03-28 19:04:25 +00006964void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6965 const InputInfo &Output,
6966 const InputInfoList &Inputs,
6967 const ArgList &Args,
6968 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006969 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006970 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006971
6972 // Add --32/--64 to make sure we get the format we want.
6973 // This is incomplete
6974 if (getToolChain().getArch() == llvm::Triple::x86) {
6975 CmdArgs.push_back("--32");
6976 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00006977 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
6978 CmdArgs.push_back("--x32");
6979 else
6980 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006981 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6982 CmdArgs.push_back("-a32");
6983 CmdArgs.push_back("-mppc");
6984 CmdArgs.push_back("-many");
6985 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6986 CmdArgs.push_back("-a64");
6987 CmdArgs.push_back("-mppc64");
6988 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006989 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6990 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006991 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00006992 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006993 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006994 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6995 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006996 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006997 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006998 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6999 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007000 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007001 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007002 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7003 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007004 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007005 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7006 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007007 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7008 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007009 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007010
Tim Northover9c7e0352013-12-12 11:55:52 +00007011 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7012 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007013 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007014
7015 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007016
7017 // FIXME: remove krait check when GNU tools support krait cpu
7018 // for now replace it with -march=armv7-a to avoid a lower
7019 // march from being picked in the absence of a cpu flag.
7020 Arg *A;
7021 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7022 StringRef(A->getValue()) == "krait")
7023 CmdArgs.push_back("-march=armv7-a");
7024 else
7025 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007026 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007027 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7028 getToolChain().getArch() == llvm::Triple::mipsel ||
7029 getToolChain().getArch() == llvm::Triple::mips64 ||
7030 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007031 StringRef CPUName;
7032 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007033 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007034 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007035
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007036 CmdArgs.push_back("-march");
7037 CmdArgs.push_back(CPUName.data());
7038
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007039 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007040 CmdArgs.push_back(ABIName.data());
7041
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007042 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7043 // or -mshared (not implemented) is in effect.
7044 bool IsPicOrPie = false;
7045 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7046 options::OPT_fpic, options::OPT_fno_pic,
7047 options::OPT_fPIE, options::OPT_fno_PIE,
7048 options::OPT_fpie, options::OPT_fno_pie)) {
7049 if (A->getOption().matches(options::OPT_fPIC) ||
7050 A->getOption().matches(options::OPT_fpic) ||
7051 A->getOption().matches(options::OPT_fPIE) ||
7052 A->getOption().matches(options::OPT_fpie))
7053 IsPicOrPie = true;
7054 }
7055 if (!IsPicOrPie)
7056 CmdArgs.push_back("-mno-shared");
7057
Daniel Sanders379d44b2014-07-16 11:52:23 +00007058 // LLVM doesn't support -mplt yet and acts as if it is always given.
7059 // However, -mplt has no effect with the N64 ABI.
7060 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007061
7062 if (getToolChain().getArch() == llvm::Triple::mips ||
7063 getToolChain().getArch() == llvm::Triple::mips64)
7064 CmdArgs.push_back("-EB");
7065 else
7066 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007067
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007068 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7069 if (StringRef(A->getValue()) == "2008")
7070 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7071 }
7072
Daniel Sanders379d44b2014-07-16 11:52:23 +00007073 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7074 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7075 options::OPT_mfp64)) {
7076 A->claim();
7077 A->render(Args, CmdArgs);
7078 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7079 ABIName))
7080 CmdArgs.push_back("-mfpxx");
7081
7082 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7083 // -mno-mips16 is actually -no-mips16.
7084 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7085 options::OPT_mno_mips16)) {
7086 if (A->getOption().matches(options::OPT_mips16)) {
7087 A->claim();
7088 A->render(Args, CmdArgs);
7089 } else {
7090 A->claim();
7091 CmdArgs.push_back("-no-mips16");
7092 }
7093 }
7094
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007095 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7096 options::OPT_mno_micromips);
7097 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7098 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7099
Simon Atanasyanbd986632013-11-26 11:58:04 +00007100 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7101 // Do not use AddLastArg because not all versions of MIPS assembler
7102 // support -mmsa / -mno-msa options.
7103 if (A->getOption().matches(options::OPT_mmsa))
7104 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7105 }
7106
Daniel Sanders379d44b2014-07-16 11:52:23 +00007107 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7108 options::OPT_msoft_float);
7109
7110 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7111 options::OPT_mno_odd_spreg);
7112
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007113 NeedsKPIC = true;
7114 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7115 // Always pass an -march option, since our default of z10 is later
7116 // than the GNU assembler's default.
7117 StringRef CPUName = getSystemZTargetCPU(Args);
7118 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7119 }
7120
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007121 if (NeedsKPIC)
7122 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007123
7124 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7125 options::OPT_Xassembler);
7126
7127 CmdArgs.push_back("-o");
7128 CmdArgs.push_back(Output.getFilename());
7129
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007130 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007131 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007132
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007133 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007134 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007135
7136 // Handle the debug info splitting at object creation time if we're
7137 // creating an object.
7138 // TODO: Currently only works on linux with newer objcopy.
7139 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007140 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007141 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7142 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007143}
7144
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007145static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007146 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007147 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007148 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7149 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007150 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007151 CmdArgs.push_back("-lgcc");
7152
Logan Chien3d3373c2012-11-19 12:04:11 +00007153 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007154 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007155 CmdArgs.push_back("-lgcc");
7156 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007157 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007158 CmdArgs.push_back("--as-needed");
7159 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007160 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007161 CmdArgs.push_back("--no-as-needed");
7162 }
7163
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007164 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007165 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007166 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007167 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007168
7169 // According to Android ABI, we have to link with libdl if we are
7170 // linking with non-static libgcc.
7171 //
7172 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7173 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7174 if (isAndroid && !StaticLibgcc)
7175 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007176}
7177
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007178static std::string getLinuxDynamicLinker(const ArgList &Args,
7179 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007180 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7181 if (ToolChain.getTriple().isArch64Bit())
7182 return "/system/bin/linker64";
7183 else
7184 return "/system/bin/linker";
7185 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7186 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007187 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007188 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007189 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007190 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007191 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007192 else if (ToolChain.getArch() == llvm::Triple::arm ||
7193 ToolChain.getArch() == llvm::Triple::thumb) {
7194 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7195 return "/lib/ld-linux-armhf.so.3";
7196 else
7197 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007198 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7199 ToolChain.getArch() == llvm::Triple::thumbeb) {
7200 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7201 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7202 else
7203 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007204 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007205 ToolChain.getArch() == llvm::Triple::mipsel ||
7206 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007207 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007208 StringRef CPUName;
7209 StringRef ABIName;
7210 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7211 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7212
7213 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7214 .Case("o32", "/lib")
7215 .Case("n32", "/lib32")
7216 .Case("n64", "/lib64")
7217 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007218 StringRef LibName;
7219 if (mips::isUCLibc(Args))
7220 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7221 else
7222 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007223
7224 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007225 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7226 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007227 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7228 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7229 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007230 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007231 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7232 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7233 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007234 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007235 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7236 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007237 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7238 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007239 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7240 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7241 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007242 else
7243 return "/lib64/ld-linux-x86-64.so.2";
7244}
7245
Renato Golinc4b49242014-02-13 10:01:16 +00007246static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7247 ArgStringList &CmdArgs, const ArgList &Args) {
7248 // Make use of compiler-rt if --rtlib option is used
7249 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7250
7251 switch(RLT) {
7252 case ToolChain::RLT_CompilerRT:
7253 addClangRTLinux(TC, Args, CmdArgs);
7254 break;
7255 case ToolChain::RLT_Libgcc:
7256 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7257 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007258 }
7259}
7260
Rafael Espindola1e085772014-08-15 17:14:35 +00007261static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7262 switch (T.getArch()) {
7263 case llvm::Triple::x86:
7264 return "elf_i386";
7265 case llvm::Triple::aarch64:
7266 return "aarch64linux";
7267 case llvm::Triple::aarch64_be:
7268 return "aarch64_be_linux";
7269 case llvm::Triple::arm:
7270 case llvm::Triple::thumb:
7271 return "armelf_linux_eabi";
7272 case llvm::Triple::armeb:
7273 case llvm::Triple::thumbeb:
7274 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7275 case llvm::Triple::ppc:
7276 return "elf32ppclinux";
7277 case llvm::Triple::ppc64:
7278 return "elf64ppc";
7279 case llvm::Triple::ppc64le:
7280 return "elf64lppc";
7281 case llvm::Triple::sparc:
7282 return "elf32_sparc";
7283 case llvm::Triple::sparcv9:
7284 return "elf64_sparc";
7285 case llvm::Triple::mips:
7286 return "elf32btsmip";
7287 case llvm::Triple::mipsel:
7288 return "elf32ltsmip";
7289 case llvm::Triple::mips64:
7290 if (mips::hasMipsAbiArg(Args, "n32"))
7291 return "elf32btsmipn32";
7292 return "elf64btsmip";
7293 case llvm::Triple::mips64el:
7294 if (mips::hasMipsAbiArg(Args, "n32"))
7295 return "elf32ltsmipn32";
7296 return "elf64ltsmip";
7297 case llvm::Triple::systemz:
7298 return "elf64_s390";
7299 case llvm::Triple::x86_64:
7300 if (T.getEnvironment() == llvm::Triple::GNUX32)
7301 return "elf32_x86_64";
7302 return "elf_x86_64";
7303 default:
7304 llvm_unreachable("Unexpected arch");
7305 }
7306}
7307
Thomas Schwinge4e555262013-03-28 19:04:25 +00007308void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7309 const InputInfo &Output,
7310 const InputInfoList &Inputs,
7311 const ArgList &Args,
7312 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007313 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007314 static_cast<const toolchains::Linux&>(getToolChain());
7315 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007316 const bool isAndroid =
7317 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007318 const bool IsPIE =
7319 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007320 !Args.hasArg(options::OPT_static) &&
7321 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7322 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007323 // Cannot use isPIEDefault here since otherwise
7324 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007325 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007326
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007327 ArgStringList CmdArgs;
7328
Rafael Espindolad1002f62010-11-15 18:28:16 +00007329 // Silence warning for "clang -g foo.o -o foo"
7330 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007331 // and "clang -emit-llvm foo.o -o foo"
7332 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007333 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007334 // handled somewhere else.
7335 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007336
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007337 if (!D.SysRoot.empty())
7338 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007339
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007340 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007341 CmdArgs.push_back("-pie");
7342
Rafael Espindola1c76c592010-11-07 22:57:16 +00007343 if (Args.hasArg(options::OPT_rdynamic))
7344 CmdArgs.push_back("-export-dynamic");
7345
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007346 if (Args.hasArg(options::OPT_s))
7347 CmdArgs.push_back("-s");
7348
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007349 for (const auto &Opt : ToolChain.ExtraOpts)
7350 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007351
7352 if (!Args.hasArg(options::OPT_static)) {
7353 CmdArgs.push_back("--eh-frame-hdr");
7354 }
7355
7356 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007357 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007358
7359 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007360 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007361 ToolChain.getArch() == llvm::Triple::armeb ||
7362 ToolChain.getArch() == llvm::Triple::thumb ||
7363 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007364 CmdArgs.push_back("-Bstatic");
7365 else
7366 CmdArgs.push_back("-static");
7367 } else if (Args.hasArg(options::OPT_shared)) {
7368 CmdArgs.push_back("-shared");
7369 }
7370
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007371 if (ToolChain.getArch() == llvm::Triple::arm ||
7372 ToolChain.getArch() == llvm::Triple::armeb ||
7373 ToolChain.getArch() == llvm::Triple::thumb ||
7374 ToolChain.getArch() == llvm::Triple::thumbeb ||
7375 (!Args.hasArg(options::OPT_static) &&
7376 !Args.hasArg(options::OPT_shared))) {
7377 CmdArgs.push_back("-dynamic-linker");
7378 CmdArgs.push_back(Args.MakeArgString(
7379 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7380 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007381
7382 CmdArgs.push_back("-o");
7383 CmdArgs.push_back(Output.getFilename());
7384
Rafael Espindola81937ec2010-12-01 01:52:43 +00007385 if (!Args.hasArg(options::OPT_nostdlib) &&
7386 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007387 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007388 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007389 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007390 if (Args.hasArg(options::OPT_pg))
7391 crt1 = "gcrt1.o";
7392 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007393 crt1 = "Scrt1.o";
7394 else
7395 crt1 = "crt1.o";
7396 }
7397 if (crt1)
7398 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007399
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007400 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7401 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007402
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007403 const char *crtbegin;
7404 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007405 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007406 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007407 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007408 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007409 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007410 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007411 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007412 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007413
7414 // Add crtfastmath.o if available and fast math is enabled.
7415 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007416 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007417
7418 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007419 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007420
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007421 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007422
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007423 for (const auto &Path : Paths)
7424 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007425
Alp Tokerce365ca2013-12-02 12:43:03 +00007426 if (D.IsUsingLTO(Args))
7427 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007428
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007429 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7430 CmdArgs.push_back("--no-demangle");
7431
Alexey Samsonov52550342014-09-15 19:58:40 +00007432 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007433 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007434 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007435 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007436
Hans Wennborg70850d82013-07-18 20:29:38 +00007437 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007438 !Args.hasArg(options::OPT_nostdlib) &&
7439 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007440 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7441 !Args.hasArg(options::OPT_static);
7442 if (OnlyLibstdcxxStatic)
7443 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007444 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007445 if (OnlyLibstdcxxStatic)
7446 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007447 CmdArgs.push_back("-lm");
7448 }
7449
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007450 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007451 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7452 if (Args.hasArg(options::OPT_static))
7453 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007454
Alexey Samsonov52550342014-09-15 19:58:40 +00007455 if (NeedsSanitizerDeps)
7456 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7457
Alexey Bataev186b28a2014-03-06 05:43:53 +00007458 LibOpenMP UsedOpenMPLib = LibUnknown;
7459 if (Args.hasArg(options::OPT_fopenmp)) {
7460 UsedOpenMPLib = LibGOMP;
7461 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7462 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7463 .Case("libgomp", LibGOMP)
7464 .Case("libiomp5", LibIOMP5)
7465 .Default(LibUnknown);
7466 if (UsedOpenMPLib == LibUnknown)
7467 D.Diag(diag::err_drv_unsupported_option_argument)
7468 << A->getOption().getName() << A->getValue();
7469 }
7470 switch (UsedOpenMPLib) {
7471 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007472 CmdArgs.push_back("-lgomp");
7473
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007474 // FIXME: Exclude this for platforms with libgomp that don't require
7475 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007476 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007477 break;
7478 case LibIOMP5:
7479 CmdArgs.push_back("-liomp5");
7480 break;
7481 case LibUnknown:
7482 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007483 }
Renato Golinc4b49242014-02-13 10:01:16 +00007484 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007485
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007486 if ((Args.hasArg(options::OPT_pthread) ||
7487 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7488 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007489 CmdArgs.push_back("-lpthread");
7490
7491 CmdArgs.push_back("-lc");
7492
7493 if (Args.hasArg(options::OPT_static))
7494 CmdArgs.push_back("--end-group");
7495 else
Renato Golinc4b49242014-02-13 10:01:16 +00007496 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007497 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007498
Rafael Espindola81937ec2010-12-01 01:52:43 +00007499 if (!Args.hasArg(options::OPT_nostartfiles)) {
7500 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007501 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007502 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007503 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007504 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007505 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007506 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007507
Rafael Espindola81937ec2010-12-01 01:52:43 +00007508 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007509 if (!isAndroid)
7510 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007511 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007512 }
7513
David Blaikiec11bf802014-09-04 16:04:28 +00007514 C.addCommand(
7515 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007516}
7517
Chris Lattner3e2ee142010-07-07 16:01:42 +00007518void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007519 const InputInfo &Output,
7520 const InputInfoList &Inputs,
7521 const ArgList &Args,
7522 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007523 ArgStringList CmdArgs;
7524
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007525 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007526
7527 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007528 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007529
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007530 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007531 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007532
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007533 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007534 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007535}
7536
7537void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007538 const InputInfo &Output,
7539 const InputInfoList &Inputs,
7540 const ArgList &Args,
7541 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007542 const Driver &D = getToolChain().getDriver();
7543 ArgStringList CmdArgs;
7544
Daniel Dunbarb440f562010-08-02 02:38:21 +00007545 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007546 CmdArgs.push_back("-o");
7547 CmdArgs.push_back(Output.getFilename());
7548 } else {
7549 assert(Output.isNothing() && "Invalid output.");
7550 }
7551
7552 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007553 !Args.hasArg(options::OPT_nostartfiles)) {
7554 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7555 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7556 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7557 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7558 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007559
7560 Args.AddAllArgs(CmdArgs, options::OPT_L);
7561 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7562 Args.AddAllArgs(CmdArgs, options::OPT_e);
7563
Daniel Dunbar54423b22010-09-17 00:24:54 +00007564 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007565
Alexey Samsonov7811d192014-02-20 13:57:37 +00007566 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007567
Chris Lattner3e2ee142010-07-07 16:01:42 +00007568 if (!Args.hasArg(options::OPT_nostdlib) &&
7569 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007570 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007571 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007572 CmdArgs.push_back("-lm");
7573 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007574 }
7575
7576 if (!Args.hasArg(options::OPT_nostdlib) &&
7577 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007578 if (Args.hasArg(options::OPT_pthread))
7579 CmdArgs.push_back("-lpthread");
7580 CmdArgs.push_back("-lc");
7581 CmdArgs.push_back("-lCompilerRT-Generic");
7582 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7583 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007584 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007585 }
7586
Logan Chieneb9162f2014-06-26 14:23:45 +00007587 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007588 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007589}
7590
Daniel Dunbarcc912342009-05-02 18:28:39 +00007591/// DragonFly Tools
7592
7593// For now, DragonFly Assemble does just about the same as for
7594// FreeBSD, but this may change soon.
7595void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007596 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007597 const InputInfoList &Inputs,
7598 const ArgList &Args,
7599 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007600 ArgStringList CmdArgs;
7601
7602 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7603 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007604 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007605 CmdArgs.push_back("--32");
7606
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007607 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007608
7609 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007610 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007611
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007612 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007613 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007614
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007615 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007617}
7618
7619void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007620 const InputInfo &Output,
7621 const InputInfoList &Inputs,
7622 const ArgList &Args,
7623 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007624 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007625 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007626 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007627
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007628 if (!D.SysRoot.empty())
7629 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7630
John McCall65b8da02013-04-11 22:55:55 +00007631 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007632 if (Args.hasArg(options::OPT_static)) {
7633 CmdArgs.push_back("-Bstatic");
7634 } else {
John McCall65b8da02013-04-11 22:55:55 +00007635 if (Args.hasArg(options::OPT_rdynamic))
7636 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007637 if (Args.hasArg(options::OPT_shared))
7638 CmdArgs.push_back("-Bshareable");
7639 else {
7640 CmdArgs.push_back("-dynamic-linker");
7641 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7642 }
John McCall65b8da02013-04-11 22:55:55 +00007643 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007644 }
7645
7646 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7647 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007648 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007649 CmdArgs.push_back("-m");
7650 CmdArgs.push_back("elf_i386");
7651 }
7652
Daniel Dunbarb440f562010-08-02 02:38:21 +00007653 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007654 CmdArgs.push_back("-o");
7655 CmdArgs.push_back(Output.getFilename());
7656 } else {
7657 assert(Output.isNothing() && "Invalid output.");
7658 }
7659
7660 if (!Args.hasArg(options::OPT_nostdlib) &&
7661 !Args.hasArg(options::OPT_nostartfiles)) {
7662 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007663 if (Args.hasArg(options::OPT_pg))
7664 CmdArgs.push_back(Args.MakeArgString(
7665 getToolChain().GetFilePath("gcrt1.o")));
7666 else {
7667 if (Args.hasArg(options::OPT_pie))
7668 CmdArgs.push_back(Args.MakeArgString(
7669 getToolChain().GetFilePath("Scrt1.o")));
7670 else
7671 CmdArgs.push_back(Args.MakeArgString(
7672 getToolChain().GetFilePath("crt1.o")));
7673 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007674 }
John McCall65b8da02013-04-11 22:55:55 +00007675 CmdArgs.push_back(Args.MakeArgString(
7676 getToolChain().GetFilePath("crti.o")));
7677 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7678 CmdArgs.push_back(Args.MakeArgString(
7679 getToolChain().GetFilePath("crtbeginS.o")));
7680 else
7681 CmdArgs.push_back(Args.MakeArgString(
7682 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007683 }
7684
7685 Args.AddAllArgs(CmdArgs, options::OPT_L);
7686 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7687 Args.AddAllArgs(CmdArgs, options::OPT_e);
7688
Daniel Dunbar54423b22010-09-17 00:24:54 +00007689 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007690
7691 if (!Args.hasArg(options::OPT_nostdlib) &&
7692 !Args.hasArg(options::OPT_nodefaultlibs)) {
7693 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7694 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007695 if (UseGCC47)
7696 CmdArgs.push_back("-L/usr/lib/gcc47");
7697 else
7698 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007699
7700 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007701 if (UseGCC47) {
7702 CmdArgs.push_back("-rpath");
7703 CmdArgs.push_back("/usr/lib/gcc47");
7704 } else {
7705 CmdArgs.push_back("-rpath");
7706 CmdArgs.push_back("/usr/lib/gcc44");
7707 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007708 }
7709
Hans Wennborg70850d82013-07-18 20:29:38 +00007710 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007711 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007712 CmdArgs.push_back("-lm");
7713 }
7714
Daniel Dunbarcc912342009-05-02 18:28:39 +00007715 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007716 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007717
7718 if (!Args.hasArg(options::OPT_nolibc)) {
7719 CmdArgs.push_back("-lc");
7720 }
7721
John McCall65b8da02013-04-11 22:55:55 +00007722 if (UseGCC47) {
7723 if (Args.hasArg(options::OPT_static) ||
7724 Args.hasArg(options::OPT_static_libgcc)) {
7725 CmdArgs.push_back("-lgcc");
7726 CmdArgs.push_back("-lgcc_eh");
7727 } else {
7728 if (Args.hasArg(options::OPT_shared_libgcc)) {
7729 CmdArgs.push_back("-lgcc_pic");
7730 if (!Args.hasArg(options::OPT_shared))
7731 CmdArgs.push_back("-lgcc");
7732 } else {
7733 CmdArgs.push_back("-lgcc");
7734 CmdArgs.push_back("--as-needed");
7735 CmdArgs.push_back("-lgcc_pic");
7736 CmdArgs.push_back("--no-as-needed");
7737 }
7738 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007739 } else {
John McCall65b8da02013-04-11 22:55:55 +00007740 if (Args.hasArg(options::OPT_shared)) {
7741 CmdArgs.push_back("-lgcc_pic");
7742 } else {
7743 CmdArgs.push_back("-lgcc");
7744 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007745 }
7746 }
7747
7748 if (!Args.hasArg(options::OPT_nostdlib) &&
7749 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007750 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007751 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007752 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007753 else
7754 CmdArgs.push_back(Args.MakeArgString(
7755 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007756 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007757 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007758 }
7759
Alexey Samsonov7811d192014-02-20 13:57:37 +00007760 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007761
Logan Chieneb9162f2014-06-26 14:23:45 +00007762 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007763 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007764}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007765
Alexey Samsonov6424e022014-05-12 20:20:20 +00007766static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7767 ArgStringList &CmdArgs,
Craig Topperbf3e3272014-08-30 16:55:52 +00007768 StringRef RTName) {
Alexey Samsonov6424e022014-05-12 20:20:20 +00007769 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7770 llvm::sys::path::append(LibSanitizer,
7771 Twine("clang_rt.") + RTName + ".lib");
7772 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7773}
7774
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007775void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7776 const InputInfo &Output,
7777 const InputInfoList &Inputs,
7778 const ArgList &Args,
7779 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007780 ArgStringList CmdArgs;
7781
7782 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007783 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7784 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007785 } else {
7786 assert(Output.isNothing() && "Invalid output.");
7787 }
7788
7789 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007790 !Args.hasArg(options::OPT_nostartfiles) &&
7791 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007792 CmdArgs.push_back("-defaultlib:libcmt");
7793 }
7794
7795 CmdArgs.push_back("-nologo");
7796
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007797 if (Args.hasArg(options::OPT_g_Group)) {
7798 CmdArgs.push_back("-debug");
7799 }
7800
Hans Wennborgf1a74252013-09-10 20:18:04 +00007801 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7802
7803 if (DLL) {
7804 CmdArgs.push_back(Args.MakeArgString("-dll"));
7805
7806 SmallString<128> ImplibName(Output.getFilename());
7807 llvm::sys::path::replace_extension(ImplibName, "lib");
7808 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7809 ImplibName.str()));
7810 }
7811
Peter Collingbourne32701642013-11-01 18:16:25 +00007812 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007813 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007814 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007815 // FIXME: Handle 64-bit.
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00007816 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
7817 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_dynamic-i386");
Timur Iskhodzhanov92c06012014-09-12 13:21:02 +00007818 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7819 "asan_dynamic_runtime_thunk-i386");
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00007820 // Make sure the dynamic runtime thunk is not optimized out at link time
7821 // to ensure proper SEH handling.
7822 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00007823 } else if (DLL) {
Alexey Samsonov6424e022014-05-12 20:20:20 +00007824 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7825 "asan_dll_thunk-i386");
7826 } else {
7827 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7828 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7829 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007830 }
7831
Hans Wennborg2e274592013-08-13 23:38:57 +00007832 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007833
Reid Kleckner337188f2014-09-16 19:22:00 +00007834 // Add filenames, libraries, and other linker inputs.
7835 for (const auto &Input : Inputs) {
7836 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007837 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00007838 continue;
7839 }
7840
7841 const Arg &A = Input.getInputArg();
7842
7843 // Render -l options differently for the MSVC linker.
7844 if (A.getOption().matches(options::OPT_l)) {
7845 StringRef Lib = A.getValue();
7846 const char *LinkLibArg;
7847 if (Lib.endswith(".lib"))
7848 LinkLibArg = Args.MakeArgString(Lib);
7849 else
7850 LinkLibArg = Args.MakeArgString(Lib + ".lib");
7851 CmdArgs.push_back(LinkLibArg);
7852 continue;
7853 }
7854
7855 // Otherwise, this is some other kind of linker input option like -Wl, -z,
7856 // or -L. Render it, even if MSVC doesn't understand it.
7857 A.renderAsInput(Args, CmdArgs);
7858 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007859
7860 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007861 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
David Blaikiec11bf802014-09-04 16:04:28 +00007862 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007863}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007864
7865void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7866 const InputInfo &Output,
7867 const InputInfoList &Inputs,
7868 const ArgList &Args,
7869 const char *LinkingOutput) const {
7870 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7871}
7872
Hans Wennborg188382e2013-09-20 18:16:35 +00007873// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7874// If one cannot be found, return FallbackName.
7875// We do this special search to prevent clang-cl from falling back onto itself
7876// if it's available as cl.exe on the path.
7877static std::string FindFallback(const char *FallbackName,
7878 const char *ClangProgramPath) {
7879 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7880 if (!OptPath.hasValue())
7881 return FallbackName;
7882
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007883 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Hans Wennborg188382e2013-09-20 18:16:35 +00007884 SmallVector<StringRef, 8> PathSegments;
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007885 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
Hans Wennborg188382e2013-09-20 18:16:35 +00007886
7887 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
Craig Topperbf3e3272014-08-30 16:55:52 +00007888 StringRef PathSegment = PathSegments[i];
Hans Wennborg188382e2013-09-20 18:16:35 +00007889 if (PathSegment.empty())
7890 continue;
7891
7892 SmallString<128> FilePath(PathSegment);
7893 llvm::sys::path::append(FilePath, FallbackName);
7894 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7895 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7896 return FilePath.str();
7897 }
7898
7899 return FallbackName;
7900}
7901
David Blaikiec11bf802014-09-04 16:04:28 +00007902std::unique_ptr<Command> visualstudio::Compile::GetCommand(
7903 Compilation &C, const JobAction &JA, const InputInfo &Output,
7904 const InputInfoList &Inputs, const ArgList &Args,
7905 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00007906 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007907 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007908 CmdArgs.push_back("/c"); // Compile only.
7909 CmdArgs.push_back("/W0"); // No warnings.
7910
7911 // The goal is to be able to invoke this tool correctly based on
7912 // any flag accepted by clang-cl.
7913
7914 // These are spelled the same way in clang and cl.exe,.
7915 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7916 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007917
7918 // Optimization level.
7919 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7920 if (A->getOption().getID() == options::OPT_O0) {
7921 CmdArgs.push_back("/Od");
7922 } else {
7923 StringRef OptLevel = A->getValue();
7924 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7925 A->render(Args, CmdArgs);
7926 else if (OptLevel == "3")
7927 CmdArgs.push_back("/Ox");
7928 }
7929 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007930
7931 // Flags for which clang-cl have an alias.
7932 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7933
David Majnemerf6072342014-07-01 22:24:56 +00007934 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7935 /*default=*/false))
7936 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007937 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7938 options::OPT_fno_function_sections))
7939 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7940 ? "/Gy"
7941 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007942 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7943 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007944 CmdArgs.push_back(
7945 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007946 if (Args.hasArg(options::OPT_fsyntax_only))
7947 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007948 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7949 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007950
Hans Wennborg260ff402013-09-27 17:54:18 +00007951 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007952 for (const auto &Include : Includes)
7953 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00007954
Hans Wennborg87cfa712013-09-19 20:32:16 +00007955 // Flags that can simply be passed through.
7956 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7957 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00007958 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007959
7960 // The order of these flags is relevant, so pick the last one.
7961 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7962 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7963 A->render(Args, CmdArgs);
7964
7965
7966 // Input filename.
7967 assert(Inputs.size() == 1);
7968 const InputInfo &II = Inputs[0];
7969 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7970 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7971 if (II.isFilename())
7972 CmdArgs.push_back(II.getFilename());
7973 else
7974 II.getInputArg().renderAsInput(Args, CmdArgs);
7975
7976 // Output filename.
7977 assert(Output.getType() == types::TY_Object);
7978 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7979 Output.getFilename());
7980 CmdArgs.push_back(Fo);
7981
Hans Wennborg188382e2013-09-20 18:16:35 +00007982 const Driver &D = getToolChain().getDriver();
7983 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007984 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
7985 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007986}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007987
7988
7989/// XCore Tools
7990// We pass assemble and link construction to the xcc tool.
7991
7992void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7993 const InputInfo &Output,
7994 const InputInfoList &Inputs,
7995 const ArgList &Args,
7996 const char *LinkingOutput) const {
7997 ArgStringList CmdArgs;
7998
7999 CmdArgs.push_back("-o");
8000 CmdArgs.push_back(Output.getFilename());
8001
8002 CmdArgs.push_back("-c");
8003
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008004 if (Args.hasArg(options::OPT_v))
8005 CmdArgs.push_back("-v");
8006
Robert Lytton894d25c2014-05-02 09:33:25 +00008007 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8008 if (!A->getOption().matches(options::OPT_g0))
8009 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008010
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008011 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8012 false))
8013 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008014
8015 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8016 options::OPT_Xassembler);
8017
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008018 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008019 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008020
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008021 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008022 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008023}
8024
8025void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8026 const InputInfo &Output,
8027 const InputInfoList &Inputs,
8028 const ArgList &Args,
8029 const char *LinkingOutput) const {
8030 ArgStringList CmdArgs;
8031
8032 if (Output.isFilename()) {
8033 CmdArgs.push_back("-o");
8034 CmdArgs.push_back(Output.getFilename());
8035 } else {
8036 assert(Output.isNothing() && "Invalid output.");
8037 }
8038
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008039 if (Args.hasArg(options::OPT_v))
8040 CmdArgs.push_back("-v");
8041
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008042 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
8043 if (EH.ShouldUseExceptionTables)
8044 CmdArgs.push_back("-fexceptions");
8045
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008046 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8047
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008048 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008049 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008050}