blob: 21ffce24432c5a8f4b1570805957006041ebda3f [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}
509
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;
760 default:
761 ABIName = "apcs-gnu";
762 }
763 }
764 CmdArgs.push_back("-target-abi");
765 CmdArgs.push_back(ABIName);
766
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000767 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000768 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000769 if (FloatABI == "soft") {
770 // Floating point operations and argument passing are soft.
771 //
772 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000773 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000774 CmdArgs.push_back("-mfloat-abi");
775 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000776 } else if (FloatABI == "softfp") {
777 // Floating point operations are hard, but argument passing is soft.
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 {
781 // Floating point operations and argument passing are hard.
782 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000783 CmdArgs.push_back("-mfloat-abi");
784 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000785 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000786
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000787 // Kernel code has more strict alignment requirements.
788 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000789 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000790 CmdArgs.push_back("-backend-option");
791 CmdArgs.push_back("-arm-long-calls");
792 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000793
Daniel Dunbar12100e22011-03-22 16:48:17 +0000794 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000795 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000796
797 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000798 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000799 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000800 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000801
Bob Wilson0874e532014-07-29 00:23:18 +0000802 // -mkernel implies -mstrict-align; don't add the redundant option.
803 if (!KernelOrKext) {
804 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
805 options::OPT_munaligned_access)) {
806 CmdArgs.push_back("-backend-option");
807 if (A->getOption().matches(options::OPT_mno_unaligned_access))
808 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000809 else {
810 if (getToolChain().getTriple().getSubArch() ==
811 llvm::Triple::SubArchType::ARMSubArch_v6m)
812 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000813 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000814 }
Bob Wilson0874e532014-07-29 00:23:18 +0000815 }
816 }
817
Chad Rosierba3df1d2011-08-26 00:26:29 +0000818 // Setting -mno-global-merge disables the codegen global merge pass. Setting
819 // -mglobal-merge has no effect as the pass is enabled by default.
820 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
821 options::OPT_mno_global_merge)) {
822 if (A->getOption().matches(options::OPT_mno_global_merge))
823 CmdArgs.push_back("-mno-global-merge");
824 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000825
Bob Wilson9c8af452013-04-11 18:53:25 +0000826 if (!Args.hasFlag(options::OPT_mimplicit_float,
827 options::OPT_mno_implicit_float,
828 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000829 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000830
Logan Chien749763e2014-04-03 13:12:44 +0000831 // llvm does not support reserving registers in general. There is support
832 // for reserving r9 on ARM though (defined as a platform-specific register
833 // in ARM EABI).
834 if (Args.hasArg(options::OPT_ffixed_r9)) {
835 CmdArgs.push_back("-backend-option");
836 CmdArgs.push_back("-arm-reserve-r9");
837 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000838}
839
Tim Northover573cbee2014-05-24 12:52:07 +0000840/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
841/// targeting.
842static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000843 Arg *A;
844 std::string CPU;
845 // If we have -mtune or -mcpu, use that.
846 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
847 CPU = A->getValue();
848 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
849 StringRef Mcpu = A->getValue();
850 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000851 }
852
Kevin Qin110db6f2014-07-18 07:03:22 +0000853 // Handle CPU name is 'native'.
854 if (CPU == "native")
855 return llvm::sys::getHostCPUName();
856 else if (CPU.size())
857 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000858
James Molloy9b1586b2014-04-17 12:51:17 +0000859 // Make sure we pick "cyclone" if -arch is used.
860 // FIXME: Should this be picked by checking the target triple instead?
861 if (Args.getLastArg(options::OPT_arch))
862 return "cyclone";
863
864 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000865}
866
Tim Northover573cbee2014-05-24 12:52:07 +0000867void Clang::AddAArch64TargetArgs(const ArgList &Args,
868 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000869 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
870 llvm::Triple Triple(TripleStr);
871
872 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
873 Args.hasArg(options::OPT_mkernel) ||
874 Args.hasArg(options::OPT_fapple_kext))
875 CmdArgs.push_back("-disable-red-zone");
876
877 if (!Args.hasFlag(options::OPT_mimplicit_float,
878 options::OPT_mno_implicit_float, true))
879 CmdArgs.push_back("-no-implicit-float");
880
Craig Topper92fc2df2014-05-17 16:56:41 +0000881 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000882 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
883 ABIName = A->getValue();
884 else if (Triple.isOSDarwin())
885 ABIName = "darwinpcs";
886 else
887 ABIName = "aapcs";
888
889 CmdArgs.push_back("-target-abi");
890 CmdArgs.push_back(ABIName);
891
Bob Wilson0874e532014-07-29 00:23:18 +0000892 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
893 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000894 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000895 if (A->getOption().matches(options::OPT_mno_unaligned_access))
896 CmdArgs.push_back("-aarch64-strict-align");
897 else
898 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000899 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000900
901 // Setting -mno-global-merge disables the codegen global merge pass. Setting
902 // -mglobal-merge has no effect as the pass is enabled by default.
903 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
904 options::OPT_mno_global_merge)) {
905 if (A->getOption().matches(options::OPT_mno_global_merge))
906 CmdArgs.push_back("-mno-global-merge");
907 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000908}
909
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000910// Get CPU and ABI names. They are not independent
911// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000912void mips::getMipsCPUAndABI(const ArgList &Args,
913 const llvm::Triple &Triple,
914 StringRef &CPUName,
915 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000916 const char *DefMips32CPU = "mips32r2";
917 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000918
Daniel Sanders2bf13662014-07-10 14:40:57 +0000919 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
920 // default for mips64(el)?-img-linux-gnu.
921 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
922 Triple.getEnvironment() == llvm::Triple::GNU) {
923 DefMips32CPU = "mips32r6";
924 DefMips64CPU = "mips64r6";
925 }
926
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000927 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000928 options::OPT_mcpu_EQ))
929 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000930
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000931 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000932 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000933 // Convert a GNU style Mips ABI name to the name
934 // accepted by LLVM Mips backend.
935 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
936 .Case("32", "o32")
937 .Case("64", "n64")
938 .Default(ABIName);
939 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000940
941 // Setup default CPU and ABI names.
942 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000943 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000944 default:
945 llvm_unreachable("Unexpected triple arch name");
946 case llvm::Triple::mips:
947 case llvm::Triple::mipsel:
948 CPUName = DefMips32CPU;
949 break;
950 case llvm::Triple::mips64:
951 case llvm::Triple::mips64el:
952 CPUName = DefMips64CPU;
953 break;
954 }
955 }
956
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000957 if (ABIName.empty()) {
958 // Deduce ABI name from the target triple.
959 if (Triple.getArch() == llvm::Triple::mips ||
960 Triple.getArch() == llvm::Triple::mipsel)
961 ABIName = "o32";
962 else
963 ABIName = "n64";
964 }
965
966 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000967 // Deduce CPU name from ABI name.
968 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +0000969 .Cases("o32", "eabi", DefMips32CPU)
970 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000971 .Default("");
972 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +0000973
974 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000975}
976
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000977// Convert ABI name to the GNU tools acceptable variant.
978static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
979 return llvm::StringSwitch<llvm::StringRef>(ABI)
980 .Case("o32", "32")
981 .Case("n64", "64")
982 .Default(ABI);
983}
984
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000985// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
986// and -mfloat-abi=.
987static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000988 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000989 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000990 options::OPT_mhard_float,
991 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000992 if (A->getOption().matches(options::OPT_msoft_float))
993 FloatABI = "soft";
994 else if (A->getOption().matches(options::OPT_mhard_float))
995 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000996 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000997 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000998 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000999 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001000 FloatABI = "hard";
1001 }
1002 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001003 }
1004
1005 // If unspecified, choose the default based on the platform.
1006 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001007 // Assume "hard", because it's a default value used by gcc.
1008 // When we start to recognize specific target MIPS processors,
1009 // we will be able to select the default more correctly.
1010 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001011 }
1012
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001013 return FloatABI;
1014}
1015
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001016static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001017 std::vector<const char *> &Features,
1018 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001019 StringRef FeatureName) {
1020 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001021 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001022 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001023 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001024 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001025 }
1026}
1027
Daniel Sanders379d44b2014-07-16 11:52:23 +00001028static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1029 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001030 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001031 StringRef CPUName;
1032 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001033 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001034 ABIName = getGnuCompatibleMipsABIName(ABIName);
1035
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001036 // Always override the backend's default ABI.
Aaron Ballman9eef74232014-07-17 13:28:50 +00001037 std::string ABIFeature = llvm::StringSwitch<StringRef>(ABIName)
1038 .Case("32", "+o32")
1039 .Case("n32", "+n32")
1040 .Case("64", "+n64")
1041 .Case("eabi", "+eabi")
1042 .Default(("+" + ABIName).str());
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001043 Features.push_back("-o32");
1044 Features.push_back("-n64");
1045 Features.push_back(Args.MakeArgString(ABIFeature));
1046
Daniel Sandersfeb61302014-08-08 15:47:17 +00001047 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1048 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001049
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001050 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001051 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001052 // FIXME: Note, this is a hack. We need to pass the selected float
1053 // mode to the MipsTargetInfoBase to define appropriate macros there.
1054 // Now it is the only method.
1055 Features.push_back("+soft-float");
1056 }
1057
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001058 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001059 StringRef Val = StringRef(A->getValue());
1060 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001061 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001062 else if (Val == "legacy")
1063 Features.push_back("-nan2008");
1064 else
1065 D.Diag(diag::err_drv_unsupported_option_argument)
1066 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001067 }
1068
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001069 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1070 options::OPT_mdouble_float, "single-float");
1071 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1072 "mips16");
1073 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1074 options::OPT_mno_micromips, "micromips");
1075 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1076 "dsp");
1077 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1078 "dspr2");
1079 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1080 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001081
1082 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1083 // pass -mfpxx
1084 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1085 options::OPT_mfp64)) {
1086 if (A->getOption().matches(options::OPT_mfp32))
1087 Features.push_back(Args.MakeArgString("-fp64"));
1088 else if (A->getOption().matches(options::OPT_mfpxx)) {
1089 Features.push_back(Args.MakeArgString("+fpxx"));
1090 Features.push_back(Args.MakeArgString("+nooddspreg"));
1091 } else
1092 Features.push_back(Args.MakeArgString("+fp64"));
1093 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001094 Features.push_back(Args.MakeArgString("+fpxx"));
1095 Features.push_back(Args.MakeArgString("+nooddspreg"));
1096 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001097
Daniel Sanders28e5d392014-07-10 10:39:51 +00001098 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1099 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001100}
1101
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001102void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001103 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001104 const Driver &D = getToolChain().getDriver();
1105 StringRef CPUName;
1106 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001107 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001108 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001109
1110 CmdArgs.push_back("-target-abi");
1111 CmdArgs.push_back(ABIName.data());
1112
1113 StringRef FloatABI = getMipsFloatABI(D, Args);
1114
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001115 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001118 CmdArgs.push_back("-mfloat-abi");
1119 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001120 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001121 else {
1122 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001123 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001124 CmdArgs.push_back("-mfloat-abi");
1125 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001126 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001127
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001128 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1129 if (A->getOption().matches(options::OPT_mxgot)) {
1130 CmdArgs.push_back("-mllvm");
1131 CmdArgs.push_back("-mxgot");
1132 }
1133 }
1134
Simon Atanasyanc580b322013-05-11 06:33:44 +00001135 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1136 options::OPT_mno_ldc1_sdc1)) {
1137 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1138 CmdArgs.push_back("-mllvm");
1139 CmdArgs.push_back("-mno-ldc1-sdc1");
1140 }
1141 }
1142
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001143 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1144 options::OPT_mno_check_zero_division)) {
1145 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1146 CmdArgs.push_back("-mllvm");
1147 CmdArgs.push_back("-mno-check-zero-division");
1148 }
1149 }
1150
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001151 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001152 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001153 CmdArgs.push_back("-mllvm");
1154 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1155 A->claim();
1156 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001157}
1158
Hal Finkel8eb59282012-06-11 22:35:19 +00001159/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1160static std::string getPPCTargetCPU(const ArgList &Args) {
1161 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001162 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001163
1164 if (CPUName == "native") {
1165 std::string CPU = llvm::sys::getHostCPUName();
1166 if (!CPU.empty() && CPU != "generic")
1167 return CPU;
1168 else
1169 return "";
1170 }
1171
1172 return llvm::StringSwitch<const char *>(CPUName)
1173 .Case("common", "generic")
1174 .Case("440", "440")
1175 .Case("440fp", "440")
1176 .Case("450", "450")
1177 .Case("601", "601")
1178 .Case("602", "602")
1179 .Case("603", "603")
1180 .Case("603e", "603e")
1181 .Case("603ev", "603ev")
1182 .Case("604", "604")
1183 .Case("604e", "604e")
1184 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001186 .Case("G3", "g3")
1187 .Case("7400", "7400")
1188 .Case("G4", "g4")
1189 .Case("7450", "7450")
1190 .Case("G4+", "g4+")
1191 .Case("750", "750")
1192 .Case("970", "970")
1193 .Case("G5", "g5")
1194 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001195 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001196 .Case("e500mc", "e500mc")
1197 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001198 .Case("power3", "pwr3")
1199 .Case("power4", "pwr4")
1200 .Case("power5", "pwr5")
1201 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001202 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001203 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001204 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001205 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001206 .Case("pwr3", "pwr3")
1207 .Case("pwr4", "pwr4")
1208 .Case("pwr5", "pwr5")
1209 .Case("pwr5x", "pwr5x")
1210 .Case("pwr6", "pwr6")
1211 .Case("pwr6x", "pwr6x")
1212 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001213 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001214 .Case("powerpc", "ppc")
1215 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001216 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001217 .Default("");
1218 }
1219
1220 return "";
1221}
1222
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001223static void getPPCTargetFeatures(const ArgList &Args,
1224 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001225 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1226 ie = Args.filtered_end();
1227 it != ie; ++it) {
1228 StringRef Name = (*it)->getOption().getName();
1229 (*it)->claim();
1230
1231 // Skip over "-m".
1232 assert(Name.startswith("m") && "Invalid feature name.");
1233 Name = Name.substr(1);
1234
1235 bool IsNegative = Name.startswith("no-");
1236 if (IsNegative)
1237 Name = Name.substr(3);
1238
1239 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1240 // pass the correct option to the backend while calling the frontend
1241 // option the same.
1242 // TODO: Change the LLVM backend option maybe?
1243 if (Name == "mfcrf")
1244 Name = "mfocrf";
1245
1246 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1247 }
1248
1249 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001250 AddTargetFeature(Args, Features, options::OPT_faltivec,
1251 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001252}
1253
Ulrich Weigand8afad612014-07-28 13:17:52 +00001254void Clang::AddPPCTargetArgs(const ArgList &Args,
1255 ArgStringList &CmdArgs) const {
1256 // Select the ABI to use.
1257 const char *ABIName = nullptr;
1258 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1259 ABIName = A->getValue();
1260 } else if (getToolChain().getTriple().isOSLinux())
1261 switch(getToolChain().getArch()) {
1262 case llvm::Triple::ppc64:
1263 ABIName = "elfv1";
1264 break;
1265 case llvm::Triple::ppc64le:
1266 ABIName = "elfv2";
1267 break;
1268 default:
1269 break;
1270 }
1271
1272 if (ABIName) {
1273 CmdArgs.push_back("-target-abi");
1274 CmdArgs.push_back(ABIName);
1275 }
1276}
1277
1278bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1279 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1280 return A && (A->getValue() == StringRef(Value));
1281}
1282
Tom Stellard6674c702013-04-01 20:56:53 +00001283/// Get the (LLVM) name of the R600 gpu we are targeting.
1284static std::string getR600TargetGPU(const ArgList &Args) {
1285 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001286 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001287 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001288 .Cases("rv630", "rv635", "r600")
1289 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001290 .Case("rv740", "rv770")
1291 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001292 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001293 .Case("hemlock", "cypress")
1294 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001295 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001296 }
1297 return "";
1298}
1299
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001300static void getSparcTargetFeatures(const ArgList &Args,
1301 std::vector<const char *> Features) {
1302 bool SoftFloatABI = true;
1303 if (Arg *A =
1304 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1305 if (A->getOption().matches(options::OPT_mhard_float))
1306 SoftFloatABI = false;
1307 }
1308 if (SoftFloatABI)
1309 Features.push_back("+soft-float");
1310}
1311
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001312void Clang::AddSparcTargetArgs(const ArgList &Args,
1313 ArgStringList &CmdArgs) const {
1314 const Driver &D = getToolChain().getDriver();
1315
Brad Smith10cd0f42014-07-11 20:12:08 +00001316 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001317 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001318 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1319 options::OPT_mhard_float)) {
1320 if (A->getOption().matches(options::OPT_msoft_float))
1321 FloatABI = "soft";
1322 else if (A->getOption().matches(options::OPT_mhard_float))
1323 FloatABI = "hard";
1324 }
1325
1326 // If unspecified, choose the default based on the platform.
1327 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001328 // Assume "soft", but warn the user we are guessing.
1329 FloatABI = "soft";
1330 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001331 }
1332
1333 if (FloatABI == "soft") {
1334 // Floating point operations and argument passing are soft.
1335 //
1336 // FIXME: This changes CPP defines, we need -target-soft-float.
1337 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001338 } else {
1339 assert(FloatABI == "hard" && "Invalid float abi!");
1340 CmdArgs.push_back("-mhard-float");
1341 }
1342}
1343
Richard Sandiford4652d892013-07-19 16:51:51 +00001344static const char *getSystemZTargetCPU(const ArgList &Args) {
1345 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1346 return A->getValue();
1347 return "z10";
1348}
1349
Chandler Carruth953fb082013-01-13 11:46:33 +00001350static const char *getX86TargetCPU(const ArgList &Args,
1351 const llvm::Triple &Triple) {
1352 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001353 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001354 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001355 return "core-avx2";
1356
Chandler Carruth953fb082013-01-13 11:46:33 +00001357 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001358 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001359
1360 // FIXME: Reject attempts to use -march=native unless the target matches
1361 // the host.
1362 //
1363 // FIXME: We should also incorporate the detected target features for use
1364 // with -native.
1365 std::string CPU = llvm::sys::getHostCPUName();
1366 if (!CPU.empty() && CPU != "generic")
1367 return Args.MakeArgString(CPU);
1368 }
1369
1370 // Select the default CPU if none was given (or detection failed).
1371
1372 if (Triple.getArch() != llvm::Triple::x86_64 &&
1373 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001374 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001375
1376 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1377
1378 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001379 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001380 if (Triple.getArchName() == "x86_64h")
1381 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001382 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001383 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001384
Alexey Bataev286d1b92014-01-31 04:07:13 +00001385 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001386 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001387 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001388
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001389 // Everything else goes to x86-64 in 64-bit mode.
1390 if (Is64Bit)
1391 return "x86-64";
1392
1393 switch (Triple.getOS()) {
1394 case llvm::Triple::FreeBSD:
1395 case llvm::Triple::NetBSD:
1396 case llvm::Triple::OpenBSD:
1397 return "i486";
1398 case llvm::Triple::Haiku:
1399 return "i586";
1400 case llvm::Triple::Bitrig:
1401 return "i686";
1402 default:
1403 // Fallback to p4.
1404 return "pentium4";
1405 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001406}
1407
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001408static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1409 switch(T.getArch()) {
1410 default:
1411 return "";
1412
Amara Emerson703da2e2013-10-31 09:32:33 +00001413 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001414 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001415 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001416
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001417 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001418 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001419 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001420 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001421 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001422
1423 case llvm::Triple::mips:
1424 case llvm::Triple::mipsel:
1425 case llvm::Triple::mips64:
1426 case llvm::Triple::mips64el: {
1427 StringRef CPUName;
1428 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001429 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001430 return CPUName;
1431 }
1432
1433 case llvm::Triple::ppc:
1434 case llvm::Triple::ppc64:
1435 case llvm::Triple::ppc64le: {
1436 std::string TargetCPUName = getPPCTargetCPU(Args);
1437 // LLVM may default to generating code for the native CPU,
1438 // but, like gcc, we default to a more generic option for
1439 // each architecture. (except on Darwin)
1440 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1441 if (T.getArch() == llvm::Triple::ppc64)
1442 TargetCPUName = "ppc64";
1443 else if (T.getArch() == llvm::Triple::ppc64le)
1444 TargetCPUName = "ppc64le";
1445 else
1446 TargetCPUName = "ppc";
1447 }
1448 return TargetCPUName;
1449 }
1450
1451 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001452 case llvm::Triple::sparcv9:
1453 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001454 return A->getValue();
1455 return "";
1456
1457 case llvm::Triple::x86:
1458 case llvm::Triple::x86_64:
1459 return getX86TargetCPU(Args, T);
1460
1461 case llvm::Triple::hexagon:
1462 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1463
1464 case llvm::Triple::systemz:
1465 return getSystemZTargetCPU(Args);
1466
1467 case llvm::Triple::r600:
1468 return getR600TargetGPU(Args);
1469 }
1470}
1471
Alp Tokerce365ca2013-12-02 12:43:03 +00001472static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1473 ArgStringList &CmdArgs) {
1474 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1475 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1476 // forward.
1477 CmdArgs.push_back("-plugin");
1478 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1479 CmdArgs.push_back(Args.MakeArgString(Plugin));
1480
1481 // Try to pass driver level flags relevant to LTO code generation down to
1482 // the plugin.
1483
1484 // Handle flags for selecting CPU variants.
1485 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1486 if (!CPU.empty())
1487 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1488}
1489
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001490static void getX86TargetFeatures(const Driver & D,
1491 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001492 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001493 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001494 if (Triple.getArchName() == "x86_64h") {
1495 // x86_64h implies quite a few of the more modern subtarget features
1496 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1497 Features.push_back("-rdrnd");
1498 Features.push_back("-aes");
1499 Features.push_back("-pclmul");
1500 Features.push_back("-rtm");
1501 Features.push_back("-hle");
1502 Features.push_back("-fsgsbase");
1503 }
1504
Alexey Volkov54ff0802014-06-25 12:15:36 +00001505 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001506 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001507 if (Triple.getArch() == llvm::Triple::x86_64) {
1508 Features.push_back("+sse4.2");
1509 Features.push_back("+popcnt");
1510 } else
1511 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001512 }
1513
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001514 // Set features according to the -arch flag on MSVC
1515 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1516 StringRef Arch = A->getValue();
1517 bool ArchUsed = false;
1518 // First, look for flags that are shared in x86 and x86-64.
1519 if (Triple.getArch() == llvm::Triple::x86_64 ||
1520 Triple.getArch() == llvm::Triple::x86) {
1521 if (Arch == "AVX" || Arch == "AVX2") {
1522 ArchUsed = true;
1523 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1524 }
1525 }
1526 // Then, look for x86-specific flags.
1527 if (Triple.getArch() == llvm::Triple::x86) {
1528 if (Arch == "IA32") {
1529 ArchUsed = true;
1530 } else if (Arch == "SSE" || Arch == "SSE2") {
1531 ArchUsed = true;
1532 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1533 }
1534 }
1535 if (!ArchUsed)
1536 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1537 }
1538
Jim Grosbach82eee262013-11-16 00:53:35 +00001539 // Now add any that the user explicitly requested on the command line,
1540 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001541 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1542 ie = Args.filtered_end();
1543 it != ie; ++it) {
1544 StringRef Name = (*it)->getOption().getName();
1545 (*it)->claim();
1546
1547 // Skip over "-m".
1548 assert(Name.startswith("m") && "Invalid feature name.");
1549 Name = Name.substr(1);
1550
1551 bool IsNegative = Name.startswith("no-");
1552 if (IsNegative)
1553 Name = Name.substr(3);
1554
1555 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1556 }
1557}
1558
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001559void Clang::AddX86TargetArgs(const ArgList &Args,
1560 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001561 if (!Args.hasFlag(options::OPT_mred_zone,
1562 options::OPT_mno_red_zone,
1563 true) ||
1564 Args.hasArg(options::OPT_mkernel) ||
1565 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001566 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001567
Bob Wilson2616e2e2013-02-10 16:01:41 +00001568 // Default to avoid implicit floating-point for kernel/kext code, but allow
1569 // that to be overridden with -mno-soft-float.
1570 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1571 Args.hasArg(options::OPT_fapple_kext));
1572 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1573 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001574 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001575 options::OPT_mno_implicit_float)) {
1576 const Option &O = A->getOption();
1577 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1578 O.matches(options::OPT_msoft_float));
1579 }
1580 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001581 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001582
1583 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1584 StringRef Value = A->getValue();
1585 if (Value == "intel" || Value == "att") {
1586 CmdArgs.push_back("-mllvm");
1587 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1588 } else {
1589 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1590 << A->getOption().getName() << Value;
1591 }
1592 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001593}
1594
Matthew Curtise8f80a12012-12-06 17:49:03 +00001595static inline bool HasPICArg(const ArgList &Args) {
1596 return Args.hasArg(options::OPT_fPIC)
1597 || Args.hasArg(options::OPT_fpic);
1598}
1599
1600static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1601 return Args.getLastArg(options::OPT_G,
1602 options::OPT_G_EQ,
1603 options::OPT_msmall_data_threshold_EQ);
1604}
1605
1606static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1607 std::string value;
1608 if (HasPICArg(Args))
1609 value = "0";
1610 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1611 value = A->getValue();
1612 A->claim();
1613 }
1614 return value;
1615}
1616
Tony Linthicum76329bf2011-12-12 21:14:55 +00001617void Clang::AddHexagonTargetArgs(const ArgList &Args,
1618 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001619 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001620 CmdArgs.push_back("-mqdsp6-compat");
1621 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001622
Matthew Curtise8f80a12012-12-06 17:49:03 +00001623 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1624 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001625 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001626 CmdArgs.push_back(Args.MakeArgString(
1627 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001628 }
1629
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001630 if (!Args.hasArg(options::OPT_fno_short_enums))
1631 CmdArgs.push_back("-fshort-enums");
1632 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1633 CmdArgs.push_back ("-mllvm");
1634 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1635 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001636 CmdArgs.push_back ("-mllvm");
1637 CmdArgs.push_back ("-machine-sink-split=0");
1638}
1639
Kevin Qin110db6f2014-07-18 07:03:22 +00001640// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
1641static bool DecodeAArch64Features(const Driver &D, const StringRef &text,
1642 std::vector<const char *> &Features) {
1643 SmallVector<StringRef, 8> Split;
1644 text.split(Split, StringRef("+"), -1, false);
1645
1646 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1647 const char *result = llvm::StringSwitch<const char *>(Split[I])
1648 .Case("fp", "+fp-armv8")
1649 .Case("simd", "+neon")
1650 .Case("crc", "+crc")
1651 .Case("crypto", "+crypto")
1652 .Case("nofp", "-fp-armv8")
1653 .Case("nosimd", "-neon")
1654 .Case("nocrc", "-crc")
1655 .Case("nocrypto", "-crypto")
1656 .Default(nullptr);
1657 if (result)
1658 Features.push_back(result);
1659 else if (Split[I] == "neon" || Split[I] == "noneon")
1660 D.Diag(diag::err_drv_no_neon_modifier);
1661 else
1662 return false;
1663 }
1664 return true;
1665}
1666
1667// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1668// decode CPU and feature.
1669static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1670 std::vector<const char *> &Features) {
1671 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1672 CPU = Split.first;
1673 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1674 Features.push_back("+neon");
1675 Features.push_back("+crc");
1676 Features.push_back("+crypto");
1677 } else if (CPU == "generic") {
1678 Features.push_back("+neon");
1679 } else {
1680 return false;
1681 }
1682
1683 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1684 return false;
1685
1686 return true;
1687}
1688
1689static bool
1690getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1691 const ArgList &Args,
1692 std::vector<const char *> &Features) {
1693 std::pair<StringRef, StringRef> Split = March.split("+");
1694 if (Split.first != "armv8-a")
1695 return false;
1696
1697 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1698 return false;
1699
1700 return true;
1701}
1702
1703static bool
1704getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1705 const ArgList &Args,
1706 std::vector<const char *> &Features) {
1707 StringRef CPU;
1708 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1709 return false;
1710
1711 return true;
1712}
1713
1714static bool
1715getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1716 const ArgList &Args,
1717 std::vector<const char *> &Features) {
1718 // Handle CPU name is 'native'.
1719 if (Mtune == "native")
1720 Mtune = llvm::sys::getHostCPUName();
1721 if (Mtune == "cyclone") {
1722 Features.push_back("+zcm");
1723 Features.push_back("+zcz");
1724 }
1725 return true;
1726}
1727
1728static bool
1729getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1730 const ArgList &Args,
1731 std::vector<const char *> &Features) {
1732 StringRef CPU;
1733 std::vector<const char *> DecodedFeature;
1734 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1735 return false;
1736
1737 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1738}
1739
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001740static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1741 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001742 Arg *A;
1743 bool success = true;
1744 // Enable NEON by default.
1745 Features.push_back("+neon");
1746 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1747 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1748 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1749 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1750
1751 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1752 success =
1753 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1754 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1755 success =
1756 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1757
1758 if (!success)
1759 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001760
1761 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1762 Features.push_back("-fp-armv8");
1763 Features.push_back("-crypto");
1764 Features.push_back("-neon");
1765 }
Bradley Smith418c5932014-05-02 15:17:51 +00001766
1767 // En/disable crc
1768 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1769 options::OPT_mnocrc)) {
1770 if (A->getOption().matches(options::OPT_mcrc))
1771 Features.push_back("+crc");
1772 else
1773 Features.push_back("-crc");
1774 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001775}
1776
1777static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001778 const ArgList &Args, ArgStringList &CmdArgs,
1779 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001780 std::vector<const char *> Features;
1781 switch (Triple.getArch()) {
1782 default:
1783 break;
1784 case llvm::Triple::mips:
1785 case llvm::Triple::mipsel:
1786 case llvm::Triple::mips64:
1787 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001788 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001789 break;
1790
1791 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001792 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001793 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001794 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001795 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001796 break;
1797
1798 case llvm::Triple::ppc:
1799 case llvm::Triple::ppc64:
1800 case llvm::Triple::ppc64le:
1801 getPPCTargetFeatures(Args, Features);
1802 break;
1803 case llvm::Triple::sparc:
1804 getSparcTargetFeatures(Args, Features);
1805 break;
1806 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001807 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001808 getAArch64TargetFeatures(D, Args, Features);
1809 break;
1810 case llvm::Triple::x86:
1811 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001812 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001813 break;
1814 }
Rafael Espindola43964802013-08-21 17:34:32 +00001815
1816 // Find the last of each feature.
1817 llvm::StringMap<unsigned> LastOpt;
1818 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1819 const char *Name = Features[I];
1820 assert(Name[0] == '-' || Name[0] == '+');
1821 LastOpt[Name + 1] = I;
1822 }
1823
1824 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1825 // If this feature was overridden, ignore it.
1826 const char *Name = Features[I];
1827 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1828 assert(LastI != LastOpt.end());
1829 unsigned Last = LastI->second;
1830 if (Last != I)
1831 continue;
1832
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001833 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001834 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001835 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001836}
1837
Eric Christopher84fbdb42011-08-19 00:30:14 +00001838static bool
John McCall5fb5df92012-06-20 06:18:46 +00001839shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001840 const llvm::Triple &Triple) {
1841 // We use the zero-cost exception tables for Objective-C if the non-fragile
1842 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1843 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001844 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001845 return true;
1846
Bob Wilson83e723a2013-12-05 19:38:42 +00001847 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001848 return false;
1849
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001850 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001851 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001852 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001853}
1854
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001855namespace {
1856 struct ExceptionSettings {
1857 bool ExceptionsEnabled;
1858 bool ShouldUseExceptionTables;
1859 ExceptionSettings() : ExceptionsEnabled(false),
1860 ShouldUseExceptionTables(false) {}
1861 };
1862} // end anonymous namespace.
1863
Nico Webere8e53112014-05-11 01:04:02 +00001864// exceptionSettings() exists to share the logic between -cc1 and linker
1865// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001866static ExceptionSettings exceptionSettings(const ArgList &Args,
1867 const llvm::Triple &Triple) {
1868 ExceptionSettings ES;
1869
1870 // Are exceptions enabled by default?
1871 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1872
1873 // This keeps track of whether exceptions were explicitly turned on or off.
1874 bool DidHaveExplicitExceptionFlag = false;
1875
1876 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1877 options::OPT_fno_exceptions)) {
1878 if (A->getOption().matches(options::OPT_fexceptions))
1879 ES.ExceptionsEnabled = true;
1880 else
1881 ES.ExceptionsEnabled = false;
1882
1883 DidHaveExplicitExceptionFlag = true;
1884 }
1885
1886 // Exception tables and cleanups can be enabled with -fexceptions even if the
1887 // language itself doesn't support exceptions.
1888 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1889 ES.ShouldUseExceptionTables = true;
1890
1891 return ES;
1892}
1893
Anders Carlssone96ab552011-02-28 02:27:16 +00001894/// addExceptionArgs - Adds exception related arguments to the driver command
1895/// arguments. There's a master flag, -fexceptions and also language specific
1896/// flags to enable/disable C++ and Objective-C exceptions.
1897/// This makes it possible to for example disable C++ exceptions but enable
1898/// Objective-C exceptions.
1899static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1900 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001901 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001902 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001903 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001904 if (KernelOrKext) {
1905 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1906 // arguments now to avoid warnings about unused arguments.
1907 Args.ClaimAllArgs(options::OPT_fexceptions);
1908 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1909 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1910 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1911 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1912 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001913 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001914 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001915
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001916 // Gather the exception settings from the command line arguments.
1917 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001918
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001919 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1920 // is not necessarily sensible, but follows GCC.
1921 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001922 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001923 options::OPT_fno_objc_exceptions,
1924 true)) {
1925 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001926
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001927 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001928 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001929 }
1930
1931 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001932 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001933
Eric Christopher84fbdb42011-08-19 00:30:14 +00001934 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1935 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001936 options::OPT_fexceptions,
1937 options::OPT_fno_exceptions)) {
1938 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1939 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001940 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001941 CXXExceptionsEnabled = false;
1942 }
1943
1944 if (CXXExceptionsEnabled) {
1945 CmdArgs.push_back("-fcxx-exceptions");
1946
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001947 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001948 }
1949 }
1950
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001951 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001952 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001953}
1954
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001955static bool ShouldDisableAutolink(const ArgList &Args,
1956 const ToolChain &TC) {
1957 bool Default = true;
1958 if (TC.getTriple().isOSDarwin()) {
1959 // The native darwin assembler doesn't support the linker_option directives,
1960 // so we disable them if we think the .s file will be passed to it.
1961 Default = TC.useIntegratedAs();
1962 }
1963 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1964 Default);
1965}
1966
Ted Kremenek62093662013-03-12 17:02:12 +00001967static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1968 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001969 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1970 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001971 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001972 return !UseDwarfDirectory;
1973}
1974
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001975/// \brief Check whether the given input tree contains any compilation actions.
1976static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001977 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001978 return true;
1979
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001980 for (const auto &Act : *A)
1981 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001982 return true;
1983
1984 return false;
1985}
1986
1987/// \brief Check if -relax-all should be passed to the internal assembler.
1988/// This is done by default when compiling non-assembler source with -O0.
1989static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1990 bool RelaxDefault = true;
1991
1992 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1993 RelaxDefault = A->getOption().matches(options::OPT_O0);
1994
1995 if (RelaxDefault) {
1996 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001997 for (const auto &Act : C.getActions()) {
1998 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001999 RelaxDefault = true;
2000 break;
2001 }
2002 }
2003 }
2004
2005 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2006 RelaxDefault);
2007}
2008
David Blaikie9260ed62013-07-25 21:19:01 +00002009static void CollectArgsForIntegratedAssembler(Compilation &C,
2010 const ArgList &Args,
2011 ArgStringList &CmdArgs,
2012 const Driver &D) {
2013 if (UseRelaxAll(C, Args))
2014 CmdArgs.push_back("-mrelax-all");
2015
David Peixottodfb66142013-11-14 22:52:58 +00002016 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002017 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002018 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2019 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2020 // arg after parsing the '-I' arg.
2021 bool TakeNextArg = false;
2022
David Blaikie9260ed62013-07-25 21:19:01 +00002023 // When using an integrated assembler, translate -Wa, and -Xassembler
2024 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002025 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002026 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2027 options::OPT_Xassembler),
2028 ie = Args.filtered_end(); it != ie; ++it) {
2029 const Arg *A = *it;
2030 A->claim();
2031
2032 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2033 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002034 if (TakeNextArg) {
2035 CmdArgs.push_back(Value.data());
2036 TakeNextArg = false;
2037 continue;
2038 }
David Blaikie9260ed62013-07-25 21:19:01 +00002039
2040 if (Value == "-force_cpusubtype_ALL") {
2041 // Do nothing, this is the default and we don't support anything else.
2042 } else if (Value == "-L") {
2043 CmdArgs.push_back("-msave-temp-labels");
2044 } else if (Value == "--fatal-warnings") {
2045 CmdArgs.push_back("-mllvm");
2046 CmdArgs.push_back("-fatal-assembler-warnings");
2047 } else if (Value == "--noexecstack") {
2048 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002049 } else if (Value == "-compress-debug-sections" ||
2050 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002051 CompressDebugSections = true;
2052 } else if (Value == "-nocompress-debug-sections" ||
2053 Value == "--nocompress-debug-sections") {
2054 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002055 } else if (Value.startswith("-I")) {
2056 CmdArgs.push_back(Value.data());
2057 // We need to consume the next argument if the current arg is a plain
2058 // -I. The next arg will be the include directory.
2059 if (Value == "-I")
2060 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002061 } else if (Value.startswith("-gdwarf-")) {
2062 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002063 } else {
2064 D.Diag(diag::err_drv_unsupported_option_argument)
2065 << A->getOption().getName() << Value;
2066 }
2067 }
2068 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002069 if (CompressDebugSections) {
2070 if (llvm::zlib::isAvailable())
2071 CmdArgs.push_back("-compress-debug-sections");
2072 else
2073 D.Diag(diag::warn_debug_compression_unavailable);
2074 }
David Blaikie9260ed62013-07-25 21:19:01 +00002075}
2076
Renato Goline807c122014-01-31 11:47:28 +00002077// Until ARM libraries are build separately, we have them all in one library
2078static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002079 if (TC.getArch() == llvm::Triple::arm ||
2080 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002081 return "arm";
2082 else
2083 return TC.getArchName();
2084}
2085
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002086static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2087 // The runtimes are located in the OS-specific resource directory.
2088 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002089 const llvm::Triple &Triple = TC.getTriple();
2090 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
2091 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
2092 "freebsd" : TC.getOS();
2093 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002094 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002095}
2096
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002097// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002098// FIXME: Make sure we can also emit shared objects if they're requested
2099// and available, check for possible errors, etc.
2100static void addClangRTLinux(
2101 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002102 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002103 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2104 getArchNameForCompilerRTLib(TC) +
2105 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00002106
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002107 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00002108 CmdArgs.push_back("-lgcc_s");
2109 if (TC.getDriver().CCCIsCXX())
2110 CmdArgs.push_back("-lgcc_eh");
2111}
2112
Alexey Samsonov7811d192014-02-20 13:57:37 +00002113static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00002114 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002115 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2116 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002117 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002118 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002119 Args.hasArg(options::OPT_fcreate_profile) ||
2120 Args.hasArg(options::OPT_coverage)))
2121 return;
2122
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002123 // -fprofile-instr-generate requires position-independent code to build with
2124 // shared objects. Link against the right archive.
2125 const char *Lib = "libclang_rt.profile-";
2126 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2127 Args.hasArg(options::OPT_shared))
2128 Lib = "libclang_rt.profile-pic-";
2129
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002130 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
2131 llvm::sys::path::append(LibProfile,
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002132 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00002133
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00002134 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00002135}
2136
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002137static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
2138 const StringRef Sanitizer,
2139 bool Shared) {
2140 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
2141 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
2142 const char *EnvSuffix =
2143 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002144 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
2145 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002146 Twine("libclang_rt.") + Sanitizer + "-" +
2147 getArchNameForCompilerRTLib(TC) + EnvSuffix +
2148 (Shared ? ".so" : ".a"));
2149 return LibSanitizer;
2150}
2151
2152static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
2153 ArgStringList &CmdArgs,
2154 const StringRef Sanitizer,
2155 bool BeforeLibStdCXX,
2156 bool ExportSymbols = true,
2157 bool LinkDeps = true) {
2158 SmallString<128> LibSanitizer =
2159 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smithcff3cde2013-03-20 23:49:07 +00002160
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002161 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
2162 // etc.) so that the linker picks custom versions of the global 'operator
2163 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002164 // strategy of inserting it at the front of the link command. It also
2165 // needs to be forced to end up in the executable, so wrap it in
2166 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00002167 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002168 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00002169 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002170 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00002171
2172 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
2173 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
2174
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002175 if (LinkDeps) {
2176 // Link sanitizer dependencies explicitly
2177 CmdArgs.push_back("-lpthread");
2178 CmdArgs.push_back("-lrt");
2179 CmdArgs.push_back("-lm");
2180 // There's no libdl on FreeBSD.
2181 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2182 CmdArgs.push_back("-ldl");
2183 }
Richard Smithf3e624c2013-03-23 00:30:08 +00002184
2185 // If possible, use a dynamic symbols file to export the symbols from the
2186 // runtime library. If we can't do so, use -export-dynamic instead to export
2187 // all symbols from the binary.
2188 if (ExportSymbols) {
2189 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
2190 CmdArgs.push_back(
2191 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2192 else
2193 CmdArgs.push_back("-export-dynamic");
2194 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002195}
2196
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002197/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
2198/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002199static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002200 ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002201 if (Shared) {
2202 // Link dynamic runtime if necessary.
2203 SmallString<128> LibSanitizer =
2204 getSanitizerRTLibName(TC, "asan", Shared);
2205 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002206 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002207
2208 // Do not link static runtime to DSOs or if compiling for Android.
2209 if (Args.hasArg(options::OPT_shared) ||
2210 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
2211 return;
2212
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002213 if (Shared) {
2214 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2215 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2216 /*LinkDeps*/ false);
2217 } else {
2218 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2219 if (IsCXX)
2220 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2221 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002222}
2223
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002224/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2225/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002226static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2227 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002228 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002229 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002230}
2231
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002232/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2233/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002234static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2235 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002236 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002237 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002238}
2239
2240/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2241/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002242static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2243 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002244 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002245 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002246}
2247
Richard Smithe30752c2012-10-09 19:52:38 +00002248/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2249/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002250static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2251 ArgStringList &CmdArgs, bool IsCXX,
2252 bool HasOtherSanitizerRt) {
Alexey Samsonovc6496812014-06-30 20:27:16 +00002253 // Do not link runtime into shared libraries.
2254 if (Args.hasArg(options::OPT_shared))
2255 return;
Richard Smith4244ea92014-06-04 23:28:46 +00002256
Nick Lewycky24921692013-10-19 00:27:23 +00002257 // Need a copy of sanitizer_common. This could come from another sanitizer
2258 // runtime; if we're not including one, include our own copy.
2259 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002260 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002261
Alexey Samsonovc6496812014-06-30 20:27:16 +00002262 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002263
2264 // Only include the bits of the runtime which need a C++ ABI library if
2265 // we're linking in C++ mode.
2266 if (IsCXX)
Alexey Samsonovc6496812014-06-30 20:27:16 +00002267 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true);
Richard Smithe30752c2012-10-09 19:52:38 +00002268}
2269
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002270static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2271 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00002272 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002273 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2274}
2275
2276// Should be called before we add C++ ABI library.
2277static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2278 ArgStringList &CmdArgs) {
2279 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002280 if (Sanitize.needsUbsanRt())
Alexey Samsonov90490af2014-08-08 22:47:17 +00002281 addUbsanRT(TC, Args, CmdArgs, Sanitize.linkCXXRuntimes(),
2282 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2283 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002284 if (Sanitize.needsAsanRt())
Alexey Samsonov90490af2014-08-08 22:47:17 +00002285 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(),
2286 Sanitize.linkCXXRuntimes());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002287 if (Sanitize.needsTsanRt())
2288 addTsanRT(TC, Args, CmdArgs);
2289 if (Sanitize.needsMsanRt())
2290 addMsanRT(TC, Args, CmdArgs);
2291 if (Sanitize.needsLsanRt())
2292 addLsanRT(TC, Args, CmdArgs);
2293 if (Sanitize.needsDfsanRt())
2294 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002295}
2296
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002297static bool shouldUseFramePointerForTarget(const ArgList &Args,
2298 const llvm::Triple &Triple) {
2299 switch (Triple.getArch()) {
2300 // Don't use a frame pointer on linux if optimizing for certain targets.
2301 case llvm::Triple::mips64:
2302 case llvm::Triple::mips64el:
2303 case llvm::Triple::mips:
2304 case llvm::Triple::mipsel:
2305 case llvm::Triple::systemz:
2306 case llvm::Triple::x86:
2307 case llvm::Triple::x86_64:
2308 if (Triple.isOSLinux())
2309 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2310 if (!A->getOption().matches(options::OPT_O0))
2311 return false;
2312 return true;
2313 case llvm::Triple::xcore:
2314 return false;
2315 default:
2316 return true;
2317 }
2318}
2319
Rafael Espindola224dd632011-12-14 21:02:23 +00002320static bool shouldUseFramePointer(const ArgList &Args,
2321 const llvm::Triple &Triple) {
2322 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2323 options::OPT_fomit_frame_pointer))
2324 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2325
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002326 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002327}
2328
Eric Christopherb7d97e92013-04-03 01:58:53 +00002329static bool shouldUseLeafFramePointer(const ArgList &Args,
2330 const llvm::Triple &Triple) {
2331 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2332 options::OPT_momit_leaf_frame_pointer))
2333 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2334
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002335 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002336}
2337
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002338/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002339static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002340 SmallString<128> cwd;
2341 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002342 CmdArgs.push_back("-fdebug-compilation-dir");
2343 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002344 }
2345}
2346
Eric Christopherd3804002013-02-22 20:12:52 +00002347static const char *SplitDebugName(const ArgList &Args,
2348 const InputInfoList &Inputs) {
2349 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2350 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2351 SmallString<128> T(FinalOutput->getValue());
2352 llvm::sys::path::replace_extension(T, "dwo");
2353 return Args.MakeArgString(T);
2354 } else {
2355 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002356 SmallString<128> T(
2357 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002358 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2359 llvm::sys::path::replace_extension(F, "dwo");
2360 T += F;
2361 return Args.MakeArgString(F);
2362 }
2363}
2364
2365static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2366 const Tool &T, const JobAction &JA,
2367 const ArgList &Args, const InputInfo &Output,
2368 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002369 ArgStringList ExtractArgs;
2370 ExtractArgs.push_back("--extract-dwo");
2371
2372 ArgStringList StripArgs;
2373 StripArgs.push_back("--strip-dwo");
2374
2375 // Grabbing the output of the earlier compile step.
2376 StripArgs.push_back(Output.getFilename());
2377 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002378 ExtractArgs.push_back(OutFile);
2379
2380 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002381 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002382
2383 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002384 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002385
2386 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002387 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002388}
2389
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002390/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002391/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2392static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002393 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002394 if (A->getOption().matches(options::OPT_O4) ||
2395 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002396 return true;
2397
2398 if (A->getOption().matches(options::OPT_O0))
2399 return false;
2400
2401 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2402
Rafael Espindola91780de2013-08-26 14:05:41 +00002403 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002404 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002405 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002406 return true;
2407
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002408 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002409 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002410 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002411
2412 unsigned OptLevel = 0;
2413 if (S.getAsInteger(10, OptLevel))
2414 return false;
2415
2416 return OptLevel > 1;
2417 }
2418
2419 return false;
2420}
2421
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002422/// Add -x lang to \p CmdArgs for \p Input.
2423static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2424 ArgStringList &CmdArgs) {
2425 // When using -verify-pch, we don't want to provide the type
2426 // 'precompiled-header' if it was inferred from the file extension
2427 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2428 return;
2429
2430 CmdArgs.push_back("-x");
2431 if (Args.hasArg(options::OPT_rewrite_objc))
2432 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2433 else
2434 CmdArgs.push_back(types::getTypeName(Input.getType()));
2435}
2436
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002437static std::string getMSCompatibilityVersion(const char *VersionStr) {
2438 unsigned Version;
2439 if (StringRef(VersionStr).getAsInteger(10, Version))
2440 return "0";
2441
2442 if (Version < 100)
2443 return llvm::utostr_32(Version) + ".0";
2444
2445 if (Version < 10000)
2446 return llvm::utostr_32(Version / 100) + "." +
2447 llvm::utostr_32(Version % 100);
2448
2449 unsigned Build = 0, Factor = 1;
2450 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2451 Build = Build + (Version % 10) * Factor;
2452 return llvm::utostr_32(Version / 100) + "." +
2453 llvm::utostr_32(Version % 100) + "." +
2454 llvm::utostr_32(Build);
2455}
2456
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002457void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002458 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002459 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002460 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002461 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002462 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2463 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002464 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002465 ArgStringList CmdArgs;
2466
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002467 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002468 bool IsWindowsCygnus =
2469 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002470 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2471
Daniel Dunbare521a892009-03-31 20:53:55 +00002472 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2473
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002474 // Invoke ourselves in -cc1 mode.
2475 //
2476 // FIXME: Implement custom jobs for internal actions.
2477 CmdArgs.push_back("-cc1");
2478
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002479 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002480 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002481 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002482 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002483
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002484 const llvm::Triple TT(TripleStr);
2485 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2486 TT.getArch() == llvm::Triple::thumb)) {
2487 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2488 unsigned Version;
2489 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2490 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002491 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2492 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002493 }
2494
Tim Northover336f1892014-03-29 13:16:12 +00002495 // Push all default warning arguments that are specific to
2496 // the given target. These come before user provided warning options
2497 // are provided.
2498 getToolChain().addClangWarningOptions(CmdArgs);
2499
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002500 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002501 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002502
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002503 if (isa<AnalyzeJobAction>(JA)) {
2504 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2505 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002506 } else if (isa<MigrateJobAction>(JA)) {
2507 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002508 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002509 if (Output.getType() == types::TY_Dependencies)
2510 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002511 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002512 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002513 if (Args.hasArg(options::OPT_rewrite_objc) &&
2514 !Args.hasArg(options::OPT_g_Group))
2515 CmdArgs.push_back("-P");
2516 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002517 } else if (isa<AssembleJobAction>(JA)) {
2518 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002519
David Blaikie9260ed62013-07-25 21:19:01 +00002520 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002521
2522 // Also ignore explicit -force_cpusubtype_ALL option.
2523 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002524 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002525 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002526 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002527
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002528 if (JA.getType() == types::TY_Nothing)
2529 CmdArgs.push_back("-fsyntax-only");
2530 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002531 CmdArgs.push_back("-emit-pch");
2532 else
2533 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002534 } else if (isa<VerifyPCHJobAction>(JA)) {
2535 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002536 } else {
2537 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002538
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002539 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002540 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002541 } else if (JA.getType() == types::TY_LLVM_IR ||
2542 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002543 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002544 } else if (JA.getType() == types::TY_LLVM_BC ||
2545 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002546 CmdArgs.push_back("-emit-llvm-bc");
2547 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002548 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002549 } else if (JA.getType() == types::TY_AST) {
2550 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002551 } else if (JA.getType() == types::TY_ModuleFile) {
2552 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002553 } else if (JA.getType() == types::TY_RewrittenObjC) {
2554 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002555 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002556 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2557 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002558 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002559 } else {
2560 assert(JA.getType() == types::TY_PP_Asm &&
2561 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002562 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002563 }
2564
Justin Bognera88f0122014-06-20 22:59:50 +00002565 // We normally speed up the clang process a bit by skipping destructors at
2566 // exit, but when we're generating diagnostics we can rely on some of the
2567 // cleanup.
2568 if (!C.isForDiagnostics())
2569 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002570
John McCallbb79b5f2010-02-13 03:50:24 +00002571 // Disable the verification pass in -asserts builds.
2572#ifdef NDEBUG
2573 CmdArgs.push_back("-disable-llvm-verifier");
2574#endif
2575
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002576 // Set the main file name, so that debug info works even with
2577 // -save-temps.
2578 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002579 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002580
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002581 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002582 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002583 if (Args.hasArg(options::OPT_static))
2584 CmdArgs.push_back("-static-define");
2585
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002586 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002587 // Enable region store model by default.
2588 CmdArgs.push_back("-analyzer-store=region");
2589
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002590 // Treat blocks as analysis entry points.
2591 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2592
Ted Kremenek49c79792011-03-24 00:28:47 +00002593 CmdArgs.push_back("-analyzer-eagerly-assume");
2594
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002595 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002596 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002597 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002598
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002599 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002600 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002601
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002602 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002603 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002604
2605 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002606
Jordan Rose10ad0812013-04-05 17:55:07 +00002607 if (types::isCXX(Inputs[0].getType()))
2608 CmdArgs.push_back("-analyzer-checker=cplusplus");
2609
Nico Webere8e53112014-05-11 01:04:02 +00002610 // Enable the following experimental checkers for testing.
2611 CmdArgs.push_back(
2612 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002613 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2614 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2615 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2616 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2617 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002618 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002619
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002620 // Set the output format. The default is plist, for (lame) historical
2621 // reasons.
2622 CmdArgs.push_back("-analyzer-output");
2623 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002624 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002625 else
2626 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002627
Ted Kremenekfe449a22010-03-22 22:32:05 +00002628 // Disable the presentation of standard compiler warnings when
2629 // using --analyze. We only want to show static analyzer diagnostics
2630 // or frontend errors.
2631 CmdArgs.push_back("-w");
2632
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002633 // Add -Xanalyzer arguments when running as analyzer.
2634 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002635 }
2636
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002637 CheckCodeGenerationOptions(D, Args);
2638
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002639 bool PIE = getToolChain().isPIEDefault();
2640 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002641 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002642
Alexey Bataev40e75222014-01-28 06:30:35 +00002643 // Android-specific defaults for PIC/PIE
2644 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2645 switch (getToolChain().getTriple().getArch()) {
2646 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002647 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002648 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002649 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002650 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002651 case llvm::Triple::mips:
2652 case llvm::Triple::mipsel:
2653 case llvm::Triple::mips64:
2654 case llvm::Triple::mips64el:
2655 PIC = true; // "-fpic"
2656 break;
2657
2658 case llvm::Triple::x86:
2659 case llvm::Triple::x86_64:
2660 PIC = true; // "-fPIC"
2661 IsPICLevelTwo = true;
2662 break;
2663
2664 default:
2665 break;
2666 }
2667 }
2668
Brad Smith5b05db82014-06-24 19:51:29 +00002669 // OpenBSD-specific defaults for PIE
2670 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2671 switch (getToolChain().getTriple().getArch()) {
2672 case llvm::Triple::mips64:
2673 case llvm::Triple::mips64el:
2674 case llvm::Triple::sparc:
2675 case llvm::Triple::x86:
2676 case llvm::Triple::x86_64:
2677 IsPICLevelTwo = false; // "-fpie"
2678 break;
2679
2680 case llvm::Triple::ppc:
2681 case llvm::Triple::sparcv9:
2682 IsPICLevelTwo = true; // "-fPIE"
2683 break;
2684
2685 default:
2686 break;
2687 }
2688 }
2689
Alexey Samsonov090301e2013-04-09 12:28:19 +00002690 // For the PIC and PIE flag options, this logic is different from the
2691 // legacy logic in very old versions of GCC, as that logic was just
2692 // a bug no one had ever fixed. This logic is both more rational and
2693 // consistent with GCC's new logic now that the bugs are fixed. The last
2694 // argument relating to either PIC or PIE wins, and no other argument is
2695 // used. If the last argument is any flavor of the '-fno-...' arguments,
2696 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2697 // at the same level.
2698 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2699 options::OPT_fpic, options::OPT_fno_pic,
2700 options::OPT_fPIE, options::OPT_fno_PIE,
2701 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002702 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2703 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002704 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002705 if (LastPICArg) {
2706 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002707 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2708 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2709 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2710 PIC = PIE || O.matches(options::OPT_fPIC) ||
2711 O.matches(options::OPT_fpic);
2712 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2713 O.matches(options::OPT_fPIC);
2714 } else {
2715 PIE = PIC = false;
2716 }
2717 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002718 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002719
Nick Lewycky609dd662013-10-11 03:33:53 +00002720 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002721 // specified while enabling PIC enabled level 1 PIC, just force it back to
2722 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2723 // informal testing).
2724 if (PIC && getToolChain().getTriple().isOSDarwin())
2725 IsPICLevelTwo |= getToolChain().isPICDefault();
2726
Chandler Carruthc0c04552012-04-08 16:40:35 +00002727 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2728 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002729 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002730 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002731 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002732 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002733 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002734 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002735
Chandler Carruth76a943b2012-11-19 03:52:03 +00002736 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2737 // This is a very special mode. It trumps the other modes, almost no one
2738 // uses it, and it isn't even valid on any OS but Darwin.
2739 if (!getToolChain().getTriple().isOSDarwin())
2740 D.Diag(diag::err_drv_unsupported_opt_for_target)
2741 << A->getSpelling() << getToolChain().getTriple().str();
2742
2743 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2744
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002745 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002746 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002747
Chandler Carruth76a943b2012-11-19 03:52:03 +00002748 // Only a forced PIC mode can cause the actual compile to have PIC defines
2749 // etc., no flags are sufficient. This behavior was selected to closely
2750 // match that of llvm-gcc and Apple GCC before that.
2751 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2752 CmdArgs.push_back("-pic-level");
2753 CmdArgs.push_back("2");
2754 }
2755 } else {
2756 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2757 // handled in Clang's IRGen by the -pie-level flag.
2758 CmdArgs.push_back("-mrelocation-model");
2759 CmdArgs.push_back(PIC ? "pic" : "static");
2760
2761 if (PIC) {
2762 CmdArgs.push_back("-pic-level");
2763 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2764 if (PIE) {
2765 CmdArgs.push_back("-pie-level");
2766 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2767 }
2768 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002769 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002770
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002771 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2772 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002773 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002774
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002775 // LLVM Code Generator Options.
2776
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002777 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2778 StringRef v = A->getValue();
2779 CmdArgs.push_back("-mllvm");
2780 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2781 A->claim();
2782 }
2783
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002784 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2785 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002786 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002787 }
2788
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002789 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2790 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002791 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002792 D.Diag(diag::err_drv_unsupported_opt_for_target)
2793 << A->getSpelling() << getToolChain().getTriple().str();
2794 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2795 CmdArgs.push_back("-fpcc-struct-return");
2796 } else {
2797 assert(A->getOption().matches(options::OPT_freg_struct_return));
2798 CmdArgs.push_back("-freg-struct-return");
2799 }
2800 }
2801
Roman Divacky65b88cd2011-03-01 17:40:53 +00002802 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2803 CmdArgs.push_back("-mrtd");
2804
Rafael Espindola224dd632011-12-14 21:02:23 +00002805 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002806 CmdArgs.push_back("-mdisable-fp-elim");
2807 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2808 options::OPT_fno_zero_initialized_in_bss))
2809 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002810
2811 bool OFastEnabled = isOptimizationLevelFast(Args);
2812 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2813 // enabled. This alias option is being used to simplify the hasFlag logic.
2814 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2815 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002816 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2817 // doesn't do any TBAA.
2818 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002819 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002820 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002821 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002822 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2823 options::OPT_fno_struct_path_tbaa))
2824 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002825 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2826 false))
2827 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002828 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2829 options::OPT_fno_optimize_sibling_calls))
2830 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002831
Eric Christopher006208c2013-04-04 06:29:47 +00002832 // Handle segmented stacks.
2833 if (Args.hasArg(options::OPT_fsplit_stack))
2834 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002835
2836 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2837 // This alias option is being used to simplify the getLastArg logic.
2838 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2839 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002840
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002841 // Handle various floating point optimization flags, mapping them to the
2842 // appropriate LLVM code generation flags. The pattern for all of these is to
2843 // default off the codegen optimizations, and if any flag enables them and no
2844 // flag disables them after the flag enabling them, enable the codegen
2845 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002846 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002847 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002848 options::OPT_ffinite_math_only,
2849 options::OPT_fno_finite_math_only,
2850 options::OPT_fhonor_infinities,
2851 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002852 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2853 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002854 A->getOption().getID() != options::OPT_fhonor_infinities)
2855 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002856 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002857 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002858 options::OPT_ffinite_math_only,
2859 options::OPT_fno_finite_math_only,
2860 options::OPT_fhonor_nans,
2861 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002862 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2863 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002864 A->getOption().getID() != options::OPT_fhonor_nans)
2865 CmdArgs.push_back("-menable-no-nans");
2866
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002867 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2868 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002869 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002870 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002871 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002872 options::OPT_fno_math_errno)) {
2873 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2874 // However, turning *off* -ffast_math merely restores the toolchain default
2875 // (which may be false).
2876 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2877 A->getOption().getID() == options::OPT_ffast_math ||
2878 A->getOption().getID() == options::OPT_Ofast)
2879 MathErrno = false;
2880 else if (A->getOption().getID() == options::OPT_fmath_errno)
2881 MathErrno = true;
2882 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002883 if (MathErrno)
2884 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002885
2886 // There are several flags which require disabling very specific
2887 // optimizations. Any of these being disabled forces us to turn off the
2888 // entire set of LLVM optimizations, so collect them through all the flag
2889 // madness.
2890 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002891 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002892 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002893 options::OPT_funsafe_math_optimizations,
2894 options::OPT_fno_unsafe_math_optimizations,
2895 options::OPT_fassociative_math,
2896 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002897 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2898 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002899 A->getOption().getID() != options::OPT_fno_associative_math)
2900 AssociativeMath = true;
2901 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002902 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002903 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002904 options::OPT_funsafe_math_optimizations,
2905 options::OPT_fno_unsafe_math_optimizations,
2906 options::OPT_freciprocal_math,
2907 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002908 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2909 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002910 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2911 ReciprocalMath = true;
2912 bool SignedZeros = true;
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,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002915 options::OPT_funsafe_math_optimizations,
2916 options::OPT_fno_unsafe_math_optimizations,
2917 options::OPT_fsigned_zeros,
2918 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002919 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2920 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002921 A->getOption().getID() != options::OPT_fsigned_zeros)
2922 SignedZeros = false;
2923 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002924 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002925 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002926 options::OPT_funsafe_math_optimizations,
2927 options::OPT_fno_unsafe_math_optimizations,
2928 options::OPT_ftrapping_math,
2929 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002930 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2931 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002932 A->getOption().getID() != options::OPT_ftrapping_math)
2933 TrappingMath = false;
2934 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2935 !TrappingMath)
2936 CmdArgs.push_back("-menable-unsafe-fp-math");
2937
Lang Hamesaa53b932012-07-06 00:59:19 +00002938
2939 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002940 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002941 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002942 options::OPT_ffp_contract)) {
2943 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002944 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002945 if (Val == "fast" || Val == "on" || Val == "off") {
2946 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2947 } else {
2948 D.Diag(diag::err_drv_unsupported_option_argument)
2949 << A->getOption().getName() << Val;
2950 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002951 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2952 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002953 // If fast-math is set then set the fp-contract mode to fast.
2954 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2955 }
2956 }
2957
Bob Wilson6a039162012-07-19 03:52:53 +00002958 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2959 // and if we find them, tell the frontend to provide the appropriate
2960 // preprocessor macros. This is distinct from enabling any optimizations as
2961 // these options induce language changes which must survive serialization
2962 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002963 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2964 options::OPT_fno_fast_math))
2965 if (!A->getOption().matches(options::OPT_fno_fast_math))
2966 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002967 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2968 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002969 if (A->getOption().matches(options::OPT_ffinite_math_only))
2970 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002971
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002972 // Decide whether to use verbose asm. Verbose assembly is the default on
2973 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002974 bool IsIntegratedAssemblerDefault =
2975 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002976 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002977 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002978 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002979 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002980
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002981 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002982 IsIntegratedAssemblerDefault))
2983 CmdArgs.push_back("-no-integrated-as");
2984
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002985 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2986 CmdArgs.push_back("-mdebug-pass");
2987 CmdArgs.push_back("Structure");
2988 }
2989 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2990 CmdArgs.push_back("-mdebug-pass");
2991 CmdArgs.push_back("Arguments");
2992 }
2993
John McCall8517abc2010-02-19 02:45:38 +00002994 // Enable -mconstructor-aliases except on darwin, where we have to
2995 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002996 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002997 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002998
John McCall7ef5cb32011-03-18 02:56:14 +00002999 // Darwin's kernel doesn't support guard variables; just die if we
3000 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003001 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003002 CmdArgs.push_back("-fforbid-guard-variables");
3003
Douglas Gregordbe39272011-02-01 15:15:22 +00003004 if (Args.hasArg(options::OPT_mms_bitfields)) {
3005 CmdArgs.push_back("-mms-bitfields");
3006 }
John McCall8517abc2010-02-19 02:45:38 +00003007
Daniel Dunbar306945d2009-09-16 06:17:29 +00003008 // This is a coarse approximation of what llvm-gcc actually does, both
3009 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3010 // complicated ways.
3011 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003012 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3013 options::OPT_fno_asynchronous_unwind_tables,
3014 (getToolChain().IsUnwindTablesDefault() ||
3015 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3016 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003017 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3018 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003019 CmdArgs.push_back("-munwind-tables");
3020
Chandler Carruth05fb5852012-11-21 23:40:23 +00003021 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003022
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003023 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3024 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003025 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003026 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003027
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003028 // FIXME: Handle -mtune=.
3029 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003030
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003031 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003032 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003033 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003034 }
3035
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003036 // Add the target cpu
3037 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3038 llvm::Triple ETriple(ETripleStr);
3039 std::string CPU = getCPUName(Args, ETriple);
3040 if (!CPU.empty()) {
3041 CmdArgs.push_back("-target-cpu");
3042 CmdArgs.push_back(Args.MakeArgString(CPU));
3043 }
3044
Rafael Espindolaeb265472013-08-21 21:59:03 +00003045 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3046 CmdArgs.push_back("-mfpmath");
3047 CmdArgs.push_back(A->getValue());
3048 }
3049
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003050 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003051 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003052
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003053 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003054 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003055 default:
3056 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003057
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003058 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003059 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003060 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003061 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003062 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003063 break;
3064
Tim Northover573cbee2014-05-24 12:52:07 +00003065 case llvm::Triple::aarch64:
3066 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003067 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003068 break;
3069
Eric Christopher0b26a612010-03-02 02:41:08 +00003070 case llvm::Triple::mips:
3071 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003072 case llvm::Triple::mips64:
3073 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003074 AddMIPSTargetArgs(Args, CmdArgs);
3075 break;
3076
Ulrich Weigand8afad612014-07-28 13:17:52 +00003077 case llvm::Triple::ppc:
3078 case llvm::Triple::ppc64:
3079 case llvm::Triple::ppc64le:
3080 AddPPCTargetArgs(Args, CmdArgs);
3081 break;
3082
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003083 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003084 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003085 AddSparcTargetArgs(Args, CmdArgs);
3086 break;
3087
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003088 case llvm::Triple::x86:
3089 case llvm::Triple::x86_64:
3090 AddX86TargetArgs(Args, CmdArgs);
3091 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003092
3093 case llvm::Triple::hexagon:
3094 AddHexagonTargetArgs(Args, CmdArgs);
3095 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003096 }
3097
Hans Wennborg75958c42013-08-08 00:17:41 +00003098 // Add clang-cl arguments.
3099 if (getToolChain().getDriver().IsCLMode())
3100 AddClangCLArgs(Args, CmdArgs);
3101
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003102 // Pass the linker version in use.
3103 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3104 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003105 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003106 }
3107
Eric Christopherb7d97e92013-04-03 01:58:53 +00003108 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003109 CmdArgs.push_back("-momit-leaf-frame-pointer");
3110
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003111 // Explicitly error on some things we know we don't support and can't just
3112 // ignore.
3113 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003114 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3115 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003116 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003117 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003118 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003119 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3120 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003121 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003122 << Unsupported->getOption().getName();
3123 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003124 }
3125
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003126 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003127 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003128 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003129 CmdArgs.push_back("-header-include-file");
3130 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3131 D.CCPrintHeadersFilename : "-");
3132 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003133 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003134 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003135
Chad Rosierbe10f982011-08-02 17:58:04 +00003136 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003137 CmdArgs.push_back("-diagnostic-log-file");
3138 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3139 D.CCLogDiagnosticsFilename : "-");
3140 }
3141
Manman Ren17bdb0f2013-11-20 20:22:14 +00003142 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3143 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003144 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003145 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00003146 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003147 // FIXME: we should support specifying dwarf version with
3148 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003149 CmdArgs.push_back("-gline-tables-only");
Brad Smith378e7f9b2014-06-13 03:35:37 +00003150 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3151 const llvm::Triple &Triple = getToolChain().getTriple();
3152 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3153 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003154 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003155 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003156 CmdArgs.push_back("-gdwarf-2");
3157 else if (A->getOption().matches(options::OPT_gdwarf_3))
3158 CmdArgs.push_back("-gdwarf-3");
3159 else if (A->getOption().matches(options::OPT_gdwarf_4))
3160 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003161 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003162 !A->getOption().matches(options::OPT_ggdb0)) {
Brad Smith378e7f9b2014-06-13 03:35:37 +00003163 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3164 const llvm::Triple &Triple = getToolChain().getTriple();
3165 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3166 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003167 CmdArgs.push_back("-gdwarf-2");
3168 else
3169 CmdArgs.push_back("-g");
3170 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003171 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003172
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003173 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3174 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003175 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3176 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003177 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003178
Eric Christopher138c32b2013-09-13 22:37:55 +00003179 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003180 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3181 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003182 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003183 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003184 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003185 CmdArgs.push_back("-g");
3186 CmdArgs.push_back("-backend-option");
3187 CmdArgs.push_back("-split-dwarf=Enable");
3188 }
3189
Eric Christopher138c32b2013-09-13 22:37:55 +00003190 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3191 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3192 CmdArgs.push_back("-backend-option");
3193 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3194 }
Eric Christophereec89c22013-06-18 00:03:50 +00003195
Eric Christopher0d403d22014-02-14 01:27:03 +00003196 // -gdwarf-aranges turns on the emission of the aranges section in the
3197 // backend.
3198 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3199 CmdArgs.push_back("-backend-option");
3200 CmdArgs.push_back("-generate-arange-section");
3201 }
3202
David Blaikief36d9ba2014-01-27 18:52:43 +00003203 if (Args.hasFlag(options::OPT_fdebug_types_section,
3204 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003205 CmdArgs.push_back("-backend-option");
3206 CmdArgs.push_back("-generate-type-units");
3207 }
Eric Christophereec89c22013-06-18 00:03:50 +00003208
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003209 if (Args.hasFlag(options::OPT_ffunction_sections,
3210 options::OPT_fno_function_sections, false)) {
3211 CmdArgs.push_back("-ffunction-sections");
3212 }
3213
3214 if (Args.hasFlag(options::OPT_fdata_sections,
3215 options::OPT_fno_data_sections, false)) {
3216 CmdArgs.push_back("-fdata-sections");
3217 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003218
Chris Lattner3c77a352010-06-22 00:03:40 +00003219 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3220
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003221 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3222 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3223 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3224 D.Diag(diag::err_drv_argument_not_allowed_with)
3225 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3226
3227 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3228
3229 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3230 A->render(Args, CmdArgs);
3231 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3232 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3233
Nick Lewycky207bce32011-04-21 23:44:07 +00003234 if (Args.hasArg(options::OPT_ftest_coverage) ||
3235 Args.hasArg(options::OPT_coverage))
3236 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003237 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3238 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003239 Args.hasArg(options::OPT_coverage))
3240 CmdArgs.push_back("-femit-coverage-data");
3241
Alex Lorenzee024992014-08-04 18:41:51 +00003242 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3243 !Args.hasArg(options::OPT_fprofile_instr_generate))
3244 D.Diag(diag::err_drv_argument_only_allowed_with)
3245 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3246
3247 if (Args.hasArg(options::OPT_fcoverage_mapping))
3248 CmdArgs.push_back("-fcoverage-mapping");
3249
Nick Lewycky480cb992011-05-04 20:46:58 +00003250 if (C.getArgs().hasArg(options::OPT_c) ||
3251 C.getArgs().hasArg(options::OPT_S)) {
3252 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003253 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00003254 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00003255 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003256 SmallString<128> Pwd;
3257 if (!llvm::sys::fs::current_path(Pwd)) {
3258 llvm::sys::path::append(Pwd, CoverageFilename.str());
3259 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003260 }
3261 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003262 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003263 }
3264 }
3265
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003266 // Pass options for controlling the default header search paths.
3267 if (Args.hasArg(options::OPT_nostdinc)) {
3268 CmdArgs.push_back("-nostdsysteminc");
3269 CmdArgs.push_back("-nobuiltininc");
3270 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003271 if (Args.hasArg(options::OPT_nostdlibinc))
3272 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003273 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3274 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3275 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003276
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003277 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003278 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003279 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003280
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003281 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3282
Ted Kremenekf7639e12012-03-06 20:06:33 +00003283 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003284 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003285 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003286 options::OPT_ccc_arcmt_modify,
3287 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003288 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003289 switch (A->getOption().getID()) {
3290 default:
3291 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003292 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003293 CmdArgs.push_back("-arcmt-check");
3294 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003295 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003296 CmdArgs.push_back("-arcmt-modify");
3297 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003298 case options::OPT_ccc_arcmt_migrate:
3299 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003300 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003301 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003302
3303 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3304 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003305 break;
John McCalld70fb982011-06-15 23:25:17 +00003306 }
3307 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003308 } else {
3309 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3310 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3311 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003312 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003313
Ted Kremenekf7639e12012-03-06 20:06:33 +00003314 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3315 if (ARCMTEnabled) {
3316 D.Diag(diag::err_drv_argument_not_allowed_with)
3317 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3318 }
3319 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003320 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003321
3322 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003323 options::OPT_objcmt_migrate_subscripting,
3324 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003325 // None specified, means enable them all.
3326 CmdArgs.push_back("-objcmt-migrate-literals");
3327 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003328 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003329 } else {
3330 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3331 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003332 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003333 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003334 } else {
3335 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3336 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3337 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3338 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3339 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3340 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3341 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3342 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3343 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3344 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3345 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3346 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3347 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003348 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003349 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003350 }
3351
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003352 // Add preprocessing options like -I, -D, etc. if we are using the
3353 // preprocessor.
3354 //
3355 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003356 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003357 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003358
Rafael Espindolaa7431922011-07-21 23:40:37 +00003359 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3360 // that "The compiler can only warn and ignore the option if not recognized".
3361 // When building with ccache, it will pass -D options to clang even on
3362 // preprocessed inputs and configure concludes that -fPIC is not supported.
3363 Args.ClaimAllArgs(options::OPT_D);
3364
Alp Toker7874bdc2013-11-15 20:40:58 +00003365 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003366 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3367 if (A->getOption().matches(options::OPT_O4)) {
3368 CmdArgs.push_back("-O3");
3369 D.Diag(diag::warn_O4_is_O3);
3370 } else {
3371 A->render(Args, CmdArgs);
3372 }
3373 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003374
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003375 // Warn about ignored options to clang.
3376 for (arg_iterator it = Args.filtered_begin(
3377 options::OPT_clang_ignored_gcc_optimization_f_Group),
3378 ie = Args.filtered_end(); it != ie; ++it) {
3379 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3380 }
3381
Chad Rosier86b82082012-12-12 20:06:31 +00003382 // Don't warn about unused -flto. This can happen when we're preprocessing or
3383 // precompiling.
3384 Args.ClaimAllArgs(options::OPT_flto);
3385
Richard Smith3be1cb22014-08-07 00:24:21 +00003386 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003387 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003388 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3389 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003390 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003391 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003392
3393 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003394 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003395 //
3396 // If a std is supplied, only add -trigraphs if it follows the
3397 // option.
3398 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3399 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003400 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003401 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003402 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003403 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003404 else
3405 Std->render(Args, CmdArgs);
3406
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003407 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3408 options::OPT_trigraphs))
3409 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003410 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003411 } else {
3412 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003413 //
3414 // FIXME: Clang doesn't correctly handle -std= when the input language
3415 // doesn't match. For the time being just ignore this for C++ inputs;
3416 // eventually we want to do all the standard defaulting here instead of
3417 // splitting it between the driver and clang -cc1.
3418 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003419 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3420 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003421 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003422 CmdArgs.push_back("-std=c++11");
3423
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003424 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003425 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003426
Richard Smith282b4492013-09-04 22:50:31 +00003427 // GCC's behavior for -Wwrite-strings is a bit strange:
3428 // * In C, this "warning flag" changes the types of string literals from
3429 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3430 // for the discarded qualifier.
3431 // * In C++, this is just a normal warning flag.
3432 //
3433 // Implementing this warning correctly in C is hard, so we follow GCC's
3434 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3435 // a non-const char* in C, rather than using this crude hack.
3436 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003437 // FIXME: This should behave just like a warning flag, and thus should also
3438 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3439 Arg *WriteStrings =
3440 Args.getLastArg(options::OPT_Wwrite_strings,
3441 options::OPT_Wno_write_strings, options::OPT_w);
3442 if (WriteStrings &&
3443 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003444 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003445 }
3446
Chandler Carruth61fbf622011-04-23 09:27:53 +00003447 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003448 // during C++ compilation, which it is by default. GCC keeps this define even
3449 // in the presence of '-w', match this behavior bug-for-bug.
3450 if (types::isCXX(InputType) &&
3451 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3452 true)) {
3453 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003454 }
3455
Chandler Carruthe0391482010-05-22 02:21:53 +00003456 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3457 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3458 if (Asm->getOption().matches(options::OPT_fasm))
3459 CmdArgs.push_back("-fgnu-keywords");
3460 else
3461 CmdArgs.push_back("-fno-gnu-keywords");
3462 }
3463
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003464 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3465 CmdArgs.push_back("-fno-dwarf-directory-asm");
3466
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003467 if (ShouldDisableAutolink(Args, getToolChain()))
3468 CmdArgs.push_back("-fno-autolink");
3469
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003470 // Add in -fdebug-compilation-dir if necessary.
3471 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003472
Richard Smith9a568822011-11-21 19:36:32 +00003473 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3474 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003475 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003476 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003477 }
3478
Richard Smith79c927b2013-11-06 19:31:51 +00003479 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3480 CmdArgs.push_back("-foperator-arrow-depth");
3481 CmdArgs.push_back(A->getValue());
3482 }
3483
Richard Smith9a568822011-11-21 19:36:32 +00003484 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3485 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003486 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003487 }
3488
Richard Smitha3d3bd22013-05-08 02:12:03 +00003489 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3490 CmdArgs.push_back("-fconstexpr-steps");
3491 CmdArgs.push_back(A->getValue());
3492 }
3493
Richard Smithb3a14522013-02-22 01:59:51 +00003494 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3495 CmdArgs.push_back("-fbracket-depth");
3496 CmdArgs.push_back(A->getValue());
3497 }
3498
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003499 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3500 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003501 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003502 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003503 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3504 } else
3505 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003506 }
3507
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003508
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003509 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003510 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003511
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003512 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3513 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003514 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003515 }
David Chisnall5778fce2009-08-31 16:41:57 +00003516
Chris Lattnere23003d2010-01-09 21:54:33 +00003517 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3518 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003519 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003520 }
3521
Chris Lattnerb35583d2010-04-07 20:49:23 +00003522 CmdArgs.push_back("-ferror-limit");
3523 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003524 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003525 else
3526 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003527
Chandler Carrutha77a7272010-05-06 04:55:18 +00003528 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3529 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003530 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003531 }
3532
3533 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3534 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003535 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003536 }
3537
Richard Smithf6f003a2011-12-16 19:06:07 +00003538 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3539 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003540 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003541 }
3542
Daniel Dunbar2c978472009-11-04 06:24:47 +00003543 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003544 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003545 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003546 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003547 } else {
3548 // If -fmessage-length=N was not specified, determine whether this is a
3549 // terminal and, if so, implicitly define -fmessage-length appropriately.
3550 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003551 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003552 }
3553
John McCallb4a99d32013-02-19 01:57:35 +00003554 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3555 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3556 options::OPT_fvisibility_ms_compat)) {
3557 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3558 CmdArgs.push_back("-fvisibility");
3559 CmdArgs.push_back(A->getValue());
3560 } else {
3561 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3562 CmdArgs.push_back("-fvisibility");
3563 CmdArgs.push_back("hidden");
3564 CmdArgs.push_back("-ftype-visibility");
3565 CmdArgs.push_back("default");
3566 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003567 }
3568
Douglas Gregor08329632010-06-15 17:05:35 +00003569 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003570
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003571 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3572
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003573 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003574 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3575 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003576 CmdArgs.push_back("-ffreestanding");
3577
Daniel Dunbare357d562009-12-03 18:42:11 +00003578 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003579 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003580 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003581 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3582 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003583 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003584 // AltiVec language extensions aren't relevant for assembling.
3585 if (!isa<PreprocessJobAction>(JA) ||
3586 Output.getType() != types::TY_PP_Asm)
3587 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003588 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3589 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003590
Peter Collingbourne32701642013-11-01 18:16:25 +00003591 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3592 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003593
Will Dietz3676d562012-12-30 20:53:28 +00003594 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3595 options::OPT_fno_sanitize_recover,
3596 true))
3597 CmdArgs.push_back("-fno-sanitize-recover");
3598
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003599 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003600 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3601 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3602
Eric Christopher459d2712013-02-19 06:16:53 +00003603 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003604 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003605 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003606 getToolChain().getArch() == llvm::Triple::ppc64 ||
3607 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003608 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003609 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003610
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003611 if (getToolChain().SupportsProfiling())
3612 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003613
3614 // -flax-vector-conversions is default.
3615 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3616 options::OPT_fno_lax_vector_conversions))
3617 CmdArgs.push_back("-fno-lax-vector-conversions");
3618
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003619 if (Args.getLastArg(options::OPT_fapple_kext))
3620 CmdArgs.push_back("-fapple-kext");
3621
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003622 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003623 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003624 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003625 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3626 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003627
3628 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3629 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003630 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003631 }
3632
Bob Wilson14adb362012-02-03 06:27:22 +00003633 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003634
Chandler Carruth6e501032011-03-27 00:04:55 +00003635 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3636 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3637 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3638 options::OPT_fno_wrapv)) {
3639 if (A->getOption().matches(options::OPT_fwrapv))
3640 CmdArgs.push_back("-fwrapv");
3641 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3642 options::OPT_fno_strict_overflow)) {
3643 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3644 CmdArgs.push_back("-fwrapv");
3645 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003646
3647 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3648 options::OPT_fno_reroll_loops))
3649 if (A->getOption().matches(options::OPT_freroll_loops))
3650 CmdArgs.push_back("-freroll-loops");
3651
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003652 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003653 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3654 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003655
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003656 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3657
Mahesha S6a682be42012-10-27 07:47:56 +00003658
Daniel Dunbar4930e332009-11-17 08:07:36 +00003659 // -stack-protector=0 is default.
3660 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003661 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3662 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003663 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003664 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003665 if (A->getOption().matches(options::OPT_fstack_protector)) {
3666 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3667 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3668 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003669 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003670 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003671 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003672 } else {
3673 StackProtectorLevel =
3674 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3675 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003676 if (StackProtectorLevel) {
3677 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003678 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003679 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003680
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003681 // --param ssp-buffer-size=
3682 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3683 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003684 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003685 if (Str.startswith("ssp-buffer-size=")) {
3686 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003687 CmdArgs.push_back("-stack-protector-buffer-size");
3688 // FIXME: Verify the argument is a valid integer.
3689 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003690 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003691 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003692 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003693 }
3694
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003695 // Translate -mstackrealign
3696 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3697 false)) {
3698 CmdArgs.push_back("-backend-option");
3699 CmdArgs.push_back("-force-align-stack");
3700 }
3701 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3702 false)) {
3703 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3704 }
3705
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003706 if (Args.hasArg(options::OPT_mstack_alignment)) {
3707 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3708 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003709 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003710
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003711 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3712 options::OPT_mno_restrict_it)) {
3713 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3714 CmdArgs.push_back("-backend-option");
3715 CmdArgs.push_back("-arm-restrict-it");
3716 } else {
3717 CmdArgs.push_back("-backend-option");
3718 CmdArgs.push_back("-arm-no-restrict-it");
3719 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003720 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3721 TT.getArch() == llvm::Triple::thumb)) {
3722 // Windows on ARM expects restricted IT blocks
3723 CmdArgs.push_back("-backend-option");
3724 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003725 }
3726
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003727 if (TT.getArch() == llvm::Triple::arm ||
3728 TT.getArch() == llvm::Triple::thumb) {
3729 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3730 options::OPT_mno_long_calls)) {
3731 if (A->getOption().matches(options::OPT_mlong_calls)) {
3732 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003733 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003734 }
3735 }
3736 }
3737
Daniel Dunbard18049a2009-04-07 21:16:11 +00003738 // Forward -f options with positive and negative forms; we translate
3739 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003740 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3741 StringRef fname = A->getValue();
3742 if (!llvm::sys::fs::exists(fname))
3743 D.Diag(diag::err_drv_no_such_file) << fname;
3744 else
3745 A->render(Args, CmdArgs);
3746 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003747
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003748 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003749 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003750 CmdArgs.push_back("-fapple-kext");
3751 if (!Args.hasArg(options::OPT_fbuiltin))
3752 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003753 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003754 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003755 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003756 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003757 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003758
Nuno Lopes13c88c72009-12-16 16:59:22 +00003759 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3760 options::OPT_fno_assume_sane_operator_new))
3761 CmdArgs.push_back("-fno-assume-sane-operator-new");
3762
Daniel Dunbar4930e332009-11-17 08:07:36 +00003763 // -fblocks=0 is default.
3764 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003765 getToolChain().IsBlocksDefault()) ||
3766 (Args.hasArg(options::OPT_fgnu_runtime) &&
3767 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3768 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003769 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003770
3771 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3772 !getToolChain().hasBlocksRuntime())
3773 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003774 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003775
Douglas Gregor226173a2012-01-18 15:19:58 +00003776 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3777 // users must also pass -fcxx-modules. The latter flag will disappear once the
3778 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003779 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003780 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3781 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3782 options::OPT_fno_cxx_modules,
3783 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003784 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003785 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003786 HaveModules = true;
3787 }
3788 }
3789
Daniel Jasper07e6c402013-08-05 20:26:17 +00003790 // -fmodule-maps enables module map processing (off by default) for header
3791 // checking. It is implied by -fmodules.
3792 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3793 false)) {
3794 CmdArgs.push_back("-fmodule-maps");
3795 }
3796
Daniel Jasperac42b752013-10-21 06:34:34 +00003797 // -fmodules-decluse checks that modules used are declared so (off by
3798 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003799 if (Args.hasFlag(options::OPT_fmodules_decluse,
3800 options::OPT_fno_modules_decluse,
3801 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003802 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003803 }
3804
Daniel Jasper962b38e2014-04-11 11:47:45 +00003805 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3806 // all #included headers are part of modules.
3807 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3808 options::OPT_fno_modules_strict_decluse,
3809 false)) {
3810 CmdArgs.push_back("-fmodules-strict-decluse");
3811 }
3812
Daniel Jasperac42b752013-10-21 06:34:34 +00003813 // -fmodule-name specifies the module that is currently being built (or
3814 // used for header checking by -fmodule-maps).
Justin Bogner5443ad52014-06-20 21:12:53 +00003815 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasperac42b752013-10-21 06:34:34 +00003816 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003817
3818 // -fmodule-map-file can be used to specify a file containing module
3819 // definitions.
Justin Bogner5443ad52014-06-20 21:12:53 +00003820 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasperac42b752013-10-21 06:34:34 +00003821 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003822
Justin Bognera88f0122014-06-20 22:59:50 +00003823 // -fmodule-cache-path specifies where our module files should be written.
3824 SmallString<128> ModuleCachePath;
3825 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3826 ModuleCachePath = A->getValue();
3827 if (HaveModules) {
3828 if (C.isForDiagnostics()) {
3829 // When generating crash reports, we want to emit the modules along with
3830 // the reproduction sources, so we ignore any provided module path.
3831 ModuleCachePath = Output.getFilename();
3832 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3833 llvm::sys::path::append(ModuleCachePath, "modules");
3834 } else if (ModuleCachePath.empty()) {
3835 // No module path was provided: use the default.
3836 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3837 ModuleCachePath);
3838 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3839 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3840 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003841 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003842 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3843 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3844 }
3845
3846 // When building modules and generating crashdumps, we need to dump a module
3847 // dependency VFS alongside the output.
3848 if (HaveModules && C.isForDiagnostics()) {
3849 SmallString<128> VFSDir(Output.getFilename());
3850 llvm::sys::path::replace_extension(VFSDir, ".cache");
3851 llvm::sys::path::append(VFSDir, "vfs");
3852 CmdArgs.push_back("-module-dependency-dir");
3853 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003854 }
3855
Justin Bogner5443ad52014-06-20 21:12:53 +00003856 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3857 if (HaveModules)
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003858 A->render(Args, CmdArgs);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003859
Douglas Gregor35b04d62013-02-07 19:01:24 +00003860 // Pass through all -fmodules-ignore-macro arguments.
3861 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003862 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3863 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003864
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003865 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3866
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003867 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3868 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3869 D.Diag(diag::err_drv_argument_not_allowed_with)
3870 << A->getAsString(Args) << "-fbuild-session-timestamp";
3871
3872 llvm::sys::fs::file_status Status;
3873 if (llvm::sys::fs::status(A->getValue(), Status))
3874 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003875 char TimeStamp[48];
3876 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3877 (uint64_t)Status.getLastModificationTime().toEpochTime());
3878 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003879 }
3880
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003881 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003882 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3883 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003884 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3885
3886 Args.AddLastArg(CmdArgs,
3887 options::OPT_fmodules_validate_once_per_build_session);
3888 }
3889
Ben Langmuirdcf73862014-03-12 00:06:17 +00003890 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3891
John McCalldfea9982010-04-09 19:12:06 +00003892 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003893 if (Args.hasFlag(options::OPT_fno_access_control,
3894 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003895 false))
John McCall3155f572010-04-09 19:03:51 +00003896 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003897
Anders Carlssond470fef2010-11-21 00:09:52 +00003898 // -felide-constructors is the default.
3899 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3900 options::OPT_felide_constructors,
3901 false))
3902 CmdArgs.push_back("-fno-elide-constructors");
3903
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003904 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003905 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003906 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003907 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003908
Richard Smith52be6192012-11-05 22:04:41 +00003909 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003910 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003911 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003912 Args.getLastArg(options::OPT_mkernel,
3913 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003914 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003915 D.Diag(diag::err_drv_argument_not_allowed_with)
3916 << "-fsanitize=vptr" << NoRttiArg;
3917 }
3918 }
3919
Tony Linthicum76329bf2011-12-12 21:14:55 +00003920 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003921 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003922 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003923 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003924 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003925 CmdArgs.push_back("-fshort-enums");
3926
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003927 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003928 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003929 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003930 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003931
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003932 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003933 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003934 options::OPT_fno_threadsafe_statics))
3935 CmdArgs.push_back("-fno-threadsafe-statics");
3936
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003937 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003938 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3939 options::OPT_fno_use_cxa_atexit,
3940 !IsWindowsCygnus && !IsWindowsGNU &&
3941 getToolChain().getArch() != llvm::Triple::hexagon &&
3942 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003943 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003944 CmdArgs.push_back("-fno-use-cxa-atexit");
3945
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003946 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003947 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003948 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003949 CmdArgs.push_back("-fms-extensions");
3950
Francois Pichet1b4f1632011-09-17 04:32:15 +00003951 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003952 if (Args.hasFlag(options::OPT_fms_compatibility,
3953 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003954 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3955 options::OPT_fno_ms_extensions,
3956 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003957 CmdArgs.push_back("-fms-compatibility");
3958
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003959 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003960 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003961 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
3962 Args.hasArg(options::OPT_fms_compatibility_version)) {
3963 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3964 const Arg *MSCompatibilityVersion =
3965 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003966
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003967 if (MSCVersion && MSCompatibilityVersion)
3968 D.Diag(diag::err_drv_argument_not_allowed_with)
3969 << MSCVersion->getAsString(Args)
3970 << MSCompatibilityVersion->getAsString(Args);
3971
3972 std::string Ver;
3973 if (MSCompatibilityVersion)
3974 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
3975 else if (MSCVersion)
3976 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
3977
3978 if (Ver.empty())
3979 CmdArgs.push_back("-fms-compatibility-version=17.00");
3980 else
3981 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
3982 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003983
Eric Christopher5ecce122013-02-18 00:38:31 +00003984 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003985 if (Args.hasFlag(options::OPT_fborland_extensions,
3986 options::OPT_fno_borland_extensions, false))
3987 CmdArgs.push_back("-fborland-extensions");
3988
Francois Pichet02744872011-09-01 16:38:08 +00003989 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3990 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003991 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003992 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003993 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003994
Chandler Carruthe03aa552010-04-17 20:17:31 +00003995 // -fgnu-keywords default varies depending on language; only pass if
3996 // specified.
3997 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003998 options::OPT_fno_gnu_keywords))
3999 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004000
Rafael Espindola922a6242011-06-02 17:30:53 +00004001 if (Args.hasFlag(options::OPT_fgnu89_inline,
4002 options::OPT_fno_gnu89_inline,
4003 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004004 CmdArgs.push_back("-fgnu89-inline");
4005
Chad Rosier9c76d242012-03-15 22:31:42 +00004006 if (Args.hasArg(options::OPT_fno_inline))
4007 CmdArgs.push_back("-fno-inline");
4008
Chad Rosier64d6be92012-03-06 21:17:19 +00004009 if (Args.hasArg(options::OPT_fno_inline_functions))
4010 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004011
John McCall5fb5df92012-06-20 06:18:46 +00004012 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004013
John McCall5fb5df92012-06-20 06:18:46 +00004014 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004015 // legacy is the default. Except for deployment taget of 10.5,
4016 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4017 // gets ignored silently.
4018 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004019 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4020 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004021 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004022 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004023 if (getToolChain().UseObjCMixedDispatch())
4024 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4025 else
4026 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4027 }
4028 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004029
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004030 // When ObjectiveC legacy runtime is in effect on MacOSX,
4031 // turn on the option to do Array/Dictionary subscripting
4032 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004033 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4034 getToolChain().getTriple().isMacOSX() &&
4035 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4036 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004037 objcRuntime.isNeXTFamily())
4038 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4039
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004040 // -fencode-extended-block-signature=1 is default.
4041 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4042 CmdArgs.push_back("-fencode-extended-block-signature");
4043 }
4044
John McCall24fc0de2011-07-06 00:26:06 +00004045 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4046 // NOTE: This logic is duplicated in ToolChains.cpp.
4047 bool ARC = isObjCAutoRefCount(Args);
4048 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004049 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004050
John McCall24fc0de2011-07-06 00:26:06 +00004051 CmdArgs.push_back("-fobjc-arc");
4052
Chandler Carruth491db322011-11-04 07:34:47 +00004053 // FIXME: It seems like this entire block, and several around it should be
4054 // wrapped in isObjC, but for now we just use it here as this is where it
4055 // was being used previously.
4056 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4057 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4058 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4059 else
4060 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4061 }
4062
John McCall24fc0de2011-07-06 00:26:06 +00004063 // Allow the user to enable full exceptions code emission.
4064 // We define off for Objective-CC, on for Objective-C++.
4065 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4066 options::OPT_fno_objc_arc_exceptions,
4067 /*default*/ types::isCXX(InputType)))
4068 CmdArgs.push_back("-fobjc-arc-exceptions");
4069 }
4070
4071 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4072 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004073 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004074 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004075
John McCall24fc0de2011-07-06 00:26:06 +00004076 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4077 // takes precedence.
4078 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4079 if (!GCArg)
4080 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4081 if (GCArg) {
4082 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004083 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004084 << GCArg->getAsString(Args);
4085 } else if (getToolChain().SupportsObjCGC()) {
4086 GCArg->render(Args, CmdArgs);
4087 } else {
4088 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004089 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004090 << GCArg->getAsString(Args);
4091 }
4092 }
4093
Reid Klecknerc542d372014-06-27 17:02:02 +00004094 // Handle GCC-style exception args.
4095 if (!C.getDriver().IsCLMode())
4096 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4097 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004098
4099 if (getToolChain().UseSjLjExceptions())
4100 CmdArgs.push_back("-fsjlj-exceptions");
4101
4102 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004103 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4104 options::OPT_fno_assume_sane_operator_new))
4105 CmdArgs.push_back("-fno-assume-sane-operator-new");
4106
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004107 // -fconstant-cfstrings is default, and may be subject to argument translation
4108 // on Darwin.
4109 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4110 options::OPT_fno_constant_cfstrings) ||
4111 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4112 options::OPT_mno_constant_cfstrings))
4113 CmdArgs.push_back("-fno-constant-cfstrings");
4114
John Thompsoned4e2952009-11-05 20:14:16 +00004115 // -fshort-wchar default varies depending on platform; only
4116 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004117 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4118 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004119 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004120
Hans Wennborg28c96312013-07-31 23:39:13 +00004121 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004122 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004123 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004124 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004125 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004126
Daniel Dunbar096ed292011-10-05 21:04:55 +00004127 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4128 // -fno-pack-struct doesn't apply to -fpack-struct=.
4129 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004130 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004131 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004132 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004133 } else if (Args.hasFlag(options::OPT_fpack_struct,
4134 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004135 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004136 }
4137
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004138 // Handle -fmax-type-align=N and -fno-type-align
4139 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4140 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4141 if (!SkipMaxTypeAlign) {
4142 std::string MaxTypeAlignStr = "-fmax-type-align=";
4143 MaxTypeAlignStr += A->getValue();
4144 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4145 }
4146 } else if (getToolChain().getTriple().isOSDarwin()) {
4147 if (!SkipMaxTypeAlign) {
4148 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4149 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4150 }
4151 }
4152
Robert Lytton0e076492013-08-13 09:43:10 +00004153 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004154 if (!Args.hasArg(options::OPT_fcommon))
4155 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004156 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004157 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004158
Daniel Dunbard18049a2009-04-07 21:16:11 +00004159 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004160 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004161 CmdArgs.push_back("-fno-common");
4162
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004163 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004164 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004165 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004166 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004167 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004168 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4169
Daniel Dunbar6358d682010-10-15 22:30:42 +00004170 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4171 if (!Args.hasFlag(options::OPT_ffor_scope,
4172 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004173 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004174 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4175
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004176 // -finput_charset=UTF-8 is default. Reject others
4177 if (Arg *inputCharset = Args.getLastArg(
4178 options::OPT_finput_charset_EQ)) {
4179 StringRef value = inputCharset->getValue();
4180 if (value != "UTF-8")
4181 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4182 }
4183
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004184 // -fexec_charset=UTF-8 is default. Reject others
4185 if (Arg *execCharset = Args.getLastArg(
4186 options::OPT_fexec_charset_EQ)) {
4187 StringRef value = execCharset->getValue();
4188 if (value != "UTF-8")
4189 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4190 }
4191
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004192 // -fcaret-diagnostics is default.
4193 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4194 options::OPT_fno_caret_diagnostics, true))
4195 CmdArgs.push_back("-fno-caret-diagnostics");
4196
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004197 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004198 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004199 options::OPT_fno_diagnostics_fixit_info))
4200 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004201
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004202 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004203 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004204 options::OPT_fno_diagnostics_show_option))
4205 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004206
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004207 if (const Arg *A =
4208 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4209 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004210 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004211 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004212
Douglas Gregor643c9222011-05-21 17:07:29 +00004213 if (const Arg *A =
4214 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4215 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004216 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004217 }
4218
Chandler Carruthb6766f02011-03-27 01:50:55 +00004219 if (Arg *A = Args.getLastArg(
4220 options::OPT_fdiagnostics_show_note_include_stack,
4221 options::OPT_fno_diagnostics_show_note_include_stack)) {
4222 if (A->getOption().matches(
4223 options::OPT_fdiagnostics_show_note_include_stack))
4224 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4225 else
4226 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4227 }
4228
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004229 // Color diagnostics are the default, unless the terminal doesn't support
4230 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004231 // Support both clang's -f[no-]color-diagnostics and gcc's
4232 // -f[no-]diagnostics-colors[=never|always|auto].
4233 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004234 for (const auto &Arg : Args) {
4235 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004236 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4237 !O.matches(options::OPT_fdiagnostics_color) &&
4238 !O.matches(options::OPT_fno_color_diagnostics) &&
4239 !O.matches(options::OPT_fno_diagnostics_color) &&
4240 !O.matches(options::OPT_fdiagnostics_color_EQ))
4241 continue;
4242
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004243 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004244 if (O.matches(options::OPT_fcolor_diagnostics) ||
4245 O.matches(options::OPT_fdiagnostics_color)) {
4246 ShowColors = Colors_On;
4247 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4248 O.matches(options::OPT_fno_diagnostics_color)) {
4249 ShowColors = Colors_Off;
4250 } else {
4251 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004252 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004253 if (value == "always")
4254 ShowColors = Colors_On;
4255 else if (value == "never")
4256 ShowColors = Colors_Off;
4257 else if (value == "auto")
4258 ShowColors = Colors_Auto;
4259 else
4260 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4261 << ("-fdiagnostics-color=" + value).str();
4262 }
4263 }
4264 if (ShowColors == Colors_On ||
4265 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004266 CmdArgs.push_back("-fcolor-diagnostics");
4267
Nico Rieck7857d462013-09-11 00:38:02 +00004268 if (Args.hasArg(options::OPT_fansi_escape_codes))
4269 CmdArgs.push_back("-fansi-escape-codes");
4270
Daniel Dunbardb097022009-06-08 21:13:54 +00004271 if (!Args.hasFlag(options::OPT_fshow_source_location,
4272 options::OPT_fno_show_source_location))
4273 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004274
Douglas Gregor643c9222011-05-21 17:07:29 +00004275 if (!Args.hasFlag(options::OPT_fshow_column,
4276 options::OPT_fno_show_column,
4277 true))
4278 CmdArgs.push_back("-fno-show-column");
4279
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004280 if (!Args.hasFlag(options::OPT_fspell_checking,
4281 options::OPT_fno_spell_checking))
4282 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004283
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004284
Chad Rosierc8e56e82012-12-05 21:08:21 +00004285 // -fno-asm-blocks is default.
4286 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4287 false))
4288 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004289
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004290 // Enable vectorization per default according to the optimization level
4291 // selected. For optimization levels that want vectorization we use the alias
4292 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004293 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004294 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004295 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004296 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004297 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004298 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004299
Chad Rosier136d67d2014-04-28 19:30:57 +00004300 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004301 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4302 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004303 options::OPT_fslp_vectorize;
4304 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004305 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004306 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004307
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004308 // -fno-slp-vectorize-aggressive is default.
4309 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004310 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004311 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004312
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004313 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4314 A->render(Args, CmdArgs);
4315
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004316 // -fdollars-in-identifiers default varies depending on platform and
4317 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004318 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004319 options::OPT_fno_dollars_in_identifiers)) {
4320 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004321 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004322 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004323 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004324 }
4325
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004326 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4327 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004328 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004329 options::OPT_fno_unit_at_a_time)) {
4330 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004331 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004332 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004333
Eli Friedman055c9702011-11-02 01:53:16 +00004334 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4335 options::OPT_fno_apple_pragma_pack, false))
4336 CmdArgs.push_back("-fapple-pragma-pack");
4337
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004338 // le32-specific flags:
4339 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4340 // by default.
4341 if (getToolChain().getArch() == llvm::Triple::le32) {
4342 CmdArgs.push_back("-fno-math-builtin");
4343 }
4344
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004345 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004346 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004347 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004348#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004349 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004350 (getToolChain().getArch() == llvm::Triple::arm ||
4351 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004352 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4353 CmdArgs.push_back("-fno-builtin-strcat");
4354 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4355 CmdArgs.push_back("-fno-builtin-strcpy");
4356 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004357#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004358
Justin Bognera88f0122014-06-20 22:59:50 +00004359 // Enable rewrite includes if the user's asked for it or if we're generating
4360 // diagnostics.
4361 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4362 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004363 if (Args.hasFlag(options::OPT_frewrite_includes,
4364 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004365 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004366 CmdArgs.push_back("-frewrite-includes");
4367
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004368 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004369 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004370 options::OPT_traditional_cpp)) {
4371 if (isa<PreprocessJobAction>(JA))
4372 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004373 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004374 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004375 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004376
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004377 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004378 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004379
4380 // Handle serialized diagnostics.
4381 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4382 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004383 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004384 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004385
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004386 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4387 CmdArgs.push_back("-fretain-comments-from-system-headers");
4388
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004389 // Forward -fcomment-block-commands to -cc1.
4390 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004391 // Forward -fparse-all-comments to -cc1.
4392 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004393
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004394 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4395 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004396 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004397 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4398 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004399 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004400
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004401 // We translate this by hand to the -cc1 argument, since nightly test uses
4402 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004403 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004404 CmdArgs.push_back("-disable-llvm-optzns");
4405 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004406 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004407 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004408
Daniel Dunbard67a3222009-03-30 06:36:42 +00004409 if (Output.getType() == types::TY_Dependencies) {
4410 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004411 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004412 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004413 CmdArgs.push_back(Output.getFilename());
4414 } else {
4415 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004416 }
4417
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004418 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004419 addDashXForInput(Args, II, CmdArgs);
4420
Daniel Dunbarb440f562010-08-02 02:38:21 +00004421 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004422 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004423 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004424 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004425 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004426
Chris Lattnere9d7d782009-11-03 19:50:27 +00004427 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4428
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004429 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004430
4431 // Optionally embed the -cc1 level arguments into the debug info, for build
4432 // analysis.
4433 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004434 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004435 for (const auto &Arg : Args)
4436 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004437
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004438 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004439 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004440 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004441 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004442 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004443 }
4444 CmdArgs.push_back("-dwarf-debug-flags");
4445 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4446 }
4447
Eric Christopherd3804002013-02-22 20:12:52 +00004448 // Add the split debug info name to the command lines here so we
4449 // can propagate it to the backend.
4450 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004451 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004452 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004453 const char *SplitDwarfOut;
4454 if (SplitDwarf) {
4455 CmdArgs.push_back("-split-dwarf-file");
4456 SplitDwarfOut = SplitDebugName(Args, Inputs);
4457 CmdArgs.push_back(SplitDwarfOut);
4458 }
4459
4460 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004461 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004462 Output.getType() == types::TY_Object &&
4463 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Hans Wennborg1da044a2014-06-26 19:59:02 +00004464 Command *CLCommand = getCLFallback()->GetCommand(C, JA, Output, Inputs,
4465 Args, LinkingOutput);
David Majnemerf6072342014-07-01 22:24:56 +00004466 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004467 } else {
4468 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4469 }
4470
Daniel Dunbar17731772009-03-23 19:03:36 +00004471
Eric Christopherf1545832013-02-22 23:50:16 +00004472 // Handle the debug info splitting at object creation time if we're
4473 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004474 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004475 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004476 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004477
Roman Divacky178e01602011-02-10 16:52:03 +00004478 if (Arg *A = Args.getLastArg(options::OPT_pg))
4479 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004480 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004481 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004482
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004483 // Claim some arguments which clang supports automatically.
4484
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004485 // -fpch-preprocess is used with gcc to add a special marker in the output to
4486 // include the PCH file. Clang's PTH solution is completely transparent, so we
4487 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004488 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004489
Daniel Dunbar17731772009-03-23 19:03:36 +00004490 // Claim some arguments which clang doesn't support, but we don't
4491 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004492 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4493 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004494
Rafael Espindolab0092d72013-09-04 19:37:35 +00004495 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004496 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004497}
4498
John McCall5fb5df92012-06-20 06:18:46 +00004499/// Add options related to the Objective-C runtime/ABI.
4500///
4501/// Returns true if the runtime is non-fragile.
4502ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4503 ArgStringList &cmdArgs,
4504 RewriteKind rewriteKind) const {
4505 // Look for the controlling runtime option.
4506 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4507 options::OPT_fgnu_runtime,
4508 options::OPT_fobjc_runtime_EQ);
4509
4510 // Just forward -fobjc-runtime= to the frontend. This supercedes
4511 // options about fragility.
4512 if (runtimeArg &&
4513 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4514 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004515 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004516 if (runtime.tryParse(value)) {
4517 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4518 << value;
4519 }
4520
4521 runtimeArg->render(args, cmdArgs);
4522 return runtime;
4523 }
4524
4525 // Otherwise, we'll need the ABI "version". Version numbers are
4526 // slightly confusing for historical reasons:
4527 // 1 - Traditional "fragile" ABI
4528 // 2 - Non-fragile ABI, version 1
4529 // 3 - Non-fragile ABI, version 2
4530 unsigned objcABIVersion = 1;
4531 // If -fobjc-abi-version= is present, use that to set the version.
4532 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004533 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004534 if (value == "1")
4535 objcABIVersion = 1;
4536 else if (value == "2")
4537 objcABIVersion = 2;
4538 else if (value == "3")
4539 objcABIVersion = 3;
4540 else
4541 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4542 << value;
4543 } else {
4544 // Otherwise, determine if we are using the non-fragile ABI.
4545 bool nonFragileABIIsDefault =
4546 (rewriteKind == RK_NonFragile ||
4547 (rewriteKind == RK_None &&
4548 getToolChain().IsObjCNonFragileABIDefault()));
4549 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4550 options::OPT_fno_objc_nonfragile_abi,
4551 nonFragileABIIsDefault)) {
4552 // Determine the non-fragile ABI version to use.
4553#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4554 unsigned nonFragileABIVersion = 1;
4555#else
4556 unsigned nonFragileABIVersion = 2;
4557#endif
4558
4559 if (Arg *abiArg = args.getLastArg(
4560 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004561 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004562 if (value == "1")
4563 nonFragileABIVersion = 1;
4564 else if (value == "2")
4565 nonFragileABIVersion = 2;
4566 else
4567 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4568 << value;
4569 }
4570
4571 objcABIVersion = 1 + nonFragileABIVersion;
4572 } else {
4573 objcABIVersion = 1;
4574 }
4575 }
4576
4577 // We don't actually care about the ABI version other than whether
4578 // it's non-fragile.
4579 bool isNonFragile = objcABIVersion != 1;
4580
4581 // If we have no runtime argument, ask the toolchain for its default runtime.
4582 // However, the rewriter only really supports the Mac runtime, so assume that.
4583 ObjCRuntime runtime;
4584 if (!runtimeArg) {
4585 switch (rewriteKind) {
4586 case RK_None:
4587 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4588 break;
4589 case RK_Fragile:
4590 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4591 break;
4592 case RK_NonFragile:
4593 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4594 break;
4595 }
4596
4597 // -fnext-runtime
4598 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4599 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004600 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004601 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4602
4603 // Otherwise, build for a generic macosx port.
4604 } else {
4605 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4606 }
4607
4608 // -fgnu-runtime
4609 } else {
4610 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004611 // Legacy behaviour is to target the gnustep runtime if we are i
4612 // non-fragile mode or the GCC runtime in fragile mode.
4613 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004614 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004615 else
4616 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004617 }
4618
4619 cmdArgs.push_back(args.MakeArgString(
4620 "-fobjc-runtime=" + runtime.getAsString()));
4621 return runtime;
4622}
4623
Reid Klecknerc542d372014-06-27 17:02:02 +00004624static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4625 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4626 I += HaveDash;
4627 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004628}
Reid Klecknerc542d372014-06-27 17:02:02 +00004629
4630struct EHFlags {
4631 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4632 bool Synch;
4633 bool Asynch;
4634 bool NoExceptC;
4635};
4636
4637/// /EH controls whether to run destructor cleanups when exceptions are
4638/// thrown. There are three modifiers:
4639/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4640/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4641/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4642/// - c: Assume that extern "C" functions are implicitly noexcept. This
4643/// modifier is an optimization, so we ignore it for now.
4644/// The default is /EHs-c-, meaning cleanups are disabled.
4645static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4646 EHFlags EH;
4647 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4648 for (auto EHVal : EHArgs) {
4649 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4650 switch (EHVal[I]) {
4651 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4652 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4653 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4654 default: break;
4655 }
4656 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4657 break;
4658 }
4659 }
4660 return EH;
4661}
4662
Hans Wennborg75958c42013-08-08 00:17:41 +00004663void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4664 unsigned RTOptionID = options::OPT__SLASH_MT;
4665
Hans Wennborgf1a74252013-09-10 20:18:04 +00004666 if (Args.hasArg(options::OPT__SLASH_LDd))
4667 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4668 // but defining _DEBUG is sticky.
4669 RTOptionID = options::OPT__SLASH_MTd;
4670
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004671 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004672 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004673
Hans Wennborg75958c42013-08-08 00:17:41 +00004674 switch(RTOptionID) {
4675 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004676 if (Args.hasArg(options::OPT__SLASH_LDd))
4677 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004678 CmdArgs.push_back("-D_MT");
4679 CmdArgs.push_back("-D_DLL");
4680 CmdArgs.push_back("--dependent-lib=msvcrt");
4681 break;
4682 case options::OPT__SLASH_MDd:
4683 CmdArgs.push_back("-D_DEBUG");
4684 CmdArgs.push_back("-D_MT");
4685 CmdArgs.push_back("-D_DLL");
4686 CmdArgs.push_back("--dependent-lib=msvcrtd");
4687 break;
4688 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004689 if (Args.hasArg(options::OPT__SLASH_LDd))
4690 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004691 CmdArgs.push_back("-D_MT");
4692 CmdArgs.push_back("--dependent-lib=libcmt");
4693 break;
4694 case options::OPT__SLASH_MTd:
4695 CmdArgs.push_back("-D_DEBUG");
4696 CmdArgs.push_back("-D_MT");
4697 CmdArgs.push_back("--dependent-lib=libcmtd");
4698 break;
4699 default:
4700 llvm_unreachable("Unexpected option ID.");
4701 }
4702
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004703 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4704 // users want. The /Za flag to cl.exe turns this off, but it's not
4705 // implemented in clang.
4706 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004707
Hans Wennborg8858a032014-07-21 23:42:07 +00004708 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4709 // would produce interleaved output, so ignore /showIncludes in such cases.
4710 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4711 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4712 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004713
David Majnemerf6072342014-07-01 22:24:56 +00004714 // This controls whether or not we emit RTTI data for polymorphic types.
4715 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4716 /*default=*/false))
4717 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004718
Reid Klecknerc542d372014-06-27 17:02:02 +00004719 const Driver &D = getToolChain().getDriver();
4720 EHFlags EH = parseClangCLEHFlags(D, Args);
4721 // FIXME: Do something with NoExceptC.
4722 if (EH.Synch || EH.Asynch) {
4723 CmdArgs.push_back("-fexceptions");
4724 CmdArgs.push_back("-fcxx-exceptions");
4725 }
4726
Hans Wennborge50cec32014-06-13 20:59:54 +00004727 // /EP should expand to -E -P.
4728 if (Args.hasArg(options::OPT__SLASH_EP)) {
4729 CmdArgs.push_back("-E");
4730 CmdArgs.push_back("-P");
4731 }
4732
David Majnemer86c318f2014-02-11 21:05:00 +00004733 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4734 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4735 if (MostGeneralArg && BestCaseArg)
4736 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4737 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4738
4739 if (MostGeneralArg) {
4740 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4741 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4742 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4743
4744 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4745 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4746 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4747 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4748 << FirstConflict->getAsString(Args)
4749 << SecondConflict->getAsString(Args);
4750
4751 if (SingleArg)
4752 CmdArgs.push_back("-fms-memptr-rep=single");
4753 else if (MultipleArg)
4754 CmdArgs.push_back("-fms-memptr-rep=multiple");
4755 else
4756 CmdArgs.push_back("-fms-memptr-rep=virtual");
4757 }
4758
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004759 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4760 A->render(Args, CmdArgs);
4761
Hans Wennborg81f74482013-09-10 01:07:07 +00004762 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4763 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004764 if (Args.hasArg(options::OPT__SLASH_fallback))
4765 CmdArgs.push_back("msvc-fallback");
4766 else
4767 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004768 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004769}
4770
Hans Wennborg1da044a2014-06-26 19:59:02 +00004771visualstudio::Compile *Clang::getCLFallback() const {
4772 if (!CLFallback)
4773 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4774 return CLFallback.get();
4775}
4776
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004777void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004778 const InputInfo &Output,
4779 const InputInfoList &Inputs,
4780 const ArgList &Args,
4781 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004782 ArgStringList CmdArgs;
4783
4784 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4785 const InputInfo &Input = Inputs[0];
4786
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004787 // Don't warn about "clang -w -c foo.s"
4788 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004789 // and "clang -emit-llvm -c foo.s"
4790 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004791
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004792 // Invoke ourselves in -cc1as mode.
4793 //
4794 // FIXME: Implement custom jobs for internal actions.
4795 CmdArgs.push_back("-cc1as");
4796
4797 // Add the "effective" target triple.
4798 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004799 std::string TripleStr =
4800 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004801 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4802
4803 // Set the output mode, we currently only expect to be used as a real
4804 // assembler.
4805 CmdArgs.push_back("-filetype");
4806 CmdArgs.push_back("obj");
4807
Eric Christopher45f2e712012-12-18 00:31:10 +00004808 // Set the main file name, so that debug info works even with
4809 // -save-temps or preprocessed assembly.
4810 CmdArgs.push_back("-main-file-name");
4811 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4812
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004813 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004814 const llvm::Triple &Triple = getToolChain().getTriple();
4815 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004816 if (!CPU.empty()) {
4817 CmdArgs.push_back("-target-cpu");
4818 CmdArgs.push_back(Args.MakeArgString(CPU));
4819 }
4820
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004821 // Add the target features
4822 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004823 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004824
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004825 // Ignore explicit -force_cpusubtype_ALL option.
4826 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004827
Eric Christopherfc3ee562012-01-10 00:38:01 +00004828 // Determine the original source input.
4829 const Action *SourceAction = &JA;
4830 while (SourceAction->getKind() != Action::InputClass) {
4831 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4832 SourceAction = SourceAction->getInputs()[0];
4833 }
4834
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004835 // Forward -g and handle debug info related flags, assuming we are dealing
4836 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004837 if (SourceAction->getType() == types::TY_Asm ||
4838 SourceAction->getType() == types::TY_PP_Asm) {
4839 Args.ClaimAllArgs(options::OPT_g_Group);
4840 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4841 if (!A->getOption().matches(options::OPT_g0))
4842 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004843
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004844 if (Args.hasArg(options::OPT_gdwarf_2))
4845 CmdArgs.push_back("-gdwarf-2");
4846 if (Args.hasArg(options::OPT_gdwarf_3))
4847 CmdArgs.push_back("-gdwarf-3");
4848 if (Args.hasArg(options::OPT_gdwarf_4))
4849 CmdArgs.push_back("-gdwarf-4");
4850
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004851 // Add the -fdebug-compilation-dir flag if needed.
4852 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004853
4854 // Set the AT_producer to the clang version when using the integrated
4855 // assembler on assembly source files.
4856 CmdArgs.push_back("-dwarf-debug-producer");
4857 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004858 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004859
4860 // Optionally embed the -cc1as level arguments into the debug info, for build
4861 // analysis.
4862 if (getToolChain().UseDwarfDebugFlags()) {
4863 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004864 for (const auto &Arg : Args)
4865 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004866
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004867 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004868 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4869 Flags += Exec;
4870 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4871 Flags += " ";
4872 Flags += OriginalArgs[i];
4873 }
4874 CmdArgs.push_back("-dwarf-debug-flags");
4875 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4876 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004877
4878 // FIXME: Add -static support, once we have it.
4879
David Blaikie372d9502014-01-17 03:17:40 +00004880 // Consume all the warning flags. Usually this would be handled more
4881 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4882 // doesn't handle that so rather than warning about unused flags that are
4883 // actually used, we'll lie by omission instead.
4884 // FIXME: Stop lying and consume only the appropriate driver flags
4885 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4886 ie = Args.filtered_end();
4887 it != ie; ++it)
4888 (*it)->claim();
4889
David Blaikie9260ed62013-07-25 21:19:01 +00004890 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4891 getToolChain().getDriver());
4892
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004893 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004894
4895 assert(Output.isFilename() && "Unexpected lipo output.");
4896 CmdArgs.push_back("-o");
4897 CmdArgs.push_back(Output.getFilename());
4898
Daniel Dunbarb440f562010-08-02 02:38:21 +00004899 assert(Input.isFilename() && "Invalid input.");
4900 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004901
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004902 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004903 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004904
4905 // Handle the debug info splitting at object creation time if we're
4906 // creating an object.
4907 // TODO: Currently only works on linux with newer objcopy.
4908 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004909 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004910 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4911 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004912}
4913
Daniel Dunbara3246a02009-03-18 08:07:30 +00004914void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004915 const InputInfo &Output,
4916 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004917 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004918 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004919 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004920 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004921
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004922 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004923 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004924 // Don't forward any -g arguments to assembly steps.
4925 if (isa<AssembleJobAction>(JA) &&
4926 A->getOption().matches(options::OPT_g_Group))
4927 continue;
4928
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004929 // Don't forward any -W arguments to assembly and link steps.
4930 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4931 A->getOption().matches(options::OPT_W_Group))
4932 continue;
4933
Daniel Dunbar2da02722009-03-19 07:55:12 +00004934 // It is unfortunate that we have to claim here, as this means
4935 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004936 // platforms using a generic gcc, even if we are just using gcc
4937 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004938 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004939 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004940 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004941 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004942
Daniel Dunbar4e295052010-01-25 22:35:08 +00004943 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004944
4945 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004946 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004947 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004948 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004949
4950 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004951 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004952 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004953 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004954 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004955 else if (Arch == llvm::Triple::ppc64le)
4956 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004957 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004958 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004959 }
4960
Daniel Dunbar5716d872009-05-02 21:41:52 +00004961 // Try to force gcc to match the tool chain we want, if we recognize
4962 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004963 //
4964 // FIXME: The triple class should directly provide the information we want
4965 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004966 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004967 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004968 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4969 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004970 CmdArgs.push_back("-m64");
4971
Daniel Dunbarb440f562010-08-02 02:38:21 +00004972 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004973 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004974 CmdArgs.push_back(Output.getFilename());
4975 } else {
4976 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004977 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004978 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004979
Tony Linthicum76329bf2011-12-12 21:14:55 +00004980 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4981 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004982
4983 // Only pass -x if gcc will understand it; otherwise hope gcc
4984 // understands the suffix correctly. The main use case this would go
4985 // wrong in is for linker inputs if they happened to have an odd
4986 // suffix; really the only way to get this to happen is a command
4987 // like '-x foobar a.c' which will treat a.c like a linker input.
4988 //
4989 // FIXME: For the linker case specifically, can we safely convert
4990 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004991 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004992 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004993 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4994 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004995 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004996 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004997 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004998 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004999 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005000 else if (II.getType() == types::TY_ModuleFile)
5001 D.Diag(diag::err_drv_no_module_support)
5002 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005003
Daniel Dunbara3246a02009-03-18 08:07:30 +00005004 if (types::canTypeBeUserSpecified(II.getType())) {
5005 CmdArgs.push_back("-x");
5006 CmdArgs.push_back(types::getTypeName(II.getType()));
5007 }
5008
Daniel Dunbarb440f562010-08-02 02:38:21 +00005009 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005010 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005011 else {
5012 const Arg &A = II.getInputArg();
5013
5014 // Reverse translate some rewritten options.
5015 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5016 CmdArgs.push_back("-lstdc++");
5017 continue;
5018 }
5019
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005020 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005021 A.render(Args, CmdArgs);
5022 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005023 }
5024
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005025 const std::string customGCCName = D.getCCCGenericGCCName();
5026 const char *GCCName;
5027 if (!customGCCName.empty())
5028 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005029 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005030 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005031 } else
5032 GCCName = "gcc";
5033
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005034 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005035 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005036 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005037}
5038
Daniel Dunbar4e295052010-01-25 22:35:08 +00005039void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5040 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005041 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005042}
5043
Daniel Dunbar4e295052010-01-25 22:35:08 +00005044void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5045 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005046 const Driver &D = getToolChain().getDriver();
5047
Daniel Dunbar4e295052010-01-25 22:35:08 +00005048 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005049 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
5050 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00005051 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005052 else {
5053 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005054 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005055 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005056
Daniel Dunbar4e295052010-01-25 22:35:08 +00005057 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005058 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005059}
5060
Daniel Dunbar4e295052010-01-25 22:35:08 +00005061void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5062 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005063 // The types are (hopefully) good enough.
5064}
5065
Tony Linthicum76329bf2011-12-12 21:14:55 +00005066// Hexagon tools start.
5067void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5068 ArgStringList &CmdArgs) const {
5069
5070}
5071void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5072 const InputInfo &Output,
5073 const InputInfoList &Inputs,
5074 const ArgList &Args,
5075 const char *LinkingOutput) const {
5076
5077 const Driver &D = getToolChain().getDriver();
5078 ArgStringList CmdArgs;
5079
5080 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005081 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005082 CmdArgs.push_back(Args.MakeArgString(MarchString));
5083
5084 RenderExtraToolArgs(JA, CmdArgs);
5085
5086 if (Output.isFilename()) {
5087 CmdArgs.push_back("-o");
5088 CmdArgs.push_back(Output.getFilename());
5089 } else {
5090 assert(Output.isNothing() && "Unexpected output");
5091 CmdArgs.push_back("-fsyntax-only");
5092 }
5093
Matthew Curtise8f80a12012-12-06 17:49:03 +00005094 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5095 if (!SmallDataThreshold.empty())
5096 CmdArgs.push_back(
5097 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005098
Matthew Curtise5df3812012-12-07 17:23:04 +00005099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5100 options::OPT_Xassembler);
5101
Tony Linthicum76329bf2011-12-12 21:14:55 +00005102 // Only pass -x if gcc will understand it; otherwise hope gcc
5103 // understands the suffix correctly. The main use case this would go
5104 // wrong in is for linker inputs if they happened to have an odd
5105 // suffix; really the only way to get this to happen is a command
5106 // like '-x foobar a.c' which will treat a.c like a linker input.
5107 //
5108 // FIXME: For the linker case specifically, can we safely convert
5109 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005110 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005111 // Don't try to pass LLVM or AST inputs to a generic gcc.
5112 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5113 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5114 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5115 << getToolChain().getTripleString();
5116 else if (II.getType() == types::TY_AST)
5117 D.Diag(clang::diag::err_drv_no_ast_support)
5118 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005119 else if (II.getType() == types::TY_ModuleFile)
5120 D.Diag(diag::err_drv_no_module_support)
5121 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005122
5123 if (II.isFilename())
5124 CmdArgs.push_back(II.getFilename());
5125 else
5126 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5127 II.getInputArg().render(Args, CmdArgs);
5128 }
5129
5130 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005131 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005132 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005133}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005134
Tony Linthicum76329bf2011-12-12 21:14:55 +00005135void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5136 ArgStringList &CmdArgs) const {
5137 // The types are (hopefully) good enough.
5138}
5139
5140void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5141 const InputInfo &Output,
5142 const InputInfoList &Inputs,
5143 const ArgList &Args,
5144 const char *LinkingOutput) const {
5145
Matthew Curtise689b052012-12-06 15:46:07 +00005146 const toolchains::Hexagon_TC& ToolChain =
5147 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5148 const Driver &D = ToolChain.getDriver();
5149
Tony Linthicum76329bf2011-12-12 21:14:55 +00005150 ArgStringList CmdArgs;
5151
Matthew Curtise689b052012-12-06 15:46:07 +00005152 //----------------------------------------------------------------------------
5153 //
5154 //----------------------------------------------------------------------------
5155 bool hasStaticArg = Args.hasArg(options::OPT_static);
5156 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005157 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005158 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5159 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5160 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5161 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005162
Matthew Curtise689b052012-12-06 15:46:07 +00005163 //----------------------------------------------------------------------------
5164 // Silence warnings for various options
5165 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005166
Matthew Curtise689b052012-12-06 15:46:07 +00005167 Args.ClaimAllArgs(options::OPT_g_Group);
5168 Args.ClaimAllArgs(options::OPT_emit_llvm);
5169 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5170 // handled somewhere else.
5171 Args.ClaimAllArgs(options::OPT_static_libgcc);
5172
5173 //----------------------------------------------------------------------------
5174 //
5175 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005176 for (const auto &Opt : ToolChain.ExtraOpts)
5177 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005178
Matthew Curtisf10a5952012-12-06 14:16:43 +00005179 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5180 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005181
Matthew Curtise689b052012-12-06 15:46:07 +00005182 if (buildingLib) {
5183 CmdArgs.push_back("-shared");
5184 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5185 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005186 }
5187
Matthew Curtise689b052012-12-06 15:46:07 +00005188 if (hasStaticArg)
5189 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005190
Matthew Curtise8f80a12012-12-06 17:49:03 +00005191 if (buildPIE && !buildingLib)
5192 CmdArgs.push_back("-pie");
5193
5194 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5195 if (!SmallDataThreshold.empty()) {
5196 CmdArgs.push_back(
5197 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5198 }
5199
Matthew Curtise689b052012-12-06 15:46:07 +00005200 //----------------------------------------------------------------------------
5201 //
5202 //----------------------------------------------------------------------------
5203 CmdArgs.push_back("-o");
5204 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005205
Matthew Curtise689b052012-12-06 15:46:07 +00005206 const std::string MarchSuffix = "/" + MarchString;
5207 const std::string G0Suffix = "/G0";
5208 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
5209 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
5210 + "/";
5211 const std::string StartFilesDir = RootDir
5212 + "hexagon/lib"
5213 + (buildingLib
5214 ? MarchG0Suffix : MarchSuffix);
5215
5216 //----------------------------------------------------------------------------
5217 // moslib
5218 //----------------------------------------------------------------------------
5219 std::vector<std::string> oslibs;
5220 bool hasStandalone= false;
5221
5222 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5223 ie = Args.filtered_end(); it != ie; ++it) {
5224 (*it)->claim();
5225 oslibs.push_back((*it)->getValue());
5226 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005227 }
Matthew Curtise689b052012-12-06 15:46:07 +00005228 if (oslibs.empty()) {
5229 oslibs.push_back("standalone");
5230 hasStandalone = true;
5231 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005232
Matthew Curtise689b052012-12-06 15:46:07 +00005233 //----------------------------------------------------------------------------
5234 // Start Files
5235 //----------------------------------------------------------------------------
5236 if (incStdLib && incStartFiles) {
5237
5238 if (!buildingLib) {
5239 if (hasStandalone) {
5240 CmdArgs.push_back(
5241 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5242 }
5243 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5244 }
5245 std::string initObj = useShared ? "/initS.o" : "/init.o";
5246 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5247 }
5248
5249 //----------------------------------------------------------------------------
5250 // Library Search Paths
5251 //----------------------------------------------------------------------------
5252 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005253 for (const auto &LibPath : LibPaths)
5254 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005255
5256 //----------------------------------------------------------------------------
5257 //
5258 //----------------------------------------------------------------------------
5259 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5260 Args.AddAllArgs(CmdArgs, options::OPT_e);
5261 Args.AddAllArgs(CmdArgs, options::OPT_s);
5262 Args.AddAllArgs(CmdArgs, options::OPT_t);
5263 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5264
5265 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5266
5267 //----------------------------------------------------------------------------
5268 // Libraries
5269 //----------------------------------------------------------------------------
5270 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005271 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005272 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5273 CmdArgs.push_back("-lm");
5274 }
5275
5276 CmdArgs.push_back("--start-group");
5277
5278 if (!buildingLib) {
5279 for(std::vector<std::string>::iterator i = oslibs.begin(),
5280 e = oslibs.end(); i != e; ++i)
5281 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5282 CmdArgs.push_back("-lc");
5283 }
5284 CmdArgs.push_back("-lgcc");
5285
5286 CmdArgs.push_back("--end-group");
5287 }
5288
5289 //----------------------------------------------------------------------------
5290 // End files
5291 //----------------------------------------------------------------------------
5292 if (incStdLib && incStartFiles) {
5293 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5294 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5295 }
5296
5297 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005298 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005299}
5300// Hexagon tools end.
5301
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005302/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005303const char *arm::getARMCPUForMArch(const ArgList &Args,
5304 const llvm::Triple &Triple) {
5305 StringRef MArch;
5306 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5307 // Otherwise, if we have -march= choose the base CPU for that arch.
5308 MArch = A->getValue();
5309 } else {
5310 // Otherwise, use the Arch from the triple.
5311 MArch = Triple.getArchName();
5312 }
5313
5314 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005315 if (MArch == "native") {
5316 std::string CPU = llvm::sys::getHostCPUName();
5317 if (CPU != "generic") {
5318 // Translate the native cpu into the architecture. The switch below will
5319 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005320 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005321 }
5322 }
5323
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005324 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005325}
5326
5327/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005328StringRef arm::getARMTargetCPU(const ArgList &Args,
5329 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005330 // FIXME: Warn on inconsistent use of -mcpu and -march.
5331 // If we have -mcpu=, use that.
5332 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5333 StringRef MCPU = A->getValue();
5334 // Handle -mcpu=native.
5335 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005336 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005337 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005338 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005339 }
5340
5341 return getARMCPUForMArch(Args, Triple);
5342}
5343
5344/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5345/// CPU.
5346//
5347// FIXME: This is redundant with -mcpu, why does LLVM use this.
5348// FIXME: tblgen this, or kill it!
5349const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5350 return llvm::StringSwitch<const char *>(CPU)
5351 .Case("strongarm", "v4")
5352 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5353 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5354 .Cases("arm920", "arm920t", "arm922t", "v4t")
5355 .Cases("arm940t", "ep9312","v4t")
5356 .Cases("arm10tdmi", "arm1020t", "v5")
5357 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5358 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5359 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5360 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5361 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5362 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00005363 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005364 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5365 .Cases("cortex-r4", "cortex-r5", "v7r")
5366 .Case("cortex-m0", "v6m")
5367 .Case("cortex-m3", "v7m")
5368 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005369 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005370 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005371 .Cases("cortex-a53", "cortex-a57", "v8")
5372 .Default("");
5373}
5374
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005375bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5376 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5377 return A && (A->getValue() == StringRef(Value));
5378}
5379
Daniel Sanders2bf13662014-07-10 14:40:57 +00005380bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005381 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5382 return llvm::StringSwitch<bool>(NaNArg->getValue())
5383 .Case("2008", true)
5384 .Case("legacy", false)
5385 .Default(false);
5386
5387 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005388 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5389 .Cases("mips32r6", "mips64r6", true)
5390 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005391
5392 return false;
5393}
5394
Daniel Sanders379d44b2014-07-16 11:52:23 +00005395bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5396 StringRef ABIName) {
5397 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005398 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005399 return false;
5400
5401 if (ABIName != "32")
5402 return false;
5403
5404 return llvm::StringSwitch<bool>(CPUName)
5405 .Cases("mips2", "mips3", "mips4", "mips5", true)
5406 .Cases("mips32", "mips32r2", true)
5407 .Cases("mips64", "mips64r2", true)
5408 .Default(false);
5409}
5410
Tim Northover157d9112014-01-16 08:48:16 +00005411llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005412 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5413 // archs which Darwin doesn't use.
5414
5415 // The matching this routine does is fairly pointless, since it is neither the
5416 // complete architecture list, nor a reasonable subset. The problem is that
5417 // historically the driver driver accepts this and also ties its -march=
5418 // handling to the architecture name, so we need to be careful before removing
5419 // support for it.
5420
5421 // This code must be kept in sync with Clang's Darwin specific argument
5422 // translation.
5423
5424 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5425 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5426 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5427 .Case("ppc64", llvm::Triple::ppc64)
5428 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5429 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5430 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005431 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005432 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005433 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005434 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005435 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005436 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005437 .Case("r600", llvm::Triple::r600)
5438 .Case("nvptx", llvm::Triple::nvptx)
5439 .Case("nvptx64", llvm::Triple::nvptx64)
5440 .Case("amdil", llvm::Triple::amdil)
5441 .Case("spir", llvm::Triple::spir)
5442 .Default(llvm::Triple::UnknownArch);
5443}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005444
Tim Northover157d9112014-01-16 08:48:16 +00005445void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5446 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5447 T.setArch(Arch);
5448
5449 if (Str == "x86_64h")
5450 T.setArchName(Str);
5451 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5452 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005453 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005454 }
5455}
5456
Bob Wilsondecc03e2012-11-23 06:14:39 +00005457const char *Clang::getBaseInputName(const ArgList &Args,
5458 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005459 return Args.MakeArgString(
5460 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005461}
5462
Bob Wilsondecc03e2012-11-23 06:14:39 +00005463const char *Clang::getBaseInputStem(const ArgList &Args,
5464 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005465 const char *Str = getBaseInputName(Args, Inputs);
5466
Chris Lattner906bb902011-01-16 08:14:11 +00005467 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005468 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005469
5470 return Str;
5471}
5472
Bob Wilsondecc03e2012-11-23 06:14:39 +00005473const char *Clang::getDependencyFileName(const ArgList &Args,
5474 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005475 // FIXME: Think about this more.
5476 std::string Res;
5477
5478 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005479 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005480 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005481 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005482 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005483 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005484 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005485}
5486
Daniel Dunbarbe220842009-03-20 16:06:39 +00005487void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005488 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005489 const InputInfoList &Inputs,
5490 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005491 const char *LinkingOutput) const {
5492 ArgStringList CmdArgs;
5493
5494 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5495 const InputInfo &Input = Inputs[0];
5496
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005497 // Determine the original source input.
5498 const Action *SourceAction = &JA;
5499 while (SourceAction->getKind() != Action::InputClass) {
5500 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5501 SourceAction = SourceAction->getInputs()[0];
5502 }
5503
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005504 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005505 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005506 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5507 // FIXME: at run-time detect assembler capabilities or rely on version
5508 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005509 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005510 const llvm::Triple &T(getToolChain().getTriple());
5511 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005512 CmdArgs.push_back("-Q");
5513 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005514
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005515 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005516 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005517 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005518 if (Args.hasArg(options::OPT_gstabs))
5519 CmdArgs.push_back("--gstabs");
5520 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005521 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005522 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005523
Daniel Dunbarbe220842009-03-20 16:06:39 +00005524 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005525 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005526
Daniel Dunbar6d484762010-07-22 01:47:22 +00005527 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005528 if (getToolChain().getArch() == llvm::Triple::x86 ||
5529 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005530 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5531 CmdArgs.push_back("-force_cpusubtype_ALL");
5532
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005533 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005534 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005535 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005536 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005537 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005538 CmdArgs.push_back("-static");
5539
Daniel Dunbarbe220842009-03-20 16:06:39 +00005540 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5541 options::OPT_Xassembler);
5542
5543 assert(Output.isFilename() && "Unexpected lipo output.");
5544 CmdArgs.push_back("-o");
5545 CmdArgs.push_back(Output.getFilename());
5546
Daniel Dunbarb440f562010-08-02 02:38:21 +00005547 assert(Input.isFilename() && "Invalid input.");
5548 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005549
5550 // asm_final spec is empty.
5551
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005552 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005553 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005554 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005555}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005556
Tim Northover157d9112014-01-16 08:48:16 +00005557void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005558
Tim Northover157d9112014-01-16 08:48:16 +00005559void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5560 ArgStringList &CmdArgs) const {
5561 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005562
Daniel Dunbarc1964212009-03-26 16:23:12 +00005563 // Derived from darwin_arch spec.
5564 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005565 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005566
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005567 // FIXME: Is this needed anymore?
5568 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005569 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005570}
5571
Bill Wendling3b2000f2012-10-02 18:02:50 +00005572bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5573 // We only need to generate a temp path for LTO if we aren't compiling object
5574 // files. When compiling source files, we run 'dsymutil' after linking. We
5575 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005576 for (const auto &Input : Inputs)
5577 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005578 return true;
5579
5580 return false;
5581}
5582
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005583void darwin::Link::AddLinkArgs(Compilation &C,
5584 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005585 ArgStringList &CmdArgs,
5586 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005587 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005588 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005589
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005590 unsigned Version[3] = { 0, 0, 0 };
5591 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5592 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005593 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005594 Version[1], Version[2], HadExtra) ||
5595 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005596 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005597 << A->getAsString(Args);
5598 }
5599
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005600 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005601 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005602 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5603 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005604
Bob Wilson3d27dad2013-08-02 22:25:34 +00005605 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5606 CmdArgs.push_back("-export_dynamic");
5607
Bill Wendling313b6bf2012-11-16 23:03:00 +00005608 // If we are using LTO, then automatically create a temporary file path for
5609 // the linker to use, so that it's lifetime will extend past a possible
5610 // dsymutil step.
5611 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5612 const char *TmpPath = C.getArgs().MakeArgString(
5613 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5614 C.addTempFile(TmpPath);
5615 CmdArgs.push_back("-object_path_lto");
5616 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005617 }
5618
Daniel Dunbarc1964212009-03-26 16:23:12 +00005619 // Derived from the "link" spec.
5620 Args.AddAllArgs(CmdArgs, options::OPT_static);
5621 if (!Args.hasArg(options::OPT_static))
5622 CmdArgs.push_back("-dynamic");
5623 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5624 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5625 // here. How do we wish to handle such things?
5626 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005627
Daniel Dunbarc1964212009-03-26 16:23:12 +00005628 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005629 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005630 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005631 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005632
5633 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5634 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5635 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5636
5637 Arg *A;
5638 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5639 (A = Args.getLastArg(options::OPT_current__version)) ||
5640 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005641 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005642 << A->getAsString(Args) << "-dynamiclib";
5643
5644 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5645 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5646 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5647 } else {
5648 CmdArgs.push_back("-dylib");
5649
5650 Arg *A;
5651 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5652 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5653 (A = Args.getLastArg(options::OPT_client__name)) ||
5654 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5655 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5656 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005657 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005658 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005659
Daniel Dunbarc1964212009-03-26 16:23:12 +00005660 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5661 "-dylib_compatibility_version");
5662 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5663 "-dylib_current_version");
5664
Tim Northover157d9112014-01-16 08:48:16 +00005665 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005666
5667 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5668 "-dylib_install_name");
5669 }
5670
5671 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5672 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5673 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005674 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005675 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005676 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5677 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5678 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5679 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5680 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5681 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005682 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005683 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5684 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5685 Args.AddAllArgs(CmdArgs, options::OPT_init);
5686
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005687 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005688 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005689
Daniel Dunbarc1964212009-03-26 16:23:12 +00005690 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5691 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5692 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5693 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5694 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005695
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005696 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5697 options::OPT_fno_pie,
5698 options::OPT_fno_PIE)) {
5699 if (A->getOption().matches(options::OPT_fpie) ||
5700 A->getOption().matches(options::OPT_fPIE))
5701 CmdArgs.push_back("-pie");
5702 else
5703 CmdArgs.push_back("-no_pie");
5704 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005705
5706 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5707 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5708 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5709 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5710 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5711 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5712 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5713 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5714 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5715 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5716 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5717 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5718 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5719 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5720 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5721 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005722
Daniel Dunbar84384642011-05-02 21:03:47 +00005723 // Give --sysroot= preference, over the Apple specific behavior to also use
5724 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005725 StringRef sysroot = C.getSysRoot();
5726 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005727 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005728 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005729 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5730 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005731 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005732 }
5733
Daniel Dunbarc1964212009-03-26 16:23:12 +00005734 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5735 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5736 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5737 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5738 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005739 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005740 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5741 Args.AddAllArgs(CmdArgs, options::OPT_y);
5742 Args.AddLastArg(CmdArgs, options::OPT_w);
5743 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5744 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5745 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5746 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5747 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5748 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5749 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5750 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5751 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5752 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5753 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5754 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5755}
5756
Alexey Bataev186b28a2014-03-06 05:43:53 +00005757enum LibOpenMP {
5758 LibUnknown,
5759 LibGOMP,
5760 LibIOMP5
5761};
5762
Daniel Dunbarc1964212009-03-26 16:23:12 +00005763void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005764 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005765 const InputInfoList &Inputs,
5766 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005767 const char *LinkingOutput) const {
5768 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005769
Daniel Dunbarc1964212009-03-26 16:23:12 +00005770 // The logic here is derived from gcc's behavior; most of which
5771 // comes from specs (starting with link_command). Consult gcc for
5772 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005773 ArgStringList CmdArgs;
5774
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005775 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5776 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5777 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005778 for (const auto &Arg : Args)
5779 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005780 const char *Exec =
5781 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5782 CmdArgs.push_back(Output.getFilename());
5783 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5784 return;
5785 }
5786
Daniel Dunbarc1964212009-03-26 16:23:12 +00005787 // I'm not sure why this particular decomposition exists in gcc, but
5788 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005789 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005790
Daniel Dunbarc1964212009-03-26 16:23:12 +00005791 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5792 Args.AddAllArgs(CmdArgs, options::OPT_s);
5793 Args.AddAllArgs(CmdArgs, options::OPT_t);
5794 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5795 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005796 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005797 Args.AddAllArgs(CmdArgs, options::OPT_r);
5798
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005799 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5800 // members of static archive libraries which implement Objective-C classes or
5801 // categories.
5802 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5803 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005804
Daniel Dunbarc1964212009-03-26 16:23:12 +00005805 CmdArgs.push_back("-o");
5806 CmdArgs.push_back(Output.getFilename());
5807
Chad Rosier06fd3c62012-05-16 23:45:12 +00005808 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005809 !Args.hasArg(options::OPT_nostartfiles))
5810 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005811
5812 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005813
Alexey Bataev186b28a2014-03-06 05:43:53 +00005814 LibOpenMP UsedOpenMPLib = LibUnknown;
5815 if (Args.hasArg(options::OPT_fopenmp)) {
5816 UsedOpenMPLib = LibGOMP;
5817 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5818 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5819 .Case("libgomp", LibGOMP)
5820 .Case("libiomp5", LibIOMP5)
5821 .Default(LibUnknown);
5822 if (UsedOpenMPLib == LibUnknown)
5823 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5824 << A->getOption().getName() << A->getValue();
5825 }
5826 switch (UsedOpenMPLib) {
5827 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005828 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005829 break;
5830 case LibIOMP5:
5831 CmdArgs.push_back("-liomp5");
5832 break;
5833 case LibUnknown:
5834 break;
5835 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005836
Douglas Gregor9295df02012-05-15 21:00:27 +00005837 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5838
Bob Wilson16d93952012-05-15 18:57:39 +00005839 if (isObjCRuntimeLinked(Args) &&
5840 !Args.hasArg(options::OPT_nostdlib) &&
5841 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005842 // We use arclite library for both ARC and subscripting support.
5843 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5844
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005845 CmdArgs.push_back("-framework");
5846 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005847 // Link libobj.
5848 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005849 }
John McCall31168b02011-06-15 23:02:42 +00005850
Daniel Dunbarc1964212009-03-26 16:23:12 +00005851 if (LinkingOutput) {
5852 CmdArgs.push_back("-arch_multiple");
5853 CmdArgs.push_back("-final_output");
5854 CmdArgs.push_back(LinkingOutput);
5855 }
5856
Daniel Dunbarc1964212009-03-26 16:23:12 +00005857 if (Args.hasArg(options::OPT_fnested_functions))
5858 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005859
Daniel Dunbarc1964212009-03-26 16:23:12 +00005860 if (!Args.hasArg(options::OPT_nostdlib) &&
5861 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005862 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005863 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005864
Daniel Dunbarc1964212009-03-26 16:23:12 +00005865 // link_ssp spec is empty.
5866
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005867 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005868 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005869 }
5870
Chad Rosier06fd3c62012-05-16 23:45:12 +00005871 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005872 !Args.hasArg(options::OPT_nostartfiles)) {
5873 // endfile_spec is empty.
5874 }
5875
5876 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5877 Args.AddAllArgs(CmdArgs, options::OPT_F);
5878
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005879 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00005880 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005881 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005882}
5883
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005884void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005885 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005886 const InputInfoList &Inputs,
5887 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005888 const char *LinkingOutput) const {
5889 ArgStringList CmdArgs;
5890
5891 CmdArgs.push_back("-create");
5892 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005893
5894 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005895 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005896
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005897 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005898 assert(II.isFilename() && "Unexpected lipo input.");
5899 CmdArgs.push_back(II.getFilename());
5900 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005901
5902 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005903 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005904}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005905
Daniel Dunbar88299622010-06-04 18:28:36 +00005906void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005907 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005908 const InputInfoList &Inputs,
5909 const ArgList &Args,
5910 const char *LinkingOutput) const {
5911 ArgStringList CmdArgs;
5912
Daniel Dunbareb86b042011-05-09 17:23:16 +00005913 CmdArgs.push_back("-o");
5914 CmdArgs.push_back(Output.getFilename());
5915
Daniel Dunbar88299622010-06-04 18:28:36 +00005916 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5917 const InputInfo &Input = Inputs[0];
5918 assert(Input.isFilename() && "Unexpected dsymutil input.");
5919 CmdArgs.push_back(Input.getFilename());
5920
Daniel Dunbar88299622010-06-04 18:28:36 +00005921 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005922 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005923 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005924}
5925
Eric Christopher551ef452011-08-23 17:56:55 +00005926void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005927 const InputInfo &Output,
5928 const InputInfoList &Inputs,
5929 const ArgList &Args,
5930 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005931 ArgStringList CmdArgs;
5932 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005933 CmdArgs.push_back("--debug-info");
5934 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005935 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005936
5937 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5938 const InputInfo &Input = Inputs[0];
5939 assert(Input.isFilename() && "Unexpected verify input");
5940
5941 // Grabbing the output of the earlier dsymutil run.
5942 CmdArgs.push_back(Input.getFilename());
5943
5944 const char *Exec =
5945 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5946 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5947}
5948
David Chisnallf571cde2012-02-15 13:39:01 +00005949void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5950 const InputInfo &Output,
5951 const InputInfoList &Inputs,
5952 const ArgList &Args,
5953 const char *LinkingOutput) const {
5954 ArgStringList CmdArgs;
5955
5956 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5957 options::OPT_Xassembler);
5958
5959 CmdArgs.push_back("-o");
5960 CmdArgs.push_back(Output.getFilename());
5961
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005962 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00005963 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00005964
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005965 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Chisnallf571cde2012-02-15 13:39:01 +00005966 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5967}
5968
David Chisnallf571cde2012-02-15 13:39:01 +00005969void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5970 const InputInfo &Output,
5971 const InputInfoList &Inputs,
5972 const ArgList &Args,
5973 const char *LinkingOutput) const {
5974 // FIXME: Find a real GCC, don't hard-code versions here
5975 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5976 const llvm::Triple &T = getToolChain().getTriple();
5977 std::string LibPath = "/usr/lib/";
5978 llvm::Triple::ArchType Arch = T.getArch();
5979 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005980 case llvm::Triple::x86:
5981 GCCLibPath +=
5982 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5983 break;
5984 case llvm::Triple::x86_64:
5985 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5986 GCCLibPath += "/4.5.2/amd64/";
5987 LibPath += "amd64/";
5988 break;
5989 default:
5990 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005991 }
5992
5993 ArgStringList CmdArgs;
5994
David Chisnall272a0712012-02-29 15:06:12 +00005995 // Demangle C++ names in errors
5996 CmdArgs.push_back("-C");
5997
David Chisnallf571cde2012-02-15 13:39:01 +00005998 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5999 (!Args.hasArg(options::OPT_shared))) {
6000 CmdArgs.push_back("-e");
6001 CmdArgs.push_back("_start");
6002 }
6003
6004 if (Args.hasArg(options::OPT_static)) {
6005 CmdArgs.push_back("-Bstatic");
6006 CmdArgs.push_back("-dn");
6007 } else {
6008 CmdArgs.push_back("-Bdynamic");
6009 if (Args.hasArg(options::OPT_shared)) {
6010 CmdArgs.push_back("-shared");
6011 } else {
6012 CmdArgs.push_back("--dynamic-linker");
6013 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6014 }
6015 }
6016
6017 if (Output.isFilename()) {
6018 CmdArgs.push_back("-o");
6019 CmdArgs.push_back(Output.getFilename());
6020 } else {
6021 assert(Output.isNothing() && "Invalid output.");
6022 }
6023
6024 if (!Args.hasArg(options::OPT_nostdlib) &&
6025 !Args.hasArg(options::OPT_nostartfiles)) {
6026 if (!Args.hasArg(options::OPT_shared)) {
6027 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6028 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006029 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006030 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6031 } else {
6032 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006033 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6034 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006035 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006036 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006037 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006038 }
6039
6040 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6041
6042 Args.AddAllArgs(CmdArgs, options::OPT_L);
6043 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6044 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006045 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006046
6047 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6048
6049 if (!Args.hasArg(options::OPT_nostdlib) &&
6050 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006051 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006052 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006053 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006054 if (!Args.hasArg(options::OPT_shared)) {
6055 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006056 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006057 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006058 }
David Chisnallf571cde2012-02-15 13:39:01 +00006059 }
6060
6061 if (!Args.hasArg(options::OPT_nostdlib) &&
6062 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006063 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006064 }
David Chisnall96de9932012-02-16 16:00:47 +00006065 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006066
Alexey Samsonov7811d192014-02-20 13:57:37 +00006067 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006068
6069 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006070 Args.MakeArgString(getToolChain().GetLinkerPath());
David Chisnallf571cde2012-02-15 13:39:01 +00006071 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6072}
6073
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006074void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006075 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006076 const InputInfoList &Inputs,
6077 const ArgList &Args,
6078 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006079 ArgStringList CmdArgs;
6080
6081 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6082 options::OPT_Xassembler);
6083
6084 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006085 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006086
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006087 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006088 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006089
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006090 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006091 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006092}
6093
6094void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006095 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006096 const InputInfoList &Inputs,
6097 const ArgList &Args,
6098 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006099 ArgStringList CmdArgs;
6100
6101 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006102 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006103 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006104 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006105 }
6106
6107 if (Args.hasArg(options::OPT_static)) {
6108 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006109 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006110 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006111// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006112 CmdArgs.push_back("-Bdynamic");
6113 if (Args.hasArg(options::OPT_shared)) {
6114 CmdArgs.push_back("-shared");
6115 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00006116 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006117 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
6118 }
6119 }
6120
Daniel Dunbarb440f562010-08-02 02:38:21 +00006121 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006122 CmdArgs.push_back("-o");
6123 CmdArgs.push_back(Output.getFilename());
6124 } else {
6125 assert(Output.isNothing() && "Invalid output.");
6126 }
6127
6128 if (!Args.hasArg(options::OPT_nostdlib) &&
6129 !Args.hasArg(options::OPT_nostartfiles)) {
6130 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006131 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006132 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006133 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006134 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006135 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006136 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006137 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006138 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006139 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006140 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006141 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006142 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006143 }
6144
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006145 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
6146 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006147 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006148
6149 Args.AddAllArgs(CmdArgs, options::OPT_L);
6150 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6151 Args.AddAllArgs(CmdArgs, options::OPT_e);
6152
Daniel Dunbar54423b22010-09-17 00:24:54 +00006153 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006154
6155 if (!Args.hasArg(options::OPT_nostdlib) &&
6156 !Args.hasArg(options::OPT_nodefaultlibs)) {
6157 // FIXME: For some reason GCC passes -lgcc before adding
6158 // the default system libraries. Just mimic this for now.
6159 CmdArgs.push_back("-lgcc");
6160
6161 if (Args.hasArg(options::OPT_pthread))
6162 CmdArgs.push_back("-pthread");
6163 if (!Args.hasArg(options::OPT_shared))
6164 CmdArgs.push_back("-lc");
6165 CmdArgs.push_back("-lgcc");
6166 }
6167
6168 if (!Args.hasArg(options::OPT_nostdlib) &&
6169 !Args.hasArg(options::OPT_nostartfiles)) {
6170 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006171 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006172 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006173 }
6174
Alexey Samsonov7811d192014-02-20 13:57:37 +00006175 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006176
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006177 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006178 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006179 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006180}
6181
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006182void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006183 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006184 const InputInfoList &Inputs,
6185 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006186 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006187 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006188 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006189
Rafael Espindolacc126272014-02-28 01:55:21 +00006190 switch (getToolChain().getArch()) {
6191 case llvm::Triple::x86:
6192 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6193 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006194 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006195 break;
6196
6197 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006198 CmdArgs.push_back("-mppc");
6199 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006200 break;
6201
6202 case llvm::Triple::sparc:
6203 CmdArgs.push_back("-32");
6204 NeedsKPIC = true;
6205 break;
6206
6207 case llvm::Triple::sparcv9:
6208 CmdArgs.push_back("-64");
6209 CmdArgs.push_back("-Av9a");
6210 NeedsKPIC = true;
6211 break;
6212
6213 case llvm::Triple::mips64:
6214 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006215 StringRef CPUName;
6216 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006217 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006218
6219 CmdArgs.push_back("-mabi");
6220 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6221
6222 if (getToolChain().getArch() == llvm::Triple::mips64)
6223 CmdArgs.push_back("-EB");
6224 else
6225 CmdArgs.push_back("-EL");
6226
Rafael Espindolacc126272014-02-28 01:55:21 +00006227 NeedsKPIC = true;
6228 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006229 }
6230
Rafael Espindolacc126272014-02-28 01:55:21 +00006231 default:
6232 break;
6233 }
6234
6235 if (NeedsKPIC)
6236 addAssemblerKPIC(Args, CmdArgs);
6237
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006238 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6239 options::OPT_Xassembler);
6240
6241 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006242 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006243
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006244 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006245 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006246
6247 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006248 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006249 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006250}
6251
6252void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006253 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006254 const InputInfoList &Inputs,
6255 const ArgList &Args,
6256 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006257 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006258 ArgStringList CmdArgs;
6259
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006260 // Silence warning for "clang -g foo.o -o foo"
6261 Args.ClaimAllArgs(options::OPT_g_Group);
6262 // and "clang -emit-llvm foo.o -o foo"
6263 Args.ClaimAllArgs(options::OPT_emit_llvm);
6264 // and for "clang -w foo.o -o foo". Other warning options are already
6265 // handled somewhere else.
6266 Args.ClaimAllArgs(options::OPT_w);
6267
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006268 if (getToolChain().getArch() == llvm::Triple::mips64)
6269 CmdArgs.push_back("-EB");
6270 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6271 CmdArgs.push_back("-EL");
6272
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006273 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006274 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006275 CmdArgs.push_back("-e");
6276 CmdArgs.push_back("__start");
6277 }
6278
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006279 if (Args.hasArg(options::OPT_static)) {
6280 CmdArgs.push_back("-Bstatic");
6281 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006282 if (Args.hasArg(options::OPT_rdynamic))
6283 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006284 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006285 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006286 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006287 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006288 } else {
6289 CmdArgs.push_back("-dynamic-linker");
6290 CmdArgs.push_back("/usr/libexec/ld.so");
6291 }
6292 }
6293
Rafael Espindola044f7832013-06-05 04:28:55 +00006294 if (Args.hasArg(options::OPT_nopie))
6295 CmdArgs.push_back("-nopie");
6296
Daniel Dunbarb440f562010-08-02 02:38:21 +00006297 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006298 CmdArgs.push_back("-o");
6299 CmdArgs.push_back(Output.getFilename());
6300 } else {
6301 assert(Output.isNothing() && "Invalid output.");
6302 }
6303
6304 if (!Args.hasArg(options::OPT_nostdlib) &&
6305 !Args.hasArg(options::OPT_nostartfiles)) {
6306 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006307 if (Args.hasArg(options::OPT_pg))
6308 CmdArgs.push_back(Args.MakeArgString(
6309 getToolChain().GetFilePath("gcrt0.o")));
6310 else
6311 CmdArgs.push_back(Args.MakeArgString(
6312 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006313 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006314 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006315 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006316 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006317 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006318 }
6319 }
6320
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006321 std::string Triple = getToolChain().getTripleString();
6322 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006323 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006324 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006325 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006326
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006327 Args.AddAllArgs(CmdArgs, options::OPT_L);
6328 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6329 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006330 Args.AddAllArgs(CmdArgs, options::OPT_s);
6331 Args.AddAllArgs(CmdArgs, options::OPT_t);
6332 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6333 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006334
Daniel Dunbar54423b22010-09-17 00:24:54 +00006335 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006336
6337 if (!Args.hasArg(options::OPT_nostdlib) &&
6338 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006339 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006340 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006341 if (Args.hasArg(options::OPT_pg))
6342 CmdArgs.push_back("-lm_p");
6343 else
6344 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006345 }
6346
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006347 // FIXME: For some reason GCC passes -lgcc before adding
6348 // the default system libraries. Just mimic this for now.
6349 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006350
Eric Christopher17674ec2012-09-13 06:32:34 +00006351 if (Args.hasArg(options::OPT_pthread)) {
6352 if (!Args.hasArg(options::OPT_shared) &&
6353 Args.hasArg(options::OPT_pg))
6354 CmdArgs.push_back("-lpthread_p");
6355 else
6356 CmdArgs.push_back("-lpthread");
6357 }
6358
Chandler Carruth45661652011-12-17 22:32:42 +00006359 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006360 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006361 CmdArgs.push_back("-lc_p");
6362 else
6363 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006364 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006365
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006366 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006367 }
6368
6369 if (!Args.hasArg(options::OPT_nostdlib) &&
6370 !Args.hasArg(options::OPT_nostartfiles)) {
6371 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006372 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006373 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006374 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006375 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006376 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006377 }
6378
6379 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006380 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006381 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006382}
Ed Schoutene33194b2009-04-02 19:13:12 +00006383
Eli Friedman9fa28852012-08-08 23:57:20 +00006384void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6385 const InputInfo &Output,
6386 const InputInfoList &Inputs,
6387 const ArgList &Args,
6388 const char *LinkingOutput) const {
6389 ArgStringList CmdArgs;
6390
6391 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6392 options::OPT_Xassembler);
6393
6394 CmdArgs.push_back("-o");
6395 CmdArgs.push_back(Output.getFilename());
6396
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006397 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006398 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006399
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006400 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Eli Friedman9fa28852012-08-08 23:57:20 +00006401 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6402}
6403
6404void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6405 const InputInfo &Output,
6406 const InputInfoList &Inputs,
6407 const ArgList &Args,
6408 const char *LinkingOutput) const {
6409 const Driver &D = getToolChain().getDriver();
6410 ArgStringList CmdArgs;
6411
6412 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6413 (!Args.hasArg(options::OPT_shared))) {
6414 CmdArgs.push_back("-e");
6415 CmdArgs.push_back("__start");
6416 }
6417
6418 if (Args.hasArg(options::OPT_static)) {
6419 CmdArgs.push_back("-Bstatic");
6420 } else {
6421 if (Args.hasArg(options::OPT_rdynamic))
6422 CmdArgs.push_back("-export-dynamic");
6423 CmdArgs.push_back("--eh-frame-hdr");
6424 CmdArgs.push_back("-Bdynamic");
6425 if (Args.hasArg(options::OPT_shared)) {
6426 CmdArgs.push_back("-shared");
6427 } else {
6428 CmdArgs.push_back("-dynamic-linker");
6429 CmdArgs.push_back("/usr/libexec/ld.so");
6430 }
6431 }
6432
6433 if (Output.isFilename()) {
6434 CmdArgs.push_back("-o");
6435 CmdArgs.push_back(Output.getFilename());
6436 } else {
6437 assert(Output.isNothing() && "Invalid output.");
6438 }
6439
6440 if (!Args.hasArg(options::OPT_nostdlib) &&
6441 !Args.hasArg(options::OPT_nostartfiles)) {
6442 if (!Args.hasArg(options::OPT_shared)) {
6443 if (Args.hasArg(options::OPT_pg))
6444 CmdArgs.push_back(Args.MakeArgString(
6445 getToolChain().GetFilePath("gcrt0.o")));
6446 else
6447 CmdArgs.push_back(Args.MakeArgString(
6448 getToolChain().GetFilePath("crt0.o")));
6449 CmdArgs.push_back(Args.MakeArgString(
6450 getToolChain().GetFilePath("crtbegin.o")));
6451 } else {
6452 CmdArgs.push_back(Args.MakeArgString(
6453 getToolChain().GetFilePath("crtbeginS.o")));
6454 }
6455 }
6456
6457 Args.AddAllArgs(CmdArgs, options::OPT_L);
6458 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6459 Args.AddAllArgs(CmdArgs, options::OPT_e);
6460
6461 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6462
6463 if (!Args.hasArg(options::OPT_nostdlib) &&
6464 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006465 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006466 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6467 if (Args.hasArg(options::OPT_pg))
6468 CmdArgs.push_back("-lm_p");
6469 else
6470 CmdArgs.push_back("-lm");
6471 }
6472
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006473 if (Args.hasArg(options::OPT_pthread)) {
6474 if (!Args.hasArg(options::OPT_shared) &&
6475 Args.hasArg(options::OPT_pg))
6476 CmdArgs.push_back("-lpthread_p");
6477 else
6478 CmdArgs.push_back("-lpthread");
6479 }
6480
Eli Friedman9fa28852012-08-08 23:57:20 +00006481 if (!Args.hasArg(options::OPT_shared)) {
6482 if (Args.hasArg(options::OPT_pg))
6483 CmdArgs.push_back("-lc_p");
6484 else
6485 CmdArgs.push_back("-lc");
6486 }
6487
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006488 StringRef MyArch;
6489 switch (getToolChain().getTriple().getArch()) {
6490 case llvm::Triple::arm:
6491 MyArch = "arm";
6492 break;
6493 case llvm::Triple::x86:
6494 MyArch = "i386";
6495 break;
6496 case llvm::Triple::x86_64:
6497 MyArch = "amd64";
6498 break;
6499 default:
6500 llvm_unreachable("Unsupported architecture");
6501 }
6502 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006503 }
6504
6505 if (!Args.hasArg(options::OPT_nostdlib) &&
6506 !Args.hasArg(options::OPT_nostartfiles)) {
6507 if (!Args.hasArg(options::OPT_shared))
6508 CmdArgs.push_back(Args.MakeArgString(
6509 getToolChain().GetFilePath("crtend.o")));
6510 else
6511 CmdArgs.push_back(Args.MakeArgString(
6512 getToolChain().GetFilePath("crtendS.o")));
6513 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006514
6515 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006516 Args.MakeArgString(getToolChain().GetLinkerPath());
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006517 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006518}
6519
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006520void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006521 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006522 const InputInfoList &Inputs,
6523 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006524 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006525 ArgStringList CmdArgs;
6526
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006527 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6528 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006529 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006530 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006531 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006532 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006533 else if (getToolChain().getArch() == llvm::Triple::mips ||
6534 getToolChain().getArch() == llvm::Triple::mipsel ||
6535 getToolChain().getArch() == llvm::Triple::mips64 ||
6536 getToolChain().getArch() == llvm::Triple::mips64el) {
6537 StringRef CPUName;
6538 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006539 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006540
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006541 CmdArgs.push_back("-march");
6542 CmdArgs.push_back(CPUName.data());
6543
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006544 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006545 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006546
6547 if (getToolChain().getArch() == llvm::Triple::mips ||
6548 getToolChain().getArch() == llvm::Triple::mips64)
6549 CmdArgs.push_back("-EB");
6550 else
6551 CmdArgs.push_back("-EL");
6552
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006553 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006554 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006555 getToolChain().getArch() == llvm::Triple::armeb ||
6556 getToolChain().getArch() == llvm::Triple::thumb ||
6557 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006558 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006559 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006560 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6561
6562 if (FloatABI == "hard") {
6563 CmdArgs.push_back("-mfpu=vfp");
6564 } else {
6565 CmdArgs.push_back("-mfpu=softvfp");
6566 }
6567
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006568 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006569 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006570 case llvm::Triple::GNUEABI:
6571 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006572 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006573 break;
6574
6575 default:
6576 CmdArgs.push_back("-matpcs");
6577 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006578 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006579 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006580 if (getToolChain().getArch() == llvm::Triple::sparc)
6581 CmdArgs.push_back("-Av8plusa");
6582 else
6583 CmdArgs.push_back("-Av9a");
6584
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006585 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006586 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006587
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006588 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6589 options::OPT_Xassembler);
6590
6591 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006592 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006593
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006594 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006595 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006596
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006597 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006598 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006599}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006600
6601void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006602 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006603 const InputInfoList &Inputs,
6604 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006605 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006606 const toolchains::FreeBSD& ToolChain =
6607 static_cast<const toolchains::FreeBSD&>(getToolChain());
6608 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006609 const bool IsPIE =
6610 !Args.hasArg(options::OPT_shared) &&
6611 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006612 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006613
6614 // Silence warning for "clang -g foo.o -o foo"
6615 Args.ClaimAllArgs(options::OPT_g_Group);
6616 // and "clang -emit-llvm foo.o -o foo"
6617 Args.ClaimAllArgs(options::OPT_emit_llvm);
6618 // and for "clang -w foo.o -o foo". Other warning options are already
6619 // handled somewhere else.
6620 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006621
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006622 if (!D.SysRoot.empty())
6623 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6624
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006625 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006626 CmdArgs.push_back("-pie");
6627
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006628 if (Args.hasArg(options::OPT_static)) {
6629 CmdArgs.push_back("-Bstatic");
6630 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006631 if (Args.hasArg(options::OPT_rdynamic))
6632 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006633 CmdArgs.push_back("--eh-frame-hdr");
6634 if (Args.hasArg(options::OPT_shared)) {
6635 CmdArgs.push_back("-Bshareable");
6636 } else {
6637 CmdArgs.push_back("-dynamic-linker");
6638 CmdArgs.push_back("/libexec/ld-elf.so.1");
6639 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006640 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6641 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006642 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6643 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6644 CmdArgs.push_back("--hash-style=both");
6645 }
6646 }
6647 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006648 }
6649
6650 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6651 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006652 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006653 CmdArgs.push_back("-m");
6654 CmdArgs.push_back("elf_i386_fbsd");
6655 }
6656
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006657 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006658 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006659 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006660 }
6661
Daniel Dunbarb440f562010-08-02 02:38:21 +00006662 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006663 CmdArgs.push_back("-o");
6664 CmdArgs.push_back(Output.getFilename());
6665 } else {
6666 assert(Output.isNothing() && "Invalid output.");
6667 }
6668
6669 if (!Args.hasArg(options::OPT_nostdlib) &&
6670 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006671 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006672 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006673 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006674 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006675 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006676 crt1 = "Scrt1.o";
6677 else
6678 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006679 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006680 if (crt1)
6681 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6682
6683 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6684
Craig Topper92fc2df2014-05-17 16:56:41 +00006685 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006686 if (Args.hasArg(options::OPT_static))
6687 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006688 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006689 crtbegin = "crtbeginS.o";
6690 else
6691 crtbegin = "crtbegin.o";
6692
6693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006694 }
6695
6696 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006697 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006698 for (const auto &Path : Paths)
6699 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006700 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6701 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006702 Args.AddAllArgs(CmdArgs, options::OPT_s);
6703 Args.AddAllArgs(CmdArgs, options::OPT_t);
6704 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6705 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006706
Alp Tokerce365ca2013-12-02 12:43:03 +00006707 if (D.IsUsingLTO(Args))
6708 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006709
Roman Divackyafe2f232012-08-28 15:09:03 +00006710 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006711
6712 if (!Args.hasArg(options::OPT_nostdlib) &&
6713 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006714 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006715 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006716 if (Args.hasArg(options::OPT_pg))
6717 CmdArgs.push_back("-lm_p");
6718 else
6719 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006720 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006721 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6722 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006723 if (Args.hasArg(options::OPT_pg))
6724 CmdArgs.push_back("-lgcc_p");
6725 else
6726 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006727 if (Args.hasArg(options::OPT_static)) {
6728 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006729 } else if (Args.hasArg(options::OPT_pg)) {
6730 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006731 } else {
6732 CmdArgs.push_back("--as-needed");
6733 CmdArgs.push_back("-lgcc_s");
6734 CmdArgs.push_back("--no-as-needed");
6735 }
6736
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006737 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006738 if (Args.hasArg(options::OPT_pg))
6739 CmdArgs.push_back("-lpthread_p");
6740 else
6741 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006742 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006743
Roman Divacky66f22762011-02-10 16:59:40 +00006744 if (Args.hasArg(options::OPT_pg)) {
6745 if (Args.hasArg(options::OPT_shared))
6746 CmdArgs.push_back("-lc");
6747 else
6748 CmdArgs.push_back("-lc_p");
6749 CmdArgs.push_back("-lgcc_p");
6750 } else {
6751 CmdArgs.push_back("-lc");
6752 CmdArgs.push_back("-lgcc");
6753 }
6754
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006755 if (Args.hasArg(options::OPT_static)) {
6756 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006757 } else if (Args.hasArg(options::OPT_pg)) {
6758 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006759 } else {
6760 CmdArgs.push_back("--as-needed");
6761 CmdArgs.push_back("-lgcc_s");
6762 CmdArgs.push_back("--no-as-needed");
6763 }
6764 }
6765
6766 if (!Args.hasArg(options::OPT_nostdlib) &&
6767 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006768 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006769 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006770 else
6771 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006772 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006773 }
6774
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006775 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6776
Alexey Samsonov7811d192014-02-20 13:57:37 +00006777 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006778
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006779 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006780 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006781 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006782}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006783
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006784void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6785 const InputInfo &Output,
6786 const InputInfoList &Inputs,
6787 const ArgList &Args,
6788 const char *LinkingOutput) const {
6789 ArgStringList CmdArgs;
6790
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006791 // GNU as needs different flags for creating the correct output format
6792 // on architectures with different ABIs or optional feature sets.
6793 switch (getToolChain().getArch()) {
6794 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006795 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006796 break;
6797 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006798 case llvm::Triple::armeb:
6799 case llvm::Triple::thumb:
6800 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006801 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006802 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006803 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006804 }
6805
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006806 case llvm::Triple::mips:
6807 case llvm::Triple::mipsel:
6808 case llvm::Triple::mips64:
6809 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006810 StringRef CPUName;
6811 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006812 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006813
6814 CmdArgs.push_back("-march");
6815 CmdArgs.push_back(CPUName.data());
6816
6817 CmdArgs.push_back("-mabi");
6818 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6819
6820 if (getToolChain().getArch() == llvm::Triple::mips ||
6821 getToolChain().getArch() == llvm::Triple::mips64)
6822 CmdArgs.push_back("-EB");
6823 else
6824 CmdArgs.push_back("-EL");
6825
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006826 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006827 break;
6828 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006829
6830 case llvm::Triple::sparc:
6831 CmdArgs.push_back("-32");
6832 addAssemblerKPIC(Args, CmdArgs);
6833 break;
6834
6835 case llvm::Triple::sparcv9:
6836 CmdArgs.push_back("-64");
6837 CmdArgs.push_back("-Av9");
6838 addAssemblerKPIC(Args, CmdArgs);
6839 break;
6840
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006841 default:
6842 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006843 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006844
6845 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6846 options::OPT_Xassembler);
6847
6848 CmdArgs.push_back("-o");
6849 CmdArgs.push_back(Output.getFilename());
6850
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006851 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006852 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006853
David Chisnallddbd68f2011-09-27 22:03:18 +00006854 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006855 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6856}
6857
6858void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6859 const InputInfo &Output,
6860 const InputInfoList &Inputs,
6861 const ArgList &Args,
6862 const char *LinkingOutput) const {
6863 const Driver &D = getToolChain().getDriver();
6864 ArgStringList CmdArgs;
6865
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006866 if (!D.SysRoot.empty())
6867 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6868
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006869 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006870 if (Args.hasArg(options::OPT_static)) {
6871 CmdArgs.push_back("-Bstatic");
6872 } else {
6873 if (Args.hasArg(options::OPT_rdynamic))
6874 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006875 if (Args.hasArg(options::OPT_shared)) {
6876 CmdArgs.push_back("-Bshareable");
6877 } else {
6878 CmdArgs.push_back("-dynamic-linker");
6879 CmdArgs.push_back("/libexec/ld.elf_so");
6880 }
6881 }
6882
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006883 // Many NetBSD architectures support more than one ABI.
6884 // Determine the correct emulation for ld.
6885 switch (getToolChain().getArch()) {
6886 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006887 CmdArgs.push_back("-m");
6888 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006889 break;
6890 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006891 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006892 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006893 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006894 CmdArgs.push_back("-m");
6895 switch (getToolChain().getTriple().getEnvironment()) {
6896 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006897 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006898 CmdArgs.push_back("armelf_nbsd_eabi");
6899 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006900 case llvm::Triple::EABIHF:
6901 case llvm::Triple::GNUEABIHF:
6902 CmdArgs.push_back("armelf_nbsd_eabihf");
6903 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006904 default:
6905 CmdArgs.push_back("armelf_nbsd");
6906 break;
6907 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006908 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006909 case llvm::Triple::mips64:
6910 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006911 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006912 CmdArgs.push_back("-m");
6913 if (getToolChain().getArch() == llvm::Triple::mips64)
6914 CmdArgs.push_back("elf32btsmip");
6915 else
6916 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006917 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006918 CmdArgs.push_back("-m");
6919 if (getToolChain().getArch() == llvm::Triple::mips64)
6920 CmdArgs.push_back("elf64btsmip");
6921 else
6922 CmdArgs.push_back("elf64ltsmip");
6923 }
6924 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006925
6926 case llvm::Triple::sparc:
6927 CmdArgs.push_back("-m");
6928 CmdArgs.push_back("elf32_sparc");
6929 break;
6930
6931 case llvm::Triple::sparcv9:
6932 CmdArgs.push_back("-m");
6933 CmdArgs.push_back("elf64_sparc");
6934 break;
6935
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006936 default:
6937 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006938 }
6939
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006940 if (Output.isFilename()) {
6941 CmdArgs.push_back("-o");
6942 CmdArgs.push_back(Output.getFilename());
6943 } else {
6944 assert(Output.isNothing() && "Invalid output.");
6945 }
6946
6947 if (!Args.hasArg(options::OPT_nostdlib) &&
6948 !Args.hasArg(options::OPT_nostartfiles)) {
6949 if (!Args.hasArg(options::OPT_shared)) {
6950 CmdArgs.push_back(Args.MakeArgString(
6951 getToolChain().GetFilePath("crt0.o")));
6952 CmdArgs.push_back(Args.MakeArgString(
6953 getToolChain().GetFilePath("crti.o")));
6954 CmdArgs.push_back(Args.MakeArgString(
6955 getToolChain().GetFilePath("crtbegin.o")));
6956 } else {
6957 CmdArgs.push_back(Args.MakeArgString(
6958 getToolChain().GetFilePath("crti.o")));
6959 CmdArgs.push_back(Args.MakeArgString(
6960 getToolChain().GetFilePath("crtbeginS.o")));
6961 }
6962 }
6963
6964 Args.AddAllArgs(CmdArgs, options::OPT_L);
6965 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6966 Args.AddAllArgs(CmdArgs, options::OPT_e);
6967 Args.AddAllArgs(CmdArgs, options::OPT_s);
6968 Args.AddAllArgs(CmdArgs, options::OPT_t);
6969 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6970 Args.AddAllArgs(CmdArgs, options::OPT_r);
6971
6972 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6973
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006974 unsigned Major, Minor, Micro;
6975 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6976 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006977 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006978 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00006979 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006980 case llvm::Triple::arm:
6981 case llvm::Triple::armeb:
6982 case llvm::Triple::thumb:
6983 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006984 case llvm::Triple::ppc:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006985 case llvm::Triple::x86:
6986 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006987 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006988 break;
6989 default:
6990 break;
6991 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006992 }
6993
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006994 if (!Args.hasArg(options::OPT_nostdlib) &&
6995 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006996 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006997 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6998 CmdArgs.push_back("-lm");
6999 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007000 if (Args.hasArg(options::OPT_pthread))
7001 CmdArgs.push_back("-lpthread");
7002 CmdArgs.push_back("-lc");
7003
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007004 if (useLibgcc) {
7005 if (Args.hasArg(options::OPT_static)) {
7006 // libgcc_eh depends on libc, so resolve as much as possible,
7007 // pull in any new requirements from libc and then get the rest
7008 // of libgcc.
7009 CmdArgs.push_back("-lgcc_eh");
7010 CmdArgs.push_back("-lc");
7011 CmdArgs.push_back("-lgcc");
7012 } else {
7013 CmdArgs.push_back("-lgcc");
7014 CmdArgs.push_back("--as-needed");
7015 CmdArgs.push_back("-lgcc_s");
7016 CmdArgs.push_back("--no-as-needed");
7017 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007018 }
7019 }
7020
7021 if (!Args.hasArg(options::OPT_nostdlib) &&
7022 !Args.hasArg(options::OPT_nostartfiles)) {
7023 if (!Args.hasArg(options::OPT_shared))
7024 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7025 "crtend.o")));
7026 else
7027 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7028 "crtendS.o")));
7029 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7030 "crtn.o")));
7031 }
7032
Alexey Samsonov7811d192014-02-20 13:57:37 +00007033 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007034
Logan Chieneb9162f2014-06-26 14:23:45 +00007035 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007036 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7037}
7038
Thomas Schwinge4e555262013-03-28 19:04:25 +00007039void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7040 const InputInfo &Output,
7041 const InputInfoList &Inputs,
7042 const ArgList &Args,
7043 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00007044 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007045 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007046
7047 // Add --32/--64 to make sure we get the format we want.
7048 // This is incomplete
7049 if (getToolChain().getArch() == llvm::Triple::x86) {
7050 CmdArgs.push_back("--32");
7051 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007052 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7053 CmdArgs.push_back("--x32");
7054 else
7055 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007056 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7057 CmdArgs.push_back("-a32");
7058 CmdArgs.push_back("-mppc");
7059 CmdArgs.push_back("-many");
7060 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7061 CmdArgs.push_back("-a64");
7062 CmdArgs.push_back("-mppc64");
7063 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007064 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7065 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007066 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007067 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007068 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007069 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7070 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007071 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007072 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007073 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7074 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007075 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007076 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007077 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7078 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007079 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007080 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7081 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007082 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7083 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007084 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007085
Tim Northover9c7e0352013-12-12 11:55:52 +00007086 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7087 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007088 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007089
7090 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007091
7092 // FIXME: remove krait check when GNU tools support krait cpu
7093 // for now replace it with -march=armv7-a to avoid a lower
7094 // march from being picked in the absence of a cpu flag.
7095 Arg *A;
7096 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7097 StringRef(A->getValue()) == "krait")
7098 CmdArgs.push_back("-march=armv7-a");
7099 else
7100 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007101 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007102 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7103 getToolChain().getArch() == llvm::Triple::mipsel ||
7104 getToolChain().getArch() == llvm::Triple::mips64 ||
7105 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007106 StringRef CPUName;
7107 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007108 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007109 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007110
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007111 CmdArgs.push_back("-march");
7112 CmdArgs.push_back(CPUName.data());
7113
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007114 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007115 CmdArgs.push_back(ABIName.data());
7116
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007117 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7118 // or -mshared (not implemented) is in effect.
7119 bool IsPicOrPie = false;
7120 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7121 options::OPT_fpic, options::OPT_fno_pic,
7122 options::OPT_fPIE, options::OPT_fno_PIE,
7123 options::OPT_fpie, options::OPT_fno_pie)) {
7124 if (A->getOption().matches(options::OPT_fPIC) ||
7125 A->getOption().matches(options::OPT_fpic) ||
7126 A->getOption().matches(options::OPT_fPIE) ||
7127 A->getOption().matches(options::OPT_fpie))
7128 IsPicOrPie = true;
7129 }
7130 if (!IsPicOrPie)
7131 CmdArgs.push_back("-mno-shared");
7132
Daniel Sanders379d44b2014-07-16 11:52:23 +00007133 // LLVM doesn't support -mplt yet and acts as if it is always given.
7134 // However, -mplt has no effect with the N64 ABI.
7135 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007136
7137 if (getToolChain().getArch() == llvm::Triple::mips ||
7138 getToolChain().getArch() == llvm::Triple::mips64)
7139 CmdArgs.push_back("-EB");
7140 else
7141 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007142
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007143 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7144 if (StringRef(A->getValue()) == "2008")
7145 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7146 }
7147
Daniel Sanders379d44b2014-07-16 11:52:23 +00007148 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7149 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7150 options::OPT_mfp64)) {
7151 A->claim();
7152 A->render(Args, CmdArgs);
7153 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7154 ABIName))
7155 CmdArgs.push_back("-mfpxx");
7156
7157 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7158 // -mno-mips16 is actually -no-mips16.
7159 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7160 options::OPT_mno_mips16)) {
7161 if (A->getOption().matches(options::OPT_mips16)) {
7162 A->claim();
7163 A->render(Args, CmdArgs);
7164 } else {
7165 A->claim();
7166 CmdArgs.push_back("-no-mips16");
7167 }
7168 }
7169
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007170 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7171 options::OPT_mno_micromips);
7172 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7173 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7174
Simon Atanasyanbd986632013-11-26 11:58:04 +00007175 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7176 // Do not use AddLastArg because not all versions of MIPS assembler
7177 // support -mmsa / -mno-msa options.
7178 if (A->getOption().matches(options::OPT_mmsa))
7179 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7180 }
7181
Daniel Sanders379d44b2014-07-16 11:52:23 +00007182 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7183 options::OPT_msoft_float);
7184
7185 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7186 options::OPT_mno_odd_spreg);
7187
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007188 NeedsKPIC = true;
7189 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7190 // Always pass an -march option, since our default of z10 is later
7191 // than the GNU assembler's default.
7192 StringRef CPUName = getSystemZTargetCPU(Args);
7193 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7194 }
7195
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007196 if (NeedsKPIC)
7197 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007198
7199 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7200 options::OPT_Xassembler);
7201
7202 CmdArgs.push_back("-o");
7203 CmdArgs.push_back(Output.getFilename());
7204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007205 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007206 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007207
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007208 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Rafael Espindola92b00932010-08-10 00:25:48 +00007209 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007210
7211 // Handle the debug info splitting at object creation time if we're
7212 // creating an object.
7213 // TODO: Currently only works on linux with newer objcopy.
7214 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007215 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007216 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7217 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007218}
7219
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007220static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007221 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007222 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007223 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7224 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007225 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007226 CmdArgs.push_back("-lgcc");
7227
Logan Chien3d3373c2012-11-19 12:04:11 +00007228 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007229 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007230 CmdArgs.push_back("-lgcc");
7231 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007232 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007233 CmdArgs.push_back("--as-needed");
7234 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007235 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007236 CmdArgs.push_back("--no-as-needed");
7237 }
7238
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007239 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007240 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007241 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007242 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007243
7244 // According to Android ABI, we have to link with libdl if we are
7245 // linking with non-static libgcc.
7246 //
7247 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7248 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7249 if (isAndroid && !StaticLibgcc)
7250 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007251}
7252
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007253static std::string getLinuxDynamicLinker(const ArgList &Args,
7254 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007255 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7256 if (ToolChain.getTriple().isArch64Bit())
7257 return "/system/bin/linker64";
7258 else
7259 return "/system/bin/linker";
7260 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7261 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007262 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007263 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007264 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007265 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007266 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007267 else if (ToolChain.getArch() == llvm::Triple::arm ||
7268 ToolChain.getArch() == llvm::Triple::thumb) {
7269 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7270 return "/lib/ld-linux-armhf.so.3";
7271 else
7272 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007273 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7274 ToolChain.getArch() == llvm::Triple::thumbeb) {
7275 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7276 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7277 else
7278 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007279 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007280 ToolChain.getArch() == llvm::Triple::mipsel ||
7281 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007282 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007283 StringRef CPUName;
7284 StringRef ABIName;
7285 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7286 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7287
7288 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7289 .Case("o32", "/lib")
7290 .Case("n32", "/lib32")
7291 .Case("n64", "/lib64")
7292 .Default("/lib");
7293 StringRef LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
7294
7295 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007296 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7297 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007298 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7299 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7300 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007301 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007302 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7303 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7304 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007305 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007306 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7307 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007308 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7309 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007310 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7311 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7312 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007313 else
7314 return "/lib64/ld-linux-x86-64.so.2";
7315}
7316
Renato Golinc4b49242014-02-13 10:01:16 +00007317static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7318 ArgStringList &CmdArgs, const ArgList &Args) {
7319 // Make use of compiler-rt if --rtlib option is used
7320 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7321
7322 switch(RLT) {
7323 case ToolChain::RLT_CompilerRT:
7324 addClangRTLinux(TC, Args, CmdArgs);
7325 break;
7326 case ToolChain::RLT_Libgcc:
7327 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7328 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007329 }
7330}
7331
Thomas Schwinge4e555262013-03-28 19:04:25 +00007332void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7333 const InputInfo &Output,
7334 const InputInfoList &Inputs,
7335 const ArgList &Args,
7336 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007337 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007338 static_cast<const toolchains::Linux&>(getToolChain());
7339 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007340 const bool isAndroid =
7341 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007342 const bool IsPIE =
7343 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007344 !Args.hasArg(options::OPT_static) &&
7345 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7346 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007347 // Cannot use isPIEDefault here since otherwise
7348 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007349 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007350
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007351 ArgStringList CmdArgs;
7352
Rafael Espindolad1002f62010-11-15 18:28:16 +00007353 // Silence warning for "clang -g foo.o -o foo"
7354 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007355 // and "clang -emit-llvm foo.o -o foo"
7356 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007357 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007358 // handled somewhere else.
7359 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007360
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007361 if (!D.SysRoot.empty())
7362 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007363
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007364 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007365 CmdArgs.push_back("-pie");
7366
Rafael Espindola1c76c592010-11-07 22:57:16 +00007367 if (Args.hasArg(options::OPT_rdynamic))
7368 CmdArgs.push_back("-export-dynamic");
7369
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007370 if (Args.hasArg(options::OPT_s))
7371 CmdArgs.push_back("-s");
7372
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007373 for (const auto &Opt : ToolChain.ExtraOpts)
7374 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007375
7376 if (!Args.hasArg(options::OPT_static)) {
7377 CmdArgs.push_back("--eh-frame-hdr");
7378 }
7379
7380 CmdArgs.push_back("-m");
7381 if (ToolChain.getArch() == llvm::Triple::x86)
7382 CmdArgs.push_back("elf_i386");
Tim Northover40956e62014-07-23 12:32:58 +00007383 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Tim Northover9bb857a2013-01-31 12:13:10 +00007384 CmdArgs.push_back("aarch64linux");
Tim Northover40956e62014-07-23 12:32:58 +00007385 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007386 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00007387 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00007388 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007389 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007390 else if (ToolChain.getArch() == llvm::Triple::armeb
7391 || ToolChain.getArch() == llvm::Triple::thumbeb)
7392 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00007393 else if (ToolChain.getArch() == llvm::Triple::ppc)
7394 CmdArgs.push_back("elf32ppclinux");
7395 else if (ToolChain.getArch() == llvm::Triple::ppc64)
7396 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007397 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7398 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00007399 else if (ToolChain.getArch() == llvm::Triple::sparc)
7400 CmdArgs.push_back("elf32_sparc");
7401 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7402 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00007403 else if (ToolChain.getArch() == llvm::Triple::mips)
7404 CmdArgs.push_back("elf32btsmip");
7405 else if (ToolChain.getArch() == llvm::Triple::mipsel)
7406 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007407 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007408 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007409 CmdArgs.push_back("elf32btsmipn32");
7410 else
7411 CmdArgs.push_back("elf64btsmip");
7412 }
7413 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007414 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007415 CmdArgs.push_back("elf32ltsmipn32");
7416 else
7417 CmdArgs.push_back("elf64ltsmip");
7418 }
Ulrich Weigand47445072013-05-06 16:26:41 +00007419 else if (ToolChain.getArch() == llvm::Triple::systemz)
7420 CmdArgs.push_back("elf64_s390");
Zinovy Nis1db95732014-07-10 15:27:19 +00007421 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7422 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7423 CmdArgs.push_back("elf32_x86_64");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007424 else
7425 CmdArgs.push_back("elf_x86_64");
7426
7427 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007428 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007429 ToolChain.getArch() == llvm::Triple::armeb ||
7430 ToolChain.getArch() == llvm::Triple::thumb ||
7431 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007432 CmdArgs.push_back("-Bstatic");
7433 else
7434 CmdArgs.push_back("-static");
7435 } else if (Args.hasArg(options::OPT_shared)) {
7436 CmdArgs.push_back("-shared");
7437 }
7438
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007439 if (ToolChain.getArch() == llvm::Triple::arm ||
7440 ToolChain.getArch() == llvm::Triple::armeb ||
7441 ToolChain.getArch() == llvm::Triple::thumb ||
7442 ToolChain.getArch() == llvm::Triple::thumbeb ||
7443 (!Args.hasArg(options::OPT_static) &&
7444 !Args.hasArg(options::OPT_shared))) {
7445 CmdArgs.push_back("-dynamic-linker");
7446 CmdArgs.push_back(Args.MakeArgString(
7447 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7448 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007449
7450 CmdArgs.push_back("-o");
7451 CmdArgs.push_back(Output.getFilename());
7452
Rafael Espindola81937ec2010-12-01 01:52:43 +00007453 if (!Args.hasArg(options::OPT_nostdlib) &&
7454 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007455 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007456 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007457 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007458 if (Args.hasArg(options::OPT_pg))
7459 crt1 = "gcrt1.o";
7460 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007461 crt1 = "Scrt1.o";
7462 else
7463 crt1 = "crt1.o";
7464 }
7465 if (crt1)
7466 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007467
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007468 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7469 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007470
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007471 const char *crtbegin;
7472 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007473 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007474 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007475 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007476 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007477 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007478 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007479 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007480 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007481
7482 // Add crtfastmath.o if available and fast math is enabled.
7483 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007484 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007485
7486 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007487 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007488
7489 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7490
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007491 for (const auto &Path : Paths)
7492 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007493
Alp Tokerce365ca2013-12-02 12:43:03 +00007494 if (D.IsUsingLTO(Args))
7495 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007496
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007497 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7498 CmdArgs.push_back("--no-demangle");
7499
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007500 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7501
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007502 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007503 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007504 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007505
Hans Wennborg70850d82013-07-18 20:29:38 +00007506 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007507 !Args.hasArg(options::OPT_nostdlib) &&
7508 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007509 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7510 !Args.hasArg(options::OPT_static);
7511 if (OnlyLibstdcxxStatic)
7512 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007513 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007514 if (OnlyLibstdcxxStatic)
7515 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007516 CmdArgs.push_back("-lm");
7517 }
7518
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007519 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007520 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7521 if (Args.hasArg(options::OPT_static))
7522 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007523
Alexey Bataev186b28a2014-03-06 05:43:53 +00007524 LibOpenMP UsedOpenMPLib = LibUnknown;
7525 if (Args.hasArg(options::OPT_fopenmp)) {
7526 UsedOpenMPLib = LibGOMP;
7527 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7528 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7529 .Case("libgomp", LibGOMP)
7530 .Case("libiomp5", LibIOMP5)
7531 .Default(LibUnknown);
7532 if (UsedOpenMPLib == LibUnknown)
7533 D.Diag(diag::err_drv_unsupported_option_argument)
7534 << A->getOption().getName() << A->getValue();
7535 }
7536 switch (UsedOpenMPLib) {
7537 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007538 CmdArgs.push_back("-lgomp");
7539
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007540 // FIXME: Exclude this for platforms with libgomp that don't require
7541 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007542 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007543 break;
7544 case LibIOMP5:
7545 CmdArgs.push_back("-liomp5");
7546 break;
7547 case LibUnknown:
7548 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007549 }
Renato Golinc4b49242014-02-13 10:01:16 +00007550 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007551
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007552 if ((Args.hasArg(options::OPT_pthread) ||
7553 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7554 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007555 CmdArgs.push_back("-lpthread");
7556
7557 CmdArgs.push_back("-lc");
7558
7559 if (Args.hasArg(options::OPT_static))
7560 CmdArgs.push_back("--end-group");
7561 else
Renato Golinc4b49242014-02-13 10:01:16 +00007562 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007563 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007564
Rafael Espindola81937ec2010-12-01 01:52:43 +00007565 if (!Args.hasArg(options::OPT_nostartfiles)) {
7566 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007567 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007568 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007569 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007570 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007571 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007572 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007573
Rafael Espindola81937ec2010-12-01 01:52:43 +00007574 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007575 if (!isAndroid)
7576 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007577 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007578 }
7579
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007580 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007581}
7582
Chris Lattner3e2ee142010-07-07 16:01:42 +00007583void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007584 const InputInfo &Output,
7585 const InputInfoList &Inputs,
7586 const ArgList &Args,
7587 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007588 ArgStringList CmdArgs;
7589
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007590 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007591
7592 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007593 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007594
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007595 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007596 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007597
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007598 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007599 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007600}
7601
7602void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007603 const InputInfo &Output,
7604 const InputInfoList &Inputs,
7605 const ArgList &Args,
7606 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007607 const Driver &D = getToolChain().getDriver();
7608 ArgStringList CmdArgs;
7609
Daniel Dunbarb440f562010-08-02 02:38:21 +00007610 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007611 CmdArgs.push_back("-o");
7612 CmdArgs.push_back(Output.getFilename());
7613 } else {
7614 assert(Output.isNothing() && "Invalid output.");
7615 }
7616
7617 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007618 !Args.hasArg(options::OPT_nostartfiles)) {
7619 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7620 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7621 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7622 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7623 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007624
7625 Args.AddAllArgs(CmdArgs, options::OPT_L);
7626 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7627 Args.AddAllArgs(CmdArgs, options::OPT_e);
7628
Daniel Dunbar54423b22010-09-17 00:24:54 +00007629 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007630
Alexey Samsonov7811d192014-02-20 13:57:37 +00007631 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007632
Chris Lattner3e2ee142010-07-07 16:01:42 +00007633 if (!Args.hasArg(options::OPT_nostdlib) &&
7634 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007635 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007636 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007637 CmdArgs.push_back("-lm");
7638 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007639 }
7640
7641 if (!Args.hasArg(options::OPT_nostdlib) &&
7642 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007643 if (Args.hasArg(options::OPT_pthread))
7644 CmdArgs.push_back("-lpthread");
7645 CmdArgs.push_back("-lc");
7646 CmdArgs.push_back("-lCompilerRT-Generic");
7647 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7648 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007649 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007650 }
7651
Logan Chieneb9162f2014-06-26 14:23:45 +00007652 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007653 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007654}
7655
Daniel Dunbarcc912342009-05-02 18:28:39 +00007656/// DragonFly Tools
7657
7658// For now, DragonFly Assemble does just about the same as for
7659// FreeBSD, but this may change soon.
7660void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007661 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007662 const InputInfoList &Inputs,
7663 const ArgList &Args,
7664 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007665 ArgStringList CmdArgs;
7666
7667 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7668 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007669 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007670 CmdArgs.push_back("--32");
7671
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007672 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007673
7674 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007675 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007676
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007677 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007678 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007679
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007680 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007681 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007682}
7683
7684void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007685 const InputInfo &Output,
7686 const InputInfoList &Inputs,
7687 const ArgList &Args,
7688 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007689 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007690 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007691 ArgStringList CmdArgs;
7692
John McCall65b8da02013-04-11 22:55:55 +00007693 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7694 UseGCC47 = false;
7695
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007696 if (!D.SysRoot.empty())
7697 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7698
John McCall65b8da02013-04-11 22:55:55 +00007699 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007700 if (Args.hasArg(options::OPT_static)) {
7701 CmdArgs.push_back("-Bstatic");
7702 } else {
John McCall65b8da02013-04-11 22:55:55 +00007703 if (Args.hasArg(options::OPT_rdynamic))
7704 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007705 if (Args.hasArg(options::OPT_shared))
7706 CmdArgs.push_back("-Bshareable");
7707 else {
7708 CmdArgs.push_back("-dynamic-linker");
7709 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7710 }
John McCall65b8da02013-04-11 22:55:55 +00007711 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007712 }
7713
7714 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7715 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007716 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007717 CmdArgs.push_back("-m");
7718 CmdArgs.push_back("elf_i386");
7719 }
7720
Daniel Dunbarb440f562010-08-02 02:38:21 +00007721 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007722 CmdArgs.push_back("-o");
7723 CmdArgs.push_back(Output.getFilename());
7724 } else {
7725 assert(Output.isNothing() && "Invalid output.");
7726 }
7727
7728 if (!Args.hasArg(options::OPT_nostdlib) &&
7729 !Args.hasArg(options::OPT_nostartfiles)) {
7730 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007731 if (Args.hasArg(options::OPT_pg))
7732 CmdArgs.push_back(Args.MakeArgString(
7733 getToolChain().GetFilePath("gcrt1.o")));
7734 else {
7735 if (Args.hasArg(options::OPT_pie))
7736 CmdArgs.push_back(Args.MakeArgString(
7737 getToolChain().GetFilePath("Scrt1.o")));
7738 else
7739 CmdArgs.push_back(Args.MakeArgString(
7740 getToolChain().GetFilePath("crt1.o")));
7741 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007742 }
John McCall65b8da02013-04-11 22:55:55 +00007743 CmdArgs.push_back(Args.MakeArgString(
7744 getToolChain().GetFilePath("crti.o")));
7745 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7746 CmdArgs.push_back(Args.MakeArgString(
7747 getToolChain().GetFilePath("crtbeginS.o")));
7748 else
7749 CmdArgs.push_back(Args.MakeArgString(
7750 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007751 }
7752
7753 Args.AddAllArgs(CmdArgs, options::OPT_L);
7754 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7755 Args.AddAllArgs(CmdArgs, options::OPT_e);
7756
Daniel Dunbar54423b22010-09-17 00:24:54 +00007757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007758
7759 if (!Args.hasArg(options::OPT_nostdlib) &&
7760 !Args.hasArg(options::OPT_nodefaultlibs)) {
7761 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7762 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007763 if (UseGCC47)
7764 CmdArgs.push_back("-L/usr/lib/gcc47");
7765 else
7766 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007767
7768 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007769 if (UseGCC47) {
7770 CmdArgs.push_back("-rpath");
7771 CmdArgs.push_back("/usr/lib/gcc47");
7772 } else {
7773 CmdArgs.push_back("-rpath");
7774 CmdArgs.push_back("/usr/lib/gcc44");
7775 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007776 }
7777
Hans Wennborg70850d82013-07-18 20:29:38 +00007778 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007779 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007780 CmdArgs.push_back("-lm");
7781 }
7782
Daniel Dunbarcc912342009-05-02 18:28:39 +00007783 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007784 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007785
7786 if (!Args.hasArg(options::OPT_nolibc)) {
7787 CmdArgs.push_back("-lc");
7788 }
7789
John McCall65b8da02013-04-11 22:55:55 +00007790 if (UseGCC47) {
7791 if (Args.hasArg(options::OPT_static) ||
7792 Args.hasArg(options::OPT_static_libgcc)) {
7793 CmdArgs.push_back("-lgcc");
7794 CmdArgs.push_back("-lgcc_eh");
7795 } else {
7796 if (Args.hasArg(options::OPT_shared_libgcc)) {
7797 CmdArgs.push_back("-lgcc_pic");
7798 if (!Args.hasArg(options::OPT_shared))
7799 CmdArgs.push_back("-lgcc");
7800 } else {
7801 CmdArgs.push_back("-lgcc");
7802 CmdArgs.push_back("--as-needed");
7803 CmdArgs.push_back("-lgcc_pic");
7804 CmdArgs.push_back("--no-as-needed");
7805 }
7806 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007807 } else {
John McCall65b8da02013-04-11 22:55:55 +00007808 if (Args.hasArg(options::OPT_shared)) {
7809 CmdArgs.push_back("-lgcc_pic");
7810 } else {
7811 CmdArgs.push_back("-lgcc");
7812 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007813 }
7814 }
7815
7816 if (!Args.hasArg(options::OPT_nostdlib) &&
7817 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007818 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007819 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007820 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007821 else
7822 CmdArgs.push_back(Args.MakeArgString(
7823 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007824 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007825 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007826 }
7827
Alexey Samsonov7811d192014-02-20 13:57:37 +00007828 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007829
Logan Chieneb9162f2014-06-26 14:23:45 +00007830 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007831 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007832}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007833
Alexey Samsonov6424e022014-05-12 20:20:20 +00007834static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7835 ArgStringList &CmdArgs,
7836 const StringRef RTName) {
7837 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7838 llvm::sys::path::append(LibSanitizer,
7839 Twine("clang_rt.") + RTName + ".lib");
7840 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7841}
7842
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007843void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7844 const InputInfo &Output,
7845 const InputInfoList &Inputs,
7846 const ArgList &Args,
7847 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007848 ArgStringList CmdArgs;
7849
7850 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007851 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7852 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007853 } else {
7854 assert(Output.isNothing() && "Invalid output.");
7855 }
7856
7857 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007858 !Args.hasArg(options::OPT_nostartfiles) &&
7859 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007860 CmdArgs.push_back("-defaultlib:libcmt");
7861 }
7862
7863 CmdArgs.push_back("-nologo");
7864
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007865 if (Args.hasArg(options::OPT_g_Group)) {
7866 CmdArgs.push_back("-debug");
7867 }
7868
Hans Wennborgf1a74252013-09-10 20:18:04 +00007869 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7870
7871 if (DLL) {
7872 CmdArgs.push_back(Args.MakeArgString("-dll"));
7873
7874 SmallString<128> ImplibName(Output.getFilename());
7875 llvm::sys::path::replace_extension(ImplibName, "lib");
7876 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7877 ImplibName.str()));
7878 }
7879
Peter Collingbourne32701642013-11-01 18:16:25 +00007880 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007881 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007882 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007883 // FIXME: Handle 64-bit.
Alexey Samsonov6424e022014-05-12 20:20:20 +00007884 if (DLL) {
7885 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7886 "asan_dll_thunk-i386");
7887 } else {
7888 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7889 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7890 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007891 }
7892
Michael J. Spencere2f49362012-06-18 16:56:04 +00007893 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007894 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007895
7896 // Add filenames immediately.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007897 for (const auto &Input : Inputs)
7898 if (Input.isFilename())
7899 CmdArgs.push_back(Input.getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007900 else
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007901 Input.getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007902
7903 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007904 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007905 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7906}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007907
7908void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7909 const InputInfo &Output,
7910 const InputInfoList &Inputs,
7911 const ArgList &Args,
7912 const char *LinkingOutput) const {
7913 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7914}
7915
Hans Wennborg188382e2013-09-20 18:16:35 +00007916// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7917// If one cannot be found, return FallbackName.
7918// We do this special search to prevent clang-cl from falling back onto itself
7919// if it's available as cl.exe on the path.
7920static std::string FindFallback(const char *FallbackName,
7921 const char *ClangProgramPath) {
7922 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7923 if (!OptPath.hasValue())
7924 return FallbackName;
7925
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007926 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Hans Wennborg188382e2013-09-20 18:16:35 +00007927 SmallVector<StringRef, 8> PathSegments;
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007928 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
Hans Wennborg188382e2013-09-20 18:16:35 +00007929
7930 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7931 const StringRef &PathSegment = PathSegments[i];
7932 if (PathSegment.empty())
7933 continue;
7934
7935 SmallString<128> FilePath(PathSegment);
7936 llvm::sys::path::append(FilePath, FallbackName);
7937 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7938 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7939 return FilePath.str();
7940 }
7941
7942 return FallbackName;
7943}
7944
Hans Wennborg87cfa712013-09-19 20:32:16 +00007945Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7946 const InputInfo &Output,
7947 const InputInfoList &Inputs,
7948 const ArgList &Args,
7949 const char *LinkingOutput) const {
7950 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007951 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007952 CmdArgs.push_back("/c"); // Compile only.
7953 CmdArgs.push_back("/W0"); // No warnings.
7954
7955 // The goal is to be able to invoke this tool correctly based on
7956 // any flag accepted by clang-cl.
7957
7958 // These are spelled the same way in clang and cl.exe,.
7959 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7960 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007961
7962 // Optimization level.
7963 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7964 if (A->getOption().getID() == options::OPT_O0) {
7965 CmdArgs.push_back("/Od");
7966 } else {
7967 StringRef OptLevel = A->getValue();
7968 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7969 A->render(Args, CmdArgs);
7970 else if (OptLevel == "3")
7971 CmdArgs.push_back("/Ox");
7972 }
7973 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007974
7975 // Flags for which clang-cl have an alias.
7976 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7977
David Majnemerf6072342014-07-01 22:24:56 +00007978 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7979 /*default=*/false))
7980 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007981 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7982 options::OPT_fno_function_sections))
7983 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7984 ? "/Gy"
7985 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007986 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7987 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007988 CmdArgs.push_back(
7989 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007990 if (Args.hasArg(options::OPT_fsyntax_only))
7991 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007992 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7993 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007994
Hans Wennborg260ff402013-09-27 17:54:18 +00007995 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007996 for (const auto &Include : Includes)
7997 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00007998
Hans Wennborg87cfa712013-09-19 20:32:16 +00007999 // Flags that can simply be passed through.
8000 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8001 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008002 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008003
8004 // The order of these flags is relevant, so pick the last one.
8005 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8006 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8007 A->render(Args, CmdArgs);
8008
8009
8010 // Input filename.
8011 assert(Inputs.size() == 1);
8012 const InputInfo &II = Inputs[0];
8013 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8014 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8015 if (II.isFilename())
8016 CmdArgs.push_back(II.getFilename());
8017 else
8018 II.getInputArg().renderAsInput(Args, CmdArgs);
8019
8020 // Output filename.
8021 assert(Output.getType() == types::TY_Object);
8022 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8023 Output.getFilename());
8024 CmdArgs.push_back(Fo);
8025
Hans Wennborg188382e2013-09-20 18:16:35 +00008026 const Driver &D = getToolChain().getDriver();
8027 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg188382e2013-09-20 18:16:35 +00008028 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008029}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008030
8031
8032/// XCore Tools
8033// We pass assemble and link construction to the xcc tool.
8034
8035void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8036 const InputInfo &Output,
8037 const InputInfoList &Inputs,
8038 const ArgList &Args,
8039 const char *LinkingOutput) const {
8040 ArgStringList CmdArgs;
8041
8042 CmdArgs.push_back("-o");
8043 CmdArgs.push_back(Output.getFilename());
8044
8045 CmdArgs.push_back("-c");
8046
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008047 if (Args.hasArg(options::OPT_v))
8048 CmdArgs.push_back("-v");
8049
Robert Lytton894d25c2014-05-02 09:33:25 +00008050 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8051 if (!A->getOption().matches(options::OPT_g0))
8052 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008053
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008054 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8055 false))
8056 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008057
8058 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8059 options::OPT_Xassembler);
8060
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008061 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008062 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008063
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008064 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008065 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
8066}
8067
8068void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8069 const InputInfo &Output,
8070 const InputInfoList &Inputs,
8071 const ArgList &Args,
8072 const char *LinkingOutput) const {
8073 ArgStringList CmdArgs;
8074
8075 if (Output.isFilename()) {
8076 CmdArgs.push_back("-o");
8077 CmdArgs.push_back(Output.getFilename());
8078 } else {
8079 assert(Output.isNothing() && "Invalid output.");
8080 }
8081
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008082 if (Args.hasArg(options::OPT_v))
8083 CmdArgs.push_back("-v");
8084
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008085 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
8086 if (EH.ShouldUseExceptionTables)
8087 CmdArgs.push_back("-fexceptions");
8088
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008089 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8090
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008091 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008092 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
8093}