blob: 86a05cd28c495b114fb03a52739f61e9e32186af [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");
809 else
810 CmdArgs.push_back("-arm-no-strict-align");
811 }
812 }
813
Chad Rosierba3df1d2011-08-26 00:26:29 +0000814 // Setting -mno-global-merge disables the codegen global merge pass. Setting
815 // -mglobal-merge has no effect as the pass is enabled by default.
816 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
817 options::OPT_mno_global_merge)) {
818 if (A->getOption().matches(options::OPT_mno_global_merge))
819 CmdArgs.push_back("-mno-global-merge");
820 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000821
Bob Wilson9c8af452013-04-11 18:53:25 +0000822 if (!Args.hasFlag(options::OPT_mimplicit_float,
823 options::OPT_mno_implicit_float,
824 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000825 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000826
Logan Chien749763e2014-04-03 13:12:44 +0000827 // llvm does not support reserving registers in general. There is support
828 // for reserving r9 on ARM though (defined as a platform-specific register
829 // in ARM EABI).
830 if (Args.hasArg(options::OPT_ffixed_r9)) {
831 CmdArgs.push_back("-backend-option");
832 CmdArgs.push_back("-arm-reserve-r9");
833 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000834}
835
Tim Northover573cbee2014-05-24 12:52:07 +0000836/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
837/// targeting.
838static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000839 Arg *A;
840 std::string CPU;
841 // If we have -mtune or -mcpu, use that.
842 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
843 CPU = A->getValue();
844 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
845 StringRef Mcpu = A->getValue();
846 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000847 }
848
Kevin Qin110db6f2014-07-18 07:03:22 +0000849 // Handle CPU name is 'native'.
850 if (CPU == "native")
851 return llvm::sys::getHostCPUName();
852 else if (CPU.size())
853 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000854
James Molloy9b1586b2014-04-17 12:51:17 +0000855 // Make sure we pick "cyclone" if -arch is used.
856 // FIXME: Should this be picked by checking the target triple instead?
857 if (Args.getLastArg(options::OPT_arch))
858 return "cyclone";
859
860 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000861}
862
Tim Northover573cbee2014-05-24 12:52:07 +0000863void Clang::AddAArch64TargetArgs(const ArgList &Args,
864 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000865 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
866 llvm::Triple Triple(TripleStr);
867
868 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
869 Args.hasArg(options::OPT_mkernel) ||
870 Args.hasArg(options::OPT_fapple_kext))
871 CmdArgs.push_back("-disable-red-zone");
872
873 if (!Args.hasFlag(options::OPT_mimplicit_float,
874 options::OPT_mno_implicit_float, true))
875 CmdArgs.push_back("-no-implicit-float");
876
Craig Topper92fc2df2014-05-17 16:56:41 +0000877 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000878 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
879 ABIName = A->getValue();
880 else if (Triple.isOSDarwin())
881 ABIName = "darwinpcs";
882 else
883 ABIName = "aapcs";
884
885 CmdArgs.push_back("-target-abi");
886 CmdArgs.push_back(ABIName);
887
Bob Wilson0874e532014-07-29 00:23:18 +0000888 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
889 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000890 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000891 if (A->getOption().matches(options::OPT_mno_unaligned_access))
892 CmdArgs.push_back("-aarch64-strict-align");
893 else
894 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000895 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000896
897 // Setting -mno-global-merge disables the codegen global merge pass. Setting
898 // -mglobal-merge has no effect as the pass is enabled by default.
899 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
900 options::OPT_mno_global_merge)) {
901 if (A->getOption().matches(options::OPT_mno_global_merge))
902 CmdArgs.push_back("-mno-global-merge");
903 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000904}
905
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000906// Get CPU and ABI names. They are not independent
907// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000908void mips::getMipsCPUAndABI(const ArgList &Args,
909 const llvm::Triple &Triple,
910 StringRef &CPUName,
911 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000912 const char *DefMips32CPU = "mips32r2";
913 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000914
Daniel Sanders2bf13662014-07-10 14:40:57 +0000915 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
916 // default for mips64(el)?-img-linux-gnu.
917 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
918 Triple.getEnvironment() == llvm::Triple::GNU) {
919 DefMips32CPU = "mips32r6";
920 DefMips64CPU = "mips64r6";
921 }
922
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000923 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000924 options::OPT_mcpu_EQ))
925 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000926
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000927 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000928 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000929 // Convert a GNU style Mips ABI name to the name
930 // accepted by LLVM Mips backend.
931 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
932 .Case("32", "o32")
933 .Case("64", "n64")
934 .Default(ABIName);
935 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000936
937 // Setup default CPU and ABI names.
938 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000939 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000940 default:
941 llvm_unreachable("Unexpected triple arch name");
942 case llvm::Triple::mips:
943 case llvm::Triple::mipsel:
944 CPUName = DefMips32CPU;
945 break;
946 case llvm::Triple::mips64:
947 case llvm::Triple::mips64el:
948 CPUName = DefMips64CPU;
949 break;
950 }
951 }
952
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000953 if (ABIName.empty()) {
954 // Deduce ABI name from the target triple.
955 if (Triple.getArch() == llvm::Triple::mips ||
956 Triple.getArch() == llvm::Triple::mipsel)
957 ABIName = "o32";
958 else
959 ABIName = "n64";
960 }
961
962 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000963 // Deduce CPU name from ABI name.
964 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +0000965 .Cases("o32", "eabi", DefMips32CPU)
966 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000967 .Default("");
968 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +0000969
970 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000971}
972
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000973// Convert ABI name to the GNU tools acceptable variant.
974static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
975 return llvm::StringSwitch<llvm::StringRef>(ABI)
976 .Case("o32", "32")
977 .Case("n64", "64")
978 .Default(ABI);
979}
980
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000981// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
982// and -mfloat-abi=.
983static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000984 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000985 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000986 options::OPT_mhard_float,
987 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000988 if (A->getOption().matches(options::OPT_msoft_float))
989 FloatABI = "soft";
990 else if (A->getOption().matches(options::OPT_mhard_float))
991 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000992 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000993 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000994 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000995 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000996 FloatABI = "hard";
997 }
998 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 }
1000
1001 // If unspecified, choose the default based on the platform.
1002 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001003 // Assume "hard", because it's a default value used by gcc.
1004 // When we start to recognize specific target MIPS processors,
1005 // we will be able to select the default more correctly.
1006 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001007 }
1008
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001009 return FloatABI;
1010}
1011
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001012static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001013 std::vector<const char *> &Features,
1014 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001015 StringRef FeatureName) {
1016 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001017 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001018 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001019 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001020 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001021 }
1022}
1023
Daniel Sanders379d44b2014-07-16 11:52:23 +00001024static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1025 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001026 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001027 StringRef CPUName;
1028 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001029 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001030 ABIName = getGnuCompatibleMipsABIName(ABIName);
1031
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001032 // Always override the backend's default ABI.
Aaron Ballman9eef74232014-07-17 13:28:50 +00001033 std::string ABIFeature = llvm::StringSwitch<StringRef>(ABIName)
1034 .Case("32", "+o32")
1035 .Case("n32", "+n32")
1036 .Case("64", "+n64")
1037 .Case("eabi", "+eabi")
1038 .Default(("+" + ABIName).str());
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001039 Features.push_back("-o32");
1040 Features.push_back("-n64");
1041 Features.push_back(Args.MakeArgString(ABIFeature));
1042
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001043 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001044 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001045 // FIXME: Note, this is a hack. We need to pass the selected float
1046 // mode to the MipsTargetInfoBase to define appropriate macros there.
1047 // Now it is the only method.
1048 Features.push_back("+soft-float");
1049 }
1050
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001051 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001052 StringRef Val = StringRef(A->getValue());
1053 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001054 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001055 else if (Val == "legacy")
1056 Features.push_back("-nan2008");
1057 else
1058 D.Diag(diag::err_drv_unsupported_option_argument)
1059 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001060 }
1061
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001062 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1063 options::OPT_mdouble_float, "single-float");
1064 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1065 "mips16");
1066 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1067 options::OPT_mno_micromips, "micromips");
1068 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1069 "dsp");
1070 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1071 "dspr2");
1072 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1073 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001074
1075 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1076 // pass -mfpxx
1077 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1078 options::OPT_mfp64)) {
1079 if (A->getOption().matches(options::OPT_mfp32))
1080 Features.push_back(Args.MakeArgString("-fp64"));
1081 else if (A->getOption().matches(options::OPT_mfpxx)) {
1082 Features.push_back(Args.MakeArgString("+fpxx"));
1083 Features.push_back(Args.MakeArgString("+nooddspreg"));
1084 } else
1085 Features.push_back(Args.MakeArgString("+fp64"));
1086 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001087 Features.push_back(Args.MakeArgString("+fpxx"));
1088 Features.push_back(Args.MakeArgString("+nooddspreg"));
1089 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001090
Daniel Sanders28e5d392014-07-10 10:39:51 +00001091 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1092 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001093}
1094
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001095void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001096 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001097 const Driver &D = getToolChain().getDriver();
1098 StringRef CPUName;
1099 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001100 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001101 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001102
1103 CmdArgs.push_back("-target-abi");
1104 CmdArgs.push_back(ABIName.data());
1105
1106 StringRef FloatABI = getMipsFloatABI(D, Args);
1107
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001108 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001109 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001110 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001111 CmdArgs.push_back("-mfloat-abi");
1112 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001113 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001114 else {
1115 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001117 CmdArgs.push_back("-mfloat-abi");
1118 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001119 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001120
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001121 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1122 if (A->getOption().matches(options::OPT_mxgot)) {
1123 CmdArgs.push_back("-mllvm");
1124 CmdArgs.push_back("-mxgot");
1125 }
1126 }
1127
Simon Atanasyanc580b322013-05-11 06:33:44 +00001128 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1129 options::OPT_mno_ldc1_sdc1)) {
1130 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1131 CmdArgs.push_back("-mllvm");
1132 CmdArgs.push_back("-mno-ldc1-sdc1");
1133 }
1134 }
1135
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1137 options::OPT_mno_check_zero_division)) {
1138 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1139 CmdArgs.push_back("-mllvm");
1140 CmdArgs.push_back("-mno-check-zero-division");
1141 }
1142 }
1143
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001144 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001145 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001146 CmdArgs.push_back("-mllvm");
1147 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1148 A->claim();
1149 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001150}
1151
Hal Finkel8eb59282012-06-11 22:35:19 +00001152/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1153static std::string getPPCTargetCPU(const ArgList &Args) {
1154 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001155 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001156
1157 if (CPUName == "native") {
1158 std::string CPU = llvm::sys::getHostCPUName();
1159 if (!CPU.empty() && CPU != "generic")
1160 return CPU;
1161 else
1162 return "";
1163 }
1164
1165 return llvm::StringSwitch<const char *>(CPUName)
1166 .Case("common", "generic")
1167 .Case("440", "440")
1168 .Case("440fp", "440")
1169 .Case("450", "450")
1170 .Case("601", "601")
1171 .Case("602", "602")
1172 .Case("603", "603")
1173 .Case("603e", "603e")
1174 .Case("603ev", "603ev")
1175 .Case("604", "604")
1176 .Case("604e", "604e")
1177 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001178 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001179 .Case("G3", "g3")
1180 .Case("7400", "7400")
1181 .Case("G4", "g4")
1182 .Case("7450", "7450")
1183 .Case("G4+", "g4+")
1184 .Case("750", "750")
1185 .Case("970", "970")
1186 .Case("G5", "g5")
1187 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001188 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001189 .Case("e500mc", "e500mc")
1190 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001191 .Case("power3", "pwr3")
1192 .Case("power4", "pwr4")
1193 .Case("power5", "pwr5")
1194 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001195 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001196 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001197 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001198 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 .Case("pwr3", "pwr3")
1200 .Case("pwr4", "pwr4")
1201 .Case("pwr5", "pwr5")
1202 .Case("pwr5x", "pwr5x")
1203 .Case("pwr6", "pwr6")
1204 .Case("pwr6x", "pwr6x")
1205 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001206 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001207 .Case("powerpc", "ppc")
1208 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001209 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001210 .Default("");
1211 }
1212
1213 return "";
1214}
1215
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001216static void getPPCTargetFeatures(const ArgList &Args,
1217 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001218 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1219 ie = Args.filtered_end();
1220 it != ie; ++it) {
1221 StringRef Name = (*it)->getOption().getName();
1222 (*it)->claim();
1223
1224 // Skip over "-m".
1225 assert(Name.startswith("m") && "Invalid feature name.");
1226 Name = Name.substr(1);
1227
1228 bool IsNegative = Name.startswith("no-");
1229 if (IsNegative)
1230 Name = Name.substr(3);
1231
1232 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1233 // pass the correct option to the backend while calling the frontend
1234 // option the same.
1235 // TODO: Change the LLVM backend option maybe?
1236 if (Name == "mfcrf")
1237 Name = "mfocrf";
1238
1239 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1240 }
1241
1242 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001243 AddTargetFeature(Args, Features, options::OPT_faltivec,
1244 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001245}
1246
Ulrich Weigand8afad612014-07-28 13:17:52 +00001247void Clang::AddPPCTargetArgs(const ArgList &Args,
1248 ArgStringList &CmdArgs) const {
1249 // Select the ABI to use.
1250 const char *ABIName = nullptr;
1251 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1252 ABIName = A->getValue();
1253 } else if (getToolChain().getTriple().isOSLinux())
1254 switch(getToolChain().getArch()) {
1255 case llvm::Triple::ppc64:
1256 ABIName = "elfv1";
1257 break;
1258 case llvm::Triple::ppc64le:
1259 ABIName = "elfv2";
1260 break;
1261 default:
1262 break;
1263 }
1264
1265 if (ABIName) {
1266 CmdArgs.push_back("-target-abi");
1267 CmdArgs.push_back(ABIName);
1268 }
1269}
1270
1271bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1272 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1273 return A && (A->getValue() == StringRef(Value));
1274}
1275
Tom Stellard6674c702013-04-01 20:56:53 +00001276/// Get the (LLVM) name of the R600 gpu we are targeting.
1277static std::string getR600TargetGPU(const ArgList &Args) {
1278 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001279 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001280 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001281 .Cases("rv630", "rv635", "r600")
1282 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001283 .Case("rv740", "rv770")
1284 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001285 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001286 .Case("hemlock", "cypress")
1287 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001288 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001289 }
1290 return "";
1291}
1292
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001293static void getSparcTargetFeatures(const ArgList &Args,
1294 std::vector<const char *> Features) {
1295 bool SoftFloatABI = true;
1296 if (Arg *A =
1297 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1298 if (A->getOption().matches(options::OPT_mhard_float))
1299 SoftFloatABI = false;
1300 }
1301 if (SoftFloatABI)
1302 Features.push_back("+soft-float");
1303}
1304
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001305void Clang::AddSparcTargetArgs(const ArgList &Args,
1306 ArgStringList &CmdArgs) const {
1307 const Driver &D = getToolChain().getDriver();
1308
Brad Smith10cd0f42014-07-11 20:12:08 +00001309 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001310 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001311 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1312 options::OPT_mhard_float)) {
1313 if (A->getOption().matches(options::OPT_msoft_float))
1314 FloatABI = "soft";
1315 else if (A->getOption().matches(options::OPT_mhard_float))
1316 FloatABI = "hard";
1317 }
1318
1319 // If unspecified, choose the default based on the platform.
1320 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001321 // Assume "soft", but warn the user we are guessing.
1322 FloatABI = "soft";
1323 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001324 }
1325
1326 if (FloatABI == "soft") {
1327 // Floating point operations and argument passing are soft.
1328 //
1329 // FIXME: This changes CPP defines, we need -target-soft-float.
1330 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001331 } else {
1332 assert(FloatABI == "hard" && "Invalid float abi!");
1333 CmdArgs.push_back("-mhard-float");
1334 }
1335}
1336
Richard Sandiford4652d892013-07-19 16:51:51 +00001337static const char *getSystemZTargetCPU(const ArgList &Args) {
1338 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1339 return A->getValue();
1340 return "z10";
1341}
1342
Chandler Carruth953fb082013-01-13 11:46:33 +00001343static const char *getX86TargetCPU(const ArgList &Args,
1344 const llvm::Triple &Triple) {
1345 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001346 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001347 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001348 return "core-avx2";
1349
Chandler Carruth953fb082013-01-13 11:46:33 +00001350 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001351 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001352
1353 // FIXME: Reject attempts to use -march=native unless the target matches
1354 // the host.
1355 //
1356 // FIXME: We should also incorporate the detected target features for use
1357 // with -native.
1358 std::string CPU = llvm::sys::getHostCPUName();
1359 if (!CPU.empty() && CPU != "generic")
1360 return Args.MakeArgString(CPU);
1361 }
1362
1363 // Select the default CPU if none was given (or detection failed).
1364
1365 if (Triple.getArch() != llvm::Triple::x86_64 &&
1366 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001367 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001368
1369 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1370
1371 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001372 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001373 if (Triple.getArchName() == "x86_64h")
1374 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001375 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001376 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001377
Alexey Bataev286d1b92014-01-31 04:07:13 +00001378 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001379 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001380 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001381
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001382 // Everything else goes to x86-64 in 64-bit mode.
1383 if (Is64Bit)
1384 return "x86-64";
1385
1386 switch (Triple.getOS()) {
1387 case llvm::Triple::FreeBSD:
1388 case llvm::Triple::NetBSD:
1389 case llvm::Triple::OpenBSD:
1390 return "i486";
1391 case llvm::Triple::Haiku:
1392 return "i586";
1393 case llvm::Triple::Bitrig:
1394 return "i686";
1395 default:
1396 // Fallback to p4.
1397 return "pentium4";
1398 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001399}
1400
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001401static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1402 switch(T.getArch()) {
1403 default:
1404 return "";
1405
Amara Emerson703da2e2013-10-31 09:32:33 +00001406 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001407 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001408 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001409
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001410 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001411 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001412 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001413 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001414 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001415
1416 case llvm::Triple::mips:
1417 case llvm::Triple::mipsel:
1418 case llvm::Triple::mips64:
1419 case llvm::Triple::mips64el: {
1420 StringRef CPUName;
1421 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001422 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001423 return CPUName;
1424 }
1425
1426 case llvm::Triple::ppc:
1427 case llvm::Triple::ppc64:
1428 case llvm::Triple::ppc64le: {
1429 std::string TargetCPUName = getPPCTargetCPU(Args);
1430 // LLVM may default to generating code for the native CPU,
1431 // but, like gcc, we default to a more generic option for
1432 // each architecture. (except on Darwin)
1433 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1434 if (T.getArch() == llvm::Triple::ppc64)
1435 TargetCPUName = "ppc64";
1436 else if (T.getArch() == llvm::Triple::ppc64le)
1437 TargetCPUName = "ppc64le";
1438 else
1439 TargetCPUName = "ppc";
1440 }
1441 return TargetCPUName;
1442 }
1443
1444 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001445 case llvm::Triple::sparcv9:
1446 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001447 return A->getValue();
1448 return "";
1449
1450 case llvm::Triple::x86:
1451 case llvm::Triple::x86_64:
1452 return getX86TargetCPU(Args, T);
1453
1454 case llvm::Triple::hexagon:
1455 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1456
1457 case llvm::Triple::systemz:
1458 return getSystemZTargetCPU(Args);
1459
1460 case llvm::Triple::r600:
1461 return getR600TargetGPU(Args);
1462 }
1463}
1464
Alp Tokerce365ca2013-12-02 12:43:03 +00001465static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1466 ArgStringList &CmdArgs) {
1467 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1468 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1469 // forward.
1470 CmdArgs.push_back("-plugin");
1471 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1472 CmdArgs.push_back(Args.MakeArgString(Plugin));
1473
1474 // Try to pass driver level flags relevant to LTO code generation down to
1475 // the plugin.
1476
1477 // Handle flags for selecting CPU variants.
1478 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1479 if (!CPU.empty())
1480 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1481}
1482
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001483static void getX86TargetFeatures(const Driver & D,
1484 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001485 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001486 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001487 if (Triple.getArchName() == "x86_64h") {
1488 // x86_64h implies quite a few of the more modern subtarget features
1489 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1490 Features.push_back("-rdrnd");
1491 Features.push_back("-aes");
1492 Features.push_back("-pclmul");
1493 Features.push_back("-rtm");
1494 Features.push_back("-hle");
1495 Features.push_back("-fsgsbase");
1496 }
1497
Alexey Volkov54ff0802014-06-25 12:15:36 +00001498 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001499 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001500 if (Triple.getArch() == llvm::Triple::x86_64) {
1501 Features.push_back("+sse4.2");
1502 Features.push_back("+popcnt");
1503 } else
1504 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001505 }
1506
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001507 // Set features according to the -arch flag on MSVC
1508 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1509 StringRef Arch = A->getValue();
1510 bool ArchUsed = false;
1511 // First, look for flags that are shared in x86 and x86-64.
1512 if (Triple.getArch() == llvm::Triple::x86_64 ||
1513 Triple.getArch() == llvm::Triple::x86) {
1514 if (Arch == "AVX" || Arch == "AVX2") {
1515 ArchUsed = true;
1516 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1517 }
1518 }
1519 // Then, look for x86-specific flags.
1520 if (Triple.getArch() == llvm::Triple::x86) {
1521 if (Arch == "IA32") {
1522 ArchUsed = true;
1523 } else if (Arch == "SSE" || Arch == "SSE2") {
1524 ArchUsed = true;
1525 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1526 }
1527 }
1528 if (!ArchUsed)
1529 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1530 }
1531
Jim Grosbach82eee262013-11-16 00:53:35 +00001532 // Now add any that the user explicitly requested on the command line,
1533 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001534 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1535 ie = Args.filtered_end();
1536 it != ie; ++it) {
1537 StringRef Name = (*it)->getOption().getName();
1538 (*it)->claim();
1539
1540 // Skip over "-m".
1541 assert(Name.startswith("m") && "Invalid feature name.");
1542 Name = Name.substr(1);
1543
1544 bool IsNegative = Name.startswith("no-");
1545 if (IsNegative)
1546 Name = Name.substr(3);
1547
1548 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1549 }
1550}
1551
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001552void Clang::AddX86TargetArgs(const ArgList &Args,
1553 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001554 if (!Args.hasFlag(options::OPT_mred_zone,
1555 options::OPT_mno_red_zone,
1556 true) ||
1557 Args.hasArg(options::OPT_mkernel) ||
1558 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001559 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001560
Bob Wilson2616e2e2013-02-10 16:01:41 +00001561 // Default to avoid implicit floating-point for kernel/kext code, but allow
1562 // that to be overridden with -mno-soft-float.
1563 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1564 Args.hasArg(options::OPT_fapple_kext));
1565 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1566 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001567 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001568 options::OPT_mno_implicit_float)) {
1569 const Option &O = A->getOption();
1570 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1571 O.matches(options::OPT_msoft_float));
1572 }
1573 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001574 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001575
1576 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1577 StringRef Value = A->getValue();
1578 if (Value == "intel" || Value == "att") {
1579 CmdArgs.push_back("-mllvm");
1580 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1581 } else {
1582 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1583 << A->getOption().getName() << Value;
1584 }
1585 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001586}
1587
Matthew Curtise8f80a12012-12-06 17:49:03 +00001588static inline bool HasPICArg(const ArgList &Args) {
1589 return Args.hasArg(options::OPT_fPIC)
1590 || Args.hasArg(options::OPT_fpic);
1591}
1592
1593static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1594 return Args.getLastArg(options::OPT_G,
1595 options::OPT_G_EQ,
1596 options::OPT_msmall_data_threshold_EQ);
1597}
1598
1599static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1600 std::string value;
1601 if (HasPICArg(Args))
1602 value = "0";
1603 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1604 value = A->getValue();
1605 A->claim();
1606 }
1607 return value;
1608}
1609
Tony Linthicum76329bf2011-12-12 21:14:55 +00001610void Clang::AddHexagonTargetArgs(const ArgList &Args,
1611 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001612 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001613 CmdArgs.push_back("-mqdsp6-compat");
1614 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001615
Matthew Curtise8f80a12012-12-06 17:49:03 +00001616 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1617 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001618 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001619 CmdArgs.push_back(Args.MakeArgString(
1620 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001621 }
1622
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001623 if (!Args.hasArg(options::OPT_fno_short_enums))
1624 CmdArgs.push_back("-fshort-enums");
1625 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1626 CmdArgs.push_back ("-mllvm");
1627 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1628 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001629 CmdArgs.push_back ("-mllvm");
1630 CmdArgs.push_back ("-machine-sink-split=0");
1631}
1632
Kevin Qin110db6f2014-07-18 07:03:22 +00001633// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
1634static bool DecodeAArch64Features(const Driver &D, const StringRef &text,
1635 std::vector<const char *> &Features) {
1636 SmallVector<StringRef, 8> Split;
1637 text.split(Split, StringRef("+"), -1, false);
1638
1639 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1640 const char *result = llvm::StringSwitch<const char *>(Split[I])
1641 .Case("fp", "+fp-armv8")
1642 .Case("simd", "+neon")
1643 .Case("crc", "+crc")
1644 .Case("crypto", "+crypto")
1645 .Case("nofp", "-fp-armv8")
1646 .Case("nosimd", "-neon")
1647 .Case("nocrc", "-crc")
1648 .Case("nocrypto", "-crypto")
1649 .Default(nullptr);
1650 if (result)
1651 Features.push_back(result);
1652 else if (Split[I] == "neon" || Split[I] == "noneon")
1653 D.Diag(diag::err_drv_no_neon_modifier);
1654 else
1655 return false;
1656 }
1657 return true;
1658}
1659
1660// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1661// decode CPU and feature.
1662static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1663 std::vector<const char *> &Features) {
1664 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1665 CPU = Split.first;
1666 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1667 Features.push_back("+neon");
1668 Features.push_back("+crc");
1669 Features.push_back("+crypto");
1670 } else if (CPU == "generic") {
1671 Features.push_back("+neon");
1672 } else {
1673 return false;
1674 }
1675
1676 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1677 return false;
1678
1679 return true;
1680}
1681
1682static bool
1683getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1684 const ArgList &Args,
1685 std::vector<const char *> &Features) {
1686 std::pair<StringRef, StringRef> Split = March.split("+");
1687 if (Split.first != "armv8-a")
1688 return false;
1689
1690 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1691 return false;
1692
1693 return true;
1694}
1695
1696static bool
1697getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1698 const ArgList &Args,
1699 std::vector<const char *> &Features) {
1700 StringRef CPU;
1701 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1702 return false;
1703
1704 return true;
1705}
1706
1707static bool
1708getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1709 const ArgList &Args,
1710 std::vector<const char *> &Features) {
1711 // Handle CPU name is 'native'.
1712 if (Mtune == "native")
1713 Mtune = llvm::sys::getHostCPUName();
1714 if (Mtune == "cyclone") {
1715 Features.push_back("+zcm");
1716 Features.push_back("+zcz");
1717 }
1718 return true;
1719}
1720
1721static bool
1722getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1723 const ArgList &Args,
1724 std::vector<const char *> &Features) {
1725 StringRef CPU;
1726 std::vector<const char *> DecodedFeature;
1727 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1728 return false;
1729
1730 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1731}
1732
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001733static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1734 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001735 Arg *A;
1736 bool success = true;
1737 // Enable NEON by default.
1738 Features.push_back("+neon");
1739 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1740 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1741 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1742 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1743
1744 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1745 success =
1746 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1747 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1748 success =
1749 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1750
1751 if (!success)
1752 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001753
1754 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1755 Features.push_back("-fp-armv8");
1756 Features.push_back("-crypto");
1757 Features.push_back("-neon");
1758 }
Bradley Smith418c5932014-05-02 15:17:51 +00001759
1760 // En/disable crc
1761 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1762 options::OPT_mnocrc)) {
1763 if (A->getOption().matches(options::OPT_mcrc))
1764 Features.push_back("+crc");
1765 else
1766 Features.push_back("-crc");
1767 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001768}
1769
1770static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001771 const ArgList &Args, ArgStringList &CmdArgs,
1772 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001773 std::vector<const char *> Features;
1774 switch (Triple.getArch()) {
1775 default:
1776 break;
1777 case llvm::Triple::mips:
1778 case llvm::Triple::mipsel:
1779 case llvm::Triple::mips64:
1780 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001781 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001782 break;
1783
1784 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001785 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001786 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001787 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001788 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001789 break;
1790
1791 case llvm::Triple::ppc:
1792 case llvm::Triple::ppc64:
1793 case llvm::Triple::ppc64le:
1794 getPPCTargetFeatures(Args, Features);
1795 break;
1796 case llvm::Triple::sparc:
1797 getSparcTargetFeatures(Args, Features);
1798 break;
1799 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001800 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001801 getAArch64TargetFeatures(D, Args, Features);
1802 break;
1803 case llvm::Triple::x86:
1804 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001805 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001806 break;
1807 }
Rafael Espindola43964802013-08-21 17:34:32 +00001808
1809 // Find the last of each feature.
1810 llvm::StringMap<unsigned> LastOpt;
1811 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1812 const char *Name = Features[I];
1813 assert(Name[0] == '-' || Name[0] == '+');
1814 LastOpt[Name + 1] = I;
1815 }
1816
1817 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1818 // If this feature was overridden, ignore it.
1819 const char *Name = Features[I];
1820 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1821 assert(LastI != LastOpt.end());
1822 unsigned Last = LastI->second;
1823 if (Last != I)
1824 continue;
1825
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001826 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001827 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001828 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001829}
1830
Eric Christopher84fbdb42011-08-19 00:30:14 +00001831static bool
John McCall5fb5df92012-06-20 06:18:46 +00001832shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001833 const llvm::Triple &Triple) {
1834 // We use the zero-cost exception tables for Objective-C if the non-fragile
1835 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1836 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001837 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001838 return true;
1839
Bob Wilson83e723a2013-12-05 19:38:42 +00001840 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001841 return false;
1842
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001843 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001844 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001845 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001846}
1847
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001848namespace {
1849 struct ExceptionSettings {
1850 bool ExceptionsEnabled;
1851 bool ShouldUseExceptionTables;
1852 ExceptionSettings() : ExceptionsEnabled(false),
1853 ShouldUseExceptionTables(false) {}
1854 };
1855} // end anonymous namespace.
1856
Nico Webere8e53112014-05-11 01:04:02 +00001857// exceptionSettings() exists to share the logic between -cc1 and linker
1858// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001859static ExceptionSettings exceptionSettings(const ArgList &Args,
1860 const llvm::Triple &Triple) {
1861 ExceptionSettings ES;
1862
1863 // Are exceptions enabled by default?
1864 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1865
1866 // This keeps track of whether exceptions were explicitly turned on or off.
1867 bool DidHaveExplicitExceptionFlag = false;
1868
1869 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1870 options::OPT_fno_exceptions)) {
1871 if (A->getOption().matches(options::OPT_fexceptions))
1872 ES.ExceptionsEnabled = true;
1873 else
1874 ES.ExceptionsEnabled = false;
1875
1876 DidHaveExplicitExceptionFlag = true;
1877 }
1878
1879 // Exception tables and cleanups can be enabled with -fexceptions even if the
1880 // language itself doesn't support exceptions.
1881 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1882 ES.ShouldUseExceptionTables = true;
1883
1884 return ES;
1885}
1886
Anders Carlssone96ab552011-02-28 02:27:16 +00001887/// addExceptionArgs - Adds exception related arguments to the driver command
1888/// arguments. There's a master flag, -fexceptions and also language specific
1889/// flags to enable/disable C++ and Objective-C exceptions.
1890/// This makes it possible to for example disable C++ exceptions but enable
1891/// Objective-C exceptions.
1892static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1893 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001894 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001895 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001896 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001897 if (KernelOrKext) {
1898 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1899 // arguments now to avoid warnings about unused arguments.
1900 Args.ClaimAllArgs(options::OPT_fexceptions);
1901 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1902 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1903 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1904 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1905 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001906 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001907 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001908
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001909 // Gather the exception settings from the command line arguments.
1910 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001911
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001912 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1913 // is not necessarily sensible, but follows GCC.
1914 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001915 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001916 options::OPT_fno_objc_exceptions,
1917 true)) {
1918 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001919
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001920 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001921 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001922 }
1923
1924 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001925 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001926
Eric Christopher84fbdb42011-08-19 00:30:14 +00001927 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1928 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001929 options::OPT_fexceptions,
1930 options::OPT_fno_exceptions)) {
1931 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1932 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001933 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001934 CXXExceptionsEnabled = false;
1935 }
1936
1937 if (CXXExceptionsEnabled) {
1938 CmdArgs.push_back("-fcxx-exceptions");
1939
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001940 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001941 }
1942 }
1943
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001944 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001945 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001946}
1947
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001948static bool ShouldDisableAutolink(const ArgList &Args,
1949 const ToolChain &TC) {
1950 bool Default = true;
1951 if (TC.getTriple().isOSDarwin()) {
1952 // The native darwin assembler doesn't support the linker_option directives,
1953 // so we disable them if we think the .s file will be passed to it.
1954 Default = TC.useIntegratedAs();
1955 }
1956 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1957 Default);
1958}
1959
Ted Kremenek62093662013-03-12 17:02:12 +00001960static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1961 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001962 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1963 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001964 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001965 return !UseDwarfDirectory;
1966}
1967
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001968/// \brief Check whether the given input tree contains any compilation actions.
1969static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001970 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001971 return true;
1972
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001973 for (const auto &Act : *A)
1974 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001975 return true;
1976
1977 return false;
1978}
1979
1980/// \brief Check if -relax-all should be passed to the internal assembler.
1981/// This is done by default when compiling non-assembler source with -O0.
1982static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1983 bool RelaxDefault = true;
1984
1985 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1986 RelaxDefault = A->getOption().matches(options::OPT_O0);
1987
1988 if (RelaxDefault) {
1989 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001990 for (const auto &Act : C.getActions()) {
1991 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001992 RelaxDefault = true;
1993 break;
1994 }
1995 }
1996 }
1997
1998 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1999 RelaxDefault);
2000}
2001
David Blaikie9260ed62013-07-25 21:19:01 +00002002static void CollectArgsForIntegratedAssembler(Compilation &C,
2003 const ArgList &Args,
2004 ArgStringList &CmdArgs,
2005 const Driver &D) {
2006 if (UseRelaxAll(C, Args))
2007 CmdArgs.push_back("-mrelax-all");
2008
David Peixottodfb66142013-11-14 22:52:58 +00002009 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002010 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002011 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2012 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2013 // arg after parsing the '-I' arg.
2014 bool TakeNextArg = false;
2015
David Blaikie9260ed62013-07-25 21:19:01 +00002016 // When using an integrated assembler, translate -Wa, and -Xassembler
2017 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002018 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002019 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2020 options::OPT_Xassembler),
2021 ie = Args.filtered_end(); it != ie; ++it) {
2022 const Arg *A = *it;
2023 A->claim();
2024
2025 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2026 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002027 if (TakeNextArg) {
2028 CmdArgs.push_back(Value.data());
2029 TakeNextArg = false;
2030 continue;
2031 }
David Blaikie9260ed62013-07-25 21:19:01 +00002032
2033 if (Value == "-force_cpusubtype_ALL") {
2034 // Do nothing, this is the default and we don't support anything else.
2035 } else if (Value == "-L") {
2036 CmdArgs.push_back("-msave-temp-labels");
2037 } else if (Value == "--fatal-warnings") {
2038 CmdArgs.push_back("-mllvm");
2039 CmdArgs.push_back("-fatal-assembler-warnings");
2040 } else if (Value == "--noexecstack") {
2041 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002042 } else if (Value == "-compress-debug-sections" ||
2043 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002044 CompressDebugSections = true;
2045 } else if (Value == "-nocompress-debug-sections" ||
2046 Value == "--nocompress-debug-sections") {
2047 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002048 } else if (Value.startswith("-I")) {
2049 CmdArgs.push_back(Value.data());
2050 // We need to consume the next argument if the current arg is a plain
2051 // -I. The next arg will be the include directory.
2052 if (Value == "-I")
2053 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002054 } else if (Value.startswith("-gdwarf-")) {
2055 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002056 } else {
2057 D.Diag(diag::err_drv_unsupported_option_argument)
2058 << A->getOption().getName() << Value;
2059 }
2060 }
2061 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002062 if (CompressDebugSections) {
2063 if (llvm::zlib::isAvailable())
2064 CmdArgs.push_back("-compress-debug-sections");
2065 else
2066 D.Diag(diag::warn_debug_compression_unavailable);
2067 }
David Blaikie9260ed62013-07-25 21:19:01 +00002068}
2069
Renato Goline807c122014-01-31 11:47:28 +00002070// Until ARM libraries are build separately, we have them all in one library
2071static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002072 if (TC.getArch() == llvm::Triple::arm ||
2073 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002074 return "arm";
2075 else
2076 return TC.getArchName();
2077}
2078
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002079static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2080 // The runtimes are located in the OS-specific resource directory.
2081 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002082 const llvm::Triple &Triple = TC.getTriple();
2083 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
2084 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
2085 "freebsd" : TC.getOS();
2086 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002087 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002088}
2089
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002090// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002091// FIXME: Make sure we can also emit shared objects if they're requested
2092// and available, check for possible errors, etc.
2093static void addClangRTLinux(
2094 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002095 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002096 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2097 getArchNameForCompilerRTLib(TC) +
2098 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00002099
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002100 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00002101 CmdArgs.push_back("-lgcc_s");
2102 if (TC.getDriver().CCCIsCXX())
2103 CmdArgs.push_back("-lgcc_eh");
2104}
2105
Alexey Samsonov7811d192014-02-20 13:57:37 +00002106static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00002107 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002108 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2109 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002110 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002111 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002112 Args.hasArg(options::OPT_fcreate_profile) ||
2113 Args.hasArg(options::OPT_coverage)))
2114 return;
2115
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002116 // -fprofile-instr-generate requires position-independent code to build with
2117 // shared objects. Link against the right archive.
2118 const char *Lib = "libclang_rt.profile-";
2119 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2120 Args.hasArg(options::OPT_shared))
2121 Lib = "libclang_rt.profile-pic-";
2122
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002123 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
2124 llvm::sys::path::append(LibProfile,
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002125 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00002126
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00002127 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00002128}
2129
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002130static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
2131 const StringRef Sanitizer,
2132 bool Shared) {
2133 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
2134 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
2135 const char *EnvSuffix =
2136 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002137 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
2138 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002139 Twine("libclang_rt.") + Sanitizer + "-" +
2140 getArchNameForCompilerRTLib(TC) + EnvSuffix +
2141 (Shared ? ".so" : ".a"));
2142 return LibSanitizer;
2143}
2144
2145static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
2146 ArgStringList &CmdArgs,
2147 const StringRef Sanitizer,
2148 bool BeforeLibStdCXX,
2149 bool ExportSymbols = true,
2150 bool LinkDeps = true) {
2151 SmallString<128> LibSanitizer =
2152 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smithcff3cde2013-03-20 23:49:07 +00002153
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002154 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
2155 // etc.) so that the linker picks custom versions of the global 'operator
2156 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002157 // strategy of inserting it at the front of the link command. It also
2158 // needs to be forced to end up in the executable, so wrap it in
2159 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00002160 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002161 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00002162 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002163 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00002164
2165 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
2166 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
2167
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002168 if (LinkDeps) {
2169 // Link sanitizer dependencies explicitly
2170 CmdArgs.push_back("-lpthread");
2171 CmdArgs.push_back("-lrt");
2172 CmdArgs.push_back("-lm");
2173 // There's no libdl on FreeBSD.
2174 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2175 CmdArgs.push_back("-ldl");
2176 }
Richard Smithf3e624c2013-03-23 00:30:08 +00002177
2178 // If possible, use a dynamic symbols file to export the symbols from the
2179 // runtime library. If we can't do so, use -export-dynamic instead to export
2180 // all symbols from the binary.
2181 if (ExportSymbols) {
2182 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
2183 CmdArgs.push_back(
2184 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2185 else
2186 CmdArgs.push_back("-export-dynamic");
2187 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002188}
2189
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002190/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
2191/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002192static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002193 ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002194 if (Shared) {
2195 // Link dynamic runtime if necessary.
2196 SmallString<128> LibSanitizer =
2197 getSanitizerRTLibName(TC, "asan", Shared);
2198 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002199 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002200
2201 // Do not link static runtime to DSOs or if compiling for Android.
2202 if (Args.hasArg(options::OPT_shared) ||
2203 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
2204 return;
2205
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002206 if (Shared) {
2207 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2208 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2209 /*LinkDeps*/ false);
2210 } else {
2211 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2212 if (IsCXX)
2213 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2214 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002215}
2216
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002217/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2218/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002219static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2220 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002221 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002222 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002223}
2224
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002225/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2226/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002227static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2228 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002229 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002230 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002231}
2232
2233/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2234/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002235static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2236 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002237 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002238 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002239}
2240
Richard Smithe30752c2012-10-09 19:52:38 +00002241/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2242/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002243static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2244 ArgStringList &CmdArgs, bool IsCXX,
2245 bool HasOtherSanitizerRt) {
Alexey Samsonovc6496812014-06-30 20:27:16 +00002246 // Do not link runtime into shared libraries.
2247 if (Args.hasArg(options::OPT_shared))
2248 return;
Richard Smith4244ea92014-06-04 23:28:46 +00002249
Nick Lewycky24921692013-10-19 00:27:23 +00002250 // Need a copy of sanitizer_common. This could come from another sanitizer
2251 // runtime; if we're not including one, include our own copy.
2252 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002253 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002254
Alexey Samsonovc6496812014-06-30 20:27:16 +00002255 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002256
2257 // Only include the bits of the runtime which need a C++ ABI library if
2258 // we're linking in C++ mode.
2259 if (IsCXX)
Alexey Samsonovc6496812014-06-30 20:27:16 +00002260 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true);
Richard Smithe30752c2012-10-09 19:52:38 +00002261}
2262
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002263static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2264 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00002265 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002266 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2267}
2268
2269// Should be called before we add C++ ABI library.
2270static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2271 ArgStringList &CmdArgs) {
2272 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2273 const Driver &D = TC.getDriver();
2274 if (Sanitize.needsUbsanRt())
2275 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2276 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2277 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2278 if (Sanitize.needsAsanRt())
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002279 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002280 if (Sanitize.needsTsanRt())
2281 addTsanRT(TC, Args, CmdArgs);
2282 if (Sanitize.needsMsanRt())
2283 addMsanRT(TC, Args, CmdArgs);
2284 if (Sanitize.needsLsanRt())
2285 addLsanRT(TC, Args, CmdArgs);
2286 if (Sanitize.needsDfsanRt())
2287 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002288}
2289
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002290static bool shouldUseFramePointerForTarget(const ArgList &Args,
2291 const llvm::Triple &Triple) {
2292 switch (Triple.getArch()) {
2293 // Don't use a frame pointer on linux if optimizing for certain targets.
2294 case llvm::Triple::mips64:
2295 case llvm::Triple::mips64el:
2296 case llvm::Triple::mips:
2297 case llvm::Triple::mipsel:
2298 case llvm::Triple::systemz:
2299 case llvm::Triple::x86:
2300 case llvm::Triple::x86_64:
2301 if (Triple.isOSLinux())
2302 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2303 if (!A->getOption().matches(options::OPT_O0))
2304 return false;
2305 return true;
2306 case llvm::Triple::xcore:
2307 return false;
2308 default:
2309 return true;
2310 }
2311}
2312
Rafael Espindola224dd632011-12-14 21:02:23 +00002313static bool shouldUseFramePointer(const ArgList &Args,
2314 const llvm::Triple &Triple) {
2315 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2316 options::OPT_fomit_frame_pointer))
2317 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2318
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002319 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002320}
2321
Eric Christopherb7d97e92013-04-03 01:58:53 +00002322static bool shouldUseLeafFramePointer(const ArgList &Args,
2323 const llvm::Triple &Triple) {
2324 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2325 options::OPT_momit_leaf_frame_pointer))
2326 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2327
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002328 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002329}
2330
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002331/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002332static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002333 SmallString<128> cwd;
2334 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002335 CmdArgs.push_back("-fdebug-compilation-dir");
2336 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002337 }
2338}
2339
Eric Christopherd3804002013-02-22 20:12:52 +00002340static const char *SplitDebugName(const ArgList &Args,
2341 const InputInfoList &Inputs) {
2342 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2343 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2344 SmallString<128> T(FinalOutput->getValue());
2345 llvm::sys::path::replace_extension(T, "dwo");
2346 return Args.MakeArgString(T);
2347 } else {
2348 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002349 SmallString<128> T(
2350 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002351 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2352 llvm::sys::path::replace_extension(F, "dwo");
2353 T += F;
2354 return Args.MakeArgString(F);
2355 }
2356}
2357
2358static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2359 const Tool &T, const JobAction &JA,
2360 const ArgList &Args, const InputInfo &Output,
2361 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002362 ArgStringList ExtractArgs;
2363 ExtractArgs.push_back("--extract-dwo");
2364
2365 ArgStringList StripArgs;
2366 StripArgs.push_back("--strip-dwo");
2367
2368 // Grabbing the output of the earlier compile step.
2369 StripArgs.push_back(Output.getFilename());
2370 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002371 ExtractArgs.push_back(OutFile);
2372
2373 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002374 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002375
2376 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002377 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002378
2379 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002380 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002381}
2382
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002383/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002384/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2385static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002386 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002387 if (A->getOption().matches(options::OPT_O4) ||
2388 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002389 return true;
2390
2391 if (A->getOption().matches(options::OPT_O0))
2392 return false;
2393
2394 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2395
Rafael Espindola91780de2013-08-26 14:05:41 +00002396 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002397 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002398 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002399 return true;
2400
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002401 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002402 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002403 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002404
2405 unsigned OptLevel = 0;
2406 if (S.getAsInteger(10, OptLevel))
2407 return false;
2408
2409 return OptLevel > 1;
2410 }
2411
2412 return false;
2413}
2414
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002415/// Add -x lang to \p CmdArgs for \p Input.
2416static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2417 ArgStringList &CmdArgs) {
2418 // When using -verify-pch, we don't want to provide the type
2419 // 'precompiled-header' if it was inferred from the file extension
2420 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2421 return;
2422
2423 CmdArgs.push_back("-x");
2424 if (Args.hasArg(options::OPT_rewrite_objc))
2425 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2426 else
2427 CmdArgs.push_back(types::getTypeName(Input.getType()));
2428}
2429
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002430static std::string getMSCompatibilityVersion(const char *VersionStr) {
2431 unsigned Version;
2432 if (StringRef(VersionStr).getAsInteger(10, Version))
2433 return "0";
2434
2435 if (Version < 100)
2436 return llvm::utostr_32(Version) + ".0";
2437
2438 if (Version < 10000)
2439 return llvm::utostr_32(Version / 100) + "." +
2440 llvm::utostr_32(Version % 100);
2441
2442 unsigned Build = 0, Factor = 1;
2443 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2444 Build = Build + (Version % 10) * Factor;
2445 return llvm::utostr_32(Version / 100) + "." +
2446 llvm::utostr_32(Version % 100) + "." +
2447 llvm::utostr_32(Build);
2448}
2449
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002450void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002451 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002452 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002453 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002454 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002455 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2456 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002457 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002458 ArgStringList CmdArgs;
2459
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002460 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002461 bool IsWindowsCygnus =
2462 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002463 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2464
Daniel Dunbare521a892009-03-31 20:53:55 +00002465 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2466
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002467 // Invoke ourselves in -cc1 mode.
2468 //
2469 // FIXME: Implement custom jobs for internal actions.
2470 CmdArgs.push_back("-cc1");
2471
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002472 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002473 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002474 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002475 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002476
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002477 const llvm::Triple TT(TripleStr);
2478 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2479 TT.getArch() == llvm::Triple::thumb)) {
2480 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2481 unsigned Version;
2482 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2483 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002484 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2485 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002486 }
2487
Tim Northover336f1892014-03-29 13:16:12 +00002488 // Push all default warning arguments that are specific to
2489 // the given target. These come before user provided warning options
2490 // are provided.
2491 getToolChain().addClangWarningOptions(CmdArgs);
2492
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002493 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002494 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002495
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002496 if (isa<AnalyzeJobAction>(JA)) {
2497 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2498 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002499 } else if (isa<MigrateJobAction>(JA)) {
2500 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002501 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002502 if (Output.getType() == types::TY_Dependencies)
2503 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002504 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002505 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002506 if (Args.hasArg(options::OPT_rewrite_objc) &&
2507 !Args.hasArg(options::OPT_g_Group))
2508 CmdArgs.push_back("-P");
2509 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002510 } else if (isa<AssembleJobAction>(JA)) {
2511 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002512
David Blaikie9260ed62013-07-25 21:19:01 +00002513 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002514
2515 // Also ignore explicit -force_cpusubtype_ALL option.
2516 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002517 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002518 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002519 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002520
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002521 if (JA.getType() == types::TY_Nothing)
2522 CmdArgs.push_back("-fsyntax-only");
2523 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002524 CmdArgs.push_back("-emit-pch");
2525 else
2526 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002527 } else if (isa<VerifyPCHJobAction>(JA)) {
2528 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002529 } else {
2530 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002531
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002532 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002533 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002534 } else if (JA.getType() == types::TY_LLVM_IR ||
2535 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002536 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002537 } else if (JA.getType() == types::TY_LLVM_BC ||
2538 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002539 CmdArgs.push_back("-emit-llvm-bc");
2540 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002541 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002542 } else if (JA.getType() == types::TY_AST) {
2543 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002544 } else if (JA.getType() == types::TY_ModuleFile) {
2545 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002546 } else if (JA.getType() == types::TY_RewrittenObjC) {
2547 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002548 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002549 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2550 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002551 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002552 } else {
2553 assert(JA.getType() == types::TY_PP_Asm &&
2554 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002555 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002556 }
2557
Justin Bognera88f0122014-06-20 22:59:50 +00002558 // We normally speed up the clang process a bit by skipping destructors at
2559 // exit, but when we're generating diagnostics we can rely on some of the
2560 // cleanup.
2561 if (!C.isForDiagnostics())
2562 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002563
John McCallbb79b5f2010-02-13 03:50:24 +00002564 // Disable the verification pass in -asserts builds.
2565#ifdef NDEBUG
2566 CmdArgs.push_back("-disable-llvm-verifier");
2567#endif
2568
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002569 // Set the main file name, so that debug info works even with
2570 // -save-temps.
2571 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002572 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002573
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002574 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002575 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002576 if (Args.hasArg(options::OPT_static))
2577 CmdArgs.push_back("-static-define");
2578
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002579 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002580 // Enable region store model by default.
2581 CmdArgs.push_back("-analyzer-store=region");
2582
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002583 // Treat blocks as analysis entry points.
2584 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2585
Ted Kremenek49c79792011-03-24 00:28:47 +00002586 CmdArgs.push_back("-analyzer-eagerly-assume");
2587
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002588 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002589 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002590 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002591
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002592 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002593 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002594
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002595 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002596 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002597
2598 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002599
Jordan Rose10ad0812013-04-05 17:55:07 +00002600 if (types::isCXX(Inputs[0].getType()))
2601 CmdArgs.push_back("-analyzer-checker=cplusplus");
2602
Nico Webere8e53112014-05-11 01:04:02 +00002603 // Enable the following experimental checkers for testing.
2604 CmdArgs.push_back(
2605 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002606 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002611 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002612
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002613 // Set the output format. The default is plist, for (lame) historical
2614 // reasons.
2615 CmdArgs.push_back("-analyzer-output");
2616 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002617 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002618 else
2619 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002620
Ted Kremenekfe449a22010-03-22 22:32:05 +00002621 // Disable the presentation of standard compiler warnings when
2622 // using --analyze. We only want to show static analyzer diagnostics
2623 // or frontend errors.
2624 CmdArgs.push_back("-w");
2625
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002626 // Add -Xanalyzer arguments when running as analyzer.
2627 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002628 }
2629
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002630 CheckCodeGenerationOptions(D, Args);
2631
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002632 bool PIE = getToolChain().isPIEDefault();
2633 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002634 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002635
Alexey Bataev40e75222014-01-28 06:30:35 +00002636 // Android-specific defaults for PIC/PIE
2637 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2638 switch (getToolChain().getTriple().getArch()) {
2639 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002640 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002641 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002642 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002643 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002644 case llvm::Triple::mips:
2645 case llvm::Triple::mipsel:
2646 case llvm::Triple::mips64:
2647 case llvm::Triple::mips64el:
2648 PIC = true; // "-fpic"
2649 break;
2650
2651 case llvm::Triple::x86:
2652 case llvm::Triple::x86_64:
2653 PIC = true; // "-fPIC"
2654 IsPICLevelTwo = true;
2655 break;
2656
2657 default:
2658 break;
2659 }
2660 }
2661
Brad Smith5b05db82014-06-24 19:51:29 +00002662 // OpenBSD-specific defaults for PIE
2663 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2664 switch (getToolChain().getTriple().getArch()) {
2665 case llvm::Triple::mips64:
2666 case llvm::Triple::mips64el:
2667 case llvm::Triple::sparc:
2668 case llvm::Triple::x86:
2669 case llvm::Triple::x86_64:
2670 IsPICLevelTwo = false; // "-fpie"
2671 break;
2672
2673 case llvm::Triple::ppc:
2674 case llvm::Triple::sparcv9:
2675 IsPICLevelTwo = true; // "-fPIE"
2676 break;
2677
2678 default:
2679 break;
2680 }
2681 }
2682
Alexey Samsonov090301e2013-04-09 12:28:19 +00002683 // For the PIC and PIE flag options, this logic is different from the
2684 // legacy logic in very old versions of GCC, as that logic was just
2685 // a bug no one had ever fixed. This logic is both more rational and
2686 // consistent with GCC's new logic now that the bugs are fixed. The last
2687 // argument relating to either PIC or PIE wins, and no other argument is
2688 // used. If the last argument is any flavor of the '-fno-...' arguments,
2689 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2690 // at the same level.
2691 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2692 options::OPT_fpic, options::OPT_fno_pic,
2693 options::OPT_fPIE, options::OPT_fno_PIE,
2694 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002695 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2696 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002697 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002698 if (LastPICArg) {
2699 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002700 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2701 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2702 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2703 PIC = PIE || O.matches(options::OPT_fPIC) ||
2704 O.matches(options::OPT_fpic);
2705 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2706 O.matches(options::OPT_fPIC);
2707 } else {
2708 PIE = PIC = false;
2709 }
2710 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002711 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002712
Nick Lewycky609dd662013-10-11 03:33:53 +00002713 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002714 // specified while enabling PIC enabled level 1 PIC, just force it back to
2715 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2716 // informal testing).
2717 if (PIC && getToolChain().getTriple().isOSDarwin())
2718 IsPICLevelTwo |= getToolChain().isPICDefault();
2719
Chandler Carruthc0c04552012-04-08 16:40:35 +00002720 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2721 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002722 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002723 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002724 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002725 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002726 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002727 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002728
Chandler Carruth76a943b2012-11-19 03:52:03 +00002729 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2730 // This is a very special mode. It trumps the other modes, almost no one
2731 // uses it, and it isn't even valid on any OS but Darwin.
2732 if (!getToolChain().getTriple().isOSDarwin())
2733 D.Diag(diag::err_drv_unsupported_opt_for_target)
2734 << A->getSpelling() << getToolChain().getTriple().str();
2735
2736 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2737
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002738 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002739 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002740
Chandler Carruth76a943b2012-11-19 03:52:03 +00002741 // Only a forced PIC mode can cause the actual compile to have PIC defines
2742 // etc., no flags are sufficient. This behavior was selected to closely
2743 // match that of llvm-gcc and Apple GCC before that.
2744 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2745 CmdArgs.push_back("-pic-level");
2746 CmdArgs.push_back("2");
2747 }
2748 } else {
2749 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2750 // handled in Clang's IRGen by the -pie-level flag.
2751 CmdArgs.push_back("-mrelocation-model");
2752 CmdArgs.push_back(PIC ? "pic" : "static");
2753
2754 if (PIC) {
2755 CmdArgs.push_back("-pic-level");
2756 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2757 if (PIE) {
2758 CmdArgs.push_back("-pie-level");
2759 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2760 }
2761 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002762 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002763
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002764 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2765 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002766 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002767
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002768 // LLVM Code Generator Options.
2769
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002770 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2771 StringRef v = A->getValue();
2772 CmdArgs.push_back("-mllvm");
2773 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2774 A->claim();
2775 }
2776
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002777 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2778 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002779 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002780 }
2781
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002782 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2783 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002784 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002785 D.Diag(diag::err_drv_unsupported_opt_for_target)
2786 << A->getSpelling() << getToolChain().getTriple().str();
2787 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2788 CmdArgs.push_back("-fpcc-struct-return");
2789 } else {
2790 assert(A->getOption().matches(options::OPT_freg_struct_return));
2791 CmdArgs.push_back("-freg-struct-return");
2792 }
2793 }
2794
Roman Divacky65b88cd2011-03-01 17:40:53 +00002795 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2796 CmdArgs.push_back("-mrtd");
2797
Rafael Espindola224dd632011-12-14 21:02:23 +00002798 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002799 CmdArgs.push_back("-mdisable-fp-elim");
2800 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2801 options::OPT_fno_zero_initialized_in_bss))
2802 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002803
2804 bool OFastEnabled = isOptimizationLevelFast(Args);
2805 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2806 // enabled. This alias option is being used to simplify the hasFlag logic.
2807 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2808 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002809 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2810 // doesn't do any TBAA.
2811 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002812 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002813 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002814 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002815 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2816 options::OPT_fno_struct_path_tbaa))
2817 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002818 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2819 false))
2820 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002821 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2822 options::OPT_fno_optimize_sibling_calls))
2823 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002824
Eric Christopher006208c2013-04-04 06:29:47 +00002825 // Handle segmented stacks.
2826 if (Args.hasArg(options::OPT_fsplit_stack))
2827 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002828
2829 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2830 // This alias option is being used to simplify the getLastArg logic.
2831 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2832 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002833
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002834 // Handle various floating point optimization flags, mapping them to the
2835 // appropriate LLVM code generation flags. The pattern for all of these is to
2836 // default off the codegen optimizations, and if any flag enables them and no
2837 // flag disables them after the flag enabling them, enable the codegen
2838 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002839 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002840 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002841 options::OPT_ffinite_math_only,
2842 options::OPT_fno_finite_math_only,
2843 options::OPT_fhonor_infinities,
2844 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002845 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2846 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002847 A->getOption().getID() != options::OPT_fhonor_infinities)
2848 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002849 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002850 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002851 options::OPT_ffinite_math_only,
2852 options::OPT_fno_finite_math_only,
2853 options::OPT_fhonor_nans,
2854 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002855 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2856 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002857 A->getOption().getID() != options::OPT_fhonor_nans)
2858 CmdArgs.push_back("-menable-no-nans");
2859
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002860 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2861 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002862 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002863 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002864 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002865 options::OPT_fno_math_errno)) {
2866 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2867 // However, turning *off* -ffast_math merely restores the toolchain default
2868 // (which may be false).
2869 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2870 A->getOption().getID() == options::OPT_ffast_math ||
2871 A->getOption().getID() == options::OPT_Ofast)
2872 MathErrno = false;
2873 else if (A->getOption().getID() == options::OPT_fmath_errno)
2874 MathErrno = true;
2875 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002876 if (MathErrno)
2877 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002878
2879 // There are several flags which require disabling very specific
2880 // optimizations. Any of these being disabled forces us to turn off the
2881 // entire set of LLVM optimizations, so collect them through all the flag
2882 // madness.
2883 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002884 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002885 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002886 options::OPT_funsafe_math_optimizations,
2887 options::OPT_fno_unsafe_math_optimizations,
2888 options::OPT_fassociative_math,
2889 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002890 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2891 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002892 A->getOption().getID() != options::OPT_fno_associative_math)
2893 AssociativeMath = true;
2894 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002895 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002896 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002897 options::OPT_funsafe_math_optimizations,
2898 options::OPT_fno_unsafe_math_optimizations,
2899 options::OPT_freciprocal_math,
2900 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002901 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2902 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002903 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2904 ReciprocalMath = true;
2905 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002906 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002907 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002908 options::OPT_funsafe_math_optimizations,
2909 options::OPT_fno_unsafe_math_optimizations,
2910 options::OPT_fsigned_zeros,
2911 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002912 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2913 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002914 A->getOption().getID() != options::OPT_fsigned_zeros)
2915 SignedZeros = false;
2916 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002917 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002918 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002919 options::OPT_funsafe_math_optimizations,
2920 options::OPT_fno_unsafe_math_optimizations,
2921 options::OPT_ftrapping_math,
2922 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002923 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2924 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002925 A->getOption().getID() != options::OPT_ftrapping_math)
2926 TrappingMath = false;
2927 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2928 !TrappingMath)
2929 CmdArgs.push_back("-menable-unsafe-fp-math");
2930
Lang Hamesaa53b932012-07-06 00:59:19 +00002931
2932 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002933 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002934 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002935 options::OPT_ffp_contract)) {
2936 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002937 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002938 if (Val == "fast" || Val == "on" || Val == "off") {
2939 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2940 } else {
2941 D.Diag(diag::err_drv_unsupported_option_argument)
2942 << A->getOption().getName() << Val;
2943 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002944 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2945 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002946 // If fast-math is set then set the fp-contract mode to fast.
2947 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2948 }
2949 }
2950
Bob Wilson6a039162012-07-19 03:52:53 +00002951 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2952 // and if we find them, tell the frontend to provide the appropriate
2953 // preprocessor macros. This is distinct from enabling any optimizations as
2954 // these options induce language changes which must survive serialization
2955 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002956 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2957 options::OPT_fno_fast_math))
2958 if (!A->getOption().matches(options::OPT_fno_fast_math))
2959 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002960 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2961 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002962 if (A->getOption().matches(options::OPT_ffinite_math_only))
2963 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002964
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002965 // Decide whether to use verbose asm. Verbose assembly is the default on
2966 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002967 bool IsIntegratedAssemblerDefault =
2968 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002969 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002970 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002971 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002972 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002973
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002974 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002975 IsIntegratedAssemblerDefault))
2976 CmdArgs.push_back("-no-integrated-as");
2977
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002978 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2979 CmdArgs.push_back("-mdebug-pass");
2980 CmdArgs.push_back("Structure");
2981 }
2982 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2983 CmdArgs.push_back("-mdebug-pass");
2984 CmdArgs.push_back("Arguments");
2985 }
2986
John McCall8517abc2010-02-19 02:45:38 +00002987 // Enable -mconstructor-aliases except on darwin, where we have to
2988 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002989 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002990 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002991
John McCall7ef5cb32011-03-18 02:56:14 +00002992 // Darwin's kernel doesn't support guard variables; just die if we
2993 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002994 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002995 CmdArgs.push_back("-fforbid-guard-variables");
2996
Douglas Gregordbe39272011-02-01 15:15:22 +00002997 if (Args.hasArg(options::OPT_mms_bitfields)) {
2998 CmdArgs.push_back("-mms-bitfields");
2999 }
John McCall8517abc2010-02-19 02:45:38 +00003000
Daniel Dunbar306945d2009-09-16 06:17:29 +00003001 // This is a coarse approximation of what llvm-gcc actually does, both
3002 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3003 // complicated ways.
3004 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003005 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3006 options::OPT_fno_asynchronous_unwind_tables,
3007 (getToolChain().IsUnwindTablesDefault() ||
3008 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3009 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003010 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3011 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003012 CmdArgs.push_back("-munwind-tables");
3013
Chandler Carruth05fb5852012-11-21 23:40:23 +00003014 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003015
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003016 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3017 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003018 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003019 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003020
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003021 // FIXME: Handle -mtune=.
3022 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003023
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003024 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003025 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003026 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003027 }
3028
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003029 // Add the target cpu
3030 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3031 llvm::Triple ETriple(ETripleStr);
3032 std::string CPU = getCPUName(Args, ETriple);
3033 if (!CPU.empty()) {
3034 CmdArgs.push_back("-target-cpu");
3035 CmdArgs.push_back(Args.MakeArgString(CPU));
3036 }
3037
Rafael Espindolaeb265472013-08-21 21:59:03 +00003038 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3039 CmdArgs.push_back("-mfpmath");
3040 CmdArgs.push_back(A->getValue());
3041 }
3042
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003043 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003044 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003045
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003046 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003047 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003048 default:
3049 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003050
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003051 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003052 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003053 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003054 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003055 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003056 break;
3057
Tim Northover573cbee2014-05-24 12:52:07 +00003058 case llvm::Triple::aarch64:
3059 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003060 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003061 break;
3062
Eric Christopher0b26a612010-03-02 02:41:08 +00003063 case llvm::Triple::mips:
3064 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003065 case llvm::Triple::mips64:
3066 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003067 AddMIPSTargetArgs(Args, CmdArgs);
3068 break;
3069
Ulrich Weigand8afad612014-07-28 13:17:52 +00003070 case llvm::Triple::ppc:
3071 case llvm::Triple::ppc64:
3072 case llvm::Triple::ppc64le:
3073 AddPPCTargetArgs(Args, CmdArgs);
3074 break;
3075
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003076 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003077 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003078 AddSparcTargetArgs(Args, CmdArgs);
3079 break;
3080
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003081 case llvm::Triple::x86:
3082 case llvm::Triple::x86_64:
3083 AddX86TargetArgs(Args, CmdArgs);
3084 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003085
3086 case llvm::Triple::hexagon:
3087 AddHexagonTargetArgs(Args, CmdArgs);
3088 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003089 }
3090
Hans Wennborg75958c42013-08-08 00:17:41 +00003091 // Add clang-cl arguments.
3092 if (getToolChain().getDriver().IsCLMode())
3093 AddClangCLArgs(Args, CmdArgs);
3094
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003095 // Pass the linker version in use.
3096 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3097 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003098 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003099 }
3100
Eric Christopherb7d97e92013-04-03 01:58:53 +00003101 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003102 CmdArgs.push_back("-momit-leaf-frame-pointer");
3103
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003104 // Explicitly error on some things we know we don't support and can't just
3105 // ignore.
3106 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003107 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3108 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003109 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003110 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003111 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003112 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3113 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003114 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003115 << Unsupported->getOption().getName();
3116 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003117 }
3118
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003119 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003120 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003121 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003122 CmdArgs.push_back("-header-include-file");
3123 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3124 D.CCPrintHeadersFilename : "-");
3125 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003126 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003127 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003128
Chad Rosierbe10f982011-08-02 17:58:04 +00003129 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003130 CmdArgs.push_back("-diagnostic-log-file");
3131 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3132 D.CCLogDiagnosticsFilename : "-");
3133 }
3134
Manman Ren17bdb0f2013-11-20 20:22:14 +00003135 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3136 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003137 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003138 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00003139 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003140 // FIXME: we should support specifying dwarf version with
3141 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003142 CmdArgs.push_back("-gline-tables-only");
Brad Smith378e7f9b2014-06-13 03:35:37 +00003143 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3144 const llvm::Triple &Triple = getToolChain().getTriple();
3145 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3146 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003147 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003148 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003149 CmdArgs.push_back("-gdwarf-2");
3150 else if (A->getOption().matches(options::OPT_gdwarf_3))
3151 CmdArgs.push_back("-gdwarf-3");
3152 else if (A->getOption().matches(options::OPT_gdwarf_4))
3153 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003154 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003155 !A->getOption().matches(options::OPT_ggdb0)) {
Brad Smith378e7f9b2014-06-13 03:35:37 +00003156 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3157 const llvm::Triple &Triple = getToolChain().getTriple();
3158 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3159 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003160 CmdArgs.push_back("-gdwarf-2");
3161 else
3162 CmdArgs.push_back("-g");
3163 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003164 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003165
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003166 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3167 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003168 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3169 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003170 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003171
Eric Christopher138c32b2013-09-13 22:37:55 +00003172 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003173 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3174 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003175 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003176 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003177 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003178 CmdArgs.push_back("-g");
3179 CmdArgs.push_back("-backend-option");
3180 CmdArgs.push_back("-split-dwarf=Enable");
3181 }
3182
Eric Christopher138c32b2013-09-13 22:37:55 +00003183 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3184 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3185 CmdArgs.push_back("-backend-option");
3186 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3187 }
Eric Christophereec89c22013-06-18 00:03:50 +00003188
Eric Christopher0d403d22014-02-14 01:27:03 +00003189 // -gdwarf-aranges turns on the emission of the aranges section in the
3190 // backend.
3191 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3192 CmdArgs.push_back("-backend-option");
3193 CmdArgs.push_back("-generate-arange-section");
3194 }
3195
David Blaikief36d9ba2014-01-27 18:52:43 +00003196 if (Args.hasFlag(options::OPT_fdebug_types_section,
3197 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003198 CmdArgs.push_back("-backend-option");
3199 CmdArgs.push_back("-generate-type-units");
3200 }
Eric Christophereec89c22013-06-18 00:03:50 +00003201
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003202 if (Args.hasFlag(options::OPT_ffunction_sections,
3203 options::OPT_fno_function_sections, false)) {
3204 CmdArgs.push_back("-ffunction-sections");
3205 }
3206
3207 if (Args.hasFlag(options::OPT_fdata_sections,
3208 options::OPT_fno_data_sections, false)) {
3209 CmdArgs.push_back("-fdata-sections");
3210 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003211
Chris Lattner3c77a352010-06-22 00:03:40 +00003212 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3213
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003214 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3215 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3216 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3217 D.Diag(diag::err_drv_argument_not_allowed_with)
3218 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3219
3220 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3221
3222 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3223 A->render(Args, CmdArgs);
3224 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3225 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3226
Nick Lewycky207bce32011-04-21 23:44:07 +00003227 if (Args.hasArg(options::OPT_ftest_coverage) ||
3228 Args.hasArg(options::OPT_coverage))
3229 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003230 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3231 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003232 Args.hasArg(options::OPT_coverage))
3233 CmdArgs.push_back("-femit-coverage-data");
3234
Alex Lorenzee024992014-08-04 18:41:51 +00003235 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3236 !Args.hasArg(options::OPT_fprofile_instr_generate))
3237 D.Diag(diag::err_drv_argument_only_allowed_with)
3238 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3239
3240 if (Args.hasArg(options::OPT_fcoverage_mapping))
3241 CmdArgs.push_back("-fcoverage-mapping");
3242
Nick Lewycky480cb992011-05-04 20:46:58 +00003243 if (C.getArgs().hasArg(options::OPT_c) ||
3244 C.getArgs().hasArg(options::OPT_S)) {
3245 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003246 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00003247 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00003248 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003249 SmallString<128> Pwd;
3250 if (!llvm::sys::fs::current_path(Pwd)) {
3251 llvm::sys::path::append(Pwd, CoverageFilename.str());
3252 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003253 }
3254 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003255 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003256 }
3257 }
3258
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003259 // Pass options for controlling the default header search paths.
3260 if (Args.hasArg(options::OPT_nostdinc)) {
3261 CmdArgs.push_back("-nostdsysteminc");
3262 CmdArgs.push_back("-nobuiltininc");
3263 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003264 if (Args.hasArg(options::OPT_nostdlibinc))
3265 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003266 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3267 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3268 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003269
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003270 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003271 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003272 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003273
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003274 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3275
Ted Kremenekf7639e12012-03-06 20:06:33 +00003276 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003277 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003278 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003279 options::OPT_ccc_arcmt_modify,
3280 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003281 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003282 switch (A->getOption().getID()) {
3283 default:
3284 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003285 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003286 CmdArgs.push_back("-arcmt-check");
3287 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003288 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003289 CmdArgs.push_back("-arcmt-modify");
3290 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003291 case options::OPT_ccc_arcmt_migrate:
3292 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003293 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003294 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003295
3296 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3297 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003298 break;
John McCalld70fb982011-06-15 23:25:17 +00003299 }
3300 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003301 } else {
3302 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3303 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3304 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003305 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003306
Ted Kremenekf7639e12012-03-06 20:06:33 +00003307 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3308 if (ARCMTEnabled) {
3309 D.Diag(diag::err_drv_argument_not_allowed_with)
3310 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3311 }
3312 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003313 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003314
3315 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003316 options::OPT_objcmt_migrate_subscripting,
3317 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003318 // None specified, means enable them all.
3319 CmdArgs.push_back("-objcmt-migrate-literals");
3320 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003321 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003322 } else {
3323 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3324 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003325 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003326 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003327 } else {
3328 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3329 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3330 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3331 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3332 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3333 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3334 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3335 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3336 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3337 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3338 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3339 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3340 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003341 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003342 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003343 }
3344
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003345 // Add preprocessing options like -I, -D, etc. if we are using the
3346 // preprocessor.
3347 //
3348 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003349 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003350 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003351
Rafael Espindolaa7431922011-07-21 23:40:37 +00003352 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3353 // that "The compiler can only warn and ignore the option if not recognized".
3354 // When building with ccache, it will pass -D options to clang even on
3355 // preprocessed inputs and configure concludes that -fPIC is not supported.
3356 Args.ClaimAllArgs(options::OPT_D);
3357
Alp Toker7874bdc2013-11-15 20:40:58 +00003358 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003359 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3360 if (A->getOption().matches(options::OPT_O4)) {
3361 CmdArgs.push_back("-O3");
3362 D.Diag(diag::warn_O4_is_O3);
3363 } else {
3364 A->render(Args, CmdArgs);
3365 }
3366 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003367
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003368 // Warn about ignored options to clang.
3369 for (arg_iterator it = Args.filtered_begin(
3370 options::OPT_clang_ignored_gcc_optimization_f_Group),
3371 ie = Args.filtered_end(); it != ie; ++it) {
3372 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3373 }
3374
Chad Rosier86b82082012-12-12 20:06:31 +00003375 // Don't warn about unused -flto. This can happen when we're preprocessing or
3376 // precompiling.
3377 Args.ClaimAllArgs(options::OPT_flto);
3378
Richard Smith3be1cb22014-08-07 00:24:21 +00003379 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003380 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003381 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3382 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003383 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003384 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003385
3386 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003387 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003388 //
3389 // If a std is supplied, only add -trigraphs if it follows the
3390 // option.
3391 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3392 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003393 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003394 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003395 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003396 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003397 else
3398 Std->render(Args, CmdArgs);
3399
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003400 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3401 options::OPT_trigraphs))
3402 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003403 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003404 } else {
3405 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003406 //
3407 // FIXME: Clang doesn't correctly handle -std= when the input language
3408 // doesn't match. For the time being just ignore this for C++ inputs;
3409 // eventually we want to do all the standard defaulting here instead of
3410 // splitting it between the driver and clang -cc1.
3411 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003412 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3413 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003414 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003415 CmdArgs.push_back("-std=c++11");
3416
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003417 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003418 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003419
Richard Smith282b4492013-09-04 22:50:31 +00003420 // GCC's behavior for -Wwrite-strings is a bit strange:
3421 // * In C, this "warning flag" changes the types of string literals from
3422 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3423 // for the discarded qualifier.
3424 // * In C++, this is just a normal warning flag.
3425 //
3426 // Implementing this warning correctly in C is hard, so we follow GCC's
3427 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3428 // a non-const char* in C, rather than using this crude hack.
3429 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003430 // FIXME: This should behave just like a warning flag, and thus should also
3431 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3432 Arg *WriteStrings =
3433 Args.getLastArg(options::OPT_Wwrite_strings,
3434 options::OPT_Wno_write_strings, options::OPT_w);
3435 if (WriteStrings &&
3436 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003437 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003438 }
3439
Chandler Carruth61fbf622011-04-23 09:27:53 +00003440 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003441 // during C++ compilation, which it is by default. GCC keeps this define even
3442 // in the presence of '-w', match this behavior bug-for-bug.
3443 if (types::isCXX(InputType) &&
3444 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3445 true)) {
3446 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003447 }
3448
Chandler Carruthe0391482010-05-22 02:21:53 +00003449 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3450 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3451 if (Asm->getOption().matches(options::OPT_fasm))
3452 CmdArgs.push_back("-fgnu-keywords");
3453 else
3454 CmdArgs.push_back("-fno-gnu-keywords");
3455 }
3456
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003457 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3458 CmdArgs.push_back("-fno-dwarf-directory-asm");
3459
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003460 if (ShouldDisableAutolink(Args, getToolChain()))
3461 CmdArgs.push_back("-fno-autolink");
3462
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003463 // Add in -fdebug-compilation-dir if necessary.
3464 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003465
Richard Smith9a568822011-11-21 19:36:32 +00003466 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3467 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003468 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003469 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003470 }
3471
Richard Smith79c927b2013-11-06 19:31:51 +00003472 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3473 CmdArgs.push_back("-foperator-arrow-depth");
3474 CmdArgs.push_back(A->getValue());
3475 }
3476
Richard Smith9a568822011-11-21 19:36:32 +00003477 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3478 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003479 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003480 }
3481
Richard Smitha3d3bd22013-05-08 02:12:03 +00003482 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3483 CmdArgs.push_back("-fconstexpr-steps");
3484 CmdArgs.push_back(A->getValue());
3485 }
3486
Richard Smithb3a14522013-02-22 01:59:51 +00003487 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3488 CmdArgs.push_back("-fbracket-depth");
3489 CmdArgs.push_back(A->getValue());
3490 }
3491
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003492 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3493 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003494 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003495 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003496 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3497 } else
3498 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003499 }
3500
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003501
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003502 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003503 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003504
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003505 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3506 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003507 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003508 }
David Chisnall5778fce2009-08-31 16:41:57 +00003509
Chris Lattnere23003d2010-01-09 21:54:33 +00003510 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3511 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003512 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003513 }
3514
Chris Lattnerb35583d2010-04-07 20:49:23 +00003515 CmdArgs.push_back("-ferror-limit");
3516 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003517 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003518 else
3519 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003520
Chandler Carrutha77a7272010-05-06 04:55:18 +00003521 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3522 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003523 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003524 }
3525
3526 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3527 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003528 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003529 }
3530
Richard Smithf6f003a2011-12-16 19:06:07 +00003531 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3532 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003533 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003534 }
3535
Daniel Dunbar2c978472009-11-04 06:24:47 +00003536 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003537 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003538 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003539 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003540 } else {
3541 // If -fmessage-length=N was not specified, determine whether this is a
3542 // terminal and, if so, implicitly define -fmessage-length appropriately.
3543 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003544 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003545 }
3546
John McCallb4a99d32013-02-19 01:57:35 +00003547 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3548 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3549 options::OPT_fvisibility_ms_compat)) {
3550 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3551 CmdArgs.push_back("-fvisibility");
3552 CmdArgs.push_back(A->getValue());
3553 } else {
3554 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3555 CmdArgs.push_back("-fvisibility");
3556 CmdArgs.push_back("hidden");
3557 CmdArgs.push_back("-ftype-visibility");
3558 CmdArgs.push_back("default");
3559 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003560 }
3561
Douglas Gregor08329632010-06-15 17:05:35 +00003562 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003563
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003564 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3565
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003566 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003567 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3568 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003569 CmdArgs.push_back("-ffreestanding");
3570
Daniel Dunbare357d562009-12-03 18:42:11 +00003571 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003572 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003573 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003574 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3575 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003576 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003577 // AltiVec language extensions aren't relevant for assembling.
3578 if (!isa<PreprocessJobAction>(JA) ||
3579 Output.getType() != types::TY_PP_Asm)
3580 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003581 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3582 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003583
Peter Collingbourne32701642013-11-01 18:16:25 +00003584 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3585 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003586
Will Dietz3676d562012-12-30 20:53:28 +00003587 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3588 options::OPT_fno_sanitize_recover,
3589 true))
3590 CmdArgs.push_back("-fno-sanitize-recover");
3591
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003592 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003593 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3594 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3595
Eric Christopher459d2712013-02-19 06:16:53 +00003596 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003597 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003598 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003599 getToolChain().getArch() == llvm::Triple::ppc64 ||
3600 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003601 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003602 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003603
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003604 if (getToolChain().SupportsProfiling())
3605 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003606
3607 // -flax-vector-conversions is default.
3608 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3609 options::OPT_fno_lax_vector_conversions))
3610 CmdArgs.push_back("-fno-lax-vector-conversions");
3611
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003612 if (Args.getLastArg(options::OPT_fapple_kext))
3613 CmdArgs.push_back("-fapple-kext");
3614
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003615 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003616 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003617 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003618 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3619 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003620
3621 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3622 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003623 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003624 }
3625
Bob Wilson14adb362012-02-03 06:27:22 +00003626 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003627
Chandler Carruth6e501032011-03-27 00:04:55 +00003628 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3629 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3630 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3631 options::OPT_fno_wrapv)) {
3632 if (A->getOption().matches(options::OPT_fwrapv))
3633 CmdArgs.push_back("-fwrapv");
3634 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3635 options::OPT_fno_strict_overflow)) {
3636 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3637 CmdArgs.push_back("-fwrapv");
3638 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003639
3640 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3641 options::OPT_fno_reroll_loops))
3642 if (A->getOption().matches(options::OPT_freroll_loops))
3643 CmdArgs.push_back("-freroll-loops");
3644
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003645 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003646 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3647 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003648
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003649 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3650
Mahesha S6a682be42012-10-27 07:47:56 +00003651
Daniel Dunbar4930e332009-11-17 08:07:36 +00003652 // -stack-protector=0 is default.
3653 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003654 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3655 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003656 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003657 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003658 if (A->getOption().matches(options::OPT_fstack_protector)) {
3659 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3660 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3661 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003662 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003663 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003664 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003665 } else {
3666 StackProtectorLevel =
3667 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3668 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003669 if (StackProtectorLevel) {
3670 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003671 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003672 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003673
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003674 // --param ssp-buffer-size=
3675 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3676 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003677 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003678 if (Str.startswith("ssp-buffer-size=")) {
3679 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003680 CmdArgs.push_back("-stack-protector-buffer-size");
3681 // FIXME: Verify the argument is a valid integer.
3682 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003683 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003684 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003685 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003686 }
3687
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003688 // Translate -mstackrealign
3689 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3690 false)) {
3691 CmdArgs.push_back("-backend-option");
3692 CmdArgs.push_back("-force-align-stack");
3693 }
3694 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3695 false)) {
3696 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3697 }
3698
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003699 if (Args.hasArg(options::OPT_mstack_alignment)) {
3700 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3701 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003702 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003703
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003704 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3705 options::OPT_mno_restrict_it)) {
3706 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3707 CmdArgs.push_back("-backend-option");
3708 CmdArgs.push_back("-arm-restrict-it");
3709 } else {
3710 CmdArgs.push_back("-backend-option");
3711 CmdArgs.push_back("-arm-no-restrict-it");
3712 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003713 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3714 TT.getArch() == llvm::Triple::thumb)) {
3715 // Windows on ARM expects restricted IT blocks
3716 CmdArgs.push_back("-backend-option");
3717 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003718 }
3719
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003720 if (TT.getArch() == llvm::Triple::arm ||
3721 TT.getArch() == llvm::Triple::thumb) {
3722 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3723 options::OPT_mno_long_calls)) {
3724 if (A->getOption().matches(options::OPT_mlong_calls)) {
3725 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003726 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003727 }
3728 }
3729 }
3730
Daniel Dunbard18049a2009-04-07 21:16:11 +00003731 // Forward -f options with positive and negative forms; we translate
3732 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003733 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3734 StringRef fname = A->getValue();
3735 if (!llvm::sys::fs::exists(fname))
3736 D.Diag(diag::err_drv_no_such_file) << fname;
3737 else
3738 A->render(Args, CmdArgs);
3739 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003740
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003741 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003742 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003743 CmdArgs.push_back("-fapple-kext");
3744 if (!Args.hasArg(options::OPT_fbuiltin))
3745 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003746 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003747 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003748 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003749 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003750 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003751
Nuno Lopes13c88c72009-12-16 16:59:22 +00003752 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3753 options::OPT_fno_assume_sane_operator_new))
3754 CmdArgs.push_back("-fno-assume-sane-operator-new");
3755
Daniel Dunbar4930e332009-11-17 08:07:36 +00003756 // -fblocks=0 is default.
3757 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003758 getToolChain().IsBlocksDefault()) ||
3759 (Args.hasArg(options::OPT_fgnu_runtime) &&
3760 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3761 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003762 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003763
3764 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3765 !getToolChain().hasBlocksRuntime())
3766 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003767 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003768
Douglas Gregor226173a2012-01-18 15:19:58 +00003769 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3770 // users must also pass -fcxx-modules. The latter flag will disappear once the
3771 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003772 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003773 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3774 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3775 options::OPT_fno_cxx_modules,
3776 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003777 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003778 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003779 HaveModules = true;
3780 }
3781 }
3782
Daniel Jasper07e6c402013-08-05 20:26:17 +00003783 // -fmodule-maps enables module map processing (off by default) for header
3784 // checking. It is implied by -fmodules.
3785 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3786 false)) {
3787 CmdArgs.push_back("-fmodule-maps");
3788 }
3789
Daniel Jasperac42b752013-10-21 06:34:34 +00003790 // -fmodules-decluse checks that modules used are declared so (off by
3791 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003792 if (Args.hasFlag(options::OPT_fmodules_decluse,
3793 options::OPT_fno_modules_decluse,
3794 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003795 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003796 }
3797
Daniel Jasper962b38e2014-04-11 11:47:45 +00003798 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3799 // all #included headers are part of modules.
3800 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3801 options::OPT_fno_modules_strict_decluse,
3802 false)) {
3803 CmdArgs.push_back("-fmodules-strict-decluse");
3804 }
3805
Daniel Jasperac42b752013-10-21 06:34:34 +00003806 // -fmodule-name specifies the module that is currently being built (or
3807 // used for header checking by -fmodule-maps).
Justin Bogner5443ad52014-06-20 21:12:53 +00003808 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasperac42b752013-10-21 06:34:34 +00003809 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003810
3811 // -fmodule-map-file can be used to specify a file containing module
3812 // definitions.
Justin Bogner5443ad52014-06-20 21:12:53 +00003813 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasperac42b752013-10-21 06:34:34 +00003814 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003815
Justin Bognera88f0122014-06-20 22:59:50 +00003816 // -fmodule-cache-path specifies where our module files should be written.
3817 SmallString<128> ModuleCachePath;
3818 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3819 ModuleCachePath = A->getValue();
3820 if (HaveModules) {
3821 if (C.isForDiagnostics()) {
3822 // When generating crash reports, we want to emit the modules along with
3823 // the reproduction sources, so we ignore any provided module path.
3824 ModuleCachePath = Output.getFilename();
3825 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3826 llvm::sys::path::append(ModuleCachePath, "modules");
3827 } else if (ModuleCachePath.empty()) {
3828 // No module path was provided: use the default.
3829 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3830 ModuleCachePath);
3831 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3832 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3833 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003834 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003835 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3836 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3837 }
3838
3839 // When building modules and generating crashdumps, we need to dump a module
3840 // dependency VFS alongside the output.
3841 if (HaveModules && C.isForDiagnostics()) {
3842 SmallString<128> VFSDir(Output.getFilename());
3843 llvm::sys::path::replace_extension(VFSDir, ".cache");
3844 llvm::sys::path::append(VFSDir, "vfs");
3845 CmdArgs.push_back("-module-dependency-dir");
3846 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003847 }
3848
Justin Bogner5443ad52014-06-20 21:12:53 +00003849 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3850 if (HaveModules)
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003851 A->render(Args, CmdArgs);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003852
Douglas Gregor35b04d62013-02-07 19:01:24 +00003853 // Pass through all -fmodules-ignore-macro arguments.
3854 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003855 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3856 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003857
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003858 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3859
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003860 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3861 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3862 D.Diag(diag::err_drv_argument_not_allowed_with)
3863 << A->getAsString(Args) << "-fbuild-session-timestamp";
3864
3865 llvm::sys::fs::file_status Status;
3866 if (llvm::sys::fs::status(A->getValue(), Status))
3867 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003868 char TimeStamp[48];
3869 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3870 (uint64_t)Status.getLastModificationTime().toEpochTime());
3871 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003872 }
3873
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003874 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003875 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3876 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003877 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3878
3879 Args.AddLastArg(CmdArgs,
3880 options::OPT_fmodules_validate_once_per_build_session);
3881 }
3882
Ben Langmuirdcf73862014-03-12 00:06:17 +00003883 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3884
John McCalldfea9982010-04-09 19:12:06 +00003885 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003886 if (Args.hasFlag(options::OPT_fno_access_control,
3887 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003888 false))
John McCall3155f572010-04-09 19:03:51 +00003889 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003890
Anders Carlssond470fef2010-11-21 00:09:52 +00003891 // -felide-constructors is the default.
3892 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3893 options::OPT_felide_constructors,
3894 false))
3895 CmdArgs.push_back("-fno-elide-constructors");
3896
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003897 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003898 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003899 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003900 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003901
Richard Smith52be6192012-11-05 22:04:41 +00003902 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003903 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003904 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003905 Args.getLastArg(options::OPT_mkernel,
3906 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003907 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003908 D.Diag(diag::err_drv_argument_not_allowed_with)
3909 << "-fsanitize=vptr" << NoRttiArg;
3910 }
3911 }
3912
Tony Linthicum76329bf2011-12-12 21:14:55 +00003913 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003914 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003915 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003916 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003917 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003918 CmdArgs.push_back("-fshort-enums");
3919
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003920 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003921 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003922 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003923 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003924
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003925 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003926 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003927 options::OPT_fno_threadsafe_statics))
3928 CmdArgs.push_back("-fno-threadsafe-statics");
3929
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003930 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003931 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3932 options::OPT_fno_use_cxa_atexit,
3933 !IsWindowsCygnus && !IsWindowsGNU &&
3934 getToolChain().getArch() != llvm::Triple::hexagon &&
3935 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003936 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003937 CmdArgs.push_back("-fno-use-cxa-atexit");
3938
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003939 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003940 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003941 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003942 CmdArgs.push_back("-fms-extensions");
3943
Francois Pichet1b4f1632011-09-17 04:32:15 +00003944 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003945 if (Args.hasFlag(options::OPT_fms_compatibility,
3946 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003947 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3948 options::OPT_fno_ms_extensions,
3949 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003950 CmdArgs.push_back("-fms-compatibility");
3951
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003952 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003953 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003954 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
3955 Args.hasArg(options::OPT_fms_compatibility_version)) {
3956 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3957 const Arg *MSCompatibilityVersion =
3958 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003959
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003960 if (MSCVersion && MSCompatibilityVersion)
3961 D.Diag(diag::err_drv_argument_not_allowed_with)
3962 << MSCVersion->getAsString(Args)
3963 << MSCompatibilityVersion->getAsString(Args);
3964
3965 std::string Ver;
3966 if (MSCompatibilityVersion)
3967 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
3968 else if (MSCVersion)
3969 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
3970
3971 if (Ver.empty())
3972 CmdArgs.push_back("-fms-compatibility-version=17.00");
3973 else
3974 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
3975 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003976
Eric Christopher5ecce122013-02-18 00:38:31 +00003977 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003978 if (Args.hasFlag(options::OPT_fborland_extensions,
3979 options::OPT_fno_borland_extensions, false))
3980 CmdArgs.push_back("-fborland-extensions");
3981
Francois Pichet02744872011-09-01 16:38:08 +00003982 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3983 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003984 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003985 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003986 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003987
Chandler Carruthe03aa552010-04-17 20:17:31 +00003988 // -fgnu-keywords default varies depending on language; only pass if
3989 // specified.
3990 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003991 options::OPT_fno_gnu_keywords))
3992 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003993
Rafael Espindola922a6242011-06-02 17:30:53 +00003994 if (Args.hasFlag(options::OPT_fgnu89_inline,
3995 options::OPT_fno_gnu89_inline,
3996 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003997 CmdArgs.push_back("-fgnu89-inline");
3998
Chad Rosier9c76d242012-03-15 22:31:42 +00003999 if (Args.hasArg(options::OPT_fno_inline))
4000 CmdArgs.push_back("-fno-inline");
4001
Chad Rosier64d6be92012-03-06 21:17:19 +00004002 if (Args.hasArg(options::OPT_fno_inline_functions))
4003 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004004
John McCall5fb5df92012-06-20 06:18:46 +00004005 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004006
John McCall5fb5df92012-06-20 06:18:46 +00004007 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004008 // legacy is the default. Except for deployment taget of 10.5,
4009 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4010 // gets ignored silently.
4011 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004012 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4013 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004014 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004015 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004016 if (getToolChain().UseObjCMixedDispatch())
4017 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4018 else
4019 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4020 }
4021 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004022
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004023 // When ObjectiveC legacy runtime is in effect on MacOSX,
4024 // turn on the option to do Array/Dictionary subscripting
4025 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004026 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4027 getToolChain().getTriple().isMacOSX() &&
4028 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4029 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004030 objcRuntime.isNeXTFamily())
4031 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4032
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004033 // -fencode-extended-block-signature=1 is default.
4034 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4035 CmdArgs.push_back("-fencode-extended-block-signature");
4036 }
4037
John McCall24fc0de2011-07-06 00:26:06 +00004038 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4039 // NOTE: This logic is duplicated in ToolChains.cpp.
4040 bool ARC = isObjCAutoRefCount(Args);
4041 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004042 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004043
John McCall24fc0de2011-07-06 00:26:06 +00004044 CmdArgs.push_back("-fobjc-arc");
4045
Chandler Carruth491db322011-11-04 07:34:47 +00004046 // FIXME: It seems like this entire block, and several around it should be
4047 // wrapped in isObjC, but for now we just use it here as this is where it
4048 // was being used previously.
4049 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4050 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4051 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4052 else
4053 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4054 }
4055
John McCall24fc0de2011-07-06 00:26:06 +00004056 // Allow the user to enable full exceptions code emission.
4057 // We define off for Objective-CC, on for Objective-C++.
4058 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4059 options::OPT_fno_objc_arc_exceptions,
4060 /*default*/ types::isCXX(InputType)))
4061 CmdArgs.push_back("-fobjc-arc-exceptions");
4062 }
4063
4064 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4065 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004066 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004067 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004068
John McCall24fc0de2011-07-06 00:26:06 +00004069 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4070 // takes precedence.
4071 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4072 if (!GCArg)
4073 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4074 if (GCArg) {
4075 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004076 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004077 << GCArg->getAsString(Args);
4078 } else if (getToolChain().SupportsObjCGC()) {
4079 GCArg->render(Args, CmdArgs);
4080 } else {
4081 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004082 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004083 << GCArg->getAsString(Args);
4084 }
4085 }
4086
Reid Klecknerc542d372014-06-27 17:02:02 +00004087 // Handle GCC-style exception args.
4088 if (!C.getDriver().IsCLMode())
4089 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4090 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004091
4092 if (getToolChain().UseSjLjExceptions())
4093 CmdArgs.push_back("-fsjlj-exceptions");
4094
4095 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004096 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4097 options::OPT_fno_assume_sane_operator_new))
4098 CmdArgs.push_back("-fno-assume-sane-operator-new");
4099
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004100 // -fconstant-cfstrings is default, and may be subject to argument translation
4101 // on Darwin.
4102 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4103 options::OPT_fno_constant_cfstrings) ||
4104 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4105 options::OPT_mno_constant_cfstrings))
4106 CmdArgs.push_back("-fno-constant-cfstrings");
4107
John Thompsoned4e2952009-11-05 20:14:16 +00004108 // -fshort-wchar default varies depending on platform; only
4109 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004110 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4111 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004112 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004113
Hans Wennborg28c96312013-07-31 23:39:13 +00004114 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004115 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004116 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004117 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004118 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004119
Daniel Dunbar096ed292011-10-05 21:04:55 +00004120 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4121 // -fno-pack-struct doesn't apply to -fpack-struct=.
4122 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004123 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004124 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004125 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004126 } else if (Args.hasFlag(options::OPT_fpack_struct,
4127 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004128 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004129 }
4130
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004131 // Handle -fmax-type-align=N and -fno-type-align
4132 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4133 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4134 if (!SkipMaxTypeAlign) {
4135 std::string MaxTypeAlignStr = "-fmax-type-align=";
4136 MaxTypeAlignStr += A->getValue();
4137 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4138 }
4139 } else if (getToolChain().getTriple().isOSDarwin()) {
4140 if (!SkipMaxTypeAlign) {
4141 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4142 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4143 }
4144 }
4145
Robert Lytton0e076492013-08-13 09:43:10 +00004146 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004147 if (!Args.hasArg(options::OPT_fcommon))
4148 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004149 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004150 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004151
Daniel Dunbard18049a2009-04-07 21:16:11 +00004152 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004153 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004154 CmdArgs.push_back("-fno-common");
4155
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004156 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004157 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004158 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004159 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004160 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004161 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4162
Daniel Dunbar6358d682010-10-15 22:30:42 +00004163 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4164 if (!Args.hasFlag(options::OPT_ffor_scope,
4165 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004166 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004167 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4168
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004169 // -finput_charset=UTF-8 is default. Reject others
4170 if (Arg *inputCharset = Args.getLastArg(
4171 options::OPT_finput_charset_EQ)) {
4172 StringRef value = inputCharset->getValue();
4173 if (value != "UTF-8")
4174 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4175 }
4176
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004177 // -fcaret-diagnostics is default.
4178 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4179 options::OPT_fno_caret_diagnostics, true))
4180 CmdArgs.push_back("-fno-caret-diagnostics");
4181
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004182 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004183 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004184 options::OPT_fno_diagnostics_fixit_info))
4185 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004186
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004187 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004188 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004189 options::OPT_fno_diagnostics_show_option))
4190 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004191
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004192 if (const Arg *A =
4193 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4194 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004195 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004196 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004197
Douglas Gregor643c9222011-05-21 17:07:29 +00004198 if (const Arg *A =
4199 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4200 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004201 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004202 }
4203
Chandler Carruthb6766f02011-03-27 01:50:55 +00004204 if (Arg *A = Args.getLastArg(
4205 options::OPT_fdiagnostics_show_note_include_stack,
4206 options::OPT_fno_diagnostics_show_note_include_stack)) {
4207 if (A->getOption().matches(
4208 options::OPT_fdiagnostics_show_note_include_stack))
4209 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4210 else
4211 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4212 }
4213
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004214 // Color diagnostics are the default, unless the terminal doesn't support
4215 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004216 // Support both clang's -f[no-]color-diagnostics and gcc's
4217 // -f[no-]diagnostics-colors[=never|always|auto].
4218 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004219 for (const auto &Arg : Args) {
4220 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004221 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4222 !O.matches(options::OPT_fdiagnostics_color) &&
4223 !O.matches(options::OPT_fno_color_diagnostics) &&
4224 !O.matches(options::OPT_fno_diagnostics_color) &&
4225 !O.matches(options::OPT_fdiagnostics_color_EQ))
4226 continue;
4227
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004228 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004229 if (O.matches(options::OPT_fcolor_diagnostics) ||
4230 O.matches(options::OPT_fdiagnostics_color)) {
4231 ShowColors = Colors_On;
4232 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4233 O.matches(options::OPT_fno_diagnostics_color)) {
4234 ShowColors = Colors_Off;
4235 } else {
4236 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004237 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004238 if (value == "always")
4239 ShowColors = Colors_On;
4240 else if (value == "never")
4241 ShowColors = Colors_Off;
4242 else if (value == "auto")
4243 ShowColors = Colors_Auto;
4244 else
4245 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4246 << ("-fdiagnostics-color=" + value).str();
4247 }
4248 }
4249 if (ShowColors == Colors_On ||
4250 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004251 CmdArgs.push_back("-fcolor-diagnostics");
4252
Nico Rieck7857d462013-09-11 00:38:02 +00004253 if (Args.hasArg(options::OPT_fansi_escape_codes))
4254 CmdArgs.push_back("-fansi-escape-codes");
4255
Daniel Dunbardb097022009-06-08 21:13:54 +00004256 if (!Args.hasFlag(options::OPT_fshow_source_location,
4257 options::OPT_fno_show_source_location))
4258 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004259
Douglas Gregor643c9222011-05-21 17:07:29 +00004260 if (!Args.hasFlag(options::OPT_fshow_column,
4261 options::OPT_fno_show_column,
4262 true))
4263 CmdArgs.push_back("-fno-show-column");
4264
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004265 if (!Args.hasFlag(options::OPT_fspell_checking,
4266 options::OPT_fno_spell_checking))
4267 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004268
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004269
Chad Rosierc8e56e82012-12-05 21:08:21 +00004270 // -fno-asm-blocks is default.
4271 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4272 false))
4273 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004274
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004275 // Enable vectorization per default according to the optimization level
4276 // selected. For optimization levels that want vectorization we use the alias
4277 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004278 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004279 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004280 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004281 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004282 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004283 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004284
Chad Rosier136d67d2014-04-28 19:30:57 +00004285 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004286 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4287 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004288 options::OPT_fslp_vectorize;
4289 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004290 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004291 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004292
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004293 // -fno-slp-vectorize-aggressive is default.
4294 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004295 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004296 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004297
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004298 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4299 A->render(Args, CmdArgs);
4300
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004301 // -fdollars-in-identifiers default varies depending on platform and
4302 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004303 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004304 options::OPT_fno_dollars_in_identifiers)) {
4305 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004306 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004307 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004308 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004309 }
4310
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004311 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4312 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004313 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004314 options::OPT_fno_unit_at_a_time)) {
4315 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004316 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004317 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004318
Eli Friedman055c9702011-11-02 01:53:16 +00004319 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4320 options::OPT_fno_apple_pragma_pack, false))
4321 CmdArgs.push_back("-fapple-pragma-pack");
4322
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004323 // le32-specific flags:
4324 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4325 // by default.
4326 if (getToolChain().getArch() == llvm::Triple::le32) {
4327 CmdArgs.push_back("-fno-math-builtin");
4328 }
4329
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004330 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004331 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004332 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004333#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004334 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004335 (getToolChain().getArch() == llvm::Triple::arm ||
4336 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004337 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4338 CmdArgs.push_back("-fno-builtin-strcat");
4339 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4340 CmdArgs.push_back("-fno-builtin-strcpy");
4341 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004342#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004343
Justin Bognera88f0122014-06-20 22:59:50 +00004344 // Enable rewrite includes if the user's asked for it or if we're generating
4345 // diagnostics.
4346 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4347 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004348 if (Args.hasFlag(options::OPT_frewrite_includes,
4349 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004350 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004351 CmdArgs.push_back("-frewrite-includes");
4352
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004353 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004354 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004355 options::OPT_traditional_cpp)) {
4356 if (isa<PreprocessJobAction>(JA))
4357 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004358 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004359 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004360 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004361
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004362 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004363 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004364
4365 // Handle serialized diagnostics.
4366 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4367 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004368 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004369 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004370
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004371 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4372 CmdArgs.push_back("-fretain-comments-from-system-headers");
4373
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004374 // Forward -fcomment-block-commands to -cc1.
4375 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004376 // Forward -fparse-all-comments to -cc1.
4377 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004378
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004379 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4380 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004381 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004382 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4383 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004384 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004385
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004386 // We translate this by hand to the -cc1 argument, since nightly test uses
4387 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004388 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004389 CmdArgs.push_back("-disable-llvm-optzns");
4390 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004391 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004392 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004393
Daniel Dunbard67a3222009-03-30 06:36:42 +00004394 if (Output.getType() == types::TY_Dependencies) {
4395 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004396 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004397 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004398 CmdArgs.push_back(Output.getFilename());
4399 } else {
4400 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004401 }
4402
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004403 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004404 addDashXForInput(Args, II, CmdArgs);
4405
Daniel Dunbarb440f562010-08-02 02:38:21 +00004406 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004407 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004408 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004409 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004410 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004411
Chris Lattnere9d7d782009-11-03 19:50:27 +00004412 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4413
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004414 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004415
4416 // Optionally embed the -cc1 level arguments into the debug info, for build
4417 // analysis.
4418 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004419 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004420 for (const auto &Arg : Args)
4421 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004422
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004423 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004424 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004425 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004426 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004427 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004428 }
4429 CmdArgs.push_back("-dwarf-debug-flags");
4430 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4431 }
4432
Eric Christopherd3804002013-02-22 20:12:52 +00004433 // Add the split debug info name to the command lines here so we
4434 // can propagate it to the backend.
4435 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004436 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004437 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004438 const char *SplitDwarfOut;
4439 if (SplitDwarf) {
4440 CmdArgs.push_back("-split-dwarf-file");
4441 SplitDwarfOut = SplitDebugName(Args, Inputs);
4442 CmdArgs.push_back(SplitDwarfOut);
4443 }
4444
4445 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004446 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004447 Output.getType() == types::TY_Object &&
4448 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Hans Wennborg1da044a2014-06-26 19:59:02 +00004449 Command *CLCommand = getCLFallback()->GetCommand(C, JA, Output, Inputs,
4450 Args, LinkingOutput);
David Majnemerf6072342014-07-01 22:24:56 +00004451 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004452 } else {
4453 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4454 }
4455
Daniel Dunbar17731772009-03-23 19:03:36 +00004456
Eric Christopherf1545832013-02-22 23:50:16 +00004457 // Handle the debug info splitting at object creation time if we're
4458 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004459 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004460 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004461 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004462
Roman Divacky178e01602011-02-10 16:52:03 +00004463 if (Arg *A = Args.getLastArg(options::OPT_pg))
4464 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004465 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004466 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004467
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004468 // Claim some arguments which clang supports automatically.
4469
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004470 // -fpch-preprocess is used with gcc to add a special marker in the output to
4471 // include the PCH file. Clang's PTH solution is completely transparent, so we
4472 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004473 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004474
Daniel Dunbar17731772009-03-23 19:03:36 +00004475 // Claim some arguments which clang doesn't support, but we don't
4476 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004477 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4478 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004479
Rafael Espindolab0092d72013-09-04 19:37:35 +00004480 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004481 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004482}
4483
John McCall5fb5df92012-06-20 06:18:46 +00004484/// Add options related to the Objective-C runtime/ABI.
4485///
4486/// Returns true if the runtime is non-fragile.
4487ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4488 ArgStringList &cmdArgs,
4489 RewriteKind rewriteKind) const {
4490 // Look for the controlling runtime option.
4491 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4492 options::OPT_fgnu_runtime,
4493 options::OPT_fobjc_runtime_EQ);
4494
4495 // Just forward -fobjc-runtime= to the frontend. This supercedes
4496 // options about fragility.
4497 if (runtimeArg &&
4498 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4499 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004500 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004501 if (runtime.tryParse(value)) {
4502 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4503 << value;
4504 }
4505
4506 runtimeArg->render(args, cmdArgs);
4507 return runtime;
4508 }
4509
4510 // Otherwise, we'll need the ABI "version". Version numbers are
4511 // slightly confusing for historical reasons:
4512 // 1 - Traditional "fragile" ABI
4513 // 2 - Non-fragile ABI, version 1
4514 // 3 - Non-fragile ABI, version 2
4515 unsigned objcABIVersion = 1;
4516 // If -fobjc-abi-version= is present, use that to set the version.
4517 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004518 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004519 if (value == "1")
4520 objcABIVersion = 1;
4521 else if (value == "2")
4522 objcABIVersion = 2;
4523 else if (value == "3")
4524 objcABIVersion = 3;
4525 else
4526 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4527 << value;
4528 } else {
4529 // Otherwise, determine if we are using the non-fragile ABI.
4530 bool nonFragileABIIsDefault =
4531 (rewriteKind == RK_NonFragile ||
4532 (rewriteKind == RK_None &&
4533 getToolChain().IsObjCNonFragileABIDefault()));
4534 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4535 options::OPT_fno_objc_nonfragile_abi,
4536 nonFragileABIIsDefault)) {
4537 // Determine the non-fragile ABI version to use.
4538#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4539 unsigned nonFragileABIVersion = 1;
4540#else
4541 unsigned nonFragileABIVersion = 2;
4542#endif
4543
4544 if (Arg *abiArg = args.getLastArg(
4545 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004546 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004547 if (value == "1")
4548 nonFragileABIVersion = 1;
4549 else if (value == "2")
4550 nonFragileABIVersion = 2;
4551 else
4552 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4553 << value;
4554 }
4555
4556 objcABIVersion = 1 + nonFragileABIVersion;
4557 } else {
4558 objcABIVersion = 1;
4559 }
4560 }
4561
4562 // We don't actually care about the ABI version other than whether
4563 // it's non-fragile.
4564 bool isNonFragile = objcABIVersion != 1;
4565
4566 // If we have no runtime argument, ask the toolchain for its default runtime.
4567 // However, the rewriter only really supports the Mac runtime, so assume that.
4568 ObjCRuntime runtime;
4569 if (!runtimeArg) {
4570 switch (rewriteKind) {
4571 case RK_None:
4572 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4573 break;
4574 case RK_Fragile:
4575 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4576 break;
4577 case RK_NonFragile:
4578 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4579 break;
4580 }
4581
4582 // -fnext-runtime
4583 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4584 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004585 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004586 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4587
4588 // Otherwise, build for a generic macosx port.
4589 } else {
4590 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4591 }
4592
4593 // -fgnu-runtime
4594 } else {
4595 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004596 // Legacy behaviour is to target the gnustep runtime if we are i
4597 // non-fragile mode or the GCC runtime in fragile mode.
4598 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004599 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004600 else
4601 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004602 }
4603
4604 cmdArgs.push_back(args.MakeArgString(
4605 "-fobjc-runtime=" + runtime.getAsString()));
4606 return runtime;
4607}
4608
Reid Klecknerc542d372014-06-27 17:02:02 +00004609static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4610 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4611 I += HaveDash;
4612 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004613}
Reid Klecknerc542d372014-06-27 17:02:02 +00004614
4615struct EHFlags {
4616 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4617 bool Synch;
4618 bool Asynch;
4619 bool NoExceptC;
4620};
4621
4622/// /EH controls whether to run destructor cleanups when exceptions are
4623/// thrown. There are three modifiers:
4624/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4625/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4626/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4627/// - c: Assume that extern "C" functions are implicitly noexcept. This
4628/// modifier is an optimization, so we ignore it for now.
4629/// The default is /EHs-c-, meaning cleanups are disabled.
4630static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4631 EHFlags EH;
4632 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4633 for (auto EHVal : EHArgs) {
4634 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4635 switch (EHVal[I]) {
4636 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4637 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4638 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4639 default: break;
4640 }
4641 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4642 break;
4643 }
4644 }
4645 return EH;
4646}
4647
Hans Wennborg75958c42013-08-08 00:17:41 +00004648void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4649 unsigned RTOptionID = options::OPT__SLASH_MT;
4650
Hans Wennborgf1a74252013-09-10 20:18:04 +00004651 if (Args.hasArg(options::OPT__SLASH_LDd))
4652 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4653 // but defining _DEBUG is sticky.
4654 RTOptionID = options::OPT__SLASH_MTd;
4655
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004656 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004657 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004658
Hans Wennborg75958c42013-08-08 00:17:41 +00004659 switch(RTOptionID) {
4660 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004661 if (Args.hasArg(options::OPT__SLASH_LDd))
4662 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004663 CmdArgs.push_back("-D_MT");
4664 CmdArgs.push_back("-D_DLL");
4665 CmdArgs.push_back("--dependent-lib=msvcrt");
4666 break;
4667 case options::OPT__SLASH_MDd:
4668 CmdArgs.push_back("-D_DEBUG");
4669 CmdArgs.push_back("-D_MT");
4670 CmdArgs.push_back("-D_DLL");
4671 CmdArgs.push_back("--dependent-lib=msvcrtd");
4672 break;
4673 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004674 if (Args.hasArg(options::OPT__SLASH_LDd))
4675 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004676 CmdArgs.push_back("-D_MT");
4677 CmdArgs.push_back("--dependent-lib=libcmt");
4678 break;
4679 case options::OPT__SLASH_MTd:
4680 CmdArgs.push_back("-D_DEBUG");
4681 CmdArgs.push_back("-D_MT");
4682 CmdArgs.push_back("--dependent-lib=libcmtd");
4683 break;
4684 default:
4685 llvm_unreachable("Unexpected option ID.");
4686 }
4687
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004688 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4689 // users want. The /Za flag to cl.exe turns this off, but it's not
4690 // implemented in clang.
4691 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004692
Hans Wennborg8858a032014-07-21 23:42:07 +00004693 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4694 // would produce interleaved output, so ignore /showIncludes in such cases.
4695 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4696 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4697 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004698
David Majnemerf6072342014-07-01 22:24:56 +00004699 // This controls whether or not we emit RTTI data for polymorphic types.
4700 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4701 /*default=*/false))
4702 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004703
Reid Klecknerc542d372014-06-27 17:02:02 +00004704 const Driver &D = getToolChain().getDriver();
4705 EHFlags EH = parseClangCLEHFlags(D, Args);
4706 // FIXME: Do something with NoExceptC.
4707 if (EH.Synch || EH.Asynch) {
4708 CmdArgs.push_back("-fexceptions");
4709 CmdArgs.push_back("-fcxx-exceptions");
4710 }
4711
Hans Wennborge50cec32014-06-13 20:59:54 +00004712 // /EP should expand to -E -P.
4713 if (Args.hasArg(options::OPT__SLASH_EP)) {
4714 CmdArgs.push_back("-E");
4715 CmdArgs.push_back("-P");
4716 }
4717
David Majnemer86c318f2014-02-11 21:05:00 +00004718 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4719 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4720 if (MostGeneralArg && BestCaseArg)
4721 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4722 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4723
4724 if (MostGeneralArg) {
4725 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4726 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4727 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4728
4729 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4730 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4731 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4732 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4733 << FirstConflict->getAsString(Args)
4734 << SecondConflict->getAsString(Args);
4735
4736 if (SingleArg)
4737 CmdArgs.push_back("-fms-memptr-rep=single");
4738 else if (MultipleArg)
4739 CmdArgs.push_back("-fms-memptr-rep=multiple");
4740 else
4741 CmdArgs.push_back("-fms-memptr-rep=virtual");
4742 }
4743
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004744 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4745 A->render(Args, CmdArgs);
4746
Hans Wennborg81f74482013-09-10 01:07:07 +00004747 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4748 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004749 if (Args.hasArg(options::OPT__SLASH_fallback))
4750 CmdArgs.push_back("msvc-fallback");
4751 else
4752 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004753 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004754}
4755
Hans Wennborg1da044a2014-06-26 19:59:02 +00004756visualstudio::Compile *Clang::getCLFallback() const {
4757 if (!CLFallback)
4758 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4759 return CLFallback.get();
4760}
4761
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004762void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004763 const InputInfo &Output,
4764 const InputInfoList &Inputs,
4765 const ArgList &Args,
4766 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004767 ArgStringList CmdArgs;
4768
4769 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4770 const InputInfo &Input = Inputs[0];
4771
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004772 // Don't warn about "clang -w -c foo.s"
4773 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004774 // and "clang -emit-llvm -c foo.s"
4775 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004776
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004777 // Invoke ourselves in -cc1as mode.
4778 //
4779 // FIXME: Implement custom jobs for internal actions.
4780 CmdArgs.push_back("-cc1as");
4781
4782 // Add the "effective" target triple.
4783 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004784 std::string TripleStr =
4785 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004786 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4787
4788 // Set the output mode, we currently only expect to be used as a real
4789 // assembler.
4790 CmdArgs.push_back("-filetype");
4791 CmdArgs.push_back("obj");
4792
Eric Christopher45f2e712012-12-18 00:31:10 +00004793 // Set the main file name, so that debug info works even with
4794 // -save-temps or preprocessed assembly.
4795 CmdArgs.push_back("-main-file-name");
4796 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4797
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004798 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004799 const llvm::Triple &Triple = getToolChain().getTriple();
4800 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004801 if (!CPU.empty()) {
4802 CmdArgs.push_back("-target-cpu");
4803 CmdArgs.push_back(Args.MakeArgString(CPU));
4804 }
4805
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004806 // Add the target features
4807 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004808 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004809
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004810 // Ignore explicit -force_cpusubtype_ALL option.
4811 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004812
Eric Christopherfc3ee562012-01-10 00:38:01 +00004813 // Determine the original source input.
4814 const Action *SourceAction = &JA;
4815 while (SourceAction->getKind() != Action::InputClass) {
4816 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4817 SourceAction = SourceAction->getInputs()[0];
4818 }
4819
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004820 // Forward -g and handle debug info related flags, assuming we are dealing
4821 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004822 if (SourceAction->getType() == types::TY_Asm ||
4823 SourceAction->getType() == types::TY_PP_Asm) {
4824 Args.ClaimAllArgs(options::OPT_g_Group);
4825 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4826 if (!A->getOption().matches(options::OPT_g0))
4827 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004828
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004829 if (Args.hasArg(options::OPT_gdwarf_2))
4830 CmdArgs.push_back("-gdwarf-2");
4831 if (Args.hasArg(options::OPT_gdwarf_3))
4832 CmdArgs.push_back("-gdwarf-3");
4833 if (Args.hasArg(options::OPT_gdwarf_4))
4834 CmdArgs.push_back("-gdwarf-4");
4835
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004836 // Add the -fdebug-compilation-dir flag if needed.
4837 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004838
4839 // Set the AT_producer to the clang version when using the integrated
4840 // assembler on assembly source files.
4841 CmdArgs.push_back("-dwarf-debug-producer");
4842 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004843 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004844
4845 // Optionally embed the -cc1as level arguments into the debug info, for build
4846 // analysis.
4847 if (getToolChain().UseDwarfDebugFlags()) {
4848 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004849 for (const auto &Arg : Args)
4850 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004851
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004852 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004853 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4854 Flags += Exec;
4855 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4856 Flags += " ";
4857 Flags += OriginalArgs[i];
4858 }
4859 CmdArgs.push_back("-dwarf-debug-flags");
4860 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4861 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004862
4863 // FIXME: Add -static support, once we have it.
4864
David Blaikie372d9502014-01-17 03:17:40 +00004865 // Consume all the warning flags. Usually this would be handled more
4866 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4867 // doesn't handle that so rather than warning about unused flags that are
4868 // actually used, we'll lie by omission instead.
4869 // FIXME: Stop lying and consume only the appropriate driver flags
4870 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4871 ie = Args.filtered_end();
4872 it != ie; ++it)
4873 (*it)->claim();
4874
David Blaikie9260ed62013-07-25 21:19:01 +00004875 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4876 getToolChain().getDriver());
4877
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004878 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004879
4880 assert(Output.isFilename() && "Unexpected lipo output.");
4881 CmdArgs.push_back("-o");
4882 CmdArgs.push_back(Output.getFilename());
4883
Daniel Dunbarb440f562010-08-02 02:38:21 +00004884 assert(Input.isFilename() && "Invalid input.");
4885 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004886
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004887 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004888 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004889
4890 // Handle the debug info splitting at object creation time if we're
4891 // creating an object.
4892 // TODO: Currently only works on linux with newer objcopy.
4893 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004894 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004895 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4896 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004897}
4898
Daniel Dunbara3246a02009-03-18 08:07:30 +00004899void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004900 const InputInfo &Output,
4901 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004902 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004903 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004904 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004905 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004906
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004907 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004908 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004909 // Don't forward any -g arguments to assembly steps.
4910 if (isa<AssembleJobAction>(JA) &&
4911 A->getOption().matches(options::OPT_g_Group))
4912 continue;
4913
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004914 // Don't forward any -W arguments to assembly and link steps.
4915 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4916 A->getOption().matches(options::OPT_W_Group))
4917 continue;
4918
Daniel Dunbar2da02722009-03-19 07:55:12 +00004919 // It is unfortunate that we have to claim here, as this means
4920 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004921 // platforms using a generic gcc, even if we are just using gcc
4922 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004923 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004924 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004925 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004926 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004927
Daniel Dunbar4e295052010-01-25 22:35:08 +00004928 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004929
4930 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004931 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004932 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004933 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004934
4935 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004936 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004937 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004938 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004939 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004940 else if (Arch == llvm::Triple::ppc64le)
4941 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004942 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004943 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004944 }
4945
Daniel Dunbar5716d872009-05-02 21:41:52 +00004946 // Try to force gcc to match the tool chain we want, if we recognize
4947 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004948 //
4949 // FIXME: The triple class should directly provide the information we want
4950 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004951 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004952 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004953 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4954 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004955 CmdArgs.push_back("-m64");
4956
Daniel Dunbarb440f562010-08-02 02:38:21 +00004957 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004958 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004959 CmdArgs.push_back(Output.getFilename());
4960 } else {
4961 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004962 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004963 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004964
Tony Linthicum76329bf2011-12-12 21:14:55 +00004965 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4966 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004967
4968 // Only pass -x if gcc will understand it; otherwise hope gcc
4969 // understands the suffix correctly. The main use case this would go
4970 // wrong in is for linker inputs if they happened to have an odd
4971 // suffix; really the only way to get this to happen is a command
4972 // like '-x foobar a.c' which will treat a.c like a linker input.
4973 //
4974 // FIXME: For the linker case specifically, can we safely convert
4975 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004976 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004977 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004978 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4979 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004980 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004981 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004982 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004983 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004984 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004985 else if (II.getType() == types::TY_ModuleFile)
4986 D.Diag(diag::err_drv_no_module_support)
4987 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004988
Daniel Dunbara3246a02009-03-18 08:07:30 +00004989 if (types::canTypeBeUserSpecified(II.getType())) {
4990 CmdArgs.push_back("-x");
4991 CmdArgs.push_back(types::getTypeName(II.getType()));
4992 }
4993
Daniel Dunbarb440f562010-08-02 02:38:21 +00004994 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004995 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004996 else {
4997 const Arg &A = II.getInputArg();
4998
4999 // Reverse translate some rewritten options.
5000 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5001 CmdArgs.push_back("-lstdc++");
5002 continue;
5003 }
5004
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005005 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005006 A.render(Args, CmdArgs);
5007 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005008 }
5009
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005010 const std::string customGCCName = D.getCCCGenericGCCName();
5011 const char *GCCName;
5012 if (!customGCCName.empty())
5013 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005014 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005015 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005016 } else
5017 GCCName = "gcc";
5018
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005019 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005020 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005021 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005022}
5023
Daniel Dunbar4e295052010-01-25 22:35:08 +00005024void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5025 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005026 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005027}
5028
Daniel Dunbar4e295052010-01-25 22:35:08 +00005029void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5030 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005031 const Driver &D = getToolChain().getDriver();
5032
Daniel Dunbar4e295052010-01-25 22:35:08 +00005033 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005034 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
5035 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00005036 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005037 else {
5038 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005039 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005040 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005041
Daniel Dunbar4e295052010-01-25 22:35:08 +00005042 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005043 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005044}
5045
Daniel Dunbar4e295052010-01-25 22:35:08 +00005046void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5047 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005048 // The types are (hopefully) good enough.
5049}
5050
Tony Linthicum76329bf2011-12-12 21:14:55 +00005051// Hexagon tools start.
5052void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5053 ArgStringList &CmdArgs) const {
5054
5055}
5056void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5057 const InputInfo &Output,
5058 const InputInfoList &Inputs,
5059 const ArgList &Args,
5060 const char *LinkingOutput) const {
5061
5062 const Driver &D = getToolChain().getDriver();
5063 ArgStringList CmdArgs;
5064
5065 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005066 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005067 CmdArgs.push_back(Args.MakeArgString(MarchString));
5068
5069 RenderExtraToolArgs(JA, CmdArgs);
5070
5071 if (Output.isFilename()) {
5072 CmdArgs.push_back("-o");
5073 CmdArgs.push_back(Output.getFilename());
5074 } else {
5075 assert(Output.isNothing() && "Unexpected output");
5076 CmdArgs.push_back("-fsyntax-only");
5077 }
5078
Matthew Curtise8f80a12012-12-06 17:49:03 +00005079 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5080 if (!SmallDataThreshold.empty())
5081 CmdArgs.push_back(
5082 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005083
Matthew Curtise5df3812012-12-07 17:23:04 +00005084 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5085 options::OPT_Xassembler);
5086
Tony Linthicum76329bf2011-12-12 21:14:55 +00005087 // Only pass -x if gcc will understand it; otherwise hope gcc
5088 // understands the suffix correctly. The main use case this would go
5089 // wrong in is for linker inputs if they happened to have an odd
5090 // suffix; really the only way to get this to happen is a command
5091 // like '-x foobar a.c' which will treat a.c like a linker input.
5092 //
5093 // FIXME: For the linker case specifically, can we safely convert
5094 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005095 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005096 // Don't try to pass LLVM or AST inputs to a generic gcc.
5097 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5098 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5099 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5100 << getToolChain().getTripleString();
5101 else if (II.getType() == types::TY_AST)
5102 D.Diag(clang::diag::err_drv_no_ast_support)
5103 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005104 else if (II.getType() == types::TY_ModuleFile)
5105 D.Diag(diag::err_drv_no_module_support)
5106 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005107
5108 if (II.isFilename())
5109 CmdArgs.push_back(II.getFilename());
5110 else
5111 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5112 II.getInputArg().render(Args, CmdArgs);
5113 }
5114
5115 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005116 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005117 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005118}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005119
Tony Linthicum76329bf2011-12-12 21:14:55 +00005120void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5121 ArgStringList &CmdArgs) const {
5122 // The types are (hopefully) good enough.
5123}
5124
5125void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5126 const InputInfo &Output,
5127 const InputInfoList &Inputs,
5128 const ArgList &Args,
5129 const char *LinkingOutput) const {
5130
Matthew Curtise689b052012-12-06 15:46:07 +00005131 const toolchains::Hexagon_TC& ToolChain =
5132 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5133 const Driver &D = ToolChain.getDriver();
5134
Tony Linthicum76329bf2011-12-12 21:14:55 +00005135 ArgStringList CmdArgs;
5136
Matthew Curtise689b052012-12-06 15:46:07 +00005137 //----------------------------------------------------------------------------
5138 //
5139 //----------------------------------------------------------------------------
5140 bool hasStaticArg = Args.hasArg(options::OPT_static);
5141 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005142 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005143 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5144 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5145 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5146 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005147
Matthew Curtise689b052012-12-06 15:46:07 +00005148 //----------------------------------------------------------------------------
5149 // Silence warnings for various options
5150 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005151
Matthew Curtise689b052012-12-06 15:46:07 +00005152 Args.ClaimAllArgs(options::OPT_g_Group);
5153 Args.ClaimAllArgs(options::OPT_emit_llvm);
5154 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5155 // handled somewhere else.
5156 Args.ClaimAllArgs(options::OPT_static_libgcc);
5157
5158 //----------------------------------------------------------------------------
5159 //
5160 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005161 for (const auto &Opt : ToolChain.ExtraOpts)
5162 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005163
Matthew Curtisf10a5952012-12-06 14:16:43 +00005164 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5165 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005166
Matthew Curtise689b052012-12-06 15:46:07 +00005167 if (buildingLib) {
5168 CmdArgs.push_back("-shared");
5169 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5170 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005171 }
5172
Matthew Curtise689b052012-12-06 15:46:07 +00005173 if (hasStaticArg)
5174 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005175
Matthew Curtise8f80a12012-12-06 17:49:03 +00005176 if (buildPIE && !buildingLib)
5177 CmdArgs.push_back("-pie");
5178
5179 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5180 if (!SmallDataThreshold.empty()) {
5181 CmdArgs.push_back(
5182 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5183 }
5184
Matthew Curtise689b052012-12-06 15:46:07 +00005185 //----------------------------------------------------------------------------
5186 //
5187 //----------------------------------------------------------------------------
5188 CmdArgs.push_back("-o");
5189 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005190
Matthew Curtise689b052012-12-06 15:46:07 +00005191 const std::string MarchSuffix = "/" + MarchString;
5192 const std::string G0Suffix = "/G0";
5193 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
5194 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
5195 + "/";
5196 const std::string StartFilesDir = RootDir
5197 + "hexagon/lib"
5198 + (buildingLib
5199 ? MarchG0Suffix : MarchSuffix);
5200
5201 //----------------------------------------------------------------------------
5202 // moslib
5203 //----------------------------------------------------------------------------
5204 std::vector<std::string> oslibs;
5205 bool hasStandalone= false;
5206
5207 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5208 ie = Args.filtered_end(); it != ie; ++it) {
5209 (*it)->claim();
5210 oslibs.push_back((*it)->getValue());
5211 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005212 }
Matthew Curtise689b052012-12-06 15:46:07 +00005213 if (oslibs.empty()) {
5214 oslibs.push_back("standalone");
5215 hasStandalone = true;
5216 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005217
Matthew Curtise689b052012-12-06 15:46:07 +00005218 //----------------------------------------------------------------------------
5219 // Start Files
5220 //----------------------------------------------------------------------------
5221 if (incStdLib && incStartFiles) {
5222
5223 if (!buildingLib) {
5224 if (hasStandalone) {
5225 CmdArgs.push_back(
5226 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5227 }
5228 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5229 }
5230 std::string initObj = useShared ? "/initS.o" : "/init.o";
5231 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5232 }
5233
5234 //----------------------------------------------------------------------------
5235 // Library Search Paths
5236 //----------------------------------------------------------------------------
5237 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005238 for (const auto &LibPath : LibPaths)
5239 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005240
5241 //----------------------------------------------------------------------------
5242 //
5243 //----------------------------------------------------------------------------
5244 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5245 Args.AddAllArgs(CmdArgs, options::OPT_e);
5246 Args.AddAllArgs(CmdArgs, options::OPT_s);
5247 Args.AddAllArgs(CmdArgs, options::OPT_t);
5248 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5249
5250 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5251
5252 //----------------------------------------------------------------------------
5253 // Libraries
5254 //----------------------------------------------------------------------------
5255 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005256 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005257 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5258 CmdArgs.push_back("-lm");
5259 }
5260
5261 CmdArgs.push_back("--start-group");
5262
5263 if (!buildingLib) {
5264 for(std::vector<std::string>::iterator i = oslibs.begin(),
5265 e = oslibs.end(); i != e; ++i)
5266 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5267 CmdArgs.push_back("-lc");
5268 }
5269 CmdArgs.push_back("-lgcc");
5270
5271 CmdArgs.push_back("--end-group");
5272 }
5273
5274 //----------------------------------------------------------------------------
5275 // End files
5276 //----------------------------------------------------------------------------
5277 if (incStdLib && incStartFiles) {
5278 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5279 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5280 }
5281
5282 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005283 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005284}
5285// Hexagon tools end.
5286
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005287/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005288const char *arm::getARMCPUForMArch(const ArgList &Args,
5289 const llvm::Triple &Triple) {
5290 StringRef MArch;
5291 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5292 // Otherwise, if we have -march= choose the base CPU for that arch.
5293 MArch = A->getValue();
5294 } else {
5295 // Otherwise, use the Arch from the triple.
5296 MArch = Triple.getArchName();
5297 }
5298
5299 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005300 if (MArch == "native") {
5301 std::string CPU = llvm::sys::getHostCPUName();
5302 if (CPU != "generic") {
5303 // Translate the native cpu into the architecture. The switch below will
5304 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005305 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005306 }
5307 }
5308
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005309 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005310}
5311
5312/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005313StringRef arm::getARMTargetCPU(const ArgList &Args,
5314 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005315 // FIXME: Warn on inconsistent use of -mcpu and -march.
5316 // If we have -mcpu=, use that.
5317 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5318 StringRef MCPU = A->getValue();
5319 // Handle -mcpu=native.
5320 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005321 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005322 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005323 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005324 }
5325
5326 return getARMCPUForMArch(Args, Triple);
5327}
5328
5329/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5330/// CPU.
5331//
5332// FIXME: This is redundant with -mcpu, why does LLVM use this.
5333// FIXME: tblgen this, or kill it!
5334const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5335 return llvm::StringSwitch<const char *>(CPU)
5336 .Case("strongarm", "v4")
5337 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5338 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5339 .Cases("arm920", "arm920t", "arm922t", "v4t")
5340 .Cases("arm940t", "ep9312","v4t")
5341 .Cases("arm10tdmi", "arm1020t", "v5")
5342 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5343 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5344 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5345 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5346 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5347 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00005348 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005349 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5350 .Cases("cortex-r4", "cortex-r5", "v7r")
5351 .Case("cortex-m0", "v6m")
5352 .Case("cortex-m3", "v7m")
5353 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005354 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005355 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005356 .Cases("cortex-a53", "cortex-a57", "v8")
5357 .Default("");
5358}
5359
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005360bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5361 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5362 return A && (A->getValue() == StringRef(Value));
5363}
5364
Daniel Sanders2bf13662014-07-10 14:40:57 +00005365bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005366 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5367 return llvm::StringSwitch<bool>(NaNArg->getValue())
5368 .Case("2008", true)
5369 .Case("legacy", false)
5370 .Default(false);
5371
5372 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005373 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5374 .Cases("mips32r6", "mips64r6", true)
5375 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005376
5377 return false;
5378}
5379
Daniel Sanders379d44b2014-07-16 11:52:23 +00005380bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5381 StringRef ABIName) {
5382 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005383 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005384 return false;
5385
5386 if (ABIName != "32")
5387 return false;
5388
5389 return llvm::StringSwitch<bool>(CPUName)
5390 .Cases("mips2", "mips3", "mips4", "mips5", true)
5391 .Cases("mips32", "mips32r2", true)
5392 .Cases("mips64", "mips64r2", true)
5393 .Default(false);
5394}
5395
Tim Northover157d9112014-01-16 08:48:16 +00005396llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005397 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5398 // archs which Darwin doesn't use.
5399
5400 // The matching this routine does is fairly pointless, since it is neither the
5401 // complete architecture list, nor a reasonable subset. The problem is that
5402 // historically the driver driver accepts this and also ties its -march=
5403 // handling to the architecture name, so we need to be careful before removing
5404 // support for it.
5405
5406 // This code must be kept in sync with Clang's Darwin specific argument
5407 // translation.
5408
5409 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5410 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5411 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5412 .Case("ppc64", llvm::Triple::ppc64)
5413 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5414 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5415 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005416 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005417 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005418 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005419 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005420 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005421 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005422 .Case("r600", llvm::Triple::r600)
5423 .Case("nvptx", llvm::Triple::nvptx)
5424 .Case("nvptx64", llvm::Triple::nvptx64)
5425 .Case("amdil", llvm::Triple::amdil)
5426 .Case("spir", llvm::Triple::spir)
5427 .Default(llvm::Triple::UnknownArch);
5428}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005429
Tim Northover157d9112014-01-16 08:48:16 +00005430void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5431 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5432 T.setArch(Arch);
5433
5434 if (Str == "x86_64h")
5435 T.setArchName(Str);
5436 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5437 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005438 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005439 }
5440}
5441
Bob Wilsondecc03e2012-11-23 06:14:39 +00005442const char *Clang::getBaseInputName(const ArgList &Args,
5443 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005444 return Args.MakeArgString(
5445 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005446}
5447
Bob Wilsondecc03e2012-11-23 06:14:39 +00005448const char *Clang::getBaseInputStem(const ArgList &Args,
5449 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005450 const char *Str = getBaseInputName(Args, Inputs);
5451
Chris Lattner906bb902011-01-16 08:14:11 +00005452 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005453 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005454
5455 return Str;
5456}
5457
Bob Wilsondecc03e2012-11-23 06:14:39 +00005458const char *Clang::getDependencyFileName(const ArgList &Args,
5459 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005460 // FIXME: Think about this more.
5461 std::string Res;
5462
5463 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005464 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005465 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005466 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005467 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005468 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005469 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005470}
5471
Daniel Dunbarbe220842009-03-20 16:06:39 +00005472void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005473 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005474 const InputInfoList &Inputs,
5475 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005476 const char *LinkingOutput) const {
5477 ArgStringList CmdArgs;
5478
5479 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5480 const InputInfo &Input = Inputs[0];
5481
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005482 // Determine the original source input.
5483 const Action *SourceAction = &JA;
5484 while (SourceAction->getKind() != Action::InputClass) {
5485 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5486 SourceAction = SourceAction->getInputs()[0];
5487 }
5488
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005489 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005490 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005491 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5492 // FIXME: at run-time detect assembler capabilities or rely on version
5493 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005494 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005495 const llvm::Triple &T(getToolChain().getTriple());
5496 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005497 CmdArgs.push_back("-Q");
5498 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005499
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005500 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005501 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005502 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005503 if (Args.hasArg(options::OPT_gstabs))
5504 CmdArgs.push_back("--gstabs");
5505 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005506 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005507 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005508
Daniel Dunbarbe220842009-03-20 16:06:39 +00005509 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005510 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005511
Daniel Dunbar6d484762010-07-22 01:47:22 +00005512 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005513 if (getToolChain().getArch() == llvm::Triple::x86 ||
5514 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005515 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5516 CmdArgs.push_back("-force_cpusubtype_ALL");
5517
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005518 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005519 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005520 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005521 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005522 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005523 CmdArgs.push_back("-static");
5524
Daniel Dunbarbe220842009-03-20 16:06:39 +00005525 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5526 options::OPT_Xassembler);
5527
5528 assert(Output.isFilename() && "Unexpected lipo output.");
5529 CmdArgs.push_back("-o");
5530 CmdArgs.push_back(Output.getFilename());
5531
Daniel Dunbarb440f562010-08-02 02:38:21 +00005532 assert(Input.isFilename() && "Invalid input.");
5533 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005534
5535 // asm_final spec is empty.
5536
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005537 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005538 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005539 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005540}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005541
Tim Northover157d9112014-01-16 08:48:16 +00005542void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005543
Tim Northover157d9112014-01-16 08:48:16 +00005544void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5545 ArgStringList &CmdArgs) const {
5546 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005547
Daniel Dunbarc1964212009-03-26 16:23:12 +00005548 // Derived from darwin_arch spec.
5549 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005550 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005551
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005552 // FIXME: Is this needed anymore?
5553 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005554 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005555}
5556
Bill Wendling3b2000f2012-10-02 18:02:50 +00005557bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5558 // We only need to generate a temp path for LTO if we aren't compiling object
5559 // files. When compiling source files, we run 'dsymutil' after linking. We
5560 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005561 for (const auto &Input : Inputs)
5562 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005563 return true;
5564
5565 return false;
5566}
5567
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005568void darwin::Link::AddLinkArgs(Compilation &C,
5569 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005570 ArgStringList &CmdArgs,
5571 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005572 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005573 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005574
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005575 unsigned Version[3] = { 0, 0, 0 };
5576 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5577 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005578 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005579 Version[1], Version[2], HadExtra) ||
5580 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005581 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005582 << A->getAsString(Args);
5583 }
5584
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005585 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005586 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005587 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5588 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005589
Bob Wilson3d27dad2013-08-02 22:25:34 +00005590 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5591 CmdArgs.push_back("-export_dynamic");
5592
Bill Wendling313b6bf2012-11-16 23:03:00 +00005593 // If we are using LTO, then automatically create a temporary file path for
5594 // the linker to use, so that it's lifetime will extend past a possible
5595 // dsymutil step.
5596 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5597 const char *TmpPath = C.getArgs().MakeArgString(
5598 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5599 C.addTempFile(TmpPath);
5600 CmdArgs.push_back("-object_path_lto");
5601 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005602 }
5603
Daniel Dunbarc1964212009-03-26 16:23:12 +00005604 // Derived from the "link" spec.
5605 Args.AddAllArgs(CmdArgs, options::OPT_static);
5606 if (!Args.hasArg(options::OPT_static))
5607 CmdArgs.push_back("-dynamic");
5608 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5609 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5610 // here. How do we wish to handle such things?
5611 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005612
Daniel Dunbarc1964212009-03-26 16:23:12 +00005613 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005614 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005615 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005616 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005617
5618 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5619 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5620 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5621
5622 Arg *A;
5623 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5624 (A = Args.getLastArg(options::OPT_current__version)) ||
5625 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005626 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005627 << A->getAsString(Args) << "-dynamiclib";
5628
5629 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5630 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5631 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5632 } else {
5633 CmdArgs.push_back("-dylib");
5634
5635 Arg *A;
5636 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5637 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5638 (A = Args.getLastArg(options::OPT_client__name)) ||
5639 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5640 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5641 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005642 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005643 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005644
Daniel Dunbarc1964212009-03-26 16:23:12 +00005645 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5646 "-dylib_compatibility_version");
5647 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5648 "-dylib_current_version");
5649
Tim Northover157d9112014-01-16 08:48:16 +00005650 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005651
5652 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5653 "-dylib_install_name");
5654 }
5655
5656 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5657 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5658 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005659 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005660 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005661 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5662 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5663 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5664 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5665 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5666 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005667 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005668 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5669 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5670 Args.AddAllArgs(CmdArgs, options::OPT_init);
5671
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005672 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005673 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005674
Daniel Dunbarc1964212009-03-26 16:23:12 +00005675 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5676 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5677 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5678 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5679 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005680
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005681 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5682 options::OPT_fno_pie,
5683 options::OPT_fno_PIE)) {
5684 if (A->getOption().matches(options::OPT_fpie) ||
5685 A->getOption().matches(options::OPT_fPIE))
5686 CmdArgs.push_back("-pie");
5687 else
5688 CmdArgs.push_back("-no_pie");
5689 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005690
5691 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5692 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5693 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5694 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5695 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5696 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5697 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5698 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5699 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5700 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5701 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5702 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5703 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5704 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5705 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5706 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005707
Daniel Dunbar84384642011-05-02 21:03:47 +00005708 // Give --sysroot= preference, over the Apple specific behavior to also use
5709 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005710 StringRef sysroot = C.getSysRoot();
5711 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005712 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005713 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005714 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5715 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005716 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005717 }
5718
Daniel Dunbarc1964212009-03-26 16:23:12 +00005719 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5720 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5721 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5722 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5723 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005724 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005725 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5726 Args.AddAllArgs(CmdArgs, options::OPT_y);
5727 Args.AddLastArg(CmdArgs, options::OPT_w);
5728 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5729 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5730 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5731 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5732 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5733 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5734 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5735 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5736 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5737 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5738 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5739 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5740}
5741
Alexey Bataev186b28a2014-03-06 05:43:53 +00005742enum LibOpenMP {
5743 LibUnknown,
5744 LibGOMP,
5745 LibIOMP5
5746};
5747
Daniel Dunbarc1964212009-03-26 16:23:12 +00005748void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005749 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005750 const InputInfoList &Inputs,
5751 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005752 const char *LinkingOutput) const {
5753 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005754
Daniel Dunbarc1964212009-03-26 16:23:12 +00005755 // The logic here is derived from gcc's behavior; most of which
5756 // comes from specs (starting with link_command). Consult gcc for
5757 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005758 ArgStringList CmdArgs;
5759
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005760 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5761 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5762 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005763 for (const auto &Arg : Args)
5764 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005765 const char *Exec =
5766 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5767 CmdArgs.push_back(Output.getFilename());
5768 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5769 return;
5770 }
5771
Daniel Dunbarc1964212009-03-26 16:23:12 +00005772 // I'm not sure why this particular decomposition exists in gcc, but
5773 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005774 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005775
Daniel Dunbarc1964212009-03-26 16:23:12 +00005776 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5777 Args.AddAllArgs(CmdArgs, options::OPT_s);
5778 Args.AddAllArgs(CmdArgs, options::OPT_t);
5779 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5780 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005781 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005782 Args.AddAllArgs(CmdArgs, options::OPT_r);
5783
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005784 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5785 // members of static archive libraries which implement Objective-C classes or
5786 // categories.
5787 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5788 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005789
Daniel Dunbarc1964212009-03-26 16:23:12 +00005790 CmdArgs.push_back("-o");
5791 CmdArgs.push_back(Output.getFilename());
5792
Chad Rosier06fd3c62012-05-16 23:45:12 +00005793 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005794 !Args.hasArg(options::OPT_nostartfiles))
5795 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005796
5797 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005798
Alexey Bataev186b28a2014-03-06 05:43:53 +00005799 LibOpenMP UsedOpenMPLib = LibUnknown;
5800 if (Args.hasArg(options::OPT_fopenmp)) {
5801 UsedOpenMPLib = LibGOMP;
5802 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5803 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5804 .Case("libgomp", LibGOMP)
5805 .Case("libiomp5", LibIOMP5)
5806 .Default(LibUnknown);
5807 if (UsedOpenMPLib == LibUnknown)
5808 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5809 << A->getOption().getName() << A->getValue();
5810 }
5811 switch (UsedOpenMPLib) {
5812 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005813 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005814 break;
5815 case LibIOMP5:
5816 CmdArgs.push_back("-liomp5");
5817 break;
5818 case LibUnknown:
5819 break;
5820 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005821
Douglas Gregor9295df02012-05-15 21:00:27 +00005822 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5823
Bob Wilson16d93952012-05-15 18:57:39 +00005824 if (isObjCRuntimeLinked(Args) &&
5825 !Args.hasArg(options::OPT_nostdlib) &&
5826 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005827 // We use arclite library for both ARC and subscripting support.
5828 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5829
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005830 CmdArgs.push_back("-framework");
5831 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005832 // Link libobj.
5833 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005834 }
John McCall31168b02011-06-15 23:02:42 +00005835
Daniel Dunbarc1964212009-03-26 16:23:12 +00005836 if (LinkingOutput) {
5837 CmdArgs.push_back("-arch_multiple");
5838 CmdArgs.push_back("-final_output");
5839 CmdArgs.push_back(LinkingOutput);
5840 }
5841
Daniel Dunbarc1964212009-03-26 16:23:12 +00005842 if (Args.hasArg(options::OPT_fnested_functions))
5843 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005844
Daniel Dunbarc1964212009-03-26 16:23:12 +00005845 if (!Args.hasArg(options::OPT_nostdlib) &&
5846 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005847 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005848 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005849
Daniel Dunbarc1964212009-03-26 16:23:12 +00005850 // link_ssp spec is empty.
5851
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005852 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005853 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005854 }
5855
Chad Rosier06fd3c62012-05-16 23:45:12 +00005856 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005857 !Args.hasArg(options::OPT_nostartfiles)) {
5858 // endfile_spec is empty.
5859 }
5860
5861 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5862 Args.AddAllArgs(CmdArgs, options::OPT_F);
5863
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005864 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00005865 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005866 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005867}
5868
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005869void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005870 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005871 const InputInfoList &Inputs,
5872 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005873 const char *LinkingOutput) const {
5874 ArgStringList CmdArgs;
5875
5876 CmdArgs.push_back("-create");
5877 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005878
5879 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005880 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005881
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005882 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005883 assert(II.isFilename() && "Unexpected lipo input.");
5884 CmdArgs.push_back(II.getFilename());
5885 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005886
5887 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005888 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005889}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005890
Daniel Dunbar88299622010-06-04 18:28:36 +00005891void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005892 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005893 const InputInfoList &Inputs,
5894 const ArgList &Args,
5895 const char *LinkingOutput) const {
5896 ArgStringList CmdArgs;
5897
Daniel Dunbareb86b042011-05-09 17:23:16 +00005898 CmdArgs.push_back("-o");
5899 CmdArgs.push_back(Output.getFilename());
5900
Daniel Dunbar88299622010-06-04 18:28:36 +00005901 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5902 const InputInfo &Input = Inputs[0];
5903 assert(Input.isFilename() && "Unexpected dsymutil input.");
5904 CmdArgs.push_back(Input.getFilename());
5905
Daniel Dunbar88299622010-06-04 18:28:36 +00005906 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005907 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005908 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005909}
5910
Eric Christopher551ef452011-08-23 17:56:55 +00005911void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005912 const InputInfo &Output,
5913 const InputInfoList &Inputs,
5914 const ArgList &Args,
5915 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005916 ArgStringList CmdArgs;
5917 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005918 CmdArgs.push_back("--debug-info");
5919 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005920 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005921
5922 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5923 const InputInfo &Input = Inputs[0];
5924 assert(Input.isFilename() && "Unexpected verify input");
5925
5926 // Grabbing the output of the earlier dsymutil run.
5927 CmdArgs.push_back(Input.getFilename());
5928
5929 const char *Exec =
5930 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5931 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5932}
5933
David Chisnallf571cde2012-02-15 13:39:01 +00005934void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5935 const InputInfo &Output,
5936 const InputInfoList &Inputs,
5937 const ArgList &Args,
5938 const char *LinkingOutput) const {
5939 ArgStringList CmdArgs;
5940
5941 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5942 options::OPT_Xassembler);
5943
5944 CmdArgs.push_back("-o");
5945 CmdArgs.push_back(Output.getFilename());
5946
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005947 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00005948 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00005949
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005950 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Chisnallf571cde2012-02-15 13:39:01 +00005951 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5952}
5953
David Chisnallf571cde2012-02-15 13:39:01 +00005954void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5955 const InputInfo &Output,
5956 const InputInfoList &Inputs,
5957 const ArgList &Args,
5958 const char *LinkingOutput) const {
5959 // FIXME: Find a real GCC, don't hard-code versions here
5960 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5961 const llvm::Triple &T = getToolChain().getTriple();
5962 std::string LibPath = "/usr/lib/";
5963 llvm::Triple::ArchType Arch = T.getArch();
5964 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005965 case llvm::Triple::x86:
5966 GCCLibPath +=
5967 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5968 break;
5969 case llvm::Triple::x86_64:
5970 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5971 GCCLibPath += "/4.5.2/amd64/";
5972 LibPath += "amd64/";
5973 break;
5974 default:
5975 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005976 }
5977
5978 ArgStringList CmdArgs;
5979
David Chisnall272a0712012-02-29 15:06:12 +00005980 // Demangle C++ names in errors
5981 CmdArgs.push_back("-C");
5982
David Chisnallf571cde2012-02-15 13:39:01 +00005983 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5984 (!Args.hasArg(options::OPT_shared))) {
5985 CmdArgs.push_back("-e");
5986 CmdArgs.push_back("_start");
5987 }
5988
5989 if (Args.hasArg(options::OPT_static)) {
5990 CmdArgs.push_back("-Bstatic");
5991 CmdArgs.push_back("-dn");
5992 } else {
5993 CmdArgs.push_back("-Bdynamic");
5994 if (Args.hasArg(options::OPT_shared)) {
5995 CmdArgs.push_back("-shared");
5996 } else {
5997 CmdArgs.push_back("--dynamic-linker");
5998 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5999 }
6000 }
6001
6002 if (Output.isFilename()) {
6003 CmdArgs.push_back("-o");
6004 CmdArgs.push_back(Output.getFilename());
6005 } else {
6006 assert(Output.isNothing() && "Invalid output.");
6007 }
6008
6009 if (!Args.hasArg(options::OPT_nostdlib) &&
6010 !Args.hasArg(options::OPT_nostartfiles)) {
6011 if (!Args.hasArg(options::OPT_shared)) {
6012 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6013 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006014 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006015 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6016 } else {
6017 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006018 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6019 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006020 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006021 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006022 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006023 }
6024
6025 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6026
6027 Args.AddAllArgs(CmdArgs, options::OPT_L);
6028 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6029 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006030 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006031
6032 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6033
6034 if (!Args.hasArg(options::OPT_nostdlib) &&
6035 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006036 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006037 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006038 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006039 if (!Args.hasArg(options::OPT_shared)) {
6040 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006041 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006042 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006043 }
David Chisnallf571cde2012-02-15 13:39:01 +00006044 }
6045
6046 if (!Args.hasArg(options::OPT_nostdlib) &&
6047 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006048 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006049 }
David Chisnall96de9932012-02-16 16:00:47 +00006050 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006051
Alexey Samsonov7811d192014-02-20 13:57:37 +00006052 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006053
6054 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006055 Args.MakeArgString(getToolChain().GetLinkerPath());
David Chisnallf571cde2012-02-15 13:39:01 +00006056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6057}
6058
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006059void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006060 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006061 const InputInfoList &Inputs,
6062 const ArgList &Args,
6063 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006064 ArgStringList CmdArgs;
6065
6066 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6067 options::OPT_Xassembler);
6068
6069 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006070 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006071
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006072 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006073 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006074
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006075 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006076 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006077}
6078
6079void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006080 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006081 const InputInfoList &Inputs,
6082 const ArgList &Args,
6083 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006084 ArgStringList CmdArgs;
6085
6086 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006087 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006088 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006089 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006090 }
6091
6092 if (Args.hasArg(options::OPT_static)) {
6093 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006094 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006095 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006096// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006097 CmdArgs.push_back("-Bdynamic");
6098 if (Args.hasArg(options::OPT_shared)) {
6099 CmdArgs.push_back("-shared");
6100 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00006101 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006102 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
6103 }
6104 }
6105
Daniel Dunbarb440f562010-08-02 02:38:21 +00006106 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006107 CmdArgs.push_back("-o");
6108 CmdArgs.push_back(Output.getFilename());
6109 } else {
6110 assert(Output.isNothing() && "Invalid output.");
6111 }
6112
6113 if (!Args.hasArg(options::OPT_nostdlib) &&
6114 !Args.hasArg(options::OPT_nostartfiles)) {
6115 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006116 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006117 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006118 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006119 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006120 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006121 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006122 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006123 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006124 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006125 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006126 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006127 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006128 }
6129
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006130 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
6131 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006132 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006133
6134 Args.AddAllArgs(CmdArgs, options::OPT_L);
6135 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6136 Args.AddAllArgs(CmdArgs, options::OPT_e);
6137
Daniel Dunbar54423b22010-09-17 00:24:54 +00006138 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006139
6140 if (!Args.hasArg(options::OPT_nostdlib) &&
6141 !Args.hasArg(options::OPT_nodefaultlibs)) {
6142 // FIXME: For some reason GCC passes -lgcc before adding
6143 // the default system libraries. Just mimic this for now.
6144 CmdArgs.push_back("-lgcc");
6145
6146 if (Args.hasArg(options::OPT_pthread))
6147 CmdArgs.push_back("-pthread");
6148 if (!Args.hasArg(options::OPT_shared))
6149 CmdArgs.push_back("-lc");
6150 CmdArgs.push_back("-lgcc");
6151 }
6152
6153 if (!Args.hasArg(options::OPT_nostdlib) &&
6154 !Args.hasArg(options::OPT_nostartfiles)) {
6155 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006156 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006157 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006158 }
6159
Alexey Samsonov7811d192014-02-20 13:57:37 +00006160 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006161
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006162 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006163 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006164 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006165}
6166
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006167void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006168 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006169 const InputInfoList &Inputs,
6170 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006171 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006172 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006173 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006174
Rafael Espindolacc126272014-02-28 01:55:21 +00006175 switch (getToolChain().getArch()) {
6176 case llvm::Triple::x86:
6177 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6178 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006179 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006180 break;
6181
6182 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006183 CmdArgs.push_back("-mppc");
6184 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006185 break;
6186
6187 case llvm::Triple::sparc:
6188 CmdArgs.push_back("-32");
6189 NeedsKPIC = true;
6190 break;
6191
6192 case llvm::Triple::sparcv9:
6193 CmdArgs.push_back("-64");
6194 CmdArgs.push_back("-Av9a");
6195 NeedsKPIC = true;
6196 break;
6197
6198 case llvm::Triple::mips64:
6199 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006200 StringRef CPUName;
6201 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006202 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006203
6204 CmdArgs.push_back("-mabi");
6205 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6206
6207 if (getToolChain().getArch() == llvm::Triple::mips64)
6208 CmdArgs.push_back("-EB");
6209 else
6210 CmdArgs.push_back("-EL");
6211
Rafael Espindolacc126272014-02-28 01:55:21 +00006212 NeedsKPIC = true;
6213 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006214 }
6215
Rafael Espindolacc126272014-02-28 01:55:21 +00006216 default:
6217 break;
6218 }
6219
6220 if (NeedsKPIC)
6221 addAssemblerKPIC(Args, CmdArgs);
6222
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006223 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6224 options::OPT_Xassembler);
6225
6226 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006227 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006228
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006229 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006230 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006231
6232 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006233 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006234 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006235}
6236
6237void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006238 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006239 const InputInfoList &Inputs,
6240 const ArgList &Args,
6241 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006242 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006243 ArgStringList CmdArgs;
6244
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006245 // Silence warning for "clang -g foo.o -o foo"
6246 Args.ClaimAllArgs(options::OPT_g_Group);
6247 // and "clang -emit-llvm foo.o -o foo"
6248 Args.ClaimAllArgs(options::OPT_emit_llvm);
6249 // and for "clang -w foo.o -o foo". Other warning options are already
6250 // handled somewhere else.
6251 Args.ClaimAllArgs(options::OPT_w);
6252
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006253 if (getToolChain().getArch() == llvm::Triple::mips64)
6254 CmdArgs.push_back("-EB");
6255 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6256 CmdArgs.push_back("-EL");
6257
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006258 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006259 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006260 CmdArgs.push_back("-e");
6261 CmdArgs.push_back("__start");
6262 }
6263
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006264 if (Args.hasArg(options::OPT_static)) {
6265 CmdArgs.push_back("-Bstatic");
6266 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006267 if (Args.hasArg(options::OPT_rdynamic))
6268 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006269 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006270 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006271 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006272 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006273 } else {
6274 CmdArgs.push_back("-dynamic-linker");
6275 CmdArgs.push_back("/usr/libexec/ld.so");
6276 }
6277 }
6278
Rafael Espindola044f7832013-06-05 04:28:55 +00006279 if (Args.hasArg(options::OPT_nopie))
6280 CmdArgs.push_back("-nopie");
6281
Daniel Dunbarb440f562010-08-02 02:38:21 +00006282 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006283 CmdArgs.push_back("-o");
6284 CmdArgs.push_back(Output.getFilename());
6285 } else {
6286 assert(Output.isNothing() && "Invalid output.");
6287 }
6288
6289 if (!Args.hasArg(options::OPT_nostdlib) &&
6290 !Args.hasArg(options::OPT_nostartfiles)) {
6291 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006292 if (Args.hasArg(options::OPT_pg))
6293 CmdArgs.push_back(Args.MakeArgString(
6294 getToolChain().GetFilePath("gcrt0.o")));
6295 else
6296 CmdArgs.push_back(Args.MakeArgString(
6297 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006298 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006299 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006300 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006301 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006302 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006303 }
6304 }
6305
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006306 std::string Triple = getToolChain().getTripleString();
6307 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006308 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006309 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006310 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006311
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006312 Args.AddAllArgs(CmdArgs, options::OPT_L);
6313 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6314 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006315 Args.AddAllArgs(CmdArgs, options::OPT_s);
6316 Args.AddAllArgs(CmdArgs, options::OPT_t);
6317 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6318 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006319
Daniel Dunbar54423b22010-09-17 00:24:54 +00006320 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006321
6322 if (!Args.hasArg(options::OPT_nostdlib) &&
6323 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006324 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006325 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006326 if (Args.hasArg(options::OPT_pg))
6327 CmdArgs.push_back("-lm_p");
6328 else
6329 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006330 }
6331
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006332 // FIXME: For some reason GCC passes -lgcc before adding
6333 // the default system libraries. Just mimic this for now.
6334 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006335
Eric Christopher17674ec2012-09-13 06:32:34 +00006336 if (Args.hasArg(options::OPT_pthread)) {
6337 if (!Args.hasArg(options::OPT_shared) &&
6338 Args.hasArg(options::OPT_pg))
6339 CmdArgs.push_back("-lpthread_p");
6340 else
6341 CmdArgs.push_back("-lpthread");
6342 }
6343
Chandler Carruth45661652011-12-17 22:32:42 +00006344 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006345 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006346 CmdArgs.push_back("-lc_p");
6347 else
6348 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006349 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006350
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006351 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006352 }
6353
6354 if (!Args.hasArg(options::OPT_nostdlib) &&
6355 !Args.hasArg(options::OPT_nostartfiles)) {
6356 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006357 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006358 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006359 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006360 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006361 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006362 }
6363
6364 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006365 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006366 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006367}
Ed Schoutene33194b2009-04-02 19:13:12 +00006368
Eli Friedman9fa28852012-08-08 23:57:20 +00006369void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6370 const InputInfo &Output,
6371 const InputInfoList &Inputs,
6372 const ArgList &Args,
6373 const char *LinkingOutput) const {
6374 ArgStringList CmdArgs;
6375
6376 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6377 options::OPT_Xassembler);
6378
6379 CmdArgs.push_back("-o");
6380 CmdArgs.push_back(Output.getFilename());
6381
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006382 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006383 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006384
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006385 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Eli Friedman9fa28852012-08-08 23:57:20 +00006386 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6387}
6388
6389void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6390 const InputInfo &Output,
6391 const InputInfoList &Inputs,
6392 const ArgList &Args,
6393 const char *LinkingOutput) const {
6394 const Driver &D = getToolChain().getDriver();
6395 ArgStringList CmdArgs;
6396
6397 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6398 (!Args.hasArg(options::OPT_shared))) {
6399 CmdArgs.push_back("-e");
6400 CmdArgs.push_back("__start");
6401 }
6402
6403 if (Args.hasArg(options::OPT_static)) {
6404 CmdArgs.push_back("-Bstatic");
6405 } else {
6406 if (Args.hasArg(options::OPT_rdynamic))
6407 CmdArgs.push_back("-export-dynamic");
6408 CmdArgs.push_back("--eh-frame-hdr");
6409 CmdArgs.push_back("-Bdynamic");
6410 if (Args.hasArg(options::OPT_shared)) {
6411 CmdArgs.push_back("-shared");
6412 } else {
6413 CmdArgs.push_back("-dynamic-linker");
6414 CmdArgs.push_back("/usr/libexec/ld.so");
6415 }
6416 }
6417
6418 if (Output.isFilename()) {
6419 CmdArgs.push_back("-o");
6420 CmdArgs.push_back(Output.getFilename());
6421 } else {
6422 assert(Output.isNothing() && "Invalid output.");
6423 }
6424
6425 if (!Args.hasArg(options::OPT_nostdlib) &&
6426 !Args.hasArg(options::OPT_nostartfiles)) {
6427 if (!Args.hasArg(options::OPT_shared)) {
6428 if (Args.hasArg(options::OPT_pg))
6429 CmdArgs.push_back(Args.MakeArgString(
6430 getToolChain().GetFilePath("gcrt0.o")));
6431 else
6432 CmdArgs.push_back(Args.MakeArgString(
6433 getToolChain().GetFilePath("crt0.o")));
6434 CmdArgs.push_back(Args.MakeArgString(
6435 getToolChain().GetFilePath("crtbegin.o")));
6436 } else {
6437 CmdArgs.push_back(Args.MakeArgString(
6438 getToolChain().GetFilePath("crtbeginS.o")));
6439 }
6440 }
6441
6442 Args.AddAllArgs(CmdArgs, options::OPT_L);
6443 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6444 Args.AddAllArgs(CmdArgs, options::OPT_e);
6445
6446 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6447
6448 if (!Args.hasArg(options::OPT_nostdlib) &&
6449 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006450 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006451 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6452 if (Args.hasArg(options::OPT_pg))
6453 CmdArgs.push_back("-lm_p");
6454 else
6455 CmdArgs.push_back("-lm");
6456 }
6457
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006458 if (Args.hasArg(options::OPT_pthread)) {
6459 if (!Args.hasArg(options::OPT_shared) &&
6460 Args.hasArg(options::OPT_pg))
6461 CmdArgs.push_back("-lpthread_p");
6462 else
6463 CmdArgs.push_back("-lpthread");
6464 }
6465
Eli Friedman9fa28852012-08-08 23:57:20 +00006466 if (!Args.hasArg(options::OPT_shared)) {
6467 if (Args.hasArg(options::OPT_pg))
6468 CmdArgs.push_back("-lc_p");
6469 else
6470 CmdArgs.push_back("-lc");
6471 }
6472
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006473 StringRef MyArch;
6474 switch (getToolChain().getTriple().getArch()) {
6475 case llvm::Triple::arm:
6476 MyArch = "arm";
6477 break;
6478 case llvm::Triple::x86:
6479 MyArch = "i386";
6480 break;
6481 case llvm::Triple::x86_64:
6482 MyArch = "amd64";
6483 break;
6484 default:
6485 llvm_unreachable("Unsupported architecture");
6486 }
6487 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006488 }
6489
6490 if (!Args.hasArg(options::OPT_nostdlib) &&
6491 !Args.hasArg(options::OPT_nostartfiles)) {
6492 if (!Args.hasArg(options::OPT_shared))
6493 CmdArgs.push_back(Args.MakeArgString(
6494 getToolChain().GetFilePath("crtend.o")));
6495 else
6496 CmdArgs.push_back(Args.MakeArgString(
6497 getToolChain().GetFilePath("crtendS.o")));
6498 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006499
6500 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006501 Args.MakeArgString(getToolChain().GetLinkerPath());
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006502 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006503}
6504
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006505void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006506 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006507 const InputInfoList &Inputs,
6508 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006509 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006510 ArgStringList CmdArgs;
6511
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006512 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6513 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006514 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006515 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006516 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006517 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006518 else if (getToolChain().getArch() == llvm::Triple::mips ||
6519 getToolChain().getArch() == llvm::Triple::mipsel ||
6520 getToolChain().getArch() == llvm::Triple::mips64 ||
6521 getToolChain().getArch() == llvm::Triple::mips64el) {
6522 StringRef CPUName;
6523 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006524 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006525
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006526 CmdArgs.push_back("-march");
6527 CmdArgs.push_back(CPUName.data());
6528
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006529 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006530 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006531
6532 if (getToolChain().getArch() == llvm::Triple::mips ||
6533 getToolChain().getArch() == llvm::Triple::mips64)
6534 CmdArgs.push_back("-EB");
6535 else
6536 CmdArgs.push_back("-EL");
6537
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006538 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006539 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006540 getToolChain().getArch() == llvm::Triple::armeb ||
6541 getToolChain().getArch() == llvm::Triple::thumb ||
6542 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006543 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006544 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006545 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6546
6547 if (FloatABI == "hard") {
6548 CmdArgs.push_back("-mfpu=vfp");
6549 } else {
6550 CmdArgs.push_back("-mfpu=softvfp");
6551 }
6552
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006553 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006554 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006555 case llvm::Triple::GNUEABI:
6556 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006557 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006558 break;
6559
6560 default:
6561 CmdArgs.push_back("-matpcs");
6562 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006563 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006564 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006565 if (getToolChain().getArch() == llvm::Triple::sparc)
6566 CmdArgs.push_back("-Av8plusa");
6567 else
6568 CmdArgs.push_back("-Av9a");
6569
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006570 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006571 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006572
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006573 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6574 options::OPT_Xassembler);
6575
6576 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006577 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006578
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006579 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006580 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006582 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006583 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006584}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006585
6586void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006587 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006588 const InputInfoList &Inputs,
6589 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006590 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006591 const toolchains::FreeBSD& ToolChain =
6592 static_cast<const toolchains::FreeBSD&>(getToolChain());
6593 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006594 const bool IsPIE =
6595 !Args.hasArg(options::OPT_shared) &&
6596 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006597 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006598
6599 // Silence warning for "clang -g foo.o -o foo"
6600 Args.ClaimAllArgs(options::OPT_g_Group);
6601 // and "clang -emit-llvm foo.o -o foo"
6602 Args.ClaimAllArgs(options::OPT_emit_llvm);
6603 // and for "clang -w foo.o -o foo". Other warning options are already
6604 // handled somewhere else.
6605 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006606
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006607 if (!D.SysRoot.empty())
6608 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6609
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006610 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006611 CmdArgs.push_back("-pie");
6612
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006613 if (Args.hasArg(options::OPT_static)) {
6614 CmdArgs.push_back("-Bstatic");
6615 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006616 if (Args.hasArg(options::OPT_rdynamic))
6617 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006618 CmdArgs.push_back("--eh-frame-hdr");
6619 if (Args.hasArg(options::OPT_shared)) {
6620 CmdArgs.push_back("-Bshareable");
6621 } else {
6622 CmdArgs.push_back("-dynamic-linker");
6623 CmdArgs.push_back("/libexec/ld-elf.so.1");
6624 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006625 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6626 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006627 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6628 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6629 CmdArgs.push_back("--hash-style=both");
6630 }
6631 }
6632 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006633 }
6634
6635 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6636 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006637 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006638 CmdArgs.push_back("-m");
6639 CmdArgs.push_back("elf_i386_fbsd");
6640 }
6641
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006642 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006643 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006644 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006645 }
6646
Daniel Dunbarb440f562010-08-02 02:38:21 +00006647 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006648 CmdArgs.push_back("-o");
6649 CmdArgs.push_back(Output.getFilename());
6650 } else {
6651 assert(Output.isNothing() && "Invalid output.");
6652 }
6653
6654 if (!Args.hasArg(options::OPT_nostdlib) &&
6655 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006656 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006657 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006658 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006659 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006660 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006661 crt1 = "Scrt1.o";
6662 else
6663 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006664 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006665 if (crt1)
6666 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6667
6668 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6669
Craig Topper92fc2df2014-05-17 16:56:41 +00006670 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006671 if (Args.hasArg(options::OPT_static))
6672 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006673 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006674 crtbegin = "crtbeginS.o";
6675 else
6676 crtbegin = "crtbegin.o";
6677
6678 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006679 }
6680
6681 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006682 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006683 for (const auto &Path : Paths)
6684 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006685 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6686 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006687 Args.AddAllArgs(CmdArgs, options::OPT_s);
6688 Args.AddAllArgs(CmdArgs, options::OPT_t);
6689 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6690 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006691
Alp Tokerce365ca2013-12-02 12:43:03 +00006692 if (D.IsUsingLTO(Args))
6693 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006694
Roman Divackyafe2f232012-08-28 15:09:03 +00006695 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006696
6697 if (!Args.hasArg(options::OPT_nostdlib) &&
6698 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006699 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006700 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006701 if (Args.hasArg(options::OPT_pg))
6702 CmdArgs.push_back("-lm_p");
6703 else
6704 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006705 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006706 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6707 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006708 if (Args.hasArg(options::OPT_pg))
6709 CmdArgs.push_back("-lgcc_p");
6710 else
6711 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006712 if (Args.hasArg(options::OPT_static)) {
6713 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006714 } else if (Args.hasArg(options::OPT_pg)) {
6715 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006716 } else {
6717 CmdArgs.push_back("--as-needed");
6718 CmdArgs.push_back("-lgcc_s");
6719 CmdArgs.push_back("--no-as-needed");
6720 }
6721
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006722 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006723 if (Args.hasArg(options::OPT_pg))
6724 CmdArgs.push_back("-lpthread_p");
6725 else
6726 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006727 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006728
Roman Divacky66f22762011-02-10 16:59:40 +00006729 if (Args.hasArg(options::OPT_pg)) {
6730 if (Args.hasArg(options::OPT_shared))
6731 CmdArgs.push_back("-lc");
6732 else
6733 CmdArgs.push_back("-lc_p");
6734 CmdArgs.push_back("-lgcc_p");
6735 } else {
6736 CmdArgs.push_back("-lc");
6737 CmdArgs.push_back("-lgcc");
6738 }
6739
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006740 if (Args.hasArg(options::OPT_static)) {
6741 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006742 } else if (Args.hasArg(options::OPT_pg)) {
6743 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006744 } else {
6745 CmdArgs.push_back("--as-needed");
6746 CmdArgs.push_back("-lgcc_s");
6747 CmdArgs.push_back("--no-as-needed");
6748 }
6749 }
6750
6751 if (!Args.hasArg(options::OPT_nostdlib) &&
6752 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006753 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006754 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006755 else
6756 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006757 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006758 }
6759
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006760 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6761
Alexey Samsonov7811d192014-02-20 13:57:37 +00006762 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006763
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006764 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006765 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006766 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006767}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006768
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006769void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6770 const InputInfo &Output,
6771 const InputInfoList &Inputs,
6772 const ArgList &Args,
6773 const char *LinkingOutput) const {
6774 ArgStringList CmdArgs;
6775
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006776 // GNU as needs different flags for creating the correct output format
6777 // on architectures with different ABIs or optional feature sets.
6778 switch (getToolChain().getArch()) {
6779 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006780 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006781 break;
6782 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006783 case llvm::Triple::armeb:
6784 case llvm::Triple::thumb:
6785 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006786 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006787 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006788 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006789 }
6790
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006791 case llvm::Triple::mips:
6792 case llvm::Triple::mipsel:
6793 case llvm::Triple::mips64:
6794 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006795 StringRef CPUName;
6796 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006797 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006798
6799 CmdArgs.push_back("-march");
6800 CmdArgs.push_back(CPUName.data());
6801
6802 CmdArgs.push_back("-mabi");
6803 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6804
6805 if (getToolChain().getArch() == llvm::Triple::mips ||
6806 getToolChain().getArch() == llvm::Triple::mips64)
6807 CmdArgs.push_back("-EB");
6808 else
6809 CmdArgs.push_back("-EL");
6810
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006811 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006812 break;
6813 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006814
6815 case llvm::Triple::sparc:
6816 CmdArgs.push_back("-32");
6817 addAssemblerKPIC(Args, CmdArgs);
6818 break;
6819
6820 case llvm::Triple::sparcv9:
6821 CmdArgs.push_back("-64");
6822 CmdArgs.push_back("-Av9");
6823 addAssemblerKPIC(Args, CmdArgs);
6824 break;
6825
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006826 default:
6827 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006828 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006829
6830 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6831 options::OPT_Xassembler);
6832
6833 CmdArgs.push_back("-o");
6834 CmdArgs.push_back(Output.getFilename());
6835
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006836 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006837 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006838
David Chisnallddbd68f2011-09-27 22:03:18 +00006839 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006840 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6841}
6842
6843void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6844 const InputInfo &Output,
6845 const InputInfoList &Inputs,
6846 const ArgList &Args,
6847 const char *LinkingOutput) const {
6848 const Driver &D = getToolChain().getDriver();
6849 ArgStringList CmdArgs;
6850
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006851 if (!D.SysRoot.empty())
6852 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6853
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006854 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006855 if (Args.hasArg(options::OPT_static)) {
6856 CmdArgs.push_back("-Bstatic");
6857 } else {
6858 if (Args.hasArg(options::OPT_rdynamic))
6859 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006860 if (Args.hasArg(options::OPT_shared)) {
6861 CmdArgs.push_back("-Bshareable");
6862 } else {
6863 CmdArgs.push_back("-dynamic-linker");
6864 CmdArgs.push_back("/libexec/ld.elf_so");
6865 }
6866 }
6867
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006868 // Many NetBSD architectures support more than one ABI.
6869 // Determine the correct emulation for ld.
6870 switch (getToolChain().getArch()) {
6871 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006872 CmdArgs.push_back("-m");
6873 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006874 break;
6875 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006876 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006877 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006878 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006879 CmdArgs.push_back("-m");
6880 switch (getToolChain().getTriple().getEnvironment()) {
6881 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006882 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006883 CmdArgs.push_back("armelf_nbsd_eabi");
6884 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006885 case llvm::Triple::EABIHF:
6886 case llvm::Triple::GNUEABIHF:
6887 CmdArgs.push_back("armelf_nbsd_eabihf");
6888 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006889 default:
6890 CmdArgs.push_back("armelf_nbsd");
6891 break;
6892 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006893 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006894 case llvm::Triple::mips64:
6895 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006896 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006897 CmdArgs.push_back("-m");
6898 if (getToolChain().getArch() == llvm::Triple::mips64)
6899 CmdArgs.push_back("elf32btsmip");
6900 else
6901 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006902 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006903 CmdArgs.push_back("-m");
6904 if (getToolChain().getArch() == llvm::Triple::mips64)
6905 CmdArgs.push_back("elf64btsmip");
6906 else
6907 CmdArgs.push_back("elf64ltsmip");
6908 }
6909 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006910
6911 case llvm::Triple::sparc:
6912 CmdArgs.push_back("-m");
6913 CmdArgs.push_back("elf32_sparc");
6914 break;
6915
6916 case llvm::Triple::sparcv9:
6917 CmdArgs.push_back("-m");
6918 CmdArgs.push_back("elf64_sparc");
6919 break;
6920
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006921 default:
6922 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006923 }
6924
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006925 if (Output.isFilename()) {
6926 CmdArgs.push_back("-o");
6927 CmdArgs.push_back(Output.getFilename());
6928 } else {
6929 assert(Output.isNothing() && "Invalid output.");
6930 }
6931
6932 if (!Args.hasArg(options::OPT_nostdlib) &&
6933 !Args.hasArg(options::OPT_nostartfiles)) {
6934 if (!Args.hasArg(options::OPT_shared)) {
6935 CmdArgs.push_back(Args.MakeArgString(
6936 getToolChain().GetFilePath("crt0.o")));
6937 CmdArgs.push_back(Args.MakeArgString(
6938 getToolChain().GetFilePath("crti.o")));
6939 CmdArgs.push_back(Args.MakeArgString(
6940 getToolChain().GetFilePath("crtbegin.o")));
6941 } else {
6942 CmdArgs.push_back(Args.MakeArgString(
6943 getToolChain().GetFilePath("crti.o")));
6944 CmdArgs.push_back(Args.MakeArgString(
6945 getToolChain().GetFilePath("crtbeginS.o")));
6946 }
6947 }
6948
6949 Args.AddAllArgs(CmdArgs, options::OPT_L);
6950 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6951 Args.AddAllArgs(CmdArgs, options::OPT_e);
6952 Args.AddAllArgs(CmdArgs, options::OPT_s);
6953 Args.AddAllArgs(CmdArgs, options::OPT_t);
6954 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6955 Args.AddAllArgs(CmdArgs, options::OPT_r);
6956
6957 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6958
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006959 unsigned Major, Minor, Micro;
6960 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6961 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006962 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006963 switch(getToolChain().getArch()) {
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006964 case llvm::Triple::arm:
6965 case llvm::Triple::armeb:
6966 case llvm::Triple::thumb:
6967 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006968 case llvm::Triple::ppc:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006969 case llvm::Triple::x86:
6970 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006971 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006972 break;
6973 default:
6974 break;
6975 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006976 }
6977
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006978 if (!Args.hasArg(options::OPT_nostdlib) &&
6979 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006980 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006981 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6982 CmdArgs.push_back("-lm");
6983 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006984 if (Args.hasArg(options::OPT_pthread))
6985 CmdArgs.push_back("-lpthread");
6986 CmdArgs.push_back("-lc");
6987
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006988 if (useLibgcc) {
6989 if (Args.hasArg(options::OPT_static)) {
6990 // libgcc_eh depends on libc, so resolve as much as possible,
6991 // pull in any new requirements from libc and then get the rest
6992 // of libgcc.
6993 CmdArgs.push_back("-lgcc_eh");
6994 CmdArgs.push_back("-lc");
6995 CmdArgs.push_back("-lgcc");
6996 } else {
6997 CmdArgs.push_back("-lgcc");
6998 CmdArgs.push_back("--as-needed");
6999 CmdArgs.push_back("-lgcc_s");
7000 CmdArgs.push_back("--no-as-needed");
7001 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007002 }
7003 }
7004
7005 if (!Args.hasArg(options::OPT_nostdlib) &&
7006 !Args.hasArg(options::OPT_nostartfiles)) {
7007 if (!Args.hasArg(options::OPT_shared))
7008 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7009 "crtend.o")));
7010 else
7011 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7012 "crtendS.o")));
7013 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7014 "crtn.o")));
7015 }
7016
Alexey Samsonov7811d192014-02-20 13:57:37 +00007017 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007018
Logan Chieneb9162f2014-06-26 14:23:45 +00007019 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007020 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7021}
7022
Thomas Schwinge4e555262013-03-28 19:04:25 +00007023void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7024 const InputInfo &Output,
7025 const InputInfoList &Inputs,
7026 const ArgList &Args,
7027 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00007028 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007029 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007030
7031 // Add --32/--64 to make sure we get the format we want.
7032 // This is incomplete
7033 if (getToolChain().getArch() == llvm::Triple::x86) {
7034 CmdArgs.push_back("--32");
7035 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007036 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7037 CmdArgs.push_back("--x32");
7038 else
7039 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007040 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7041 CmdArgs.push_back("-a32");
7042 CmdArgs.push_back("-mppc");
7043 CmdArgs.push_back("-many");
7044 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7045 CmdArgs.push_back("-a64");
7046 CmdArgs.push_back("-mppc64");
7047 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007048 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7049 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007050 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007051 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007052 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007053 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7054 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007055 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007056 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007057 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7058 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007059 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007060 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007061 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7062 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007063 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007064 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7065 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007066 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7067 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007068 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007069
Tim Northover9c7e0352013-12-12 11:55:52 +00007070 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7071 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007072 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007073
7074 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007075
7076 // FIXME: remove krait check when GNU tools support krait cpu
7077 // for now replace it with -march=armv7-a to avoid a lower
7078 // march from being picked in the absence of a cpu flag.
7079 Arg *A;
7080 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7081 StringRef(A->getValue()) == "krait")
7082 CmdArgs.push_back("-march=armv7-a");
7083 else
7084 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007085 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007086 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7087 getToolChain().getArch() == llvm::Triple::mipsel ||
7088 getToolChain().getArch() == llvm::Triple::mips64 ||
7089 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007090 StringRef CPUName;
7091 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007092 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007093 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007094
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007095 CmdArgs.push_back("-march");
7096 CmdArgs.push_back(CPUName.data());
7097
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007098 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007099 CmdArgs.push_back(ABIName.data());
7100
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007101 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7102 // or -mshared (not implemented) is in effect.
7103 bool IsPicOrPie = false;
7104 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7105 options::OPT_fpic, options::OPT_fno_pic,
7106 options::OPT_fPIE, options::OPT_fno_PIE,
7107 options::OPT_fpie, options::OPT_fno_pie)) {
7108 if (A->getOption().matches(options::OPT_fPIC) ||
7109 A->getOption().matches(options::OPT_fpic) ||
7110 A->getOption().matches(options::OPT_fPIE) ||
7111 A->getOption().matches(options::OPT_fpie))
7112 IsPicOrPie = true;
7113 }
7114 if (!IsPicOrPie)
7115 CmdArgs.push_back("-mno-shared");
7116
Daniel Sanders379d44b2014-07-16 11:52:23 +00007117 // LLVM doesn't support -mplt yet and acts as if it is always given.
7118 // However, -mplt has no effect with the N64 ABI.
7119 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007120
7121 if (getToolChain().getArch() == llvm::Triple::mips ||
7122 getToolChain().getArch() == llvm::Triple::mips64)
7123 CmdArgs.push_back("-EB");
7124 else
7125 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007126
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007127 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7128 if (StringRef(A->getValue()) == "2008")
7129 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7130 }
7131
Daniel Sanders379d44b2014-07-16 11:52:23 +00007132 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7133 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7134 options::OPT_mfp64)) {
7135 A->claim();
7136 A->render(Args, CmdArgs);
7137 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7138 ABIName))
7139 CmdArgs.push_back("-mfpxx");
7140
7141 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7142 // -mno-mips16 is actually -no-mips16.
7143 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7144 options::OPT_mno_mips16)) {
7145 if (A->getOption().matches(options::OPT_mips16)) {
7146 A->claim();
7147 A->render(Args, CmdArgs);
7148 } else {
7149 A->claim();
7150 CmdArgs.push_back("-no-mips16");
7151 }
7152 }
7153
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007154 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7155 options::OPT_mno_micromips);
7156 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7157 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7158
Simon Atanasyanbd986632013-11-26 11:58:04 +00007159 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7160 // Do not use AddLastArg because not all versions of MIPS assembler
7161 // support -mmsa / -mno-msa options.
7162 if (A->getOption().matches(options::OPT_mmsa))
7163 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7164 }
7165
Daniel Sanders379d44b2014-07-16 11:52:23 +00007166 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7167 options::OPT_msoft_float);
7168
7169 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7170 options::OPT_mno_odd_spreg);
7171
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007172 NeedsKPIC = true;
7173 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7174 // Always pass an -march option, since our default of z10 is later
7175 // than the GNU assembler's default.
7176 StringRef CPUName = getSystemZTargetCPU(Args);
7177 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7178 }
7179
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007180 if (NeedsKPIC)
7181 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007182
7183 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7184 options::OPT_Xassembler);
7185
7186 CmdArgs.push_back("-o");
7187 CmdArgs.push_back(Output.getFilename());
7188
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007189 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007190 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007191
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007192 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Rafael Espindola92b00932010-08-10 00:25:48 +00007193 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007194
7195 // Handle the debug info splitting at object creation time if we're
7196 // creating an object.
7197 // TODO: Currently only works on linux with newer objcopy.
7198 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007199 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007200 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7201 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007202}
7203
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007204static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007205 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007206 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007207 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7208 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007209 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007210 CmdArgs.push_back("-lgcc");
7211
Logan Chien3d3373c2012-11-19 12:04:11 +00007212 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007213 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007214 CmdArgs.push_back("-lgcc");
7215 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007216 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007217 CmdArgs.push_back("--as-needed");
7218 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007219 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007220 CmdArgs.push_back("--no-as-needed");
7221 }
7222
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007223 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007224 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007225 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007226 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007227
7228 // According to Android ABI, we have to link with libdl if we are
7229 // linking with non-static libgcc.
7230 //
7231 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7232 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7233 if (isAndroid && !StaticLibgcc)
7234 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007235}
7236
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007237static std::string getLinuxDynamicLinker(const ArgList &Args,
7238 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007239 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7240 if (ToolChain.getTriple().isArch64Bit())
7241 return "/system/bin/linker64";
7242 else
7243 return "/system/bin/linker";
7244 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7245 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007246 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007247 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007248 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007249 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007250 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007251 else if (ToolChain.getArch() == llvm::Triple::arm ||
7252 ToolChain.getArch() == llvm::Triple::thumb) {
7253 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7254 return "/lib/ld-linux-armhf.so.3";
7255 else
7256 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007257 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7258 ToolChain.getArch() == llvm::Triple::thumbeb) {
7259 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7260 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7261 else
7262 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007263 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007264 ToolChain.getArch() == llvm::Triple::mipsel ||
7265 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007266 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007267 StringRef CPUName;
7268 StringRef ABIName;
7269 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7270 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7271
7272 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7273 .Case("o32", "/lib")
7274 .Case("n32", "/lib32")
7275 .Case("n64", "/lib64")
7276 .Default("/lib");
7277 StringRef LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
7278
7279 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007280 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7281 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007282 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7283 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7284 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007285 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007286 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7287 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7288 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007289 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007290 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7291 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007292 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7293 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007294 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7295 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7296 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007297 else
7298 return "/lib64/ld-linux-x86-64.so.2";
7299}
7300
Renato Golinc4b49242014-02-13 10:01:16 +00007301static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7302 ArgStringList &CmdArgs, const ArgList &Args) {
7303 // Make use of compiler-rt if --rtlib option is used
7304 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7305
7306 switch(RLT) {
7307 case ToolChain::RLT_CompilerRT:
7308 addClangRTLinux(TC, Args, CmdArgs);
7309 break;
7310 case ToolChain::RLT_Libgcc:
7311 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7312 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007313 }
7314}
7315
Thomas Schwinge4e555262013-03-28 19:04:25 +00007316void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7317 const InputInfo &Output,
7318 const InputInfoList &Inputs,
7319 const ArgList &Args,
7320 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007321 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007322 static_cast<const toolchains::Linux&>(getToolChain());
7323 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007324 const bool isAndroid =
7325 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007326 const bool IsPIE =
7327 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007328 !Args.hasArg(options::OPT_static) &&
7329 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7330 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007331 // Cannot use isPIEDefault here since otherwise
7332 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007333 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007334
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007335 ArgStringList CmdArgs;
7336
Rafael Espindolad1002f62010-11-15 18:28:16 +00007337 // Silence warning for "clang -g foo.o -o foo"
7338 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007339 // and "clang -emit-llvm foo.o -o foo"
7340 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007341 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007342 // handled somewhere else.
7343 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007344
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007345 if (!D.SysRoot.empty())
7346 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007347
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007348 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007349 CmdArgs.push_back("-pie");
7350
Rafael Espindola1c76c592010-11-07 22:57:16 +00007351 if (Args.hasArg(options::OPT_rdynamic))
7352 CmdArgs.push_back("-export-dynamic");
7353
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007354 if (Args.hasArg(options::OPT_s))
7355 CmdArgs.push_back("-s");
7356
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007357 for (const auto &Opt : ToolChain.ExtraOpts)
7358 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007359
7360 if (!Args.hasArg(options::OPT_static)) {
7361 CmdArgs.push_back("--eh-frame-hdr");
7362 }
7363
7364 CmdArgs.push_back("-m");
7365 if (ToolChain.getArch() == llvm::Triple::x86)
7366 CmdArgs.push_back("elf_i386");
Tim Northover40956e62014-07-23 12:32:58 +00007367 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Tim Northover9bb857a2013-01-31 12:13:10 +00007368 CmdArgs.push_back("aarch64linux");
Tim Northover40956e62014-07-23 12:32:58 +00007369 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007370 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00007371 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00007372 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007373 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007374 else if (ToolChain.getArch() == llvm::Triple::armeb
7375 || ToolChain.getArch() == llvm::Triple::thumbeb)
7376 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00007377 else if (ToolChain.getArch() == llvm::Triple::ppc)
7378 CmdArgs.push_back("elf32ppclinux");
7379 else if (ToolChain.getArch() == llvm::Triple::ppc64)
7380 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007381 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7382 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00007383 else if (ToolChain.getArch() == llvm::Triple::sparc)
7384 CmdArgs.push_back("elf32_sparc");
7385 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7386 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00007387 else if (ToolChain.getArch() == llvm::Triple::mips)
7388 CmdArgs.push_back("elf32btsmip");
7389 else if (ToolChain.getArch() == llvm::Triple::mipsel)
7390 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007391 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007392 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007393 CmdArgs.push_back("elf32btsmipn32");
7394 else
7395 CmdArgs.push_back("elf64btsmip");
7396 }
7397 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007398 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007399 CmdArgs.push_back("elf32ltsmipn32");
7400 else
7401 CmdArgs.push_back("elf64ltsmip");
7402 }
Ulrich Weigand47445072013-05-06 16:26:41 +00007403 else if (ToolChain.getArch() == llvm::Triple::systemz)
7404 CmdArgs.push_back("elf64_s390");
Zinovy Nis1db95732014-07-10 15:27:19 +00007405 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7406 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7407 CmdArgs.push_back("elf32_x86_64");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007408 else
7409 CmdArgs.push_back("elf_x86_64");
7410
7411 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007412 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007413 ToolChain.getArch() == llvm::Triple::armeb ||
7414 ToolChain.getArch() == llvm::Triple::thumb ||
7415 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007416 CmdArgs.push_back("-Bstatic");
7417 else
7418 CmdArgs.push_back("-static");
7419 } else if (Args.hasArg(options::OPT_shared)) {
7420 CmdArgs.push_back("-shared");
7421 }
7422
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007423 if (ToolChain.getArch() == llvm::Triple::arm ||
7424 ToolChain.getArch() == llvm::Triple::armeb ||
7425 ToolChain.getArch() == llvm::Triple::thumb ||
7426 ToolChain.getArch() == llvm::Triple::thumbeb ||
7427 (!Args.hasArg(options::OPT_static) &&
7428 !Args.hasArg(options::OPT_shared))) {
7429 CmdArgs.push_back("-dynamic-linker");
7430 CmdArgs.push_back(Args.MakeArgString(
7431 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7432 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007433
7434 CmdArgs.push_back("-o");
7435 CmdArgs.push_back(Output.getFilename());
7436
Rafael Espindola81937ec2010-12-01 01:52:43 +00007437 if (!Args.hasArg(options::OPT_nostdlib) &&
7438 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007439 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007440 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007441 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007442 if (Args.hasArg(options::OPT_pg))
7443 crt1 = "gcrt1.o";
7444 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007445 crt1 = "Scrt1.o";
7446 else
7447 crt1 = "crt1.o";
7448 }
7449 if (crt1)
7450 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007451
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007452 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7453 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007454
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007455 const char *crtbegin;
7456 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007457 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007458 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007459 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007460 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007461 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007462 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007463 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007464 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007465
7466 // Add crtfastmath.o if available and fast math is enabled.
7467 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007468 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007469
7470 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007471 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007472
7473 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7474
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007475 for (const auto &Path : Paths)
7476 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007477
Alp Tokerce365ca2013-12-02 12:43:03 +00007478 if (D.IsUsingLTO(Args))
7479 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007480
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007481 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7482 CmdArgs.push_back("--no-demangle");
7483
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007484 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7485
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007486 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007487 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007488 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007489
Hans Wennborg70850d82013-07-18 20:29:38 +00007490 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007491 !Args.hasArg(options::OPT_nostdlib) &&
7492 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007493 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7494 !Args.hasArg(options::OPT_static);
7495 if (OnlyLibstdcxxStatic)
7496 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007497 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007498 if (OnlyLibstdcxxStatic)
7499 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007500 CmdArgs.push_back("-lm");
7501 }
7502
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007503 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007504 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7505 if (Args.hasArg(options::OPT_static))
7506 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007507
Alexey Bataev186b28a2014-03-06 05:43:53 +00007508 LibOpenMP UsedOpenMPLib = LibUnknown;
7509 if (Args.hasArg(options::OPT_fopenmp)) {
7510 UsedOpenMPLib = LibGOMP;
7511 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7512 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7513 .Case("libgomp", LibGOMP)
7514 .Case("libiomp5", LibIOMP5)
7515 .Default(LibUnknown);
7516 if (UsedOpenMPLib == LibUnknown)
7517 D.Diag(diag::err_drv_unsupported_option_argument)
7518 << A->getOption().getName() << A->getValue();
7519 }
7520 switch (UsedOpenMPLib) {
7521 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007522 CmdArgs.push_back("-lgomp");
7523
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007524 // FIXME: Exclude this for platforms with libgomp that don't require
7525 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007526 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007527 break;
7528 case LibIOMP5:
7529 CmdArgs.push_back("-liomp5");
7530 break;
7531 case LibUnknown:
7532 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007533 }
Renato Golinc4b49242014-02-13 10:01:16 +00007534 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007535
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007536 if ((Args.hasArg(options::OPT_pthread) ||
7537 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7538 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007539 CmdArgs.push_back("-lpthread");
7540
7541 CmdArgs.push_back("-lc");
7542
7543 if (Args.hasArg(options::OPT_static))
7544 CmdArgs.push_back("--end-group");
7545 else
Renato Golinc4b49242014-02-13 10:01:16 +00007546 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007547 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007548
Rafael Espindola81937ec2010-12-01 01:52:43 +00007549 if (!Args.hasArg(options::OPT_nostartfiles)) {
7550 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007551 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007552 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007553 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007554 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007555 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007556 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007557
Rafael Espindola81937ec2010-12-01 01:52:43 +00007558 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007559 if (!isAndroid)
7560 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007561 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007562 }
7563
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007564 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007565}
7566
Chris Lattner3e2ee142010-07-07 16:01:42 +00007567void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007568 const InputInfo &Output,
7569 const InputInfoList &Inputs,
7570 const ArgList &Args,
7571 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007572 ArgStringList CmdArgs;
7573
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007574 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007575
7576 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007577 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007578
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007579 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007580 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007582 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007583 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007584}
7585
7586void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007587 const InputInfo &Output,
7588 const InputInfoList &Inputs,
7589 const ArgList &Args,
7590 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007591 const Driver &D = getToolChain().getDriver();
7592 ArgStringList CmdArgs;
7593
Daniel Dunbarb440f562010-08-02 02:38:21 +00007594 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007595 CmdArgs.push_back("-o");
7596 CmdArgs.push_back(Output.getFilename());
7597 } else {
7598 assert(Output.isNothing() && "Invalid output.");
7599 }
7600
7601 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007602 !Args.hasArg(options::OPT_nostartfiles)) {
7603 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7604 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7605 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7606 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7607 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007608
7609 Args.AddAllArgs(CmdArgs, options::OPT_L);
7610 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7611 Args.AddAllArgs(CmdArgs, options::OPT_e);
7612
Daniel Dunbar54423b22010-09-17 00:24:54 +00007613 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007614
Alexey Samsonov7811d192014-02-20 13:57:37 +00007615 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007616
Chris Lattner3e2ee142010-07-07 16:01:42 +00007617 if (!Args.hasArg(options::OPT_nostdlib) &&
7618 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007619 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007620 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007621 CmdArgs.push_back("-lm");
7622 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007623 }
7624
7625 if (!Args.hasArg(options::OPT_nostdlib) &&
7626 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007627 if (Args.hasArg(options::OPT_pthread))
7628 CmdArgs.push_back("-lpthread");
7629 CmdArgs.push_back("-lc");
7630 CmdArgs.push_back("-lCompilerRT-Generic");
7631 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7632 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007633 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007634 }
7635
Logan Chieneb9162f2014-06-26 14:23:45 +00007636 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007637 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007638}
7639
Daniel Dunbarcc912342009-05-02 18:28:39 +00007640/// DragonFly Tools
7641
7642// For now, DragonFly Assemble does just about the same as for
7643// FreeBSD, but this may change soon.
7644void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007645 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007646 const InputInfoList &Inputs,
7647 const ArgList &Args,
7648 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007649 ArgStringList CmdArgs;
7650
7651 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7652 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007653 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007654 CmdArgs.push_back("--32");
7655
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007656 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007657
7658 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007659 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007660
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007661 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007662 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007663
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007664 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007665 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007666}
7667
7668void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007669 const InputInfo &Output,
7670 const InputInfoList &Inputs,
7671 const ArgList &Args,
7672 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007673 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007674 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007675 ArgStringList CmdArgs;
7676
John McCall65b8da02013-04-11 22:55:55 +00007677 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7678 UseGCC47 = false;
7679
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007680 if (!D.SysRoot.empty())
7681 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7682
John McCall65b8da02013-04-11 22:55:55 +00007683 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007684 if (Args.hasArg(options::OPT_static)) {
7685 CmdArgs.push_back("-Bstatic");
7686 } else {
John McCall65b8da02013-04-11 22:55:55 +00007687 if (Args.hasArg(options::OPT_rdynamic))
7688 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007689 if (Args.hasArg(options::OPT_shared))
7690 CmdArgs.push_back("-Bshareable");
7691 else {
7692 CmdArgs.push_back("-dynamic-linker");
7693 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7694 }
John McCall65b8da02013-04-11 22:55:55 +00007695 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007696 }
7697
7698 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7699 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007700 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007701 CmdArgs.push_back("-m");
7702 CmdArgs.push_back("elf_i386");
7703 }
7704
Daniel Dunbarb440f562010-08-02 02:38:21 +00007705 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007706 CmdArgs.push_back("-o");
7707 CmdArgs.push_back(Output.getFilename());
7708 } else {
7709 assert(Output.isNothing() && "Invalid output.");
7710 }
7711
7712 if (!Args.hasArg(options::OPT_nostdlib) &&
7713 !Args.hasArg(options::OPT_nostartfiles)) {
7714 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007715 if (Args.hasArg(options::OPT_pg))
7716 CmdArgs.push_back(Args.MakeArgString(
7717 getToolChain().GetFilePath("gcrt1.o")));
7718 else {
7719 if (Args.hasArg(options::OPT_pie))
7720 CmdArgs.push_back(Args.MakeArgString(
7721 getToolChain().GetFilePath("Scrt1.o")));
7722 else
7723 CmdArgs.push_back(Args.MakeArgString(
7724 getToolChain().GetFilePath("crt1.o")));
7725 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007726 }
John McCall65b8da02013-04-11 22:55:55 +00007727 CmdArgs.push_back(Args.MakeArgString(
7728 getToolChain().GetFilePath("crti.o")));
7729 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7730 CmdArgs.push_back(Args.MakeArgString(
7731 getToolChain().GetFilePath("crtbeginS.o")));
7732 else
7733 CmdArgs.push_back(Args.MakeArgString(
7734 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007735 }
7736
7737 Args.AddAllArgs(CmdArgs, options::OPT_L);
7738 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7739 Args.AddAllArgs(CmdArgs, options::OPT_e);
7740
Daniel Dunbar54423b22010-09-17 00:24:54 +00007741 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007742
7743 if (!Args.hasArg(options::OPT_nostdlib) &&
7744 !Args.hasArg(options::OPT_nodefaultlibs)) {
7745 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7746 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007747 if (UseGCC47)
7748 CmdArgs.push_back("-L/usr/lib/gcc47");
7749 else
7750 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007751
7752 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007753 if (UseGCC47) {
7754 CmdArgs.push_back("-rpath");
7755 CmdArgs.push_back("/usr/lib/gcc47");
7756 } else {
7757 CmdArgs.push_back("-rpath");
7758 CmdArgs.push_back("/usr/lib/gcc44");
7759 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007760 }
7761
Hans Wennborg70850d82013-07-18 20:29:38 +00007762 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007763 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007764 CmdArgs.push_back("-lm");
7765 }
7766
Daniel Dunbarcc912342009-05-02 18:28:39 +00007767 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007768 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007769
7770 if (!Args.hasArg(options::OPT_nolibc)) {
7771 CmdArgs.push_back("-lc");
7772 }
7773
John McCall65b8da02013-04-11 22:55:55 +00007774 if (UseGCC47) {
7775 if (Args.hasArg(options::OPT_static) ||
7776 Args.hasArg(options::OPT_static_libgcc)) {
7777 CmdArgs.push_back("-lgcc");
7778 CmdArgs.push_back("-lgcc_eh");
7779 } else {
7780 if (Args.hasArg(options::OPT_shared_libgcc)) {
7781 CmdArgs.push_back("-lgcc_pic");
7782 if (!Args.hasArg(options::OPT_shared))
7783 CmdArgs.push_back("-lgcc");
7784 } else {
7785 CmdArgs.push_back("-lgcc");
7786 CmdArgs.push_back("--as-needed");
7787 CmdArgs.push_back("-lgcc_pic");
7788 CmdArgs.push_back("--no-as-needed");
7789 }
7790 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007791 } else {
John McCall65b8da02013-04-11 22:55:55 +00007792 if (Args.hasArg(options::OPT_shared)) {
7793 CmdArgs.push_back("-lgcc_pic");
7794 } else {
7795 CmdArgs.push_back("-lgcc");
7796 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007797 }
7798 }
7799
7800 if (!Args.hasArg(options::OPT_nostdlib) &&
7801 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007802 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007803 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007804 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007805 else
7806 CmdArgs.push_back(Args.MakeArgString(
7807 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007808 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007809 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007810 }
7811
Alexey Samsonov7811d192014-02-20 13:57:37 +00007812 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007813
Logan Chieneb9162f2014-06-26 14:23:45 +00007814 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007815 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007816}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007817
Alexey Samsonov6424e022014-05-12 20:20:20 +00007818static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7819 ArgStringList &CmdArgs,
7820 const StringRef RTName) {
7821 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7822 llvm::sys::path::append(LibSanitizer,
7823 Twine("clang_rt.") + RTName + ".lib");
7824 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7825}
7826
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007827void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7828 const InputInfo &Output,
7829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007832 ArgStringList CmdArgs;
7833
7834 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007835 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7836 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007837 } else {
7838 assert(Output.isNothing() && "Invalid output.");
7839 }
7840
7841 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007842 !Args.hasArg(options::OPT_nostartfiles) &&
7843 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007844 CmdArgs.push_back("-defaultlib:libcmt");
7845 }
7846
7847 CmdArgs.push_back("-nologo");
7848
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007849 if (Args.hasArg(options::OPT_g_Group)) {
7850 CmdArgs.push_back("-debug");
7851 }
7852
Hans Wennborgf1a74252013-09-10 20:18:04 +00007853 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7854
7855 if (DLL) {
7856 CmdArgs.push_back(Args.MakeArgString("-dll"));
7857
7858 SmallString<128> ImplibName(Output.getFilename());
7859 llvm::sys::path::replace_extension(ImplibName, "lib");
7860 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7861 ImplibName.str()));
7862 }
7863
Peter Collingbourne32701642013-11-01 18:16:25 +00007864 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007865 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007866 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007867 // FIXME: Handle 64-bit.
Alexey Samsonov6424e022014-05-12 20:20:20 +00007868 if (DLL) {
7869 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7870 "asan_dll_thunk-i386");
7871 } else {
7872 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7873 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7874 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007875 }
7876
Michael J. Spencere2f49362012-06-18 16:56:04 +00007877 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007878 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007879
7880 // Add filenames immediately.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007881 for (const auto &Input : Inputs)
7882 if (Input.isFilename())
7883 CmdArgs.push_back(Input.getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007884 else
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007885 Input.getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007886
7887 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007888 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007889 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7890}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007891
7892void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7893 const InputInfo &Output,
7894 const InputInfoList &Inputs,
7895 const ArgList &Args,
7896 const char *LinkingOutput) const {
7897 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7898}
7899
Hans Wennborg188382e2013-09-20 18:16:35 +00007900// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7901// If one cannot be found, return FallbackName.
7902// We do this special search to prevent clang-cl from falling back onto itself
7903// if it's available as cl.exe on the path.
7904static std::string FindFallback(const char *FallbackName,
7905 const char *ClangProgramPath) {
7906 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7907 if (!OptPath.hasValue())
7908 return FallbackName;
7909
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007910 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Hans Wennborg188382e2013-09-20 18:16:35 +00007911 SmallVector<StringRef, 8> PathSegments;
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007912 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
Hans Wennborg188382e2013-09-20 18:16:35 +00007913
7914 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7915 const StringRef &PathSegment = PathSegments[i];
7916 if (PathSegment.empty())
7917 continue;
7918
7919 SmallString<128> FilePath(PathSegment);
7920 llvm::sys::path::append(FilePath, FallbackName);
7921 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7922 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7923 return FilePath.str();
7924 }
7925
7926 return FallbackName;
7927}
7928
Hans Wennborg87cfa712013-09-19 20:32:16 +00007929Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7930 const InputInfo &Output,
7931 const InputInfoList &Inputs,
7932 const ArgList &Args,
7933 const char *LinkingOutput) const {
7934 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007935 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007936 CmdArgs.push_back("/c"); // Compile only.
7937 CmdArgs.push_back("/W0"); // No warnings.
7938
7939 // The goal is to be able to invoke this tool correctly based on
7940 // any flag accepted by clang-cl.
7941
7942 // These are spelled the same way in clang and cl.exe,.
7943 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7944 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007945
7946 // Optimization level.
7947 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7948 if (A->getOption().getID() == options::OPT_O0) {
7949 CmdArgs.push_back("/Od");
7950 } else {
7951 StringRef OptLevel = A->getValue();
7952 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7953 A->render(Args, CmdArgs);
7954 else if (OptLevel == "3")
7955 CmdArgs.push_back("/Ox");
7956 }
7957 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007958
7959 // Flags for which clang-cl have an alias.
7960 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7961
David Majnemerf6072342014-07-01 22:24:56 +00007962 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7963 /*default=*/false))
7964 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007965 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7966 options::OPT_fno_function_sections))
7967 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7968 ? "/Gy"
7969 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007970 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7971 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007972 CmdArgs.push_back(
7973 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007974 if (Args.hasArg(options::OPT_fsyntax_only))
7975 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007976 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7977 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007978
Hans Wennborg260ff402013-09-27 17:54:18 +00007979 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007980 for (const auto &Include : Includes)
7981 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00007982
Hans Wennborg87cfa712013-09-19 20:32:16 +00007983 // Flags that can simply be passed through.
7984 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7985 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00007986 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007987
7988 // The order of these flags is relevant, so pick the last one.
7989 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7990 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7991 A->render(Args, CmdArgs);
7992
7993
7994 // Input filename.
7995 assert(Inputs.size() == 1);
7996 const InputInfo &II = Inputs[0];
7997 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7998 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7999 if (II.isFilename())
8000 CmdArgs.push_back(II.getFilename());
8001 else
8002 II.getInputArg().renderAsInput(Args, CmdArgs);
8003
8004 // Output filename.
8005 assert(Output.getType() == types::TY_Object);
8006 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8007 Output.getFilename());
8008 CmdArgs.push_back(Fo);
8009
Hans Wennborg188382e2013-09-20 18:16:35 +00008010 const Driver &D = getToolChain().getDriver();
8011 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg188382e2013-09-20 18:16:35 +00008012 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008013}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008014
8015
8016/// XCore Tools
8017// We pass assemble and link construction to the xcc tool.
8018
8019void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8020 const InputInfo &Output,
8021 const InputInfoList &Inputs,
8022 const ArgList &Args,
8023 const char *LinkingOutput) const {
8024 ArgStringList CmdArgs;
8025
8026 CmdArgs.push_back("-o");
8027 CmdArgs.push_back(Output.getFilename());
8028
8029 CmdArgs.push_back("-c");
8030
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008031 if (Args.hasArg(options::OPT_v))
8032 CmdArgs.push_back("-v");
8033
Robert Lytton894d25c2014-05-02 09:33:25 +00008034 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8035 if (!A->getOption().matches(options::OPT_g0))
8036 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008037
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008038 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8039 false))
8040 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008041
8042 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8043 options::OPT_Xassembler);
8044
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008045 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008046 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008047
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008048 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008049 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
8050}
8051
8052void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8053 const InputInfo &Output,
8054 const InputInfoList &Inputs,
8055 const ArgList &Args,
8056 const char *LinkingOutput) const {
8057 ArgStringList CmdArgs;
8058
8059 if (Output.isFilename()) {
8060 CmdArgs.push_back("-o");
8061 CmdArgs.push_back(Output.getFilename());
8062 } else {
8063 assert(Output.isNothing() && "Invalid output.");
8064 }
8065
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008066 if (Args.hasArg(options::OPT_v))
8067 CmdArgs.push_back("-v");
8068
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008069 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
8070 if (EH.ShouldUseExceptionTables)
8071 CmdArgs.push_back("-fexceptions");
8072
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008073 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8074
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008075 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008076 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
8077}