blob: 860454a22b72195371f529dd507bb3e39c81b220 [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
Daniel Sandersfeb61302014-08-08 15:47:17 +00001043 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1044 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001045
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001046 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001047 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001048 // FIXME: Note, this is a hack. We need to pass the selected float
1049 // mode to the MipsTargetInfoBase to define appropriate macros there.
1050 // Now it is the only method.
1051 Features.push_back("+soft-float");
1052 }
1053
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001054 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001055 StringRef Val = StringRef(A->getValue());
1056 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001057 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001058 else if (Val == "legacy")
1059 Features.push_back("-nan2008");
1060 else
1061 D.Diag(diag::err_drv_unsupported_option_argument)
1062 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001063 }
1064
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001065 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1066 options::OPT_mdouble_float, "single-float");
1067 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1068 "mips16");
1069 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1070 options::OPT_mno_micromips, "micromips");
1071 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1072 "dsp");
1073 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1074 "dspr2");
1075 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1076 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001077
1078 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1079 // pass -mfpxx
1080 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1081 options::OPT_mfp64)) {
1082 if (A->getOption().matches(options::OPT_mfp32))
1083 Features.push_back(Args.MakeArgString("-fp64"));
1084 else if (A->getOption().matches(options::OPT_mfpxx)) {
1085 Features.push_back(Args.MakeArgString("+fpxx"));
1086 Features.push_back(Args.MakeArgString("+nooddspreg"));
1087 } else
1088 Features.push_back(Args.MakeArgString("+fp64"));
1089 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001090 Features.push_back(Args.MakeArgString("+fpxx"));
1091 Features.push_back(Args.MakeArgString("+nooddspreg"));
1092 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001093
Daniel Sanders28e5d392014-07-10 10:39:51 +00001094 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1095 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001096}
1097
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001098void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001099 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001100 const Driver &D = getToolChain().getDriver();
1101 StringRef CPUName;
1102 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001103 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001104 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001105
1106 CmdArgs.push_back("-target-abi");
1107 CmdArgs.push_back(ABIName.data());
1108
1109 StringRef FloatABI = getMipsFloatABI(D, Args);
1110
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001111 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001112 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001113 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001114 CmdArgs.push_back("-mfloat-abi");
1115 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001116 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001117 else {
1118 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001119 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001120 CmdArgs.push_back("-mfloat-abi");
1121 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001122 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001123
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001124 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1125 if (A->getOption().matches(options::OPT_mxgot)) {
1126 CmdArgs.push_back("-mllvm");
1127 CmdArgs.push_back("-mxgot");
1128 }
1129 }
1130
Simon Atanasyanc580b322013-05-11 06:33:44 +00001131 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1132 options::OPT_mno_ldc1_sdc1)) {
1133 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1134 CmdArgs.push_back("-mllvm");
1135 CmdArgs.push_back("-mno-ldc1-sdc1");
1136 }
1137 }
1138
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001139 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1140 options::OPT_mno_check_zero_division)) {
1141 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1142 CmdArgs.push_back("-mllvm");
1143 CmdArgs.push_back("-mno-check-zero-division");
1144 }
1145 }
1146
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001147 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001148 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001149 CmdArgs.push_back("-mllvm");
1150 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1151 A->claim();
1152 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001153}
1154
Hal Finkel8eb59282012-06-11 22:35:19 +00001155/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1156static std::string getPPCTargetCPU(const ArgList &Args) {
1157 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001158 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001159
1160 if (CPUName == "native") {
1161 std::string CPU = llvm::sys::getHostCPUName();
1162 if (!CPU.empty() && CPU != "generic")
1163 return CPU;
1164 else
1165 return "";
1166 }
1167
1168 return llvm::StringSwitch<const char *>(CPUName)
1169 .Case("common", "generic")
1170 .Case("440", "440")
1171 .Case("440fp", "440")
1172 .Case("450", "450")
1173 .Case("601", "601")
1174 .Case("602", "602")
1175 .Case("603", "603")
1176 .Case("603e", "603e")
1177 .Case("603ev", "603ev")
1178 .Case("604", "604")
1179 .Case("604e", "604e")
1180 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001181 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001182 .Case("G3", "g3")
1183 .Case("7400", "7400")
1184 .Case("G4", "g4")
1185 .Case("7450", "7450")
1186 .Case("G4+", "g4+")
1187 .Case("750", "750")
1188 .Case("970", "970")
1189 .Case("G5", "g5")
1190 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001191 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001192 .Case("e500mc", "e500mc")
1193 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001194 .Case("power3", "pwr3")
1195 .Case("power4", "pwr4")
1196 .Case("power5", "pwr5")
1197 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001198 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001201 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001202 .Case("pwr3", "pwr3")
1203 .Case("pwr4", "pwr4")
1204 .Case("pwr5", "pwr5")
1205 .Case("pwr5x", "pwr5x")
1206 .Case("pwr6", "pwr6")
1207 .Case("pwr6x", "pwr6x")
1208 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001209 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001210 .Case("powerpc", "ppc")
1211 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001212 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001213 .Default("");
1214 }
1215
1216 return "";
1217}
1218
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001219static void getPPCTargetFeatures(const ArgList &Args,
1220 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001221 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1222 ie = Args.filtered_end();
1223 it != ie; ++it) {
1224 StringRef Name = (*it)->getOption().getName();
1225 (*it)->claim();
1226
1227 // Skip over "-m".
1228 assert(Name.startswith("m") && "Invalid feature name.");
1229 Name = Name.substr(1);
1230
1231 bool IsNegative = Name.startswith("no-");
1232 if (IsNegative)
1233 Name = Name.substr(3);
1234
1235 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1236 // pass the correct option to the backend while calling the frontend
1237 // option the same.
1238 // TODO: Change the LLVM backend option maybe?
1239 if (Name == "mfcrf")
1240 Name = "mfocrf";
1241
1242 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1243 }
1244
1245 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001246 AddTargetFeature(Args, Features, options::OPT_faltivec,
1247 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001248}
1249
Ulrich Weigand8afad612014-07-28 13:17:52 +00001250void Clang::AddPPCTargetArgs(const ArgList &Args,
1251 ArgStringList &CmdArgs) const {
1252 // Select the ABI to use.
1253 const char *ABIName = nullptr;
1254 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1255 ABIName = A->getValue();
1256 } else if (getToolChain().getTriple().isOSLinux())
1257 switch(getToolChain().getArch()) {
1258 case llvm::Triple::ppc64:
1259 ABIName = "elfv1";
1260 break;
1261 case llvm::Triple::ppc64le:
1262 ABIName = "elfv2";
1263 break;
1264 default:
1265 break;
1266 }
1267
1268 if (ABIName) {
1269 CmdArgs.push_back("-target-abi");
1270 CmdArgs.push_back(ABIName);
1271 }
1272}
1273
1274bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1275 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1276 return A && (A->getValue() == StringRef(Value));
1277}
1278
Tom Stellard6674c702013-04-01 20:56:53 +00001279/// Get the (LLVM) name of the R600 gpu we are targeting.
1280static std::string getR600TargetGPU(const ArgList &Args) {
1281 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001282 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001283 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001284 .Cases("rv630", "rv635", "r600")
1285 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001286 .Case("rv740", "rv770")
1287 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001288 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001289 .Case("hemlock", "cypress")
1290 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001291 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001292 }
1293 return "";
1294}
1295
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296static void getSparcTargetFeatures(const ArgList &Args,
1297 std::vector<const char *> Features) {
1298 bool SoftFloatABI = true;
1299 if (Arg *A =
1300 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1301 if (A->getOption().matches(options::OPT_mhard_float))
1302 SoftFloatABI = false;
1303 }
1304 if (SoftFloatABI)
1305 Features.push_back("+soft-float");
1306}
1307
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001308void Clang::AddSparcTargetArgs(const ArgList &Args,
1309 ArgStringList &CmdArgs) const {
1310 const Driver &D = getToolChain().getDriver();
1311
Brad Smith10cd0f42014-07-11 20:12:08 +00001312 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001313 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001314 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1315 options::OPT_mhard_float)) {
1316 if (A->getOption().matches(options::OPT_msoft_float))
1317 FloatABI = "soft";
1318 else if (A->getOption().matches(options::OPT_mhard_float))
1319 FloatABI = "hard";
1320 }
1321
1322 // If unspecified, choose the default based on the platform.
1323 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001324 // Assume "soft", but warn the user we are guessing.
1325 FloatABI = "soft";
1326 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001327 }
1328
1329 if (FloatABI == "soft") {
1330 // Floating point operations and argument passing are soft.
1331 //
1332 // FIXME: This changes CPP defines, we need -target-soft-float.
1333 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001334 } else {
1335 assert(FloatABI == "hard" && "Invalid float abi!");
1336 CmdArgs.push_back("-mhard-float");
1337 }
1338}
1339
Richard Sandiford4652d892013-07-19 16:51:51 +00001340static const char *getSystemZTargetCPU(const ArgList &Args) {
1341 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1342 return A->getValue();
1343 return "z10";
1344}
1345
Chandler Carruth953fb082013-01-13 11:46:33 +00001346static const char *getX86TargetCPU(const ArgList &Args,
1347 const llvm::Triple &Triple) {
1348 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001349 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001350 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001351 return "core-avx2";
1352
Chandler Carruth953fb082013-01-13 11:46:33 +00001353 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001354 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001355
1356 // FIXME: Reject attempts to use -march=native unless the target matches
1357 // the host.
1358 //
1359 // FIXME: We should also incorporate the detected target features for use
1360 // with -native.
1361 std::string CPU = llvm::sys::getHostCPUName();
1362 if (!CPU.empty() && CPU != "generic")
1363 return Args.MakeArgString(CPU);
1364 }
1365
1366 // Select the default CPU if none was given (or detection failed).
1367
1368 if (Triple.getArch() != llvm::Triple::x86_64 &&
1369 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001370 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001371
1372 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1373
1374 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001375 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001376 if (Triple.getArchName() == "x86_64h")
1377 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001378 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001379 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001380
Alexey Bataev286d1b92014-01-31 04:07:13 +00001381 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001382 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001383 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001384
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001385 // Everything else goes to x86-64 in 64-bit mode.
1386 if (Is64Bit)
1387 return "x86-64";
1388
1389 switch (Triple.getOS()) {
1390 case llvm::Triple::FreeBSD:
1391 case llvm::Triple::NetBSD:
1392 case llvm::Triple::OpenBSD:
1393 return "i486";
1394 case llvm::Triple::Haiku:
1395 return "i586";
1396 case llvm::Triple::Bitrig:
1397 return "i686";
1398 default:
1399 // Fallback to p4.
1400 return "pentium4";
1401 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001402}
1403
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001404static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1405 switch(T.getArch()) {
1406 default:
1407 return "";
1408
Amara Emerson703da2e2013-10-31 09:32:33 +00001409 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001410 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001411 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001412
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001413 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001414 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001415 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001416 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001417 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001418
1419 case llvm::Triple::mips:
1420 case llvm::Triple::mipsel:
1421 case llvm::Triple::mips64:
1422 case llvm::Triple::mips64el: {
1423 StringRef CPUName;
1424 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001425 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001426 return CPUName;
1427 }
1428
1429 case llvm::Triple::ppc:
1430 case llvm::Triple::ppc64:
1431 case llvm::Triple::ppc64le: {
1432 std::string TargetCPUName = getPPCTargetCPU(Args);
1433 // LLVM may default to generating code for the native CPU,
1434 // but, like gcc, we default to a more generic option for
1435 // each architecture. (except on Darwin)
1436 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1437 if (T.getArch() == llvm::Triple::ppc64)
1438 TargetCPUName = "ppc64";
1439 else if (T.getArch() == llvm::Triple::ppc64le)
1440 TargetCPUName = "ppc64le";
1441 else
1442 TargetCPUName = "ppc";
1443 }
1444 return TargetCPUName;
1445 }
1446
1447 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001448 case llvm::Triple::sparcv9:
1449 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001450 return A->getValue();
1451 return "";
1452
1453 case llvm::Triple::x86:
1454 case llvm::Triple::x86_64:
1455 return getX86TargetCPU(Args, T);
1456
1457 case llvm::Triple::hexagon:
1458 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1459
1460 case llvm::Triple::systemz:
1461 return getSystemZTargetCPU(Args);
1462
1463 case llvm::Triple::r600:
1464 return getR600TargetGPU(Args);
1465 }
1466}
1467
Alp Tokerce365ca2013-12-02 12:43:03 +00001468static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1469 ArgStringList &CmdArgs) {
1470 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1471 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1472 // forward.
1473 CmdArgs.push_back("-plugin");
1474 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1475 CmdArgs.push_back(Args.MakeArgString(Plugin));
1476
1477 // Try to pass driver level flags relevant to LTO code generation down to
1478 // the plugin.
1479
1480 // Handle flags for selecting CPU variants.
1481 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1482 if (!CPU.empty())
1483 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1484}
1485
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001486static void getX86TargetFeatures(const Driver & D,
1487 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001488 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001489 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001490 if (Triple.getArchName() == "x86_64h") {
1491 // x86_64h implies quite a few of the more modern subtarget features
1492 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1493 Features.push_back("-rdrnd");
1494 Features.push_back("-aes");
1495 Features.push_back("-pclmul");
1496 Features.push_back("-rtm");
1497 Features.push_back("-hle");
1498 Features.push_back("-fsgsbase");
1499 }
1500
Alexey Volkov54ff0802014-06-25 12:15:36 +00001501 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001502 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001503 if (Triple.getArch() == llvm::Triple::x86_64) {
1504 Features.push_back("+sse4.2");
1505 Features.push_back("+popcnt");
1506 } else
1507 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001508 }
1509
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001510 // Set features according to the -arch flag on MSVC
1511 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1512 StringRef Arch = A->getValue();
1513 bool ArchUsed = false;
1514 // First, look for flags that are shared in x86 and x86-64.
1515 if (Triple.getArch() == llvm::Triple::x86_64 ||
1516 Triple.getArch() == llvm::Triple::x86) {
1517 if (Arch == "AVX" || Arch == "AVX2") {
1518 ArchUsed = true;
1519 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1520 }
1521 }
1522 // Then, look for x86-specific flags.
1523 if (Triple.getArch() == llvm::Triple::x86) {
1524 if (Arch == "IA32") {
1525 ArchUsed = true;
1526 } else if (Arch == "SSE" || Arch == "SSE2") {
1527 ArchUsed = true;
1528 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1529 }
1530 }
1531 if (!ArchUsed)
1532 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1533 }
1534
Jim Grosbach82eee262013-11-16 00:53:35 +00001535 // Now add any that the user explicitly requested on the command line,
1536 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001537 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1538 ie = Args.filtered_end();
1539 it != ie; ++it) {
1540 StringRef Name = (*it)->getOption().getName();
1541 (*it)->claim();
1542
1543 // Skip over "-m".
1544 assert(Name.startswith("m") && "Invalid feature name.");
1545 Name = Name.substr(1);
1546
1547 bool IsNegative = Name.startswith("no-");
1548 if (IsNegative)
1549 Name = Name.substr(3);
1550
1551 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1552 }
1553}
1554
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001555void Clang::AddX86TargetArgs(const ArgList &Args,
1556 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001557 if (!Args.hasFlag(options::OPT_mred_zone,
1558 options::OPT_mno_red_zone,
1559 true) ||
1560 Args.hasArg(options::OPT_mkernel) ||
1561 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001562 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001563
Bob Wilson2616e2e2013-02-10 16:01:41 +00001564 // Default to avoid implicit floating-point for kernel/kext code, but allow
1565 // that to be overridden with -mno-soft-float.
1566 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1567 Args.hasArg(options::OPT_fapple_kext));
1568 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1569 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001570 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001571 options::OPT_mno_implicit_float)) {
1572 const Option &O = A->getOption();
1573 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1574 O.matches(options::OPT_msoft_float));
1575 }
1576 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001577 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001578
1579 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1580 StringRef Value = A->getValue();
1581 if (Value == "intel" || Value == "att") {
1582 CmdArgs.push_back("-mllvm");
1583 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1584 } else {
1585 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1586 << A->getOption().getName() << Value;
1587 }
1588 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001589}
1590
Matthew Curtise8f80a12012-12-06 17:49:03 +00001591static inline bool HasPICArg(const ArgList &Args) {
1592 return Args.hasArg(options::OPT_fPIC)
1593 || Args.hasArg(options::OPT_fpic);
1594}
1595
1596static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1597 return Args.getLastArg(options::OPT_G,
1598 options::OPT_G_EQ,
1599 options::OPT_msmall_data_threshold_EQ);
1600}
1601
1602static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1603 std::string value;
1604 if (HasPICArg(Args))
1605 value = "0";
1606 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1607 value = A->getValue();
1608 A->claim();
1609 }
1610 return value;
1611}
1612
Tony Linthicum76329bf2011-12-12 21:14:55 +00001613void Clang::AddHexagonTargetArgs(const ArgList &Args,
1614 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001615 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001616 CmdArgs.push_back("-mqdsp6-compat");
1617 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001618
Matthew Curtise8f80a12012-12-06 17:49:03 +00001619 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1620 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001621 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001622 CmdArgs.push_back(Args.MakeArgString(
1623 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001624 }
1625
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001626 if (!Args.hasArg(options::OPT_fno_short_enums))
1627 CmdArgs.push_back("-fshort-enums");
1628 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1629 CmdArgs.push_back ("-mllvm");
1630 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1631 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001632 CmdArgs.push_back ("-mllvm");
1633 CmdArgs.push_back ("-machine-sink-split=0");
1634}
1635
Kevin Qin110db6f2014-07-18 07:03:22 +00001636// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
1637static bool DecodeAArch64Features(const Driver &D, const StringRef &text,
1638 std::vector<const char *> &Features) {
1639 SmallVector<StringRef, 8> Split;
1640 text.split(Split, StringRef("+"), -1, false);
1641
1642 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1643 const char *result = llvm::StringSwitch<const char *>(Split[I])
1644 .Case("fp", "+fp-armv8")
1645 .Case("simd", "+neon")
1646 .Case("crc", "+crc")
1647 .Case("crypto", "+crypto")
1648 .Case("nofp", "-fp-armv8")
1649 .Case("nosimd", "-neon")
1650 .Case("nocrc", "-crc")
1651 .Case("nocrypto", "-crypto")
1652 .Default(nullptr);
1653 if (result)
1654 Features.push_back(result);
1655 else if (Split[I] == "neon" || Split[I] == "noneon")
1656 D.Diag(diag::err_drv_no_neon_modifier);
1657 else
1658 return false;
1659 }
1660 return true;
1661}
1662
1663// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1664// decode CPU and feature.
1665static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1666 std::vector<const char *> &Features) {
1667 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1668 CPU = Split.first;
1669 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1670 Features.push_back("+neon");
1671 Features.push_back("+crc");
1672 Features.push_back("+crypto");
1673 } else if (CPU == "generic") {
1674 Features.push_back("+neon");
1675 } else {
1676 return false;
1677 }
1678
1679 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1680 return false;
1681
1682 return true;
1683}
1684
1685static bool
1686getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1687 const ArgList &Args,
1688 std::vector<const char *> &Features) {
1689 std::pair<StringRef, StringRef> Split = March.split("+");
1690 if (Split.first != "armv8-a")
1691 return false;
1692
1693 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1694 return false;
1695
1696 return true;
1697}
1698
1699static bool
1700getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1701 const ArgList &Args,
1702 std::vector<const char *> &Features) {
1703 StringRef CPU;
1704 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1705 return false;
1706
1707 return true;
1708}
1709
1710static bool
1711getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1712 const ArgList &Args,
1713 std::vector<const char *> &Features) {
1714 // Handle CPU name is 'native'.
1715 if (Mtune == "native")
1716 Mtune = llvm::sys::getHostCPUName();
1717 if (Mtune == "cyclone") {
1718 Features.push_back("+zcm");
1719 Features.push_back("+zcz");
1720 }
1721 return true;
1722}
1723
1724static bool
1725getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1726 const ArgList &Args,
1727 std::vector<const char *> &Features) {
1728 StringRef CPU;
1729 std::vector<const char *> DecodedFeature;
1730 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1731 return false;
1732
1733 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1734}
1735
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001736static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1737 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001738 Arg *A;
1739 bool success = true;
1740 // Enable NEON by default.
1741 Features.push_back("+neon");
1742 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1743 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1744 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1745 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1746
1747 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1748 success =
1749 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1750 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1751 success =
1752 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1753
1754 if (!success)
1755 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001756
1757 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1758 Features.push_back("-fp-armv8");
1759 Features.push_back("-crypto");
1760 Features.push_back("-neon");
1761 }
Bradley Smith418c5932014-05-02 15:17:51 +00001762
1763 // En/disable crc
1764 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1765 options::OPT_mnocrc)) {
1766 if (A->getOption().matches(options::OPT_mcrc))
1767 Features.push_back("+crc");
1768 else
1769 Features.push_back("-crc");
1770 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001771}
1772
1773static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001774 const ArgList &Args, ArgStringList &CmdArgs,
1775 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001776 std::vector<const char *> Features;
1777 switch (Triple.getArch()) {
1778 default:
1779 break;
1780 case llvm::Triple::mips:
1781 case llvm::Triple::mipsel:
1782 case llvm::Triple::mips64:
1783 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001784 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001785 break;
1786
1787 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001788 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001789 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001790 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001791 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001792 break;
1793
1794 case llvm::Triple::ppc:
1795 case llvm::Triple::ppc64:
1796 case llvm::Triple::ppc64le:
1797 getPPCTargetFeatures(Args, Features);
1798 break;
1799 case llvm::Triple::sparc:
1800 getSparcTargetFeatures(Args, Features);
1801 break;
1802 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001803 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001804 getAArch64TargetFeatures(D, Args, Features);
1805 break;
1806 case llvm::Triple::x86:
1807 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001808 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001809 break;
1810 }
Rafael Espindola43964802013-08-21 17:34:32 +00001811
1812 // Find the last of each feature.
1813 llvm::StringMap<unsigned> LastOpt;
1814 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1815 const char *Name = Features[I];
1816 assert(Name[0] == '-' || Name[0] == '+');
1817 LastOpt[Name + 1] = I;
1818 }
1819
1820 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1821 // If this feature was overridden, ignore it.
1822 const char *Name = Features[I];
1823 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1824 assert(LastI != LastOpt.end());
1825 unsigned Last = LastI->second;
1826 if (Last != I)
1827 continue;
1828
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001829 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001830 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001831 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001832}
1833
Eric Christopher84fbdb42011-08-19 00:30:14 +00001834static bool
John McCall5fb5df92012-06-20 06:18:46 +00001835shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001836 const llvm::Triple &Triple) {
1837 // We use the zero-cost exception tables for Objective-C if the non-fragile
1838 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1839 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001840 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001841 return true;
1842
Bob Wilson83e723a2013-12-05 19:38:42 +00001843 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001844 return false;
1845
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001846 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001847 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001848 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001849}
1850
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001851namespace {
1852 struct ExceptionSettings {
1853 bool ExceptionsEnabled;
1854 bool ShouldUseExceptionTables;
1855 ExceptionSettings() : ExceptionsEnabled(false),
1856 ShouldUseExceptionTables(false) {}
1857 };
1858} // end anonymous namespace.
1859
Nico Webere8e53112014-05-11 01:04:02 +00001860// exceptionSettings() exists to share the logic between -cc1 and linker
1861// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001862static ExceptionSettings exceptionSettings(const ArgList &Args,
1863 const llvm::Triple &Triple) {
1864 ExceptionSettings ES;
1865
1866 // Are exceptions enabled by default?
1867 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1868
1869 // This keeps track of whether exceptions were explicitly turned on or off.
1870 bool DidHaveExplicitExceptionFlag = false;
1871
1872 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1873 options::OPT_fno_exceptions)) {
1874 if (A->getOption().matches(options::OPT_fexceptions))
1875 ES.ExceptionsEnabled = true;
1876 else
1877 ES.ExceptionsEnabled = false;
1878
1879 DidHaveExplicitExceptionFlag = true;
1880 }
1881
1882 // Exception tables and cleanups can be enabled with -fexceptions even if the
1883 // language itself doesn't support exceptions.
1884 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1885 ES.ShouldUseExceptionTables = true;
1886
1887 return ES;
1888}
1889
Anders Carlssone96ab552011-02-28 02:27:16 +00001890/// addExceptionArgs - Adds exception related arguments to the driver command
1891/// arguments. There's a master flag, -fexceptions and also language specific
1892/// flags to enable/disable C++ and Objective-C exceptions.
1893/// This makes it possible to for example disable C++ exceptions but enable
1894/// Objective-C exceptions.
1895static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1896 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001897 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001898 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001899 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001900 if (KernelOrKext) {
1901 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1902 // arguments now to avoid warnings about unused arguments.
1903 Args.ClaimAllArgs(options::OPT_fexceptions);
1904 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1905 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1906 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1907 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1908 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001909 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001910 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001911
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001912 // Gather the exception settings from the command line arguments.
1913 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001914
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001915 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1916 // is not necessarily sensible, but follows GCC.
1917 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001918 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001919 options::OPT_fno_objc_exceptions,
1920 true)) {
1921 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001922
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001923 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001924 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001925 }
1926
1927 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001928 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001929
Eric Christopher84fbdb42011-08-19 00:30:14 +00001930 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1931 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001932 options::OPT_fexceptions,
1933 options::OPT_fno_exceptions)) {
1934 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1935 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001936 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001937 CXXExceptionsEnabled = false;
1938 }
1939
1940 if (CXXExceptionsEnabled) {
1941 CmdArgs.push_back("-fcxx-exceptions");
1942
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001943 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001944 }
1945 }
1946
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001947 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001948 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001949}
1950
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001951static bool ShouldDisableAutolink(const ArgList &Args,
1952 const ToolChain &TC) {
1953 bool Default = true;
1954 if (TC.getTriple().isOSDarwin()) {
1955 // The native darwin assembler doesn't support the linker_option directives,
1956 // so we disable them if we think the .s file will be passed to it.
1957 Default = TC.useIntegratedAs();
1958 }
1959 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1960 Default);
1961}
1962
Ted Kremenek62093662013-03-12 17:02:12 +00001963static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1964 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001965 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1966 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001967 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001968 return !UseDwarfDirectory;
1969}
1970
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001971/// \brief Check whether the given input tree contains any compilation actions.
1972static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001973 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001974 return true;
1975
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001976 for (const auto &Act : *A)
1977 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001978 return true;
1979
1980 return false;
1981}
1982
1983/// \brief Check if -relax-all should be passed to the internal assembler.
1984/// This is done by default when compiling non-assembler source with -O0.
1985static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1986 bool RelaxDefault = true;
1987
1988 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1989 RelaxDefault = A->getOption().matches(options::OPT_O0);
1990
1991 if (RelaxDefault) {
1992 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001993 for (const auto &Act : C.getActions()) {
1994 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001995 RelaxDefault = true;
1996 break;
1997 }
1998 }
1999 }
2000
2001 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2002 RelaxDefault);
2003}
2004
David Blaikie9260ed62013-07-25 21:19:01 +00002005static void CollectArgsForIntegratedAssembler(Compilation &C,
2006 const ArgList &Args,
2007 ArgStringList &CmdArgs,
2008 const Driver &D) {
2009 if (UseRelaxAll(C, Args))
2010 CmdArgs.push_back("-mrelax-all");
2011
David Peixottodfb66142013-11-14 22:52:58 +00002012 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002013 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002014 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2015 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2016 // arg after parsing the '-I' arg.
2017 bool TakeNextArg = false;
2018
David Blaikie9260ed62013-07-25 21:19:01 +00002019 // When using an integrated assembler, translate -Wa, and -Xassembler
2020 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002021 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002022 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2023 options::OPT_Xassembler),
2024 ie = Args.filtered_end(); it != ie; ++it) {
2025 const Arg *A = *it;
2026 A->claim();
2027
2028 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2029 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002030 if (TakeNextArg) {
2031 CmdArgs.push_back(Value.data());
2032 TakeNextArg = false;
2033 continue;
2034 }
David Blaikie9260ed62013-07-25 21:19:01 +00002035
2036 if (Value == "-force_cpusubtype_ALL") {
2037 // Do nothing, this is the default and we don't support anything else.
2038 } else if (Value == "-L") {
2039 CmdArgs.push_back("-msave-temp-labels");
2040 } else if (Value == "--fatal-warnings") {
2041 CmdArgs.push_back("-mllvm");
2042 CmdArgs.push_back("-fatal-assembler-warnings");
2043 } else if (Value == "--noexecstack") {
2044 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002045 } else if (Value == "-compress-debug-sections" ||
2046 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002047 CompressDebugSections = true;
2048 } else if (Value == "-nocompress-debug-sections" ||
2049 Value == "--nocompress-debug-sections") {
2050 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002051 } else if (Value.startswith("-I")) {
2052 CmdArgs.push_back(Value.data());
2053 // We need to consume the next argument if the current arg is a plain
2054 // -I. The next arg will be the include directory.
2055 if (Value == "-I")
2056 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002057 } else if (Value.startswith("-gdwarf-")) {
2058 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002059 } else {
2060 D.Diag(diag::err_drv_unsupported_option_argument)
2061 << A->getOption().getName() << Value;
2062 }
2063 }
2064 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002065 if (CompressDebugSections) {
2066 if (llvm::zlib::isAvailable())
2067 CmdArgs.push_back("-compress-debug-sections");
2068 else
2069 D.Diag(diag::warn_debug_compression_unavailable);
2070 }
David Blaikie9260ed62013-07-25 21:19:01 +00002071}
2072
Renato Goline807c122014-01-31 11:47:28 +00002073// Until ARM libraries are build separately, we have them all in one library
2074static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002075 if (TC.getArch() == llvm::Triple::arm ||
2076 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002077 return "arm";
2078 else
2079 return TC.getArchName();
2080}
2081
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002082static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2083 // The runtimes are located in the OS-specific resource directory.
2084 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002085 const llvm::Triple &Triple = TC.getTriple();
2086 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
2087 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
2088 "freebsd" : TC.getOS();
2089 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002090 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002091}
2092
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002093// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002094// FIXME: Make sure we can also emit shared objects if they're requested
2095// and available, check for possible errors, etc.
2096static void addClangRTLinux(
2097 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002098 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002099 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2100 getArchNameForCompilerRTLib(TC) +
2101 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00002102
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002103 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00002104 CmdArgs.push_back("-lgcc_s");
2105 if (TC.getDriver().CCCIsCXX())
2106 CmdArgs.push_back("-lgcc_eh");
2107}
2108
Alexey Samsonov7811d192014-02-20 13:57:37 +00002109static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00002110 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002111 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2112 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002113 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002114 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002115 Args.hasArg(options::OPT_fcreate_profile) ||
2116 Args.hasArg(options::OPT_coverage)))
2117 return;
2118
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002119 // -fprofile-instr-generate requires position-independent code to build with
2120 // shared objects. Link against the right archive.
2121 const char *Lib = "libclang_rt.profile-";
2122 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2123 Args.hasArg(options::OPT_shared))
2124 Lib = "libclang_rt.profile-pic-";
2125
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002126 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
2127 llvm::sys::path::append(LibProfile,
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002128 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00002129
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00002130 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00002131}
2132
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002133static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
2134 const StringRef Sanitizer,
2135 bool Shared) {
2136 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
2137 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
2138 const char *EnvSuffix =
2139 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002140 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
2141 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002142 Twine("libclang_rt.") + Sanitizer + "-" +
2143 getArchNameForCompilerRTLib(TC) + EnvSuffix +
2144 (Shared ? ".so" : ".a"));
2145 return LibSanitizer;
2146}
2147
2148static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
2149 ArgStringList &CmdArgs,
2150 const StringRef Sanitizer,
2151 bool BeforeLibStdCXX,
2152 bool ExportSymbols = true,
2153 bool LinkDeps = true) {
2154 SmallString<128> LibSanitizer =
2155 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smithcff3cde2013-03-20 23:49:07 +00002156
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002157 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
2158 // etc.) so that the linker picks custom versions of the global 'operator
2159 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002160 // strategy of inserting it at the front of the link command. It also
2161 // needs to be forced to end up in the executable, so wrap it in
2162 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00002163 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002164 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00002165 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002166 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00002167
2168 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
2169 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
2170
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002171 if (LinkDeps) {
2172 // Link sanitizer dependencies explicitly
2173 CmdArgs.push_back("-lpthread");
2174 CmdArgs.push_back("-lrt");
2175 CmdArgs.push_back("-lm");
2176 // There's no libdl on FreeBSD.
2177 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2178 CmdArgs.push_back("-ldl");
2179 }
Richard Smithf3e624c2013-03-23 00:30:08 +00002180
2181 // If possible, use a dynamic symbols file to export the symbols from the
2182 // runtime library. If we can't do so, use -export-dynamic instead to export
2183 // all symbols from the binary.
2184 if (ExportSymbols) {
2185 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
2186 CmdArgs.push_back(
2187 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2188 else
2189 CmdArgs.push_back("-export-dynamic");
2190 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002191}
2192
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002193/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
2194/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002195static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002196 ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002197 if (Shared) {
2198 // Link dynamic runtime if necessary.
2199 SmallString<128> LibSanitizer =
2200 getSanitizerRTLibName(TC, "asan", Shared);
2201 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002202 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002203
2204 // Do not link static runtime to DSOs or if compiling for Android.
2205 if (Args.hasArg(options::OPT_shared) ||
2206 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
2207 return;
2208
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002209 if (Shared) {
2210 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2211 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2212 /*LinkDeps*/ false);
2213 } else {
2214 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2215 if (IsCXX)
2216 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2217 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002218}
2219
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002220/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2221/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002222static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2223 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002224 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002225 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002226}
2227
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002228/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2229/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002230static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2231 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002232 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002233 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002234}
2235
2236/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2237/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002238static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2239 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002240 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002241 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002242}
2243
Richard Smithe30752c2012-10-09 19:52:38 +00002244/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2245/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002246static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2247 ArgStringList &CmdArgs, bool IsCXX,
2248 bool HasOtherSanitizerRt) {
Alexey Samsonovc6496812014-06-30 20:27:16 +00002249 // Do not link runtime into shared libraries.
2250 if (Args.hasArg(options::OPT_shared))
2251 return;
Richard Smith4244ea92014-06-04 23:28:46 +00002252
Nick Lewycky24921692013-10-19 00:27:23 +00002253 // Need a copy of sanitizer_common. This could come from another sanitizer
2254 // runtime; if we're not including one, include our own copy.
2255 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002256 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002257
Alexey Samsonovc6496812014-06-30 20:27:16 +00002258 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002259
2260 // Only include the bits of the runtime which need a C++ ABI library if
2261 // we're linking in C++ mode.
2262 if (IsCXX)
Alexey Samsonovc6496812014-06-30 20:27:16 +00002263 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true);
Richard Smithe30752c2012-10-09 19:52:38 +00002264}
2265
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002266static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2267 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00002268 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002269 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2270}
2271
2272// Should be called before we add C++ ABI library.
2273static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2274 ArgStringList &CmdArgs) {
2275 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2276 const Driver &D = TC.getDriver();
2277 if (Sanitize.needsUbsanRt())
2278 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2279 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2280 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2281 if (Sanitize.needsAsanRt())
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002282 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002283 if (Sanitize.needsTsanRt())
2284 addTsanRT(TC, Args, CmdArgs);
2285 if (Sanitize.needsMsanRt())
2286 addMsanRT(TC, Args, CmdArgs);
2287 if (Sanitize.needsLsanRt())
2288 addLsanRT(TC, Args, CmdArgs);
2289 if (Sanitize.needsDfsanRt())
2290 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002291}
2292
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002293static bool shouldUseFramePointerForTarget(const ArgList &Args,
2294 const llvm::Triple &Triple) {
2295 switch (Triple.getArch()) {
2296 // Don't use a frame pointer on linux if optimizing for certain targets.
2297 case llvm::Triple::mips64:
2298 case llvm::Triple::mips64el:
2299 case llvm::Triple::mips:
2300 case llvm::Triple::mipsel:
2301 case llvm::Triple::systemz:
2302 case llvm::Triple::x86:
2303 case llvm::Triple::x86_64:
2304 if (Triple.isOSLinux())
2305 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2306 if (!A->getOption().matches(options::OPT_O0))
2307 return false;
2308 return true;
2309 case llvm::Triple::xcore:
2310 return false;
2311 default:
2312 return true;
2313 }
2314}
2315
Rafael Espindola224dd632011-12-14 21:02:23 +00002316static bool shouldUseFramePointer(const ArgList &Args,
2317 const llvm::Triple &Triple) {
2318 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2319 options::OPT_fomit_frame_pointer))
2320 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2321
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002322 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002323}
2324
Eric Christopherb7d97e92013-04-03 01:58:53 +00002325static bool shouldUseLeafFramePointer(const ArgList &Args,
2326 const llvm::Triple &Triple) {
2327 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2328 options::OPT_momit_leaf_frame_pointer))
2329 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2330
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002331 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002332}
2333
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002334/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002335static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002336 SmallString<128> cwd;
2337 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002338 CmdArgs.push_back("-fdebug-compilation-dir");
2339 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002340 }
2341}
2342
Eric Christopherd3804002013-02-22 20:12:52 +00002343static const char *SplitDebugName(const ArgList &Args,
2344 const InputInfoList &Inputs) {
2345 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2346 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2347 SmallString<128> T(FinalOutput->getValue());
2348 llvm::sys::path::replace_extension(T, "dwo");
2349 return Args.MakeArgString(T);
2350 } else {
2351 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002352 SmallString<128> T(
2353 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002354 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2355 llvm::sys::path::replace_extension(F, "dwo");
2356 T += F;
2357 return Args.MakeArgString(F);
2358 }
2359}
2360
2361static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2362 const Tool &T, const JobAction &JA,
2363 const ArgList &Args, const InputInfo &Output,
2364 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002365 ArgStringList ExtractArgs;
2366 ExtractArgs.push_back("--extract-dwo");
2367
2368 ArgStringList StripArgs;
2369 StripArgs.push_back("--strip-dwo");
2370
2371 // Grabbing the output of the earlier compile step.
2372 StripArgs.push_back(Output.getFilename());
2373 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002374 ExtractArgs.push_back(OutFile);
2375
2376 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002377 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002378
2379 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002380 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002381
2382 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002383 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002384}
2385
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002386/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002387/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2388static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002389 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002390 if (A->getOption().matches(options::OPT_O4) ||
2391 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002392 return true;
2393
2394 if (A->getOption().matches(options::OPT_O0))
2395 return false;
2396
2397 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2398
Rafael Espindola91780de2013-08-26 14:05:41 +00002399 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002400 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002401 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002402 return true;
2403
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002404 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002405 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002406 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002407
2408 unsigned OptLevel = 0;
2409 if (S.getAsInteger(10, OptLevel))
2410 return false;
2411
2412 return OptLevel > 1;
2413 }
2414
2415 return false;
2416}
2417
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002418/// Add -x lang to \p CmdArgs for \p Input.
2419static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2420 ArgStringList &CmdArgs) {
2421 // When using -verify-pch, we don't want to provide the type
2422 // 'precompiled-header' if it was inferred from the file extension
2423 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2424 return;
2425
2426 CmdArgs.push_back("-x");
2427 if (Args.hasArg(options::OPT_rewrite_objc))
2428 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2429 else
2430 CmdArgs.push_back(types::getTypeName(Input.getType()));
2431}
2432
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002433static std::string getMSCompatibilityVersion(const char *VersionStr) {
2434 unsigned Version;
2435 if (StringRef(VersionStr).getAsInteger(10, Version))
2436 return "0";
2437
2438 if (Version < 100)
2439 return llvm::utostr_32(Version) + ".0";
2440
2441 if (Version < 10000)
2442 return llvm::utostr_32(Version / 100) + "." +
2443 llvm::utostr_32(Version % 100);
2444
2445 unsigned Build = 0, Factor = 1;
2446 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2447 Build = Build + (Version % 10) * Factor;
2448 return llvm::utostr_32(Version / 100) + "." +
2449 llvm::utostr_32(Version % 100) + "." +
2450 llvm::utostr_32(Build);
2451}
2452
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002453void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002454 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002455 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002456 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002457 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002458 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2459 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002460 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002461 ArgStringList CmdArgs;
2462
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002463 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002464 bool IsWindowsCygnus =
2465 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002466 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2467
Daniel Dunbare521a892009-03-31 20:53:55 +00002468 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2469
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002470 // Invoke ourselves in -cc1 mode.
2471 //
2472 // FIXME: Implement custom jobs for internal actions.
2473 CmdArgs.push_back("-cc1");
2474
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002475 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002476 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002477 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002478 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002479
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002480 const llvm::Triple TT(TripleStr);
2481 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2482 TT.getArch() == llvm::Triple::thumb)) {
2483 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2484 unsigned Version;
2485 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2486 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002487 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2488 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002489 }
2490
Tim Northover336f1892014-03-29 13:16:12 +00002491 // Push all default warning arguments that are specific to
2492 // the given target. These come before user provided warning options
2493 // are provided.
2494 getToolChain().addClangWarningOptions(CmdArgs);
2495
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002496 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002497 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002498
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002499 if (isa<AnalyzeJobAction>(JA)) {
2500 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2501 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002502 } else if (isa<MigrateJobAction>(JA)) {
2503 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002504 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002505 if (Output.getType() == types::TY_Dependencies)
2506 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002507 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002508 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002509 if (Args.hasArg(options::OPT_rewrite_objc) &&
2510 !Args.hasArg(options::OPT_g_Group))
2511 CmdArgs.push_back("-P");
2512 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002513 } else if (isa<AssembleJobAction>(JA)) {
2514 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002515
David Blaikie9260ed62013-07-25 21:19:01 +00002516 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002517
2518 // Also ignore explicit -force_cpusubtype_ALL option.
2519 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002520 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002521 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002522 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002523
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002524 if (JA.getType() == types::TY_Nothing)
2525 CmdArgs.push_back("-fsyntax-only");
2526 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002527 CmdArgs.push_back("-emit-pch");
2528 else
2529 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002530 } else if (isa<VerifyPCHJobAction>(JA)) {
2531 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002532 } else {
2533 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002534
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002535 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002536 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002537 } else if (JA.getType() == types::TY_LLVM_IR ||
2538 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002539 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002540 } else if (JA.getType() == types::TY_LLVM_BC ||
2541 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002542 CmdArgs.push_back("-emit-llvm-bc");
2543 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002544 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002545 } else if (JA.getType() == types::TY_AST) {
2546 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002547 } else if (JA.getType() == types::TY_ModuleFile) {
2548 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002549 } else if (JA.getType() == types::TY_RewrittenObjC) {
2550 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002551 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002552 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2553 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002554 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002555 } else {
2556 assert(JA.getType() == types::TY_PP_Asm &&
2557 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002558 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002559 }
2560
Justin Bognera88f0122014-06-20 22:59:50 +00002561 // We normally speed up the clang process a bit by skipping destructors at
2562 // exit, but when we're generating diagnostics we can rely on some of the
2563 // cleanup.
2564 if (!C.isForDiagnostics())
2565 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002566
John McCallbb79b5f2010-02-13 03:50:24 +00002567 // Disable the verification pass in -asserts builds.
2568#ifdef NDEBUG
2569 CmdArgs.push_back("-disable-llvm-verifier");
2570#endif
2571
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002572 // Set the main file name, so that debug info works even with
2573 // -save-temps.
2574 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002575 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002576
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002577 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002578 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002579 if (Args.hasArg(options::OPT_static))
2580 CmdArgs.push_back("-static-define");
2581
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002582 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002583 // Enable region store model by default.
2584 CmdArgs.push_back("-analyzer-store=region");
2585
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002586 // Treat blocks as analysis entry points.
2587 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2588
Ted Kremenek49c79792011-03-24 00:28:47 +00002589 CmdArgs.push_back("-analyzer-eagerly-assume");
2590
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002591 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002592 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002593 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002594
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002595 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002596 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002597
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002598 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002599 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002600
2601 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002602
Jordan Rose10ad0812013-04-05 17:55:07 +00002603 if (types::isCXX(Inputs[0].getType()))
2604 CmdArgs.push_back("-analyzer-checker=cplusplus");
2605
Nico Webere8e53112014-05-11 01:04:02 +00002606 // Enable the following experimental checkers for testing.
2607 CmdArgs.push_back(
2608 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2613 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002614 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002615
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002616 // Set the output format. The default is plist, for (lame) historical
2617 // reasons.
2618 CmdArgs.push_back("-analyzer-output");
2619 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002620 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002621 else
2622 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002623
Ted Kremenekfe449a22010-03-22 22:32:05 +00002624 // Disable the presentation of standard compiler warnings when
2625 // using --analyze. We only want to show static analyzer diagnostics
2626 // or frontend errors.
2627 CmdArgs.push_back("-w");
2628
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002629 // Add -Xanalyzer arguments when running as analyzer.
2630 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002631 }
2632
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002633 CheckCodeGenerationOptions(D, Args);
2634
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002635 bool PIE = getToolChain().isPIEDefault();
2636 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002637 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002638
Alexey Bataev40e75222014-01-28 06:30:35 +00002639 // Android-specific defaults for PIC/PIE
2640 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2641 switch (getToolChain().getTriple().getArch()) {
2642 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002643 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002644 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002645 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002646 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002647 case llvm::Triple::mips:
2648 case llvm::Triple::mipsel:
2649 case llvm::Triple::mips64:
2650 case llvm::Triple::mips64el:
2651 PIC = true; // "-fpic"
2652 break;
2653
2654 case llvm::Triple::x86:
2655 case llvm::Triple::x86_64:
2656 PIC = true; // "-fPIC"
2657 IsPICLevelTwo = true;
2658 break;
2659
2660 default:
2661 break;
2662 }
2663 }
2664
Brad Smith5b05db82014-06-24 19:51:29 +00002665 // OpenBSD-specific defaults for PIE
2666 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2667 switch (getToolChain().getTriple().getArch()) {
2668 case llvm::Triple::mips64:
2669 case llvm::Triple::mips64el:
2670 case llvm::Triple::sparc:
2671 case llvm::Triple::x86:
2672 case llvm::Triple::x86_64:
2673 IsPICLevelTwo = false; // "-fpie"
2674 break;
2675
2676 case llvm::Triple::ppc:
2677 case llvm::Triple::sparcv9:
2678 IsPICLevelTwo = true; // "-fPIE"
2679 break;
2680
2681 default:
2682 break;
2683 }
2684 }
2685
Alexey Samsonov090301e2013-04-09 12:28:19 +00002686 // For the PIC and PIE flag options, this logic is different from the
2687 // legacy logic in very old versions of GCC, as that logic was just
2688 // a bug no one had ever fixed. This logic is both more rational and
2689 // consistent with GCC's new logic now that the bugs are fixed. The last
2690 // argument relating to either PIC or PIE wins, and no other argument is
2691 // used. If the last argument is any flavor of the '-fno-...' arguments,
2692 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2693 // at the same level.
2694 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2695 options::OPT_fpic, options::OPT_fno_pic,
2696 options::OPT_fPIE, options::OPT_fno_PIE,
2697 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002698 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2699 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002700 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002701 if (LastPICArg) {
2702 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002703 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2704 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2705 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2706 PIC = PIE || O.matches(options::OPT_fPIC) ||
2707 O.matches(options::OPT_fpic);
2708 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2709 O.matches(options::OPT_fPIC);
2710 } else {
2711 PIE = PIC = false;
2712 }
2713 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002714 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002715
Nick Lewycky609dd662013-10-11 03:33:53 +00002716 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002717 // specified while enabling PIC enabled level 1 PIC, just force it back to
2718 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2719 // informal testing).
2720 if (PIC && getToolChain().getTriple().isOSDarwin())
2721 IsPICLevelTwo |= getToolChain().isPICDefault();
2722
Chandler Carruthc0c04552012-04-08 16:40:35 +00002723 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2724 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002725 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002726 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002727 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002728 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002729 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002730 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002731
Chandler Carruth76a943b2012-11-19 03:52:03 +00002732 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2733 // This is a very special mode. It trumps the other modes, almost no one
2734 // uses it, and it isn't even valid on any OS but Darwin.
2735 if (!getToolChain().getTriple().isOSDarwin())
2736 D.Diag(diag::err_drv_unsupported_opt_for_target)
2737 << A->getSpelling() << getToolChain().getTriple().str();
2738
2739 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2740
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002741 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002742 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002743
Chandler Carruth76a943b2012-11-19 03:52:03 +00002744 // Only a forced PIC mode can cause the actual compile to have PIC defines
2745 // etc., no flags are sufficient. This behavior was selected to closely
2746 // match that of llvm-gcc and Apple GCC before that.
2747 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2748 CmdArgs.push_back("-pic-level");
2749 CmdArgs.push_back("2");
2750 }
2751 } else {
2752 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2753 // handled in Clang's IRGen by the -pie-level flag.
2754 CmdArgs.push_back("-mrelocation-model");
2755 CmdArgs.push_back(PIC ? "pic" : "static");
2756
2757 if (PIC) {
2758 CmdArgs.push_back("-pic-level");
2759 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2760 if (PIE) {
2761 CmdArgs.push_back("-pie-level");
2762 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2763 }
2764 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002765 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002766
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002767 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2768 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002769 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002770
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002771 // LLVM Code Generator Options.
2772
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002773 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2774 StringRef v = A->getValue();
2775 CmdArgs.push_back("-mllvm");
2776 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2777 A->claim();
2778 }
2779
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002780 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2781 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002782 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002783 }
2784
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002785 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2786 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002787 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002788 D.Diag(diag::err_drv_unsupported_opt_for_target)
2789 << A->getSpelling() << getToolChain().getTriple().str();
2790 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2791 CmdArgs.push_back("-fpcc-struct-return");
2792 } else {
2793 assert(A->getOption().matches(options::OPT_freg_struct_return));
2794 CmdArgs.push_back("-freg-struct-return");
2795 }
2796 }
2797
Roman Divacky65b88cd2011-03-01 17:40:53 +00002798 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2799 CmdArgs.push_back("-mrtd");
2800
Rafael Espindola224dd632011-12-14 21:02:23 +00002801 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002802 CmdArgs.push_back("-mdisable-fp-elim");
2803 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2804 options::OPT_fno_zero_initialized_in_bss))
2805 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002806
2807 bool OFastEnabled = isOptimizationLevelFast(Args);
2808 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2809 // enabled. This alias option is being used to simplify the hasFlag logic.
2810 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2811 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002812 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2813 // doesn't do any TBAA.
2814 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002815 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002816 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002817 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002818 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2819 options::OPT_fno_struct_path_tbaa))
2820 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002821 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2822 false))
2823 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002824 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2825 options::OPT_fno_optimize_sibling_calls))
2826 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002827
Eric Christopher006208c2013-04-04 06:29:47 +00002828 // Handle segmented stacks.
2829 if (Args.hasArg(options::OPT_fsplit_stack))
2830 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002831
2832 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2833 // This alias option is being used to simplify the getLastArg logic.
2834 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2835 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002836
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002837 // Handle various floating point optimization flags, mapping them to the
2838 // appropriate LLVM code generation flags. The pattern for all of these is to
2839 // default off the codegen optimizations, and if any flag enables them and no
2840 // flag disables them after the flag enabling them, enable the codegen
2841 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002842 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002843 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002844 options::OPT_ffinite_math_only,
2845 options::OPT_fno_finite_math_only,
2846 options::OPT_fhonor_infinities,
2847 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002848 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2849 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002850 A->getOption().getID() != options::OPT_fhonor_infinities)
2851 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002852 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002853 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002854 options::OPT_ffinite_math_only,
2855 options::OPT_fno_finite_math_only,
2856 options::OPT_fhonor_nans,
2857 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002858 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2859 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002860 A->getOption().getID() != options::OPT_fhonor_nans)
2861 CmdArgs.push_back("-menable-no-nans");
2862
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002863 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2864 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002865 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002866 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002867 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002868 options::OPT_fno_math_errno)) {
2869 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2870 // However, turning *off* -ffast_math merely restores the toolchain default
2871 // (which may be false).
2872 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2873 A->getOption().getID() == options::OPT_ffast_math ||
2874 A->getOption().getID() == options::OPT_Ofast)
2875 MathErrno = false;
2876 else if (A->getOption().getID() == options::OPT_fmath_errno)
2877 MathErrno = true;
2878 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002879 if (MathErrno)
2880 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002881
2882 // There are several flags which require disabling very specific
2883 // optimizations. Any of these being disabled forces us to turn off the
2884 // entire set of LLVM optimizations, so collect them through all the flag
2885 // madness.
2886 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002887 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002888 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002889 options::OPT_funsafe_math_optimizations,
2890 options::OPT_fno_unsafe_math_optimizations,
2891 options::OPT_fassociative_math,
2892 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002893 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2894 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002895 A->getOption().getID() != options::OPT_fno_associative_math)
2896 AssociativeMath = true;
2897 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002898 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002899 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002900 options::OPT_funsafe_math_optimizations,
2901 options::OPT_fno_unsafe_math_optimizations,
2902 options::OPT_freciprocal_math,
2903 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002904 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2905 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002906 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2907 ReciprocalMath = true;
2908 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002909 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002910 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002911 options::OPT_funsafe_math_optimizations,
2912 options::OPT_fno_unsafe_math_optimizations,
2913 options::OPT_fsigned_zeros,
2914 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002915 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2916 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002917 A->getOption().getID() != options::OPT_fsigned_zeros)
2918 SignedZeros = false;
2919 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002920 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002921 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002922 options::OPT_funsafe_math_optimizations,
2923 options::OPT_fno_unsafe_math_optimizations,
2924 options::OPT_ftrapping_math,
2925 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002926 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2927 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002928 A->getOption().getID() != options::OPT_ftrapping_math)
2929 TrappingMath = false;
2930 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2931 !TrappingMath)
2932 CmdArgs.push_back("-menable-unsafe-fp-math");
2933
Lang Hamesaa53b932012-07-06 00:59:19 +00002934
2935 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002936 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002937 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002938 options::OPT_ffp_contract)) {
2939 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002940 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002941 if (Val == "fast" || Val == "on" || Val == "off") {
2942 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2943 } else {
2944 D.Diag(diag::err_drv_unsupported_option_argument)
2945 << A->getOption().getName() << Val;
2946 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002947 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2948 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002949 // If fast-math is set then set the fp-contract mode to fast.
2950 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2951 }
2952 }
2953
Bob Wilson6a039162012-07-19 03:52:53 +00002954 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2955 // and if we find them, tell the frontend to provide the appropriate
2956 // preprocessor macros. This is distinct from enabling any optimizations as
2957 // these options induce language changes which must survive serialization
2958 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002959 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2960 options::OPT_fno_fast_math))
2961 if (!A->getOption().matches(options::OPT_fno_fast_math))
2962 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002963 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2964 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002965 if (A->getOption().matches(options::OPT_ffinite_math_only))
2966 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002967
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002968 // Decide whether to use verbose asm. Verbose assembly is the default on
2969 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002970 bool IsIntegratedAssemblerDefault =
2971 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002972 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002973 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002974 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002975 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002976
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002977 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002978 IsIntegratedAssemblerDefault))
2979 CmdArgs.push_back("-no-integrated-as");
2980
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002981 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2982 CmdArgs.push_back("-mdebug-pass");
2983 CmdArgs.push_back("Structure");
2984 }
2985 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2986 CmdArgs.push_back("-mdebug-pass");
2987 CmdArgs.push_back("Arguments");
2988 }
2989
John McCall8517abc2010-02-19 02:45:38 +00002990 // Enable -mconstructor-aliases except on darwin, where we have to
2991 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002992 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002993 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002994
John McCall7ef5cb32011-03-18 02:56:14 +00002995 // Darwin's kernel doesn't support guard variables; just die if we
2996 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002997 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002998 CmdArgs.push_back("-fforbid-guard-variables");
2999
Douglas Gregordbe39272011-02-01 15:15:22 +00003000 if (Args.hasArg(options::OPT_mms_bitfields)) {
3001 CmdArgs.push_back("-mms-bitfields");
3002 }
John McCall8517abc2010-02-19 02:45:38 +00003003
Daniel Dunbar306945d2009-09-16 06:17:29 +00003004 // This is a coarse approximation of what llvm-gcc actually does, both
3005 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3006 // complicated ways.
3007 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003008 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3009 options::OPT_fno_asynchronous_unwind_tables,
3010 (getToolChain().IsUnwindTablesDefault() ||
3011 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3012 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003013 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3014 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003015 CmdArgs.push_back("-munwind-tables");
3016
Chandler Carruth05fb5852012-11-21 23:40:23 +00003017 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003018
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003019 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3020 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003021 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003022 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003023
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003024 // FIXME: Handle -mtune=.
3025 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003026
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003027 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003028 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003029 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003030 }
3031
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003032 // Add the target cpu
3033 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3034 llvm::Triple ETriple(ETripleStr);
3035 std::string CPU = getCPUName(Args, ETriple);
3036 if (!CPU.empty()) {
3037 CmdArgs.push_back("-target-cpu");
3038 CmdArgs.push_back(Args.MakeArgString(CPU));
3039 }
3040
Rafael Espindolaeb265472013-08-21 21:59:03 +00003041 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3042 CmdArgs.push_back("-mfpmath");
3043 CmdArgs.push_back(A->getValue());
3044 }
3045
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003046 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003047 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003048
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003049 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003050 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003051 default:
3052 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003053
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003054 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003055 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003056 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003057 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003058 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003059 break;
3060
Tim Northover573cbee2014-05-24 12:52:07 +00003061 case llvm::Triple::aarch64:
3062 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003063 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003064 break;
3065
Eric Christopher0b26a612010-03-02 02:41:08 +00003066 case llvm::Triple::mips:
3067 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003068 case llvm::Triple::mips64:
3069 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003070 AddMIPSTargetArgs(Args, CmdArgs);
3071 break;
3072
Ulrich Weigand8afad612014-07-28 13:17:52 +00003073 case llvm::Triple::ppc:
3074 case llvm::Triple::ppc64:
3075 case llvm::Triple::ppc64le:
3076 AddPPCTargetArgs(Args, CmdArgs);
3077 break;
3078
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003079 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003080 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003081 AddSparcTargetArgs(Args, CmdArgs);
3082 break;
3083
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003084 case llvm::Triple::x86:
3085 case llvm::Triple::x86_64:
3086 AddX86TargetArgs(Args, CmdArgs);
3087 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003088
3089 case llvm::Triple::hexagon:
3090 AddHexagonTargetArgs(Args, CmdArgs);
3091 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003092 }
3093
Hans Wennborg75958c42013-08-08 00:17:41 +00003094 // Add clang-cl arguments.
3095 if (getToolChain().getDriver().IsCLMode())
3096 AddClangCLArgs(Args, CmdArgs);
3097
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003098 // Pass the linker version in use.
3099 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3100 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003101 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003102 }
3103
Eric Christopherb7d97e92013-04-03 01:58:53 +00003104 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003105 CmdArgs.push_back("-momit-leaf-frame-pointer");
3106
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003107 // Explicitly error on some things we know we don't support and can't just
3108 // ignore.
3109 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003110 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3111 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003112 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003113 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003114 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003115 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3116 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003117 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003118 << Unsupported->getOption().getName();
3119 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003120 }
3121
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003122 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003123 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003124 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003125 CmdArgs.push_back("-header-include-file");
3126 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3127 D.CCPrintHeadersFilename : "-");
3128 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003129 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003130 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003131
Chad Rosierbe10f982011-08-02 17:58:04 +00003132 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003133 CmdArgs.push_back("-diagnostic-log-file");
3134 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3135 D.CCLogDiagnosticsFilename : "-");
3136 }
3137
Manman Ren17bdb0f2013-11-20 20:22:14 +00003138 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3139 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003140 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003141 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00003142 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003143 // FIXME: we should support specifying dwarf version with
3144 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003145 CmdArgs.push_back("-gline-tables-only");
Brad Smith378e7f9b2014-06-13 03:35:37 +00003146 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3147 const llvm::Triple &Triple = getToolChain().getTriple();
3148 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3149 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003150 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003151 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003152 CmdArgs.push_back("-gdwarf-2");
3153 else if (A->getOption().matches(options::OPT_gdwarf_3))
3154 CmdArgs.push_back("-gdwarf-3");
3155 else if (A->getOption().matches(options::OPT_gdwarf_4))
3156 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003157 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003158 !A->getOption().matches(options::OPT_ggdb0)) {
Brad Smith378e7f9b2014-06-13 03:35:37 +00003159 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3160 const llvm::Triple &Triple = getToolChain().getTriple();
3161 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3162 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003163 CmdArgs.push_back("-gdwarf-2");
3164 else
3165 CmdArgs.push_back("-g");
3166 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003167 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003168
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003169 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3170 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003171 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3172 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003173 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003174
Eric Christopher138c32b2013-09-13 22:37:55 +00003175 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003176 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3177 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003178 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003179 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003180 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003181 CmdArgs.push_back("-g");
3182 CmdArgs.push_back("-backend-option");
3183 CmdArgs.push_back("-split-dwarf=Enable");
3184 }
3185
Eric Christopher138c32b2013-09-13 22:37:55 +00003186 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3187 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3188 CmdArgs.push_back("-backend-option");
3189 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3190 }
Eric Christophereec89c22013-06-18 00:03:50 +00003191
Eric Christopher0d403d22014-02-14 01:27:03 +00003192 // -gdwarf-aranges turns on the emission of the aranges section in the
3193 // backend.
3194 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3195 CmdArgs.push_back("-backend-option");
3196 CmdArgs.push_back("-generate-arange-section");
3197 }
3198
David Blaikief36d9ba2014-01-27 18:52:43 +00003199 if (Args.hasFlag(options::OPT_fdebug_types_section,
3200 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003201 CmdArgs.push_back("-backend-option");
3202 CmdArgs.push_back("-generate-type-units");
3203 }
Eric Christophereec89c22013-06-18 00:03:50 +00003204
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003205 if (Args.hasFlag(options::OPT_ffunction_sections,
3206 options::OPT_fno_function_sections, false)) {
3207 CmdArgs.push_back("-ffunction-sections");
3208 }
3209
3210 if (Args.hasFlag(options::OPT_fdata_sections,
3211 options::OPT_fno_data_sections, false)) {
3212 CmdArgs.push_back("-fdata-sections");
3213 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003214
Chris Lattner3c77a352010-06-22 00:03:40 +00003215 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3216
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003217 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3218 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3219 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3220 D.Diag(diag::err_drv_argument_not_allowed_with)
3221 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3222
3223 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3224
3225 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3226 A->render(Args, CmdArgs);
3227 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3228 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3229
Nick Lewycky207bce32011-04-21 23:44:07 +00003230 if (Args.hasArg(options::OPT_ftest_coverage) ||
3231 Args.hasArg(options::OPT_coverage))
3232 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003233 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3234 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003235 Args.hasArg(options::OPT_coverage))
3236 CmdArgs.push_back("-femit-coverage-data");
3237
Alex Lorenzee024992014-08-04 18:41:51 +00003238 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3239 !Args.hasArg(options::OPT_fprofile_instr_generate))
3240 D.Diag(diag::err_drv_argument_only_allowed_with)
3241 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3242
3243 if (Args.hasArg(options::OPT_fcoverage_mapping))
3244 CmdArgs.push_back("-fcoverage-mapping");
3245
Nick Lewycky480cb992011-05-04 20:46:58 +00003246 if (C.getArgs().hasArg(options::OPT_c) ||
3247 C.getArgs().hasArg(options::OPT_S)) {
3248 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003249 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00003250 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00003251 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003252 SmallString<128> Pwd;
3253 if (!llvm::sys::fs::current_path(Pwd)) {
3254 llvm::sys::path::append(Pwd, CoverageFilename.str());
3255 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003256 }
3257 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003258 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003259 }
3260 }
3261
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003262 // Pass options for controlling the default header search paths.
3263 if (Args.hasArg(options::OPT_nostdinc)) {
3264 CmdArgs.push_back("-nostdsysteminc");
3265 CmdArgs.push_back("-nobuiltininc");
3266 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003267 if (Args.hasArg(options::OPT_nostdlibinc))
3268 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003269 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3270 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3271 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003272
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003273 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003274 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003275 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003276
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003277 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3278
Ted Kremenekf7639e12012-03-06 20:06:33 +00003279 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003280 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003281 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003282 options::OPT_ccc_arcmt_modify,
3283 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003284 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003285 switch (A->getOption().getID()) {
3286 default:
3287 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003288 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003289 CmdArgs.push_back("-arcmt-check");
3290 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003291 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003292 CmdArgs.push_back("-arcmt-modify");
3293 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003294 case options::OPT_ccc_arcmt_migrate:
3295 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003296 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003297 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003298
3299 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3300 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003301 break;
John McCalld70fb982011-06-15 23:25:17 +00003302 }
3303 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003304 } else {
3305 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3306 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3307 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003308 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003309
Ted Kremenekf7639e12012-03-06 20:06:33 +00003310 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3311 if (ARCMTEnabled) {
3312 D.Diag(diag::err_drv_argument_not_allowed_with)
3313 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3314 }
3315 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003316 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003317
3318 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003319 options::OPT_objcmt_migrate_subscripting,
3320 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003321 // None specified, means enable them all.
3322 CmdArgs.push_back("-objcmt-migrate-literals");
3323 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003324 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003325 } else {
3326 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3327 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003328 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003329 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003330 } else {
3331 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3332 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3333 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3334 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3335 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3336 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3337 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3338 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3339 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3340 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3341 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3342 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3343 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003344 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003345 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003346 }
3347
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003348 // Add preprocessing options like -I, -D, etc. if we are using the
3349 // preprocessor.
3350 //
3351 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003352 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003353 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003354
Rafael Espindolaa7431922011-07-21 23:40:37 +00003355 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3356 // that "The compiler can only warn and ignore the option if not recognized".
3357 // When building with ccache, it will pass -D options to clang even on
3358 // preprocessed inputs and configure concludes that -fPIC is not supported.
3359 Args.ClaimAllArgs(options::OPT_D);
3360
Alp Toker7874bdc2013-11-15 20:40:58 +00003361 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003362 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3363 if (A->getOption().matches(options::OPT_O4)) {
3364 CmdArgs.push_back("-O3");
3365 D.Diag(diag::warn_O4_is_O3);
3366 } else {
3367 A->render(Args, CmdArgs);
3368 }
3369 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003370
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003371 // Warn about ignored options to clang.
3372 for (arg_iterator it = Args.filtered_begin(
3373 options::OPT_clang_ignored_gcc_optimization_f_Group),
3374 ie = Args.filtered_end(); it != ie; ++it) {
3375 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3376 }
3377
Chad Rosier86b82082012-12-12 20:06:31 +00003378 // Don't warn about unused -flto. This can happen when we're preprocessing or
3379 // precompiling.
3380 Args.ClaimAllArgs(options::OPT_flto);
3381
Richard Smith3be1cb22014-08-07 00:24:21 +00003382 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003383 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003384 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3385 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003386 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003387 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003388
3389 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003390 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003391 //
3392 // If a std is supplied, only add -trigraphs if it follows the
3393 // option.
3394 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3395 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003396 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003397 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003398 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003399 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003400 else
3401 Std->render(Args, CmdArgs);
3402
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003403 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3404 options::OPT_trigraphs))
3405 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003406 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003407 } else {
3408 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003409 //
3410 // FIXME: Clang doesn't correctly handle -std= when the input language
3411 // doesn't match. For the time being just ignore this for C++ inputs;
3412 // eventually we want to do all the standard defaulting here instead of
3413 // splitting it between the driver and clang -cc1.
3414 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003415 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3416 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003417 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003418 CmdArgs.push_back("-std=c++11");
3419
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003420 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003421 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003422
Richard Smith282b4492013-09-04 22:50:31 +00003423 // GCC's behavior for -Wwrite-strings is a bit strange:
3424 // * In C, this "warning flag" changes the types of string literals from
3425 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3426 // for the discarded qualifier.
3427 // * In C++, this is just a normal warning flag.
3428 //
3429 // Implementing this warning correctly in C is hard, so we follow GCC's
3430 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3431 // a non-const char* in C, rather than using this crude hack.
3432 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003433 // FIXME: This should behave just like a warning flag, and thus should also
3434 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3435 Arg *WriteStrings =
3436 Args.getLastArg(options::OPT_Wwrite_strings,
3437 options::OPT_Wno_write_strings, options::OPT_w);
3438 if (WriteStrings &&
3439 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003440 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003441 }
3442
Chandler Carruth61fbf622011-04-23 09:27:53 +00003443 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003444 // during C++ compilation, which it is by default. GCC keeps this define even
3445 // in the presence of '-w', match this behavior bug-for-bug.
3446 if (types::isCXX(InputType) &&
3447 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3448 true)) {
3449 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003450 }
3451
Chandler Carruthe0391482010-05-22 02:21:53 +00003452 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3453 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3454 if (Asm->getOption().matches(options::OPT_fasm))
3455 CmdArgs.push_back("-fgnu-keywords");
3456 else
3457 CmdArgs.push_back("-fno-gnu-keywords");
3458 }
3459
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003460 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3461 CmdArgs.push_back("-fno-dwarf-directory-asm");
3462
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003463 if (ShouldDisableAutolink(Args, getToolChain()))
3464 CmdArgs.push_back("-fno-autolink");
3465
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003466 // Add in -fdebug-compilation-dir if necessary.
3467 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003468
Richard Smith9a568822011-11-21 19:36:32 +00003469 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3470 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003471 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003472 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003473 }
3474
Richard Smith79c927b2013-11-06 19:31:51 +00003475 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3476 CmdArgs.push_back("-foperator-arrow-depth");
3477 CmdArgs.push_back(A->getValue());
3478 }
3479
Richard Smith9a568822011-11-21 19:36:32 +00003480 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3481 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003482 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003483 }
3484
Richard Smitha3d3bd22013-05-08 02:12:03 +00003485 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3486 CmdArgs.push_back("-fconstexpr-steps");
3487 CmdArgs.push_back(A->getValue());
3488 }
3489
Richard Smithb3a14522013-02-22 01:59:51 +00003490 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3491 CmdArgs.push_back("-fbracket-depth");
3492 CmdArgs.push_back(A->getValue());
3493 }
3494
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003495 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3496 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003497 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003498 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003499 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3500 } else
3501 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003502 }
3503
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003504
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003505 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003506 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003507
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003508 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3509 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003510 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003511 }
David Chisnall5778fce2009-08-31 16:41:57 +00003512
Chris Lattnere23003d2010-01-09 21:54:33 +00003513 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3514 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003515 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003516 }
3517
Chris Lattnerb35583d2010-04-07 20:49:23 +00003518 CmdArgs.push_back("-ferror-limit");
3519 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003520 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003521 else
3522 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003523
Chandler Carrutha77a7272010-05-06 04:55:18 +00003524 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3525 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003526 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003527 }
3528
3529 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3530 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003531 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003532 }
3533
Richard Smithf6f003a2011-12-16 19:06:07 +00003534 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3535 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003536 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003537 }
3538
Daniel Dunbar2c978472009-11-04 06:24:47 +00003539 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003540 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003541 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003542 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003543 } else {
3544 // If -fmessage-length=N was not specified, determine whether this is a
3545 // terminal and, if so, implicitly define -fmessage-length appropriately.
3546 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003547 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003548 }
3549
John McCallb4a99d32013-02-19 01:57:35 +00003550 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3551 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3552 options::OPT_fvisibility_ms_compat)) {
3553 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3554 CmdArgs.push_back("-fvisibility");
3555 CmdArgs.push_back(A->getValue());
3556 } else {
3557 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3558 CmdArgs.push_back("-fvisibility");
3559 CmdArgs.push_back("hidden");
3560 CmdArgs.push_back("-ftype-visibility");
3561 CmdArgs.push_back("default");
3562 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003563 }
3564
Douglas Gregor08329632010-06-15 17:05:35 +00003565 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003566
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003567 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3568
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003569 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003570 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3571 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003572 CmdArgs.push_back("-ffreestanding");
3573
Daniel Dunbare357d562009-12-03 18:42:11 +00003574 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003575 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003576 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003577 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3578 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003579 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003580 // AltiVec language extensions aren't relevant for assembling.
3581 if (!isa<PreprocessJobAction>(JA) ||
3582 Output.getType() != types::TY_PP_Asm)
3583 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003584 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3585 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003586
Peter Collingbourne32701642013-11-01 18:16:25 +00003587 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3588 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003589
Will Dietz3676d562012-12-30 20:53:28 +00003590 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3591 options::OPT_fno_sanitize_recover,
3592 true))
3593 CmdArgs.push_back("-fno-sanitize-recover");
3594
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003595 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003596 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3597 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3598
Eric Christopher459d2712013-02-19 06:16:53 +00003599 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003600 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003601 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003602 getToolChain().getArch() == llvm::Triple::ppc64 ||
3603 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003604 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003605 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003606
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003607 if (getToolChain().SupportsProfiling())
3608 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003609
3610 // -flax-vector-conversions is default.
3611 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3612 options::OPT_fno_lax_vector_conversions))
3613 CmdArgs.push_back("-fno-lax-vector-conversions");
3614
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003615 if (Args.getLastArg(options::OPT_fapple_kext))
3616 CmdArgs.push_back("-fapple-kext");
3617
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003618 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003619 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003620 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003621 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3622 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003623
3624 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3625 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003626 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003627 }
3628
Bob Wilson14adb362012-02-03 06:27:22 +00003629 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003630
Chandler Carruth6e501032011-03-27 00:04:55 +00003631 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3632 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3633 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3634 options::OPT_fno_wrapv)) {
3635 if (A->getOption().matches(options::OPT_fwrapv))
3636 CmdArgs.push_back("-fwrapv");
3637 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3638 options::OPT_fno_strict_overflow)) {
3639 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3640 CmdArgs.push_back("-fwrapv");
3641 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003642
3643 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3644 options::OPT_fno_reroll_loops))
3645 if (A->getOption().matches(options::OPT_freroll_loops))
3646 CmdArgs.push_back("-freroll-loops");
3647
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003648 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003649 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3650 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003651
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003652 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3653
Mahesha S6a682be42012-10-27 07:47:56 +00003654
Daniel Dunbar4930e332009-11-17 08:07:36 +00003655 // -stack-protector=0 is default.
3656 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003657 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3658 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003659 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003660 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003661 if (A->getOption().matches(options::OPT_fstack_protector)) {
3662 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3663 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3664 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003665 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003666 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003667 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003668 } else {
3669 StackProtectorLevel =
3670 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3671 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003672 if (StackProtectorLevel) {
3673 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003674 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003675 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003676
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003677 // --param ssp-buffer-size=
3678 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3679 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003680 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003681 if (Str.startswith("ssp-buffer-size=")) {
3682 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003683 CmdArgs.push_back("-stack-protector-buffer-size");
3684 // FIXME: Verify the argument is a valid integer.
3685 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003686 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003687 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003688 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003689 }
3690
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003691 // Translate -mstackrealign
3692 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3693 false)) {
3694 CmdArgs.push_back("-backend-option");
3695 CmdArgs.push_back("-force-align-stack");
3696 }
3697 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3698 false)) {
3699 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3700 }
3701
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003702 if (Args.hasArg(options::OPT_mstack_alignment)) {
3703 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3704 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003705 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003706
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003707 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3708 options::OPT_mno_restrict_it)) {
3709 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3710 CmdArgs.push_back("-backend-option");
3711 CmdArgs.push_back("-arm-restrict-it");
3712 } else {
3713 CmdArgs.push_back("-backend-option");
3714 CmdArgs.push_back("-arm-no-restrict-it");
3715 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003716 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3717 TT.getArch() == llvm::Triple::thumb)) {
3718 // Windows on ARM expects restricted IT blocks
3719 CmdArgs.push_back("-backend-option");
3720 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003721 }
3722
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003723 if (TT.getArch() == llvm::Triple::arm ||
3724 TT.getArch() == llvm::Triple::thumb) {
3725 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3726 options::OPT_mno_long_calls)) {
3727 if (A->getOption().matches(options::OPT_mlong_calls)) {
3728 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003729 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003730 }
3731 }
3732 }
3733
Daniel Dunbard18049a2009-04-07 21:16:11 +00003734 // Forward -f options with positive and negative forms; we translate
3735 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003736 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3737 StringRef fname = A->getValue();
3738 if (!llvm::sys::fs::exists(fname))
3739 D.Diag(diag::err_drv_no_such_file) << fname;
3740 else
3741 A->render(Args, CmdArgs);
3742 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003743
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003744 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003745 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003746 CmdArgs.push_back("-fapple-kext");
3747 if (!Args.hasArg(options::OPT_fbuiltin))
3748 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003749 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003750 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003751 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003752 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003753 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003754
Nuno Lopes13c88c72009-12-16 16:59:22 +00003755 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3756 options::OPT_fno_assume_sane_operator_new))
3757 CmdArgs.push_back("-fno-assume-sane-operator-new");
3758
Daniel Dunbar4930e332009-11-17 08:07:36 +00003759 // -fblocks=0 is default.
3760 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003761 getToolChain().IsBlocksDefault()) ||
3762 (Args.hasArg(options::OPT_fgnu_runtime) &&
3763 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3764 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003765 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003766
3767 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3768 !getToolChain().hasBlocksRuntime())
3769 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003770 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003771
Douglas Gregor226173a2012-01-18 15:19:58 +00003772 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3773 // users must also pass -fcxx-modules. The latter flag will disappear once the
3774 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003775 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003776 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3777 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3778 options::OPT_fno_cxx_modules,
3779 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003780 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003781 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003782 HaveModules = true;
3783 }
3784 }
3785
Daniel Jasper07e6c402013-08-05 20:26:17 +00003786 // -fmodule-maps enables module map processing (off by default) for header
3787 // checking. It is implied by -fmodules.
3788 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3789 false)) {
3790 CmdArgs.push_back("-fmodule-maps");
3791 }
3792
Daniel Jasperac42b752013-10-21 06:34:34 +00003793 // -fmodules-decluse checks that modules used are declared so (off by
3794 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003795 if (Args.hasFlag(options::OPT_fmodules_decluse,
3796 options::OPT_fno_modules_decluse,
3797 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003798 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003799 }
3800
Daniel Jasper962b38e2014-04-11 11:47:45 +00003801 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3802 // all #included headers are part of modules.
3803 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3804 options::OPT_fno_modules_strict_decluse,
3805 false)) {
3806 CmdArgs.push_back("-fmodules-strict-decluse");
3807 }
3808
Daniel Jasperac42b752013-10-21 06:34:34 +00003809 // -fmodule-name specifies the module that is currently being built (or
3810 // used for header checking by -fmodule-maps).
Justin Bogner5443ad52014-06-20 21:12:53 +00003811 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasperac42b752013-10-21 06:34:34 +00003812 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003813
3814 // -fmodule-map-file can be used to specify a file containing module
3815 // definitions.
Justin Bogner5443ad52014-06-20 21:12:53 +00003816 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasperac42b752013-10-21 06:34:34 +00003817 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003818
Justin Bognera88f0122014-06-20 22:59:50 +00003819 // -fmodule-cache-path specifies where our module files should be written.
3820 SmallString<128> ModuleCachePath;
3821 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3822 ModuleCachePath = A->getValue();
3823 if (HaveModules) {
3824 if (C.isForDiagnostics()) {
3825 // When generating crash reports, we want to emit the modules along with
3826 // the reproduction sources, so we ignore any provided module path.
3827 ModuleCachePath = Output.getFilename();
3828 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3829 llvm::sys::path::append(ModuleCachePath, "modules");
3830 } else if (ModuleCachePath.empty()) {
3831 // No module path was provided: use the default.
3832 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3833 ModuleCachePath);
3834 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3835 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3836 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003837 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003838 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3839 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3840 }
3841
3842 // When building modules and generating crashdumps, we need to dump a module
3843 // dependency VFS alongside the output.
3844 if (HaveModules && C.isForDiagnostics()) {
3845 SmallString<128> VFSDir(Output.getFilename());
3846 llvm::sys::path::replace_extension(VFSDir, ".cache");
3847 llvm::sys::path::append(VFSDir, "vfs");
3848 CmdArgs.push_back("-module-dependency-dir");
3849 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003850 }
3851
Justin Bogner5443ad52014-06-20 21:12:53 +00003852 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3853 if (HaveModules)
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003854 A->render(Args, CmdArgs);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003855
Douglas Gregor35b04d62013-02-07 19:01:24 +00003856 // Pass through all -fmodules-ignore-macro arguments.
3857 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003858 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3859 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003860
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003861 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3862
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003863 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3864 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3865 D.Diag(diag::err_drv_argument_not_allowed_with)
3866 << A->getAsString(Args) << "-fbuild-session-timestamp";
3867
3868 llvm::sys::fs::file_status Status;
3869 if (llvm::sys::fs::status(A->getValue(), Status))
3870 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003871 char TimeStamp[48];
3872 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3873 (uint64_t)Status.getLastModificationTime().toEpochTime());
3874 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003875 }
3876
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003877 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003878 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3879 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003880 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3881
3882 Args.AddLastArg(CmdArgs,
3883 options::OPT_fmodules_validate_once_per_build_session);
3884 }
3885
Ben Langmuirdcf73862014-03-12 00:06:17 +00003886 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3887
John McCalldfea9982010-04-09 19:12:06 +00003888 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003889 if (Args.hasFlag(options::OPT_fno_access_control,
3890 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003891 false))
John McCall3155f572010-04-09 19:03:51 +00003892 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003893
Anders Carlssond470fef2010-11-21 00:09:52 +00003894 // -felide-constructors is the default.
3895 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3896 options::OPT_felide_constructors,
3897 false))
3898 CmdArgs.push_back("-fno-elide-constructors");
3899
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003900 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003901 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003902 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003903 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003904
Richard Smith52be6192012-11-05 22:04:41 +00003905 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003906 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003907 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003908 Args.getLastArg(options::OPT_mkernel,
3909 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003910 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003911 D.Diag(diag::err_drv_argument_not_allowed_with)
3912 << "-fsanitize=vptr" << NoRttiArg;
3913 }
3914 }
3915
Tony Linthicum76329bf2011-12-12 21:14:55 +00003916 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003917 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003918 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003919 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003920 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003921 CmdArgs.push_back("-fshort-enums");
3922
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003923 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003924 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003925 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003926 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003927
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003928 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003929 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003930 options::OPT_fno_threadsafe_statics))
3931 CmdArgs.push_back("-fno-threadsafe-statics");
3932
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003933 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003934 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3935 options::OPT_fno_use_cxa_atexit,
3936 !IsWindowsCygnus && !IsWindowsGNU &&
3937 getToolChain().getArch() != llvm::Triple::hexagon &&
3938 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003939 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003940 CmdArgs.push_back("-fno-use-cxa-atexit");
3941
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003942 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003943 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003944 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003945 CmdArgs.push_back("-fms-extensions");
3946
Francois Pichet1b4f1632011-09-17 04:32:15 +00003947 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003948 if (Args.hasFlag(options::OPT_fms_compatibility,
3949 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003950 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3951 options::OPT_fno_ms_extensions,
3952 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003953 CmdArgs.push_back("-fms-compatibility");
3954
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003955 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003956 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003957 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
3958 Args.hasArg(options::OPT_fms_compatibility_version)) {
3959 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3960 const Arg *MSCompatibilityVersion =
3961 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003962
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003963 if (MSCVersion && MSCompatibilityVersion)
3964 D.Diag(diag::err_drv_argument_not_allowed_with)
3965 << MSCVersion->getAsString(Args)
3966 << MSCompatibilityVersion->getAsString(Args);
3967
3968 std::string Ver;
3969 if (MSCompatibilityVersion)
3970 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
3971 else if (MSCVersion)
3972 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
3973
3974 if (Ver.empty())
3975 CmdArgs.push_back("-fms-compatibility-version=17.00");
3976 else
3977 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
3978 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003979
Eric Christopher5ecce122013-02-18 00:38:31 +00003980 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003981 if (Args.hasFlag(options::OPT_fborland_extensions,
3982 options::OPT_fno_borland_extensions, false))
3983 CmdArgs.push_back("-fborland-extensions");
3984
Francois Pichet02744872011-09-01 16:38:08 +00003985 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3986 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003987 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003988 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003989 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003990
Chandler Carruthe03aa552010-04-17 20:17:31 +00003991 // -fgnu-keywords default varies depending on language; only pass if
3992 // specified.
3993 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003994 options::OPT_fno_gnu_keywords))
3995 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003996
Rafael Espindola922a6242011-06-02 17:30:53 +00003997 if (Args.hasFlag(options::OPT_fgnu89_inline,
3998 options::OPT_fno_gnu89_inline,
3999 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004000 CmdArgs.push_back("-fgnu89-inline");
4001
Chad Rosier9c76d242012-03-15 22:31:42 +00004002 if (Args.hasArg(options::OPT_fno_inline))
4003 CmdArgs.push_back("-fno-inline");
4004
Chad Rosier64d6be92012-03-06 21:17:19 +00004005 if (Args.hasArg(options::OPT_fno_inline_functions))
4006 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004007
John McCall5fb5df92012-06-20 06:18:46 +00004008 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004009
John McCall5fb5df92012-06-20 06:18:46 +00004010 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004011 // legacy is the default. Except for deployment taget of 10.5,
4012 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4013 // gets ignored silently.
4014 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004015 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4016 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004017 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004018 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004019 if (getToolChain().UseObjCMixedDispatch())
4020 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4021 else
4022 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4023 }
4024 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004025
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004026 // When ObjectiveC legacy runtime is in effect on MacOSX,
4027 // turn on the option to do Array/Dictionary subscripting
4028 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004029 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4030 getToolChain().getTriple().isMacOSX() &&
4031 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4032 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004033 objcRuntime.isNeXTFamily())
4034 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4035
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004036 // -fencode-extended-block-signature=1 is default.
4037 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4038 CmdArgs.push_back("-fencode-extended-block-signature");
4039 }
4040
John McCall24fc0de2011-07-06 00:26:06 +00004041 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4042 // NOTE: This logic is duplicated in ToolChains.cpp.
4043 bool ARC = isObjCAutoRefCount(Args);
4044 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004045 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004046
John McCall24fc0de2011-07-06 00:26:06 +00004047 CmdArgs.push_back("-fobjc-arc");
4048
Chandler Carruth491db322011-11-04 07:34:47 +00004049 // FIXME: It seems like this entire block, and several around it should be
4050 // wrapped in isObjC, but for now we just use it here as this is where it
4051 // was being used previously.
4052 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4053 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4054 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4055 else
4056 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4057 }
4058
John McCall24fc0de2011-07-06 00:26:06 +00004059 // Allow the user to enable full exceptions code emission.
4060 // We define off for Objective-CC, on for Objective-C++.
4061 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4062 options::OPT_fno_objc_arc_exceptions,
4063 /*default*/ types::isCXX(InputType)))
4064 CmdArgs.push_back("-fobjc-arc-exceptions");
4065 }
4066
4067 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4068 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004069 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004070 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004071
John McCall24fc0de2011-07-06 00:26:06 +00004072 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4073 // takes precedence.
4074 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4075 if (!GCArg)
4076 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4077 if (GCArg) {
4078 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004079 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004080 << GCArg->getAsString(Args);
4081 } else if (getToolChain().SupportsObjCGC()) {
4082 GCArg->render(Args, CmdArgs);
4083 } else {
4084 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004085 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004086 << GCArg->getAsString(Args);
4087 }
4088 }
4089
Reid Klecknerc542d372014-06-27 17:02:02 +00004090 // Handle GCC-style exception args.
4091 if (!C.getDriver().IsCLMode())
4092 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4093 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004094
4095 if (getToolChain().UseSjLjExceptions())
4096 CmdArgs.push_back("-fsjlj-exceptions");
4097
4098 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004099 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4100 options::OPT_fno_assume_sane_operator_new))
4101 CmdArgs.push_back("-fno-assume-sane-operator-new");
4102
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004103 // -fconstant-cfstrings is default, and may be subject to argument translation
4104 // on Darwin.
4105 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4106 options::OPT_fno_constant_cfstrings) ||
4107 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4108 options::OPT_mno_constant_cfstrings))
4109 CmdArgs.push_back("-fno-constant-cfstrings");
4110
John Thompsoned4e2952009-11-05 20:14:16 +00004111 // -fshort-wchar default varies depending on platform; only
4112 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004113 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4114 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004115 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004116
Hans Wennborg28c96312013-07-31 23:39:13 +00004117 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004118 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004119 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004120 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004121 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004122
Daniel Dunbar096ed292011-10-05 21:04:55 +00004123 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4124 // -fno-pack-struct doesn't apply to -fpack-struct=.
4125 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004126 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004127 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004128 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004129 } else if (Args.hasFlag(options::OPT_fpack_struct,
4130 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004131 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004132 }
4133
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004134 // Handle -fmax-type-align=N and -fno-type-align
4135 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4136 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4137 if (!SkipMaxTypeAlign) {
4138 std::string MaxTypeAlignStr = "-fmax-type-align=";
4139 MaxTypeAlignStr += A->getValue();
4140 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4141 }
4142 } else if (getToolChain().getTriple().isOSDarwin()) {
4143 if (!SkipMaxTypeAlign) {
4144 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4145 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4146 }
4147 }
4148
Robert Lytton0e076492013-08-13 09:43:10 +00004149 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004150 if (!Args.hasArg(options::OPT_fcommon))
4151 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004152 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004153 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004154
Daniel Dunbard18049a2009-04-07 21:16:11 +00004155 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004156 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004157 CmdArgs.push_back("-fno-common");
4158
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004159 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004160 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004161 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004162 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004163 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004164 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4165
Daniel Dunbar6358d682010-10-15 22:30:42 +00004166 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4167 if (!Args.hasFlag(options::OPT_ffor_scope,
4168 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004169 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004170 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4171
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004172 // -finput_charset=UTF-8 is default. Reject others
4173 if (Arg *inputCharset = Args.getLastArg(
4174 options::OPT_finput_charset_EQ)) {
4175 StringRef value = inputCharset->getValue();
4176 if (value != "UTF-8")
4177 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4178 }
4179
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004180 // -fcaret-diagnostics is default.
4181 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4182 options::OPT_fno_caret_diagnostics, true))
4183 CmdArgs.push_back("-fno-caret-diagnostics");
4184
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004185 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004186 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004187 options::OPT_fno_diagnostics_fixit_info))
4188 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004189
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004190 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004191 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004192 options::OPT_fno_diagnostics_show_option))
4193 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004194
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004195 if (const Arg *A =
4196 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4197 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004198 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004199 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004200
Douglas Gregor643c9222011-05-21 17:07:29 +00004201 if (const Arg *A =
4202 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4203 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004204 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004205 }
4206
Chandler Carruthb6766f02011-03-27 01:50:55 +00004207 if (Arg *A = Args.getLastArg(
4208 options::OPT_fdiagnostics_show_note_include_stack,
4209 options::OPT_fno_diagnostics_show_note_include_stack)) {
4210 if (A->getOption().matches(
4211 options::OPT_fdiagnostics_show_note_include_stack))
4212 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4213 else
4214 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4215 }
4216
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004217 // Color diagnostics are the default, unless the terminal doesn't support
4218 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004219 // Support both clang's -f[no-]color-diagnostics and gcc's
4220 // -f[no-]diagnostics-colors[=never|always|auto].
4221 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004222 for (const auto &Arg : Args) {
4223 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004224 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4225 !O.matches(options::OPT_fdiagnostics_color) &&
4226 !O.matches(options::OPT_fno_color_diagnostics) &&
4227 !O.matches(options::OPT_fno_diagnostics_color) &&
4228 !O.matches(options::OPT_fdiagnostics_color_EQ))
4229 continue;
4230
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004231 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004232 if (O.matches(options::OPT_fcolor_diagnostics) ||
4233 O.matches(options::OPT_fdiagnostics_color)) {
4234 ShowColors = Colors_On;
4235 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4236 O.matches(options::OPT_fno_diagnostics_color)) {
4237 ShowColors = Colors_Off;
4238 } else {
4239 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004240 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004241 if (value == "always")
4242 ShowColors = Colors_On;
4243 else if (value == "never")
4244 ShowColors = Colors_Off;
4245 else if (value == "auto")
4246 ShowColors = Colors_Auto;
4247 else
4248 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4249 << ("-fdiagnostics-color=" + value).str();
4250 }
4251 }
4252 if (ShowColors == Colors_On ||
4253 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004254 CmdArgs.push_back("-fcolor-diagnostics");
4255
Nico Rieck7857d462013-09-11 00:38:02 +00004256 if (Args.hasArg(options::OPT_fansi_escape_codes))
4257 CmdArgs.push_back("-fansi-escape-codes");
4258
Daniel Dunbardb097022009-06-08 21:13:54 +00004259 if (!Args.hasFlag(options::OPT_fshow_source_location,
4260 options::OPT_fno_show_source_location))
4261 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004262
Douglas Gregor643c9222011-05-21 17:07:29 +00004263 if (!Args.hasFlag(options::OPT_fshow_column,
4264 options::OPT_fno_show_column,
4265 true))
4266 CmdArgs.push_back("-fno-show-column");
4267
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004268 if (!Args.hasFlag(options::OPT_fspell_checking,
4269 options::OPT_fno_spell_checking))
4270 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004271
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004272
Chad Rosierc8e56e82012-12-05 21:08:21 +00004273 // -fno-asm-blocks is default.
4274 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4275 false))
4276 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004277
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004278 // Enable vectorization per default according to the optimization level
4279 // selected. For optimization levels that want vectorization we use the alias
4280 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004281 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004282 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004283 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004284 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004285 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004286 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004287
Chad Rosier136d67d2014-04-28 19:30:57 +00004288 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004289 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4290 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004291 options::OPT_fslp_vectorize;
4292 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004293 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004294 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004295
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004296 // -fno-slp-vectorize-aggressive is default.
4297 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004298 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004299 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004300
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004301 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4302 A->render(Args, CmdArgs);
4303
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004304 // -fdollars-in-identifiers default varies depending on platform and
4305 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004306 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004307 options::OPT_fno_dollars_in_identifiers)) {
4308 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004309 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004310 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004311 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004312 }
4313
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004314 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4315 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004316 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004317 options::OPT_fno_unit_at_a_time)) {
4318 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004319 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004320 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004321
Eli Friedman055c9702011-11-02 01:53:16 +00004322 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4323 options::OPT_fno_apple_pragma_pack, false))
4324 CmdArgs.push_back("-fapple-pragma-pack");
4325
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004326 // le32-specific flags:
4327 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4328 // by default.
4329 if (getToolChain().getArch() == llvm::Triple::le32) {
4330 CmdArgs.push_back("-fno-math-builtin");
4331 }
4332
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004333 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004334 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004335 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004336#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004337 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004338 (getToolChain().getArch() == llvm::Triple::arm ||
4339 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004340 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4341 CmdArgs.push_back("-fno-builtin-strcat");
4342 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4343 CmdArgs.push_back("-fno-builtin-strcpy");
4344 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004345#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004346
Justin Bognera88f0122014-06-20 22:59:50 +00004347 // Enable rewrite includes if the user's asked for it or if we're generating
4348 // diagnostics.
4349 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4350 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004351 if (Args.hasFlag(options::OPT_frewrite_includes,
4352 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004353 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004354 CmdArgs.push_back("-frewrite-includes");
4355
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004356 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004357 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004358 options::OPT_traditional_cpp)) {
4359 if (isa<PreprocessJobAction>(JA))
4360 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004361 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004362 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004363 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004364
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004365 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004366 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004367
4368 // Handle serialized diagnostics.
4369 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4370 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004371 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004372 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004373
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004374 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4375 CmdArgs.push_back("-fretain-comments-from-system-headers");
4376
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004377 // Forward -fcomment-block-commands to -cc1.
4378 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004379 // Forward -fparse-all-comments to -cc1.
4380 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004381
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004382 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4383 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004384 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004385 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4386 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004387 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004388
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004389 // We translate this by hand to the -cc1 argument, since nightly test uses
4390 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004391 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004392 CmdArgs.push_back("-disable-llvm-optzns");
4393 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004394 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004395 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004396
Daniel Dunbard67a3222009-03-30 06:36:42 +00004397 if (Output.getType() == types::TY_Dependencies) {
4398 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004399 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004400 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004401 CmdArgs.push_back(Output.getFilename());
4402 } else {
4403 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004404 }
4405
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004406 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004407 addDashXForInput(Args, II, CmdArgs);
4408
Daniel Dunbarb440f562010-08-02 02:38:21 +00004409 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004410 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004411 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004412 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004413 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004414
Chris Lattnere9d7d782009-11-03 19:50:27 +00004415 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4416
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004417 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004418
4419 // Optionally embed the -cc1 level arguments into the debug info, for build
4420 // analysis.
4421 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004422 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004423 for (const auto &Arg : Args)
4424 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004425
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004426 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004427 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004428 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004429 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004430 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004431 }
4432 CmdArgs.push_back("-dwarf-debug-flags");
4433 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4434 }
4435
Eric Christopherd3804002013-02-22 20:12:52 +00004436 // Add the split debug info name to the command lines here so we
4437 // can propagate it to the backend.
4438 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004439 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004440 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004441 const char *SplitDwarfOut;
4442 if (SplitDwarf) {
4443 CmdArgs.push_back("-split-dwarf-file");
4444 SplitDwarfOut = SplitDebugName(Args, Inputs);
4445 CmdArgs.push_back(SplitDwarfOut);
4446 }
4447
4448 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004449 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004450 Output.getType() == types::TY_Object &&
4451 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Hans Wennborg1da044a2014-06-26 19:59:02 +00004452 Command *CLCommand = getCLFallback()->GetCommand(C, JA, Output, Inputs,
4453 Args, LinkingOutput);
David Majnemerf6072342014-07-01 22:24:56 +00004454 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004455 } else {
4456 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4457 }
4458
Daniel Dunbar17731772009-03-23 19:03:36 +00004459
Eric Christopherf1545832013-02-22 23:50:16 +00004460 // Handle the debug info splitting at object creation time if we're
4461 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004462 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004463 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004464 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004465
Roman Divacky178e01602011-02-10 16:52:03 +00004466 if (Arg *A = Args.getLastArg(options::OPT_pg))
4467 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004468 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004469 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004470
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004471 // Claim some arguments which clang supports automatically.
4472
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004473 // -fpch-preprocess is used with gcc to add a special marker in the output to
4474 // include the PCH file. Clang's PTH solution is completely transparent, so we
4475 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004476 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004477
Daniel Dunbar17731772009-03-23 19:03:36 +00004478 // Claim some arguments which clang doesn't support, but we don't
4479 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004480 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4481 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004482
Rafael Espindolab0092d72013-09-04 19:37:35 +00004483 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004484 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004485}
4486
John McCall5fb5df92012-06-20 06:18:46 +00004487/// Add options related to the Objective-C runtime/ABI.
4488///
4489/// Returns true if the runtime is non-fragile.
4490ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4491 ArgStringList &cmdArgs,
4492 RewriteKind rewriteKind) const {
4493 // Look for the controlling runtime option.
4494 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4495 options::OPT_fgnu_runtime,
4496 options::OPT_fobjc_runtime_EQ);
4497
4498 // Just forward -fobjc-runtime= to the frontend. This supercedes
4499 // options about fragility.
4500 if (runtimeArg &&
4501 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4502 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004503 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004504 if (runtime.tryParse(value)) {
4505 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4506 << value;
4507 }
4508
4509 runtimeArg->render(args, cmdArgs);
4510 return runtime;
4511 }
4512
4513 // Otherwise, we'll need the ABI "version". Version numbers are
4514 // slightly confusing for historical reasons:
4515 // 1 - Traditional "fragile" ABI
4516 // 2 - Non-fragile ABI, version 1
4517 // 3 - Non-fragile ABI, version 2
4518 unsigned objcABIVersion = 1;
4519 // If -fobjc-abi-version= is present, use that to set the version.
4520 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004521 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004522 if (value == "1")
4523 objcABIVersion = 1;
4524 else if (value == "2")
4525 objcABIVersion = 2;
4526 else if (value == "3")
4527 objcABIVersion = 3;
4528 else
4529 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4530 << value;
4531 } else {
4532 // Otherwise, determine if we are using the non-fragile ABI.
4533 bool nonFragileABIIsDefault =
4534 (rewriteKind == RK_NonFragile ||
4535 (rewriteKind == RK_None &&
4536 getToolChain().IsObjCNonFragileABIDefault()));
4537 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4538 options::OPT_fno_objc_nonfragile_abi,
4539 nonFragileABIIsDefault)) {
4540 // Determine the non-fragile ABI version to use.
4541#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4542 unsigned nonFragileABIVersion = 1;
4543#else
4544 unsigned nonFragileABIVersion = 2;
4545#endif
4546
4547 if (Arg *abiArg = args.getLastArg(
4548 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004549 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004550 if (value == "1")
4551 nonFragileABIVersion = 1;
4552 else if (value == "2")
4553 nonFragileABIVersion = 2;
4554 else
4555 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4556 << value;
4557 }
4558
4559 objcABIVersion = 1 + nonFragileABIVersion;
4560 } else {
4561 objcABIVersion = 1;
4562 }
4563 }
4564
4565 // We don't actually care about the ABI version other than whether
4566 // it's non-fragile.
4567 bool isNonFragile = objcABIVersion != 1;
4568
4569 // If we have no runtime argument, ask the toolchain for its default runtime.
4570 // However, the rewriter only really supports the Mac runtime, so assume that.
4571 ObjCRuntime runtime;
4572 if (!runtimeArg) {
4573 switch (rewriteKind) {
4574 case RK_None:
4575 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4576 break;
4577 case RK_Fragile:
4578 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4579 break;
4580 case RK_NonFragile:
4581 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4582 break;
4583 }
4584
4585 // -fnext-runtime
4586 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4587 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004588 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004589 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4590
4591 // Otherwise, build for a generic macosx port.
4592 } else {
4593 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4594 }
4595
4596 // -fgnu-runtime
4597 } else {
4598 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004599 // Legacy behaviour is to target the gnustep runtime if we are i
4600 // non-fragile mode or the GCC runtime in fragile mode.
4601 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004602 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004603 else
4604 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004605 }
4606
4607 cmdArgs.push_back(args.MakeArgString(
4608 "-fobjc-runtime=" + runtime.getAsString()));
4609 return runtime;
4610}
4611
Reid Klecknerc542d372014-06-27 17:02:02 +00004612static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4613 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4614 I += HaveDash;
4615 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004616}
Reid Klecknerc542d372014-06-27 17:02:02 +00004617
4618struct EHFlags {
4619 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4620 bool Synch;
4621 bool Asynch;
4622 bool NoExceptC;
4623};
4624
4625/// /EH controls whether to run destructor cleanups when exceptions are
4626/// thrown. There are three modifiers:
4627/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4628/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4629/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4630/// - c: Assume that extern "C" functions are implicitly noexcept. This
4631/// modifier is an optimization, so we ignore it for now.
4632/// The default is /EHs-c-, meaning cleanups are disabled.
4633static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4634 EHFlags EH;
4635 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4636 for (auto EHVal : EHArgs) {
4637 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4638 switch (EHVal[I]) {
4639 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4640 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4641 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4642 default: break;
4643 }
4644 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4645 break;
4646 }
4647 }
4648 return EH;
4649}
4650
Hans Wennborg75958c42013-08-08 00:17:41 +00004651void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4652 unsigned RTOptionID = options::OPT__SLASH_MT;
4653
Hans Wennborgf1a74252013-09-10 20:18:04 +00004654 if (Args.hasArg(options::OPT__SLASH_LDd))
4655 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4656 // but defining _DEBUG is sticky.
4657 RTOptionID = options::OPT__SLASH_MTd;
4658
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004659 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004660 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004661
Hans Wennborg75958c42013-08-08 00:17:41 +00004662 switch(RTOptionID) {
4663 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004664 if (Args.hasArg(options::OPT__SLASH_LDd))
4665 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004666 CmdArgs.push_back("-D_MT");
4667 CmdArgs.push_back("-D_DLL");
4668 CmdArgs.push_back("--dependent-lib=msvcrt");
4669 break;
4670 case options::OPT__SLASH_MDd:
4671 CmdArgs.push_back("-D_DEBUG");
4672 CmdArgs.push_back("-D_MT");
4673 CmdArgs.push_back("-D_DLL");
4674 CmdArgs.push_back("--dependent-lib=msvcrtd");
4675 break;
4676 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004677 if (Args.hasArg(options::OPT__SLASH_LDd))
4678 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004679 CmdArgs.push_back("-D_MT");
4680 CmdArgs.push_back("--dependent-lib=libcmt");
4681 break;
4682 case options::OPT__SLASH_MTd:
4683 CmdArgs.push_back("-D_DEBUG");
4684 CmdArgs.push_back("-D_MT");
4685 CmdArgs.push_back("--dependent-lib=libcmtd");
4686 break;
4687 default:
4688 llvm_unreachable("Unexpected option ID.");
4689 }
4690
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004691 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4692 // users want. The /Za flag to cl.exe turns this off, but it's not
4693 // implemented in clang.
4694 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004695
Hans Wennborg8858a032014-07-21 23:42:07 +00004696 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4697 // would produce interleaved output, so ignore /showIncludes in such cases.
4698 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4699 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4700 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004701
David Majnemerf6072342014-07-01 22:24:56 +00004702 // This controls whether or not we emit RTTI data for polymorphic types.
4703 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4704 /*default=*/false))
4705 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004706
Reid Klecknerc542d372014-06-27 17:02:02 +00004707 const Driver &D = getToolChain().getDriver();
4708 EHFlags EH = parseClangCLEHFlags(D, Args);
4709 // FIXME: Do something with NoExceptC.
4710 if (EH.Synch || EH.Asynch) {
4711 CmdArgs.push_back("-fexceptions");
4712 CmdArgs.push_back("-fcxx-exceptions");
4713 }
4714
Hans Wennborge50cec32014-06-13 20:59:54 +00004715 // /EP should expand to -E -P.
4716 if (Args.hasArg(options::OPT__SLASH_EP)) {
4717 CmdArgs.push_back("-E");
4718 CmdArgs.push_back("-P");
4719 }
4720
David Majnemer86c318f2014-02-11 21:05:00 +00004721 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4722 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4723 if (MostGeneralArg && BestCaseArg)
4724 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4725 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4726
4727 if (MostGeneralArg) {
4728 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4729 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4730 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4731
4732 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4733 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4734 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4735 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4736 << FirstConflict->getAsString(Args)
4737 << SecondConflict->getAsString(Args);
4738
4739 if (SingleArg)
4740 CmdArgs.push_back("-fms-memptr-rep=single");
4741 else if (MultipleArg)
4742 CmdArgs.push_back("-fms-memptr-rep=multiple");
4743 else
4744 CmdArgs.push_back("-fms-memptr-rep=virtual");
4745 }
4746
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004747 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4748 A->render(Args, CmdArgs);
4749
Hans Wennborg81f74482013-09-10 01:07:07 +00004750 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4751 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004752 if (Args.hasArg(options::OPT__SLASH_fallback))
4753 CmdArgs.push_back("msvc-fallback");
4754 else
4755 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004756 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004757}
4758
Hans Wennborg1da044a2014-06-26 19:59:02 +00004759visualstudio::Compile *Clang::getCLFallback() const {
4760 if (!CLFallback)
4761 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4762 return CLFallback.get();
4763}
4764
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004765void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004766 const InputInfo &Output,
4767 const InputInfoList &Inputs,
4768 const ArgList &Args,
4769 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004770 ArgStringList CmdArgs;
4771
4772 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4773 const InputInfo &Input = Inputs[0];
4774
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004775 // Don't warn about "clang -w -c foo.s"
4776 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004777 // and "clang -emit-llvm -c foo.s"
4778 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004779
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004780 // Invoke ourselves in -cc1as mode.
4781 //
4782 // FIXME: Implement custom jobs for internal actions.
4783 CmdArgs.push_back("-cc1as");
4784
4785 // Add the "effective" target triple.
4786 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004787 std::string TripleStr =
4788 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004789 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4790
4791 // Set the output mode, we currently only expect to be used as a real
4792 // assembler.
4793 CmdArgs.push_back("-filetype");
4794 CmdArgs.push_back("obj");
4795
Eric Christopher45f2e712012-12-18 00:31:10 +00004796 // Set the main file name, so that debug info works even with
4797 // -save-temps or preprocessed assembly.
4798 CmdArgs.push_back("-main-file-name");
4799 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4800
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004801 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004802 const llvm::Triple &Triple = getToolChain().getTriple();
4803 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004804 if (!CPU.empty()) {
4805 CmdArgs.push_back("-target-cpu");
4806 CmdArgs.push_back(Args.MakeArgString(CPU));
4807 }
4808
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004809 // Add the target features
4810 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004811 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004812
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004813 // Ignore explicit -force_cpusubtype_ALL option.
4814 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004815
Eric Christopherfc3ee562012-01-10 00:38:01 +00004816 // Determine the original source input.
4817 const Action *SourceAction = &JA;
4818 while (SourceAction->getKind() != Action::InputClass) {
4819 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4820 SourceAction = SourceAction->getInputs()[0];
4821 }
4822
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004823 // Forward -g and handle debug info related flags, assuming we are dealing
4824 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004825 if (SourceAction->getType() == types::TY_Asm ||
4826 SourceAction->getType() == types::TY_PP_Asm) {
4827 Args.ClaimAllArgs(options::OPT_g_Group);
4828 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4829 if (!A->getOption().matches(options::OPT_g0))
4830 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004831
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004832 if (Args.hasArg(options::OPT_gdwarf_2))
4833 CmdArgs.push_back("-gdwarf-2");
4834 if (Args.hasArg(options::OPT_gdwarf_3))
4835 CmdArgs.push_back("-gdwarf-3");
4836 if (Args.hasArg(options::OPT_gdwarf_4))
4837 CmdArgs.push_back("-gdwarf-4");
4838
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004839 // Add the -fdebug-compilation-dir flag if needed.
4840 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004841
4842 // Set the AT_producer to the clang version when using the integrated
4843 // assembler on assembly source files.
4844 CmdArgs.push_back("-dwarf-debug-producer");
4845 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004846 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004847
4848 // Optionally embed the -cc1as level arguments into the debug info, for build
4849 // analysis.
4850 if (getToolChain().UseDwarfDebugFlags()) {
4851 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004852 for (const auto &Arg : Args)
4853 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004854
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004855 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004856 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4857 Flags += Exec;
4858 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4859 Flags += " ";
4860 Flags += OriginalArgs[i];
4861 }
4862 CmdArgs.push_back("-dwarf-debug-flags");
4863 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4864 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004865
4866 // FIXME: Add -static support, once we have it.
4867
David Blaikie372d9502014-01-17 03:17:40 +00004868 // Consume all the warning flags. Usually this would be handled more
4869 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4870 // doesn't handle that so rather than warning about unused flags that are
4871 // actually used, we'll lie by omission instead.
4872 // FIXME: Stop lying and consume only the appropriate driver flags
4873 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4874 ie = Args.filtered_end();
4875 it != ie; ++it)
4876 (*it)->claim();
4877
David Blaikie9260ed62013-07-25 21:19:01 +00004878 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4879 getToolChain().getDriver());
4880
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004881 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004882
4883 assert(Output.isFilename() && "Unexpected lipo output.");
4884 CmdArgs.push_back("-o");
4885 CmdArgs.push_back(Output.getFilename());
4886
Daniel Dunbarb440f562010-08-02 02:38:21 +00004887 assert(Input.isFilename() && "Invalid input.");
4888 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004889
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004890 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004891 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004892
4893 // Handle the debug info splitting at object creation time if we're
4894 // creating an object.
4895 // TODO: Currently only works on linux with newer objcopy.
4896 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004897 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004898 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4899 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004900}
4901
Daniel Dunbara3246a02009-03-18 08:07:30 +00004902void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004903 const InputInfo &Output,
4904 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004905 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004906 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004907 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004908 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004909
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004910 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004911 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004912 // Don't forward any -g arguments to assembly steps.
4913 if (isa<AssembleJobAction>(JA) &&
4914 A->getOption().matches(options::OPT_g_Group))
4915 continue;
4916
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004917 // Don't forward any -W arguments to assembly and link steps.
4918 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4919 A->getOption().matches(options::OPT_W_Group))
4920 continue;
4921
Daniel Dunbar2da02722009-03-19 07:55:12 +00004922 // It is unfortunate that we have to claim here, as this means
4923 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004924 // platforms using a generic gcc, even if we are just using gcc
4925 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004926 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004927 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004928 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004929 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004930
Daniel Dunbar4e295052010-01-25 22:35:08 +00004931 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004932
4933 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004934 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004935 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004936 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004937
4938 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004939 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004940 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004941 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004942 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004943 else if (Arch == llvm::Triple::ppc64le)
4944 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004945 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004946 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004947 }
4948
Daniel Dunbar5716d872009-05-02 21:41:52 +00004949 // Try to force gcc to match the tool chain we want, if we recognize
4950 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004951 //
4952 // FIXME: The triple class should directly provide the information we want
4953 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004954 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004955 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004956 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4957 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004958 CmdArgs.push_back("-m64");
4959
Daniel Dunbarb440f562010-08-02 02:38:21 +00004960 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004961 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004962 CmdArgs.push_back(Output.getFilename());
4963 } else {
4964 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004965 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004966 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004967
Tony Linthicum76329bf2011-12-12 21:14:55 +00004968 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4969 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004970
4971 // Only pass -x if gcc will understand it; otherwise hope gcc
4972 // understands the suffix correctly. The main use case this would go
4973 // wrong in is for linker inputs if they happened to have an odd
4974 // suffix; really the only way to get this to happen is a command
4975 // like '-x foobar a.c' which will treat a.c like a linker input.
4976 //
4977 // FIXME: For the linker case specifically, can we safely convert
4978 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004979 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004980 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004981 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4982 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004983 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004984 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004985 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004986 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004987 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004988 else if (II.getType() == types::TY_ModuleFile)
4989 D.Diag(diag::err_drv_no_module_support)
4990 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004991
Daniel Dunbara3246a02009-03-18 08:07:30 +00004992 if (types::canTypeBeUserSpecified(II.getType())) {
4993 CmdArgs.push_back("-x");
4994 CmdArgs.push_back(types::getTypeName(II.getType()));
4995 }
4996
Daniel Dunbarb440f562010-08-02 02:38:21 +00004997 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004998 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004999 else {
5000 const Arg &A = II.getInputArg();
5001
5002 // Reverse translate some rewritten options.
5003 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5004 CmdArgs.push_back("-lstdc++");
5005 continue;
5006 }
5007
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005008 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005009 A.render(Args, CmdArgs);
5010 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005011 }
5012
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005013 const std::string customGCCName = D.getCCCGenericGCCName();
5014 const char *GCCName;
5015 if (!customGCCName.empty())
5016 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005017 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005018 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005019 } else
5020 GCCName = "gcc";
5021
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005022 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005023 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005024 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005025}
5026
Daniel Dunbar4e295052010-01-25 22:35:08 +00005027void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5028 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005029 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005030}
5031
Daniel Dunbar4e295052010-01-25 22:35:08 +00005032void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5033 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005034 const Driver &D = getToolChain().getDriver();
5035
Daniel Dunbar4e295052010-01-25 22:35:08 +00005036 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005037 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
5038 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00005039 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005040 else {
5041 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005042 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005043 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005044
Daniel Dunbar4e295052010-01-25 22:35:08 +00005045 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005046 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005047}
5048
Daniel Dunbar4e295052010-01-25 22:35:08 +00005049void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5050 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005051 // The types are (hopefully) good enough.
5052}
5053
Tony Linthicum76329bf2011-12-12 21:14:55 +00005054// Hexagon tools start.
5055void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5056 ArgStringList &CmdArgs) const {
5057
5058}
5059void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5060 const InputInfo &Output,
5061 const InputInfoList &Inputs,
5062 const ArgList &Args,
5063 const char *LinkingOutput) const {
5064
5065 const Driver &D = getToolChain().getDriver();
5066 ArgStringList CmdArgs;
5067
5068 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005069 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005070 CmdArgs.push_back(Args.MakeArgString(MarchString));
5071
5072 RenderExtraToolArgs(JA, CmdArgs);
5073
5074 if (Output.isFilename()) {
5075 CmdArgs.push_back("-o");
5076 CmdArgs.push_back(Output.getFilename());
5077 } else {
5078 assert(Output.isNothing() && "Unexpected output");
5079 CmdArgs.push_back("-fsyntax-only");
5080 }
5081
Matthew Curtise8f80a12012-12-06 17:49:03 +00005082 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5083 if (!SmallDataThreshold.empty())
5084 CmdArgs.push_back(
5085 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005086
Matthew Curtise5df3812012-12-07 17:23:04 +00005087 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5088 options::OPT_Xassembler);
5089
Tony Linthicum76329bf2011-12-12 21:14:55 +00005090 // Only pass -x if gcc will understand it; otherwise hope gcc
5091 // understands the suffix correctly. The main use case this would go
5092 // wrong in is for linker inputs if they happened to have an odd
5093 // suffix; really the only way to get this to happen is a command
5094 // like '-x foobar a.c' which will treat a.c like a linker input.
5095 //
5096 // FIXME: For the linker case specifically, can we safely convert
5097 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005098 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005099 // Don't try to pass LLVM or AST inputs to a generic gcc.
5100 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5101 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5102 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5103 << getToolChain().getTripleString();
5104 else if (II.getType() == types::TY_AST)
5105 D.Diag(clang::diag::err_drv_no_ast_support)
5106 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005107 else if (II.getType() == types::TY_ModuleFile)
5108 D.Diag(diag::err_drv_no_module_support)
5109 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005110
5111 if (II.isFilename())
5112 CmdArgs.push_back(II.getFilename());
5113 else
5114 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5115 II.getInputArg().render(Args, CmdArgs);
5116 }
5117
5118 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005119 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005120 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005121}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005122
Tony Linthicum76329bf2011-12-12 21:14:55 +00005123void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5124 ArgStringList &CmdArgs) const {
5125 // The types are (hopefully) good enough.
5126}
5127
5128void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5129 const InputInfo &Output,
5130 const InputInfoList &Inputs,
5131 const ArgList &Args,
5132 const char *LinkingOutput) const {
5133
Matthew Curtise689b052012-12-06 15:46:07 +00005134 const toolchains::Hexagon_TC& ToolChain =
5135 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5136 const Driver &D = ToolChain.getDriver();
5137
Tony Linthicum76329bf2011-12-12 21:14:55 +00005138 ArgStringList CmdArgs;
5139
Matthew Curtise689b052012-12-06 15:46:07 +00005140 //----------------------------------------------------------------------------
5141 //
5142 //----------------------------------------------------------------------------
5143 bool hasStaticArg = Args.hasArg(options::OPT_static);
5144 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005145 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005146 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5147 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5148 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5149 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005150
Matthew Curtise689b052012-12-06 15:46:07 +00005151 //----------------------------------------------------------------------------
5152 // Silence warnings for various options
5153 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005154
Matthew Curtise689b052012-12-06 15:46:07 +00005155 Args.ClaimAllArgs(options::OPT_g_Group);
5156 Args.ClaimAllArgs(options::OPT_emit_llvm);
5157 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5158 // handled somewhere else.
5159 Args.ClaimAllArgs(options::OPT_static_libgcc);
5160
5161 //----------------------------------------------------------------------------
5162 //
5163 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005164 for (const auto &Opt : ToolChain.ExtraOpts)
5165 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005166
Matthew Curtisf10a5952012-12-06 14:16:43 +00005167 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5168 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005169
Matthew Curtise689b052012-12-06 15:46:07 +00005170 if (buildingLib) {
5171 CmdArgs.push_back("-shared");
5172 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5173 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005174 }
5175
Matthew Curtise689b052012-12-06 15:46:07 +00005176 if (hasStaticArg)
5177 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005178
Matthew Curtise8f80a12012-12-06 17:49:03 +00005179 if (buildPIE && !buildingLib)
5180 CmdArgs.push_back("-pie");
5181
5182 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5183 if (!SmallDataThreshold.empty()) {
5184 CmdArgs.push_back(
5185 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5186 }
5187
Matthew Curtise689b052012-12-06 15:46:07 +00005188 //----------------------------------------------------------------------------
5189 //
5190 //----------------------------------------------------------------------------
5191 CmdArgs.push_back("-o");
5192 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005193
Matthew Curtise689b052012-12-06 15:46:07 +00005194 const std::string MarchSuffix = "/" + MarchString;
5195 const std::string G0Suffix = "/G0";
5196 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
5197 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
5198 + "/";
5199 const std::string StartFilesDir = RootDir
5200 + "hexagon/lib"
5201 + (buildingLib
5202 ? MarchG0Suffix : MarchSuffix);
5203
5204 //----------------------------------------------------------------------------
5205 // moslib
5206 //----------------------------------------------------------------------------
5207 std::vector<std::string> oslibs;
5208 bool hasStandalone= false;
5209
5210 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5211 ie = Args.filtered_end(); it != ie; ++it) {
5212 (*it)->claim();
5213 oslibs.push_back((*it)->getValue());
5214 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005215 }
Matthew Curtise689b052012-12-06 15:46:07 +00005216 if (oslibs.empty()) {
5217 oslibs.push_back("standalone");
5218 hasStandalone = true;
5219 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005220
Matthew Curtise689b052012-12-06 15:46:07 +00005221 //----------------------------------------------------------------------------
5222 // Start Files
5223 //----------------------------------------------------------------------------
5224 if (incStdLib && incStartFiles) {
5225
5226 if (!buildingLib) {
5227 if (hasStandalone) {
5228 CmdArgs.push_back(
5229 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5230 }
5231 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5232 }
5233 std::string initObj = useShared ? "/initS.o" : "/init.o";
5234 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5235 }
5236
5237 //----------------------------------------------------------------------------
5238 // Library Search Paths
5239 //----------------------------------------------------------------------------
5240 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005241 for (const auto &LibPath : LibPaths)
5242 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005243
5244 //----------------------------------------------------------------------------
5245 //
5246 //----------------------------------------------------------------------------
5247 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5248 Args.AddAllArgs(CmdArgs, options::OPT_e);
5249 Args.AddAllArgs(CmdArgs, options::OPT_s);
5250 Args.AddAllArgs(CmdArgs, options::OPT_t);
5251 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5252
5253 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5254
5255 //----------------------------------------------------------------------------
5256 // Libraries
5257 //----------------------------------------------------------------------------
5258 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005259 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005260 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5261 CmdArgs.push_back("-lm");
5262 }
5263
5264 CmdArgs.push_back("--start-group");
5265
5266 if (!buildingLib) {
5267 for(std::vector<std::string>::iterator i = oslibs.begin(),
5268 e = oslibs.end(); i != e; ++i)
5269 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5270 CmdArgs.push_back("-lc");
5271 }
5272 CmdArgs.push_back("-lgcc");
5273
5274 CmdArgs.push_back("--end-group");
5275 }
5276
5277 //----------------------------------------------------------------------------
5278 // End files
5279 //----------------------------------------------------------------------------
5280 if (incStdLib && incStartFiles) {
5281 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5282 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5283 }
5284
5285 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005286 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005287}
5288// Hexagon tools end.
5289
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005290/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005291const char *arm::getARMCPUForMArch(const ArgList &Args,
5292 const llvm::Triple &Triple) {
5293 StringRef MArch;
5294 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5295 // Otherwise, if we have -march= choose the base CPU for that arch.
5296 MArch = A->getValue();
5297 } else {
5298 // Otherwise, use the Arch from the triple.
5299 MArch = Triple.getArchName();
5300 }
5301
5302 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005303 if (MArch == "native") {
5304 std::string CPU = llvm::sys::getHostCPUName();
5305 if (CPU != "generic") {
5306 // Translate the native cpu into the architecture. The switch below will
5307 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005308 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005309 }
5310 }
5311
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005312 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005313}
5314
5315/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005316StringRef arm::getARMTargetCPU(const ArgList &Args,
5317 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005318 // FIXME: Warn on inconsistent use of -mcpu and -march.
5319 // If we have -mcpu=, use that.
5320 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5321 StringRef MCPU = A->getValue();
5322 // Handle -mcpu=native.
5323 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005324 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005325 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005326 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005327 }
5328
5329 return getARMCPUForMArch(Args, Triple);
5330}
5331
5332/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5333/// CPU.
5334//
5335// FIXME: This is redundant with -mcpu, why does LLVM use this.
5336// FIXME: tblgen this, or kill it!
5337const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5338 return llvm::StringSwitch<const char *>(CPU)
5339 .Case("strongarm", "v4")
5340 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5341 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5342 .Cases("arm920", "arm920t", "arm922t", "v4t")
5343 .Cases("arm940t", "ep9312","v4t")
5344 .Cases("arm10tdmi", "arm1020t", "v5")
5345 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5346 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5347 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5348 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5349 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5350 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00005351 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005352 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5353 .Cases("cortex-r4", "cortex-r5", "v7r")
5354 .Case("cortex-m0", "v6m")
5355 .Case("cortex-m3", "v7m")
5356 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005357 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005358 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005359 .Cases("cortex-a53", "cortex-a57", "v8")
5360 .Default("");
5361}
5362
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005363bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5364 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5365 return A && (A->getValue() == StringRef(Value));
5366}
5367
Daniel Sanders2bf13662014-07-10 14:40:57 +00005368bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005369 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5370 return llvm::StringSwitch<bool>(NaNArg->getValue())
5371 .Case("2008", true)
5372 .Case("legacy", false)
5373 .Default(false);
5374
5375 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005376 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5377 .Cases("mips32r6", "mips64r6", true)
5378 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005379
5380 return false;
5381}
5382
Daniel Sanders379d44b2014-07-16 11:52:23 +00005383bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5384 StringRef ABIName) {
5385 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005386 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005387 return false;
5388
5389 if (ABIName != "32")
5390 return false;
5391
5392 return llvm::StringSwitch<bool>(CPUName)
5393 .Cases("mips2", "mips3", "mips4", "mips5", true)
5394 .Cases("mips32", "mips32r2", true)
5395 .Cases("mips64", "mips64r2", true)
5396 .Default(false);
5397}
5398
Tim Northover157d9112014-01-16 08:48:16 +00005399llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005400 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5401 // archs which Darwin doesn't use.
5402
5403 // The matching this routine does is fairly pointless, since it is neither the
5404 // complete architecture list, nor a reasonable subset. The problem is that
5405 // historically the driver driver accepts this and also ties its -march=
5406 // handling to the architecture name, so we need to be careful before removing
5407 // support for it.
5408
5409 // This code must be kept in sync with Clang's Darwin specific argument
5410 // translation.
5411
5412 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5413 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5414 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5415 .Case("ppc64", llvm::Triple::ppc64)
5416 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5417 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5418 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005419 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005420 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005421 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005422 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005423 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005424 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005425 .Case("r600", llvm::Triple::r600)
5426 .Case("nvptx", llvm::Triple::nvptx)
5427 .Case("nvptx64", llvm::Triple::nvptx64)
5428 .Case("amdil", llvm::Triple::amdil)
5429 .Case("spir", llvm::Triple::spir)
5430 .Default(llvm::Triple::UnknownArch);
5431}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005432
Tim Northover157d9112014-01-16 08:48:16 +00005433void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5434 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5435 T.setArch(Arch);
5436
5437 if (Str == "x86_64h")
5438 T.setArchName(Str);
5439 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5440 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005441 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005442 }
5443}
5444
Bob Wilsondecc03e2012-11-23 06:14:39 +00005445const char *Clang::getBaseInputName(const ArgList &Args,
5446 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005447 return Args.MakeArgString(
5448 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005449}
5450
Bob Wilsondecc03e2012-11-23 06:14:39 +00005451const char *Clang::getBaseInputStem(const ArgList &Args,
5452 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005453 const char *Str = getBaseInputName(Args, Inputs);
5454
Chris Lattner906bb902011-01-16 08:14:11 +00005455 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005456 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005457
5458 return Str;
5459}
5460
Bob Wilsondecc03e2012-11-23 06:14:39 +00005461const char *Clang::getDependencyFileName(const ArgList &Args,
5462 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005463 // FIXME: Think about this more.
5464 std::string Res;
5465
5466 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005467 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005468 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005469 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005470 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005471 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005472 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005473}
5474
Daniel Dunbarbe220842009-03-20 16:06:39 +00005475void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005476 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005477 const InputInfoList &Inputs,
5478 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005479 const char *LinkingOutput) const {
5480 ArgStringList CmdArgs;
5481
5482 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5483 const InputInfo &Input = Inputs[0];
5484
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005485 // Determine the original source input.
5486 const Action *SourceAction = &JA;
5487 while (SourceAction->getKind() != Action::InputClass) {
5488 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5489 SourceAction = SourceAction->getInputs()[0];
5490 }
5491
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005492 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005493 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005494 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5495 // FIXME: at run-time detect assembler capabilities or rely on version
5496 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005497 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005498 const llvm::Triple &T(getToolChain().getTriple());
5499 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005500 CmdArgs.push_back("-Q");
5501 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005502
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005503 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005504 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005505 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005506 if (Args.hasArg(options::OPT_gstabs))
5507 CmdArgs.push_back("--gstabs");
5508 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005509 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005510 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005511
Daniel Dunbarbe220842009-03-20 16:06:39 +00005512 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005513 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005514
Daniel Dunbar6d484762010-07-22 01:47:22 +00005515 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005516 if (getToolChain().getArch() == llvm::Triple::x86 ||
5517 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005518 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5519 CmdArgs.push_back("-force_cpusubtype_ALL");
5520
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005521 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005522 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005523 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005524 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005525 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005526 CmdArgs.push_back("-static");
5527
Daniel Dunbarbe220842009-03-20 16:06:39 +00005528 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5529 options::OPT_Xassembler);
5530
5531 assert(Output.isFilename() && "Unexpected lipo output.");
5532 CmdArgs.push_back("-o");
5533 CmdArgs.push_back(Output.getFilename());
5534
Daniel Dunbarb440f562010-08-02 02:38:21 +00005535 assert(Input.isFilename() && "Invalid input.");
5536 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005537
5538 // asm_final spec is empty.
5539
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005540 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005541 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005542 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005543}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005544
Tim Northover157d9112014-01-16 08:48:16 +00005545void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005546
Tim Northover157d9112014-01-16 08:48:16 +00005547void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5548 ArgStringList &CmdArgs) const {
5549 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005550
Daniel Dunbarc1964212009-03-26 16:23:12 +00005551 // Derived from darwin_arch spec.
5552 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005553 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005554
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005555 // FIXME: Is this needed anymore?
5556 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005557 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005558}
5559
Bill Wendling3b2000f2012-10-02 18:02:50 +00005560bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5561 // We only need to generate a temp path for LTO if we aren't compiling object
5562 // files. When compiling source files, we run 'dsymutil' after linking. We
5563 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005564 for (const auto &Input : Inputs)
5565 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005566 return true;
5567
5568 return false;
5569}
5570
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005571void darwin::Link::AddLinkArgs(Compilation &C,
5572 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005573 ArgStringList &CmdArgs,
5574 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005575 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005576 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005577
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005578 unsigned Version[3] = { 0, 0, 0 };
5579 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5580 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005581 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005582 Version[1], Version[2], HadExtra) ||
5583 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005584 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005585 << A->getAsString(Args);
5586 }
5587
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005588 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005589 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005590 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5591 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005592
Bob Wilson3d27dad2013-08-02 22:25:34 +00005593 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5594 CmdArgs.push_back("-export_dynamic");
5595
Bill Wendling313b6bf2012-11-16 23:03:00 +00005596 // If we are using LTO, then automatically create a temporary file path for
5597 // the linker to use, so that it's lifetime will extend past a possible
5598 // dsymutil step.
5599 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5600 const char *TmpPath = C.getArgs().MakeArgString(
5601 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5602 C.addTempFile(TmpPath);
5603 CmdArgs.push_back("-object_path_lto");
5604 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005605 }
5606
Daniel Dunbarc1964212009-03-26 16:23:12 +00005607 // Derived from the "link" spec.
5608 Args.AddAllArgs(CmdArgs, options::OPT_static);
5609 if (!Args.hasArg(options::OPT_static))
5610 CmdArgs.push_back("-dynamic");
5611 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5612 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5613 // here. How do we wish to handle such things?
5614 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005615
Daniel Dunbarc1964212009-03-26 16:23:12 +00005616 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005617 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005618 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005619 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005620
5621 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5622 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5623 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5624
5625 Arg *A;
5626 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5627 (A = Args.getLastArg(options::OPT_current__version)) ||
5628 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005629 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005630 << A->getAsString(Args) << "-dynamiclib";
5631
5632 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5633 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5634 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5635 } else {
5636 CmdArgs.push_back("-dylib");
5637
5638 Arg *A;
5639 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5640 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5641 (A = Args.getLastArg(options::OPT_client__name)) ||
5642 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5643 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5644 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005645 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005646 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005647
Daniel Dunbarc1964212009-03-26 16:23:12 +00005648 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5649 "-dylib_compatibility_version");
5650 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5651 "-dylib_current_version");
5652
Tim Northover157d9112014-01-16 08:48:16 +00005653 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005654
5655 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5656 "-dylib_install_name");
5657 }
5658
5659 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5660 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5661 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005662 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005663 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005664 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5665 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5666 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5667 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5668 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5669 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005670 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005671 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5672 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5673 Args.AddAllArgs(CmdArgs, options::OPT_init);
5674
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005675 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005676 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005677
Daniel Dunbarc1964212009-03-26 16:23:12 +00005678 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5679 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5680 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5681 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5682 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005683
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005684 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5685 options::OPT_fno_pie,
5686 options::OPT_fno_PIE)) {
5687 if (A->getOption().matches(options::OPT_fpie) ||
5688 A->getOption().matches(options::OPT_fPIE))
5689 CmdArgs.push_back("-pie");
5690 else
5691 CmdArgs.push_back("-no_pie");
5692 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005693
5694 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5695 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5696 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5697 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5698 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5699 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5700 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5701 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5702 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5703 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5704 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5705 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5706 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5707 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5708 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5709 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005710
Daniel Dunbar84384642011-05-02 21:03:47 +00005711 // Give --sysroot= preference, over the Apple specific behavior to also use
5712 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005713 StringRef sysroot = C.getSysRoot();
5714 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005715 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005716 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005717 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5718 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005719 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005720 }
5721
Daniel Dunbarc1964212009-03-26 16:23:12 +00005722 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5723 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5724 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5725 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5726 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005727 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005728 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5729 Args.AddAllArgs(CmdArgs, options::OPT_y);
5730 Args.AddLastArg(CmdArgs, options::OPT_w);
5731 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5732 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5733 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5734 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5735 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5736 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5737 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5738 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5739 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5740 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5741 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5742 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5743}
5744
Alexey Bataev186b28a2014-03-06 05:43:53 +00005745enum LibOpenMP {
5746 LibUnknown,
5747 LibGOMP,
5748 LibIOMP5
5749};
5750
Daniel Dunbarc1964212009-03-26 16:23:12 +00005751void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005752 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005753 const InputInfoList &Inputs,
5754 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005755 const char *LinkingOutput) const {
5756 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005757
Daniel Dunbarc1964212009-03-26 16:23:12 +00005758 // The logic here is derived from gcc's behavior; most of which
5759 // comes from specs (starting with link_command). Consult gcc for
5760 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005761 ArgStringList CmdArgs;
5762
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005763 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5764 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5765 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005766 for (const auto &Arg : Args)
5767 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005768 const char *Exec =
5769 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5770 CmdArgs.push_back(Output.getFilename());
5771 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5772 return;
5773 }
5774
Daniel Dunbarc1964212009-03-26 16:23:12 +00005775 // I'm not sure why this particular decomposition exists in gcc, but
5776 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005777 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005778
Daniel Dunbarc1964212009-03-26 16:23:12 +00005779 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5780 Args.AddAllArgs(CmdArgs, options::OPT_s);
5781 Args.AddAllArgs(CmdArgs, options::OPT_t);
5782 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5783 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005784 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005785 Args.AddAllArgs(CmdArgs, options::OPT_r);
5786
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005787 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5788 // members of static archive libraries which implement Objective-C classes or
5789 // categories.
5790 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5791 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005792
Daniel Dunbarc1964212009-03-26 16:23:12 +00005793 CmdArgs.push_back("-o");
5794 CmdArgs.push_back(Output.getFilename());
5795
Chad Rosier06fd3c62012-05-16 23:45:12 +00005796 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005797 !Args.hasArg(options::OPT_nostartfiles))
5798 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005799
5800 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005801
Alexey Bataev186b28a2014-03-06 05:43:53 +00005802 LibOpenMP UsedOpenMPLib = LibUnknown;
5803 if (Args.hasArg(options::OPT_fopenmp)) {
5804 UsedOpenMPLib = LibGOMP;
5805 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5806 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5807 .Case("libgomp", LibGOMP)
5808 .Case("libiomp5", LibIOMP5)
5809 .Default(LibUnknown);
5810 if (UsedOpenMPLib == LibUnknown)
5811 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5812 << A->getOption().getName() << A->getValue();
5813 }
5814 switch (UsedOpenMPLib) {
5815 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005816 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005817 break;
5818 case LibIOMP5:
5819 CmdArgs.push_back("-liomp5");
5820 break;
5821 case LibUnknown:
5822 break;
5823 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005824
Douglas Gregor9295df02012-05-15 21:00:27 +00005825 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5826
Bob Wilson16d93952012-05-15 18:57:39 +00005827 if (isObjCRuntimeLinked(Args) &&
5828 !Args.hasArg(options::OPT_nostdlib) &&
5829 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005830 // We use arclite library for both ARC and subscripting support.
5831 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5832
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005833 CmdArgs.push_back("-framework");
5834 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005835 // Link libobj.
5836 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005837 }
John McCall31168b02011-06-15 23:02:42 +00005838
Daniel Dunbarc1964212009-03-26 16:23:12 +00005839 if (LinkingOutput) {
5840 CmdArgs.push_back("-arch_multiple");
5841 CmdArgs.push_back("-final_output");
5842 CmdArgs.push_back(LinkingOutput);
5843 }
5844
Daniel Dunbarc1964212009-03-26 16:23:12 +00005845 if (Args.hasArg(options::OPT_fnested_functions))
5846 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005847
Daniel Dunbarc1964212009-03-26 16:23:12 +00005848 if (!Args.hasArg(options::OPT_nostdlib) &&
5849 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005850 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005851 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005852
Daniel Dunbarc1964212009-03-26 16:23:12 +00005853 // link_ssp spec is empty.
5854
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005855 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005856 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005857 }
5858
Chad Rosier06fd3c62012-05-16 23:45:12 +00005859 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005860 !Args.hasArg(options::OPT_nostartfiles)) {
5861 // endfile_spec is empty.
5862 }
5863
5864 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5865 Args.AddAllArgs(CmdArgs, options::OPT_F);
5866
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005867 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00005868 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005869 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005870}
5871
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005872void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005873 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005874 const InputInfoList &Inputs,
5875 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005876 const char *LinkingOutput) const {
5877 ArgStringList CmdArgs;
5878
5879 CmdArgs.push_back("-create");
5880 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005881
5882 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005883 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005884
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005885 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005886 assert(II.isFilename() && "Unexpected lipo input.");
5887 CmdArgs.push_back(II.getFilename());
5888 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005889
5890 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005891 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005892}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005893
Daniel Dunbar88299622010-06-04 18:28:36 +00005894void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005895 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005896 const InputInfoList &Inputs,
5897 const ArgList &Args,
5898 const char *LinkingOutput) const {
5899 ArgStringList CmdArgs;
5900
Daniel Dunbareb86b042011-05-09 17:23:16 +00005901 CmdArgs.push_back("-o");
5902 CmdArgs.push_back(Output.getFilename());
5903
Daniel Dunbar88299622010-06-04 18:28:36 +00005904 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5905 const InputInfo &Input = Inputs[0];
5906 assert(Input.isFilename() && "Unexpected dsymutil input.");
5907 CmdArgs.push_back(Input.getFilename());
5908
Daniel Dunbar88299622010-06-04 18:28:36 +00005909 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005910 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005911 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005912}
5913
Eric Christopher551ef452011-08-23 17:56:55 +00005914void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005915 const InputInfo &Output,
5916 const InputInfoList &Inputs,
5917 const ArgList &Args,
5918 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005919 ArgStringList CmdArgs;
5920 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005921 CmdArgs.push_back("--debug-info");
5922 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005923 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005924
5925 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5926 const InputInfo &Input = Inputs[0];
5927 assert(Input.isFilename() && "Unexpected verify input");
5928
5929 // Grabbing the output of the earlier dsymutil run.
5930 CmdArgs.push_back(Input.getFilename());
5931
5932 const char *Exec =
5933 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5934 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5935}
5936
David Chisnallf571cde2012-02-15 13:39:01 +00005937void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5938 const InputInfo &Output,
5939 const InputInfoList &Inputs,
5940 const ArgList &Args,
5941 const char *LinkingOutput) const {
5942 ArgStringList CmdArgs;
5943
5944 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5945 options::OPT_Xassembler);
5946
5947 CmdArgs.push_back("-o");
5948 CmdArgs.push_back(Output.getFilename());
5949
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005950 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00005951 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00005952
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005953 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Chisnallf571cde2012-02-15 13:39:01 +00005954 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5955}
5956
David Chisnallf571cde2012-02-15 13:39:01 +00005957void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5958 const InputInfo &Output,
5959 const InputInfoList &Inputs,
5960 const ArgList &Args,
5961 const char *LinkingOutput) const {
5962 // FIXME: Find a real GCC, don't hard-code versions here
5963 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5964 const llvm::Triple &T = getToolChain().getTriple();
5965 std::string LibPath = "/usr/lib/";
5966 llvm::Triple::ArchType Arch = T.getArch();
5967 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005968 case llvm::Triple::x86:
5969 GCCLibPath +=
5970 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5971 break;
5972 case llvm::Triple::x86_64:
5973 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5974 GCCLibPath += "/4.5.2/amd64/";
5975 LibPath += "amd64/";
5976 break;
5977 default:
5978 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005979 }
5980
5981 ArgStringList CmdArgs;
5982
David Chisnall272a0712012-02-29 15:06:12 +00005983 // Demangle C++ names in errors
5984 CmdArgs.push_back("-C");
5985
David Chisnallf571cde2012-02-15 13:39:01 +00005986 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5987 (!Args.hasArg(options::OPT_shared))) {
5988 CmdArgs.push_back("-e");
5989 CmdArgs.push_back("_start");
5990 }
5991
5992 if (Args.hasArg(options::OPT_static)) {
5993 CmdArgs.push_back("-Bstatic");
5994 CmdArgs.push_back("-dn");
5995 } else {
5996 CmdArgs.push_back("-Bdynamic");
5997 if (Args.hasArg(options::OPT_shared)) {
5998 CmdArgs.push_back("-shared");
5999 } else {
6000 CmdArgs.push_back("--dynamic-linker");
6001 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6002 }
6003 }
6004
6005 if (Output.isFilename()) {
6006 CmdArgs.push_back("-o");
6007 CmdArgs.push_back(Output.getFilename());
6008 } else {
6009 assert(Output.isNothing() && "Invalid output.");
6010 }
6011
6012 if (!Args.hasArg(options::OPT_nostdlib) &&
6013 !Args.hasArg(options::OPT_nostartfiles)) {
6014 if (!Args.hasArg(options::OPT_shared)) {
6015 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6016 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006017 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006018 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6019 } else {
6020 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006021 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6022 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006023 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006024 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006025 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006026 }
6027
6028 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6029
6030 Args.AddAllArgs(CmdArgs, options::OPT_L);
6031 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6032 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006033 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006034
6035 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6036
6037 if (!Args.hasArg(options::OPT_nostdlib) &&
6038 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006039 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006040 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006041 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006042 if (!Args.hasArg(options::OPT_shared)) {
6043 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006044 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006045 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006046 }
David Chisnallf571cde2012-02-15 13:39:01 +00006047 }
6048
6049 if (!Args.hasArg(options::OPT_nostdlib) &&
6050 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006051 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006052 }
David Chisnall96de9932012-02-16 16:00:47 +00006053 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006054
Alexey Samsonov7811d192014-02-20 13:57:37 +00006055 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006056
6057 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006058 Args.MakeArgString(getToolChain().GetLinkerPath());
David Chisnallf571cde2012-02-15 13:39:01 +00006059 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6060}
6061
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006062void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006063 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006064 const InputInfoList &Inputs,
6065 const ArgList &Args,
6066 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006067 ArgStringList CmdArgs;
6068
6069 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6070 options::OPT_Xassembler);
6071
6072 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006073 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006074
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006075 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006076 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006077
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006078 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006079 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006080}
6081
6082void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006083 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006084 const InputInfoList &Inputs,
6085 const ArgList &Args,
6086 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006087 ArgStringList CmdArgs;
6088
6089 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006090 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006091 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006092 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006093 }
6094
6095 if (Args.hasArg(options::OPT_static)) {
6096 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006097 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006098 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00006099// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006100 CmdArgs.push_back("-Bdynamic");
6101 if (Args.hasArg(options::OPT_shared)) {
6102 CmdArgs.push_back("-shared");
6103 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00006104 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006105 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
6106 }
6107 }
6108
Daniel Dunbarb440f562010-08-02 02:38:21 +00006109 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006110 CmdArgs.push_back("-o");
6111 CmdArgs.push_back(Output.getFilename());
6112 } else {
6113 assert(Output.isNothing() && "Invalid output.");
6114 }
6115
6116 if (!Args.hasArg(options::OPT_nostdlib) &&
6117 !Args.hasArg(options::OPT_nostartfiles)) {
6118 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006119 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006120 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006121 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006122 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006123 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006124 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006125 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006126 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006127 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006128 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006129 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006130 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006131 }
6132
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006133 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
6134 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006135 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006136
6137 Args.AddAllArgs(CmdArgs, options::OPT_L);
6138 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6139 Args.AddAllArgs(CmdArgs, options::OPT_e);
6140
Daniel Dunbar54423b22010-09-17 00:24:54 +00006141 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006142
6143 if (!Args.hasArg(options::OPT_nostdlib) &&
6144 !Args.hasArg(options::OPT_nodefaultlibs)) {
6145 // FIXME: For some reason GCC passes -lgcc before adding
6146 // the default system libraries. Just mimic this for now.
6147 CmdArgs.push_back("-lgcc");
6148
6149 if (Args.hasArg(options::OPT_pthread))
6150 CmdArgs.push_back("-pthread");
6151 if (!Args.hasArg(options::OPT_shared))
6152 CmdArgs.push_back("-lc");
6153 CmdArgs.push_back("-lgcc");
6154 }
6155
6156 if (!Args.hasArg(options::OPT_nostdlib) &&
6157 !Args.hasArg(options::OPT_nostartfiles)) {
6158 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006159 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006160 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006161 }
6162
Alexey Samsonov7811d192014-02-20 13:57:37 +00006163 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006164
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006165 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006166 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006167 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00006168}
6169
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006170void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006171 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006172 const InputInfoList &Inputs,
6173 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006174 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006175 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006176 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006177
Rafael Espindolacc126272014-02-28 01:55:21 +00006178 switch (getToolChain().getArch()) {
6179 case llvm::Triple::x86:
6180 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6181 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006182 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006183 break;
6184
6185 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006186 CmdArgs.push_back("-mppc");
6187 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006188 break;
6189
6190 case llvm::Triple::sparc:
6191 CmdArgs.push_back("-32");
6192 NeedsKPIC = true;
6193 break;
6194
6195 case llvm::Triple::sparcv9:
6196 CmdArgs.push_back("-64");
6197 CmdArgs.push_back("-Av9a");
6198 NeedsKPIC = true;
6199 break;
6200
6201 case llvm::Triple::mips64:
6202 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006203 StringRef CPUName;
6204 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006205 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006206
6207 CmdArgs.push_back("-mabi");
6208 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6209
6210 if (getToolChain().getArch() == llvm::Triple::mips64)
6211 CmdArgs.push_back("-EB");
6212 else
6213 CmdArgs.push_back("-EL");
6214
Rafael Espindolacc126272014-02-28 01:55:21 +00006215 NeedsKPIC = true;
6216 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006217 }
6218
Rafael Espindolacc126272014-02-28 01:55:21 +00006219 default:
6220 break;
6221 }
6222
6223 if (NeedsKPIC)
6224 addAssemblerKPIC(Args, CmdArgs);
6225
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6227 options::OPT_Xassembler);
6228
6229 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006230 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006231
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006232 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006233 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006234
6235 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006236 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006237 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006238}
6239
6240void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006241 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006242 const InputInfoList &Inputs,
6243 const ArgList &Args,
6244 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006245 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006246 ArgStringList CmdArgs;
6247
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006248 // Silence warning for "clang -g foo.o -o foo"
6249 Args.ClaimAllArgs(options::OPT_g_Group);
6250 // and "clang -emit-llvm foo.o -o foo"
6251 Args.ClaimAllArgs(options::OPT_emit_llvm);
6252 // and for "clang -w foo.o -o foo". Other warning options are already
6253 // handled somewhere else.
6254 Args.ClaimAllArgs(options::OPT_w);
6255
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006256 if (getToolChain().getArch() == llvm::Triple::mips64)
6257 CmdArgs.push_back("-EB");
6258 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6259 CmdArgs.push_back("-EL");
6260
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006261 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006262 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006263 CmdArgs.push_back("-e");
6264 CmdArgs.push_back("__start");
6265 }
6266
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006267 if (Args.hasArg(options::OPT_static)) {
6268 CmdArgs.push_back("-Bstatic");
6269 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006270 if (Args.hasArg(options::OPT_rdynamic))
6271 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006272 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006273 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006274 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006275 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006276 } else {
6277 CmdArgs.push_back("-dynamic-linker");
6278 CmdArgs.push_back("/usr/libexec/ld.so");
6279 }
6280 }
6281
Rafael Espindola044f7832013-06-05 04:28:55 +00006282 if (Args.hasArg(options::OPT_nopie))
6283 CmdArgs.push_back("-nopie");
6284
Daniel Dunbarb440f562010-08-02 02:38:21 +00006285 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006286 CmdArgs.push_back("-o");
6287 CmdArgs.push_back(Output.getFilename());
6288 } else {
6289 assert(Output.isNothing() && "Invalid output.");
6290 }
6291
6292 if (!Args.hasArg(options::OPT_nostdlib) &&
6293 !Args.hasArg(options::OPT_nostartfiles)) {
6294 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006295 if (Args.hasArg(options::OPT_pg))
6296 CmdArgs.push_back(Args.MakeArgString(
6297 getToolChain().GetFilePath("gcrt0.o")));
6298 else
6299 CmdArgs.push_back(Args.MakeArgString(
6300 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006301 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006302 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006303 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006304 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006305 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006306 }
6307 }
6308
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006309 std::string Triple = getToolChain().getTripleString();
6310 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006311 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006312 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006313 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006314
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006315 Args.AddAllArgs(CmdArgs, options::OPT_L);
6316 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6317 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006318 Args.AddAllArgs(CmdArgs, options::OPT_s);
6319 Args.AddAllArgs(CmdArgs, options::OPT_t);
6320 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6321 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006322
Daniel Dunbar54423b22010-09-17 00:24:54 +00006323 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006324
6325 if (!Args.hasArg(options::OPT_nostdlib) &&
6326 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006327 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006328 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006329 if (Args.hasArg(options::OPT_pg))
6330 CmdArgs.push_back("-lm_p");
6331 else
6332 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006333 }
6334
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006335 // FIXME: For some reason GCC passes -lgcc before adding
6336 // the default system libraries. Just mimic this for now.
6337 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006338
Eric Christopher17674ec2012-09-13 06:32:34 +00006339 if (Args.hasArg(options::OPT_pthread)) {
6340 if (!Args.hasArg(options::OPT_shared) &&
6341 Args.hasArg(options::OPT_pg))
6342 CmdArgs.push_back("-lpthread_p");
6343 else
6344 CmdArgs.push_back("-lpthread");
6345 }
6346
Chandler Carruth45661652011-12-17 22:32:42 +00006347 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006348 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006349 CmdArgs.push_back("-lc_p");
6350 else
6351 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006352 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006353
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006354 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006355 }
6356
6357 if (!Args.hasArg(options::OPT_nostdlib) &&
6358 !Args.hasArg(options::OPT_nostartfiles)) {
6359 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006360 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006361 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006362 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006363 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006364 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006365 }
6366
6367 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006368 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006369 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006370}
Ed Schoutene33194b2009-04-02 19:13:12 +00006371
Eli Friedman9fa28852012-08-08 23:57:20 +00006372void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6373 const InputInfo &Output,
6374 const InputInfoList &Inputs,
6375 const ArgList &Args,
6376 const char *LinkingOutput) const {
6377 ArgStringList CmdArgs;
6378
6379 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6380 options::OPT_Xassembler);
6381
6382 CmdArgs.push_back("-o");
6383 CmdArgs.push_back(Output.getFilename());
6384
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006385 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006386 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006387
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006388 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Eli Friedman9fa28852012-08-08 23:57:20 +00006389 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6390}
6391
6392void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6393 const InputInfo &Output,
6394 const InputInfoList &Inputs,
6395 const ArgList &Args,
6396 const char *LinkingOutput) const {
6397 const Driver &D = getToolChain().getDriver();
6398 ArgStringList CmdArgs;
6399
6400 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6401 (!Args.hasArg(options::OPT_shared))) {
6402 CmdArgs.push_back("-e");
6403 CmdArgs.push_back("__start");
6404 }
6405
6406 if (Args.hasArg(options::OPT_static)) {
6407 CmdArgs.push_back("-Bstatic");
6408 } else {
6409 if (Args.hasArg(options::OPT_rdynamic))
6410 CmdArgs.push_back("-export-dynamic");
6411 CmdArgs.push_back("--eh-frame-hdr");
6412 CmdArgs.push_back("-Bdynamic");
6413 if (Args.hasArg(options::OPT_shared)) {
6414 CmdArgs.push_back("-shared");
6415 } else {
6416 CmdArgs.push_back("-dynamic-linker");
6417 CmdArgs.push_back("/usr/libexec/ld.so");
6418 }
6419 }
6420
6421 if (Output.isFilename()) {
6422 CmdArgs.push_back("-o");
6423 CmdArgs.push_back(Output.getFilename());
6424 } else {
6425 assert(Output.isNothing() && "Invalid output.");
6426 }
6427
6428 if (!Args.hasArg(options::OPT_nostdlib) &&
6429 !Args.hasArg(options::OPT_nostartfiles)) {
6430 if (!Args.hasArg(options::OPT_shared)) {
6431 if (Args.hasArg(options::OPT_pg))
6432 CmdArgs.push_back(Args.MakeArgString(
6433 getToolChain().GetFilePath("gcrt0.o")));
6434 else
6435 CmdArgs.push_back(Args.MakeArgString(
6436 getToolChain().GetFilePath("crt0.o")));
6437 CmdArgs.push_back(Args.MakeArgString(
6438 getToolChain().GetFilePath("crtbegin.o")));
6439 } else {
6440 CmdArgs.push_back(Args.MakeArgString(
6441 getToolChain().GetFilePath("crtbeginS.o")));
6442 }
6443 }
6444
6445 Args.AddAllArgs(CmdArgs, options::OPT_L);
6446 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6447 Args.AddAllArgs(CmdArgs, options::OPT_e);
6448
6449 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6450
6451 if (!Args.hasArg(options::OPT_nostdlib) &&
6452 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006453 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006454 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6455 if (Args.hasArg(options::OPT_pg))
6456 CmdArgs.push_back("-lm_p");
6457 else
6458 CmdArgs.push_back("-lm");
6459 }
6460
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006461 if (Args.hasArg(options::OPT_pthread)) {
6462 if (!Args.hasArg(options::OPT_shared) &&
6463 Args.hasArg(options::OPT_pg))
6464 CmdArgs.push_back("-lpthread_p");
6465 else
6466 CmdArgs.push_back("-lpthread");
6467 }
6468
Eli Friedman9fa28852012-08-08 23:57:20 +00006469 if (!Args.hasArg(options::OPT_shared)) {
6470 if (Args.hasArg(options::OPT_pg))
6471 CmdArgs.push_back("-lc_p");
6472 else
6473 CmdArgs.push_back("-lc");
6474 }
6475
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006476 StringRef MyArch;
6477 switch (getToolChain().getTriple().getArch()) {
6478 case llvm::Triple::arm:
6479 MyArch = "arm";
6480 break;
6481 case llvm::Triple::x86:
6482 MyArch = "i386";
6483 break;
6484 case llvm::Triple::x86_64:
6485 MyArch = "amd64";
6486 break;
6487 default:
6488 llvm_unreachable("Unsupported architecture");
6489 }
6490 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006491 }
6492
6493 if (!Args.hasArg(options::OPT_nostdlib) &&
6494 !Args.hasArg(options::OPT_nostartfiles)) {
6495 if (!Args.hasArg(options::OPT_shared))
6496 CmdArgs.push_back(Args.MakeArgString(
6497 getToolChain().GetFilePath("crtend.o")));
6498 else
6499 CmdArgs.push_back(Args.MakeArgString(
6500 getToolChain().GetFilePath("crtendS.o")));
6501 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006502
6503 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006504 Args.MakeArgString(getToolChain().GetLinkerPath());
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006505 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006506}
6507
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006508void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006509 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006510 const InputInfoList &Inputs,
6511 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006512 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006513 ArgStringList CmdArgs;
6514
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006515 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6516 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006517 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006518 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006519 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006520 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006521 else if (getToolChain().getArch() == llvm::Triple::mips ||
6522 getToolChain().getArch() == llvm::Triple::mipsel ||
6523 getToolChain().getArch() == llvm::Triple::mips64 ||
6524 getToolChain().getArch() == llvm::Triple::mips64el) {
6525 StringRef CPUName;
6526 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006527 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006528
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006529 CmdArgs.push_back("-march");
6530 CmdArgs.push_back(CPUName.data());
6531
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006532 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006533 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006534
6535 if (getToolChain().getArch() == llvm::Triple::mips ||
6536 getToolChain().getArch() == llvm::Triple::mips64)
6537 CmdArgs.push_back("-EB");
6538 else
6539 CmdArgs.push_back("-EL");
6540
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006541 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006542 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006543 getToolChain().getArch() == llvm::Triple::armeb ||
6544 getToolChain().getArch() == llvm::Triple::thumb ||
6545 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006546 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006547 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006548 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6549
6550 if (FloatABI == "hard") {
6551 CmdArgs.push_back("-mfpu=vfp");
6552 } else {
6553 CmdArgs.push_back("-mfpu=softvfp");
6554 }
6555
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006556 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006557 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006558 case llvm::Triple::GNUEABI:
6559 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006560 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006561 break;
6562
6563 default:
6564 CmdArgs.push_back("-matpcs");
6565 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006566 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006567 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006568 if (getToolChain().getArch() == llvm::Triple::sparc)
6569 CmdArgs.push_back("-Av8plusa");
6570 else
6571 CmdArgs.push_back("-Av9a");
6572
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006573 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006574 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006575
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006576 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6577 options::OPT_Xassembler);
6578
6579 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006580 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006582 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006583 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006584
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006585 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006586 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006587}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006588
6589void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006590 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006591 const InputInfoList &Inputs,
6592 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006593 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006594 const toolchains::FreeBSD& ToolChain =
6595 static_cast<const toolchains::FreeBSD&>(getToolChain());
6596 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006597 const bool IsPIE =
6598 !Args.hasArg(options::OPT_shared) &&
6599 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006600 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006601
6602 // Silence warning for "clang -g foo.o -o foo"
6603 Args.ClaimAllArgs(options::OPT_g_Group);
6604 // and "clang -emit-llvm foo.o -o foo"
6605 Args.ClaimAllArgs(options::OPT_emit_llvm);
6606 // and for "clang -w foo.o -o foo". Other warning options are already
6607 // handled somewhere else.
6608 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006609
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006610 if (!D.SysRoot.empty())
6611 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6612
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006613 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006614 CmdArgs.push_back("-pie");
6615
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006616 if (Args.hasArg(options::OPT_static)) {
6617 CmdArgs.push_back("-Bstatic");
6618 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006619 if (Args.hasArg(options::OPT_rdynamic))
6620 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006621 CmdArgs.push_back("--eh-frame-hdr");
6622 if (Args.hasArg(options::OPT_shared)) {
6623 CmdArgs.push_back("-Bshareable");
6624 } else {
6625 CmdArgs.push_back("-dynamic-linker");
6626 CmdArgs.push_back("/libexec/ld-elf.so.1");
6627 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006628 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6629 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006630 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6631 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6632 CmdArgs.push_back("--hash-style=both");
6633 }
6634 }
6635 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006636 }
6637
6638 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6639 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006640 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006641 CmdArgs.push_back("-m");
6642 CmdArgs.push_back("elf_i386_fbsd");
6643 }
6644
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006645 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006646 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006647 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006648 }
6649
Daniel Dunbarb440f562010-08-02 02:38:21 +00006650 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006651 CmdArgs.push_back("-o");
6652 CmdArgs.push_back(Output.getFilename());
6653 } else {
6654 assert(Output.isNothing() && "Invalid output.");
6655 }
6656
6657 if (!Args.hasArg(options::OPT_nostdlib) &&
6658 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006659 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006660 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006661 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006662 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006663 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006664 crt1 = "Scrt1.o";
6665 else
6666 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006667 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006668 if (crt1)
6669 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6670
6671 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6672
Craig Topper92fc2df2014-05-17 16:56:41 +00006673 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006674 if (Args.hasArg(options::OPT_static))
6675 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006676 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006677 crtbegin = "crtbeginS.o";
6678 else
6679 crtbegin = "crtbegin.o";
6680
6681 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006682 }
6683
6684 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006685 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006686 for (const auto &Path : Paths)
6687 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006688 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6689 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006690 Args.AddAllArgs(CmdArgs, options::OPT_s);
6691 Args.AddAllArgs(CmdArgs, options::OPT_t);
6692 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6693 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006694
Alp Tokerce365ca2013-12-02 12:43:03 +00006695 if (D.IsUsingLTO(Args))
6696 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006697
Roman Divackyafe2f232012-08-28 15:09:03 +00006698 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006699
6700 if (!Args.hasArg(options::OPT_nostdlib) &&
6701 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006702 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006703 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006704 if (Args.hasArg(options::OPT_pg))
6705 CmdArgs.push_back("-lm_p");
6706 else
6707 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006708 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006709 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6710 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006711 if (Args.hasArg(options::OPT_pg))
6712 CmdArgs.push_back("-lgcc_p");
6713 else
6714 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006715 if (Args.hasArg(options::OPT_static)) {
6716 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006717 } else if (Args.hasArg(options::OPT_pg)) {
6718 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006719 } else {
6720 CmdArgs.push_back("--as-needed");
6721 CmdArgs.push_back("-lgcc_s");
6722 CmdArgs.push_back("--no-as-needed");
6723 }
6724
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006725 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006726 if (Args.hasArg(options::OPT_pg))
6727 CmdArgs.push_back("-lpthread_p");
6728 else
6729 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006730 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006731
Roman Divacky66f22762011-02-10 16:59:40 +00006732 if (Args.hasArg(options::OPT_pg)) {
6733 if (Args.hasArg(options::OPT_shared))
6734 CmdArgs.push_back("-lc");
6735 else
6736 CmdArgs.push_back("-lc_p");
6737 CmdArgs.push_back("-lgcc_p");
6738 } else {
6739 CmdArgs.push_back("-lc");
6740 CmdArgs.push_back("-lgcc");
6741 }
6742
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006743 if (Args.hasArg(options::OPT_static)) {
6744 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006745 } else if (Args.hasArg(options::OPT_pg)) {
6746 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006747 } else {
6748 CmdArgs.push_back("--as-needed");
6749 CmdArgs.push_back("-lgcc_s");
6750 CmdArgs.push_back("--no-as-needed");
6751 }
6752 }
6753
6754 if (!Args.hasArg(options::OPT_nostdlib) &&
6755 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006756 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006757 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006758 else
6759 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006760 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006761 }
6762
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006763 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6764
Alexey Samsonov7811d192014-02-20 13:57:37 +00006765 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006766
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006767 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006768 Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006769 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006770}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006771
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006772void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6773 const InputInfo &Output,
6774 const InputInfoList &Inputs,
6775 const ArgList &Args,
6776 const char *LinkingOutput) const {
6777 ArgStringList CmdArgs;
6778
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006779 // GNU as needs different flags for creating the correct output format
6780 // on architectures with different ABIs or optional feature sets.
6781 switch (getToolChain().getArch()) {
6782 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006783 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006784 break;
6785 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006786 case llvm::Triple::armeb:
6787 case llvm::Triple::thumb:
6788 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006789 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006790 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006791 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006792 }
6793
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006794 case llvm::Triple::mips:
6795 case llvm::Triple::mipsel:
6796 case llvm::Triple::mips64:
6797 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006798 StringRef CPUName;
6799 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006800 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006801
6802 CmdArgs.push_back("-march");
6803 CmdArgs.push_back(CPUName.data());
6804
6805 CmdArgs.push_back("-mabi");
6806 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6807
6808 if (getToolChain().getArch() == llvm::Triple::mips ||
6809 getToolChain().getArch() == llvm::Triple::mips64)
6810 CmdArgs.push_back("-EB");
6811 else
6812 CmdArgs.push_back("-EL");
6813
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006814 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006815 break;
6816 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006817
6818 case llvm::Triple::sparc:
6819 CmdArgs.push_back("-32");
6820 addAssemblerKPIC(Args, CmdArgs);
6821 break;
6822
6823 case llvm::Triple::sparcv9:
6824 CmdArgs.push_back("-64");
6825 CmdArgs.push_back("-Av9");
6826 addAssemblerKPIC(Args, CmdArgs);
6827 break;
6828
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006829 default:
6830 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006831 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006832
6833 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6834 options::OPT_Xassembler);
6835
6836 CmdArgs.push_back("-o");
6837 CmdArgs.push_back(Output.getFilename());
6838
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006839 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006840 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006841
David Chisnallddbd68f2011-09-27 22:03:18 +00006842 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006843 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6844}
6845
6846void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6847 const InputInfo &Output,
6848 const InputInfoList &Inputs,
6849 const ArgList &Args,
6850 const char *LinkingOutput) const {
6851 const Driver &D = getToolChain().getDriver();
6852 ArgStringList CmdArgs;
6853
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006854 if (!D.SysRoot.empty())
6855 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6856
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006857 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006858 if (Args.hasArg(options::OPT_static)) {
6859 CmdArgs.push_back("-Bstatic");
6860 } else {
6861 if (Args.hasArg(options::OPT_rdynamic))
6862 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006863 if (Args.hasArg(options::OPT_shared)) {
6864 CmdArgs.push_back("-Bshareable");
6865 } else {
6866 CmdArgs.push_back("-dynamic-linker");
6867 CmdArgs.push_back("/libexec/ld.elf_so");
6868 }
6869 }
6870
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006871 // Many NetBSD architectures support more than one ABI.
6872 // Determine the correct emulation for ld.
6873 switch (getToolChain().getArch()) {
6874 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006875 CmdArgs.push_back("-m");
6876 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006877 break;
6878 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006879 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006880 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006881 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006882 CmdArgs.push_back("-m");
6883 switch (getToolChain().getTriple().getEnvironment()) {
6884 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006885 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006886 CmdArgs.push_back("armelf_nbsd_eabi");
6887 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006888 case llvm::Triple::EABIHF:
6889 case llvm::Triple::GNUEABIHF:
6890 CmdArgs.push_back("armelf_nbsd_eabihf");
6891 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006892 default:
6893 CmdArgs.push_back("armelf_nbsd");
6894 break;
6895 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006896 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006897 case llvm::Triple::mips64:
6898 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006899 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006900 CmdArgs.push_back("-m");
6901 if (getToolChain().getArch() == llvm::Triple::mips64)
6902 CmdArgs.push_back("elf32btsmip");
6903 else
6904 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006905 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006906 CmdArgs.push_back("-m");
6907 if (getToolChain().getArch() == llvm::Triple::mips64)
6908 CmdArgs.push_back("elf64btsmip");
6909 else
6910 CmdArgs.push_back("elf64ltsmip");
6911 }
6912 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006913
6914 case llvm::Triple::sparc:
6915 CmdArgs.push_back("-m");
6916 CmdArgs.push_back("elf32_sparc");
6917 break;
6918
6919 case llvm::Triple::sparcv9:
6920 CmdArgs.push_back("-m");
6921 CmdArgs.push_back("elf64_sparc");
6922 break;
6923
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006924 default:
6925 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006926 }
6927
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006928 if (Output.isFilename()) {
6929 CmdArgs.push_back("-o");
6930 CmdArgs.push_back(Output.getFilename());
6931 } else {
6932 assert(Output.isNothing() && "Invalid output.");
6933 }
6934
6935 if (!Args.hasArg(options::OPT_nostdlib) &&
6936 !Args.hasArg(options::OPT_nostartfiles)) {
6937 if (!Args.hasArg(options::OPT_shared)) {
6938 CmdArgs.push_back(Args.MakeArgString(
6939 getToolChain().GetFilePath("crt0.o")));
6940 CmdArgs.push_back(Args.MakeArgString(
6941 getToolChain().GetFilePath("crti.o")));
6942 CmdArgs.push_back(Args.MakeArgString(
6943 getToolChain().GetFilePath("crtbegin.o")));
6944 } else {
6945 CmdArgs.push_back(Args.MakeArgString(
6946 getToolChain().GetFilePath("crti.o")));
6947 CmdArgs.push_back(Args.MakeArgString(
6948 getToolChain().GetFilePath("crtbeginS.o")));
6949 }
6950 }
6951
6952 Args.AddAllArgs(CmdArgs, options::OPT_L);
6953 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6954 Args.AddAllArgs(CmdArgs, options::OPT_e);
6955 Args.AddAllArgs(CmdArgs, options::OPT_s);
6956 Args.AddAllArgs(CmdArgs, options::OPT_t);
6957 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6958 Args.AddAllArgs(CmdArgs, options::OPT_r);
6959
6960 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6961
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006962 unsigned Major, Minor, Micro;
6963 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6964 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006965 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006966 switch(getToolChain().getArch()) {
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006967 case llvm::Triple::arm:
6968 case llvm::Triple::armeb:
6969 case llvm::Triple::thumb:
6970 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006971 case llvm::Triple::ppc:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006972 case llvm::Triple::x86:
6973 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006974 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006975 break;
6976 default:
6977 break;
6978 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006979 }
6980
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006981 if (!Args.hasArg(options::OPT_nostdlib) &&
6982 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006983 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006984 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6985 CmdArgs.push_back("-lm");
6986 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006987 if (Args.hasArg(options::OPT_pthread))
6988 CmdArgs.push_back("-lpthread");
6989 CmdArgs.push_back("-lc");
6990
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006991 if (useLibgcc) {
6992 if (Args.hasArg(options::OPT_static)) {
6993 // libgcc_eh depends on libc, so resolve as much as possible,
6994 // pull in any new requirements from libc and then get the rest
6995 // of libgcc.
6996 CmdArgs.push_back("-lgcc_eh");
6997 CmdArgs.push_back("-lc");
6998 CmdArgs.push_back("-lgcc");
6999 } else {
7000 CmdArgs.push_back("-lgcc");
7001 CmdArgs.push_back("--as-needed");
7002 CmdArgs.push_back("-lgcc_s");
7003 CmdArgs.push_back("--no-as-needed");
7004 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007005 }
7006 }
7007
7008 if (!Args.hasArg(options::OPT_nostdlib) &&
7009 !Args.hasArg(options::OPT_nostartfiles)) {
7010 if (!Args.hasArg(options::OPT_shared))
7011 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7012 "crtend.o")));
7013 else
7014 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7015 "crtendS.o")));
7016 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7017 "crtn.o")));
7018 }
7019
Alexey Samsonov7811d192014-02-20 13:57:37 +00007020 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007021
Logan Chieneb9162f2014-06-26 14:23:45 +00007022 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007023 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7024}
7025
Thomas Schwinge4e555262013-03-28 19:04:25 +00007026void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7027 const InputInfo &Output,
7028 const InputInfoList &Inputs,
7029 const ArgList &Args,
7030 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00007031 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007032 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007033
7034 // Add --32/--64 to make sure we get the format we want.
7035 // This is incomplete
7036 if (getToolChain().getArch() == llvm::Triple::x86) {
7037 CmdArgs.push_back("--32");
7038 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007039 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7040 CmdArgs.push_back("--x32");
7041 else
7042 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007043 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7044 CmdArgs.push_back("-a32");
7045 CmdArgs.push_back("-mppc");
7046 CmdArgs.push_back("-many");
7047 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7048 CmdArgs.push_back("-a64");
7049 CmdArgs.push_back("-mppc64");
7050 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007051 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7052 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007053 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007054 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007055 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007056 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7057 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007058 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007059 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007060 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7061 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007062 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007063 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007064 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7065 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007066 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007067 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7068 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007069 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7070 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007071 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007072
Tim Northover9c7e0352013-12-12 11:55:52 +00007073 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7074 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007075 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007076
7077 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007078
7079 // FIXME: remove krait check when GNU tools support krait cpu
7080 // for now replace it with -march=armv7-a to avoid a lower
7081 // march from being picked in the absence of a cpu flag.
7082 Arg *A;
7083 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7084 StringRef(A->getValue()) == "krait")
7085 CmdArgs.push_back("-march=armv7-a");
7086 else
7087 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007088 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007089 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7090 getToolChain().getArch() == llvm::Triple::mipsel ||
7091 getToolChain().getArch() == llvm::Triple::mips64 ||
7092 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007093 StringRef CPUName;
7094 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007095 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007096 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007097
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007098 CmdArgs.push_back("-march");
7099 CmdArgs.push_back(CPUName.data());
7100
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007101 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007102 CmdArgs.push_back(ABIName.data());
7103
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007104 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7105 // or -mshared (not implemented) is in effect.
7106 bool IsPicOrPie = false;
7107 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7108 options::OPT_fpic, options::OPT_fno_pic,
7109 options::OPT_fPIE, options::OPT_fno_PIE,
7110 options::OPT_fpie, options::OPT_fno_pie)) {
7111 if (A->getOption().matches(options::OPT_fPIC) ||
7112 A->getOption().matches(options::OPT_fpic) ||
7113 A->getOption().matches(options::OPT_fPIE) ||
7114 A->getOption().matches(options::OPT_fpie))
7115 IsPicOrPie = true;
7116 }
7117 if (!IsPicOrPie)
7118 CmdArgs.push_back("-mno-shared");
7119
Daniel Sanders379d44b2014-07-16 11:52:23 +00007120 // LLVM doesn't support -mplt yet and acts as if it is always given.
7121 // However, -mplt has no effect with the N64 ABI.
7122 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007123
7124 if (getToolChain().getArch() == llvm::Triple::mips ||
7125 getToolChain().getArch() == llvm::Triple::mips64)
7126 CmdArgs.push_back("-EB");
7127 else
7128 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007129
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007130 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7131 if (StringRef(A->getValue()) == "2008")
7132 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7133 }
7134
Daniel Sanders379d44b2014-07-16 11:52:23 +00007135 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7136 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7137 options::OPT_mfp64)) {
7138 A->claim();
7139 A->render(Args, CmdArgs);
7140 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7141 ABIName))
7142 CmdArgs.push_back("-mfpxx");
7143
7144 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7145 // -mno-mips16 is actually -no-mips16.
7146 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7147 options::OPT_mno_mips16)) {
7148 if (A->getOption().matches(options::OPT_mips16)) {
7149 A->claim();
7150 A->render(Args, CmdArgs);
7151 } else {
7152 A->claim();
7153 CmdArgs.push_back("-no-mips16");
7154 }
7155 }
7156
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007157 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7158 options::OPT_mno_micromips);
7159 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7160 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7161
Simon Atanasyanbd986632013-11-26 11:58:04 +00007162 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7163 // Do not use AddLastArg because not all versions of MIPS assembler
7164 // support -mmsa / -mno-msa options.
7165 if (A->getOption().matches(options::OPT_mmsa))
7166 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7167 }
7168
Daniel Sanders379d44b2014-07-16 11:52:23 +00007169 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7170 options::OPT_msoft_float);
7171
7172 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7173 options::OPT_mno_odd_spreg);
7174
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007175 NeedsKPIC = true;
7176 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7177 // Always pass an -march option, since our default of z10 is later
7178 // than the GNU assembler's default.
7179 StringRef CPUName = getSystemZTargetCPU(Args);
7180 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7181 }
7182
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007183 if (NeedsKPIC)
7184 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007185
7186 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7187 options::OPT_Xassembler);
7188
7189 CmdArgs.push_back("-o");
7190 CmdArgs.push_back(Output.getFilename());
7191
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007192 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007193 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007194
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007195 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Rafael Espindola92b00932010-08-10 00:25:48 +00007196 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007197
7198 // Handle the debug info splitting at object creation time if we're
7199 // creating an object.
7200 // TODO: Currently only works on linux with newer objcopy.
7201 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007202 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007203 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7204 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007205}
7206
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007207static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007208 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007209 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007210 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7211 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007212 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007213 CmdArgs.push_back("-lgcc");
7214
Logan Chien3d3373c2012-11-19 12:04:11 +00007215 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007216 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007217 CmdArgs.push_back("-lgcc");
7218 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007219 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007220 CmdArgs.push_back("--as-needed");
7221 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007222 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007223 CmdArgs.push_back("--no-as-needed");
7224 }
7225
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007226 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007227 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007228 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007229 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007230
7231 // According to Android ABI, we have to link with libdl if we are
7232 // linking with non-static libgcc.
7233 //
7234 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7235 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7236 if (isAndroid && !StaticLibgcc)
7237 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007238}
7239
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007240static std::string getLinuxDynamicLinker(const ArgList &Args,
7241 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007242 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7243 if (ToolChain.getTriple().isArch64Bit())
7244 return "/system/bin/linker64";
7245 else
7246 return "/system/bin/linker";
7247 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7248 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007249 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007250 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007251 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007252 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007253 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007254 else if (ToolChain.getArch() == llvm::Triple::arm ||
7255 ToolChain.getArch() == llvm::Triple::thumb) {
7256 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7257 return "/lib/ld-linux-armhf.so.3";
7258 else
7259 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007260 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7261 ToolChain.getArch() == llvm::Triple::thumbeb) {
7262 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7263 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7264 else
7265 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007266 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007267 ToolChain.getArch() == llvm::Triple::mipsel ||
7268 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007269 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007270 StringRef CPUName;
7271 StringRef ABIName;
7272 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7273 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7274
7275 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7276 .Case("o32", "/lib")
7277 .Case("n32", "/lib32")
7278 .Case("n64", "/lib64")
7279 .Default("/lib");
7280 StringRef LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
7281
7282 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007283 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7284 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007285 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7286 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7287 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007288 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007289 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7290 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7291 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007292 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007293 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7294 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007295 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7296 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007297 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7298 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7299 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007300 else
7301 return "/lib64/ld-linux-x86-64.so.2";
7302}
7303
Renato Golinc4b49242014-02-13 10:01:16 +00007304static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7305 ArgStringList &CmdArgs, const ArgList &Args) {
7306 // Make use of compiler-rt if --rtlib option is used
7307 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7308
7309 switch(RLT) {
7310 case ToolChain::RLT_CompilerRT:
7311 addClangRTLinux(TC, Args, CmdArgs);
7312 break;
7313 case ToolChain::RLT_Libgcc:
7314 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7315 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007316 }
7317}
7318
Thomas Schwinge4e555262013-03-28 19:04:25 +00007319void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7320 const InputInfo &Output,
7321 const InputInfoList &Inputs,
7322 const ArgList &Args,
7323 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007324 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007325 static_cast<const toolchains::Linux&>(getToolChain());
7326 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007327 const bool isAndroid =
7328 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007329 const bool IsPIE =
7330 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007331 !Args.hasArg(options::OPT_static) &&
7332 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7333 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007334 // Cannot use isPIEDefault here since otherwise
7335 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007336 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007337
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007338 ArgStringList CmdArgs;
7339
Rafael Espindolad1002f62010-11-15 18:28:16 +00007340 // Silence warning for "clang -g foo.o -o foo"
7341 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007342 // and "clang -emit-llvm foo.o -o foo"
7343 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007344 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007345 // handled somewhere else.
7346 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007347
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007348 if (!D.SysRoot.empty())
7349 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007350
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007351 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007352 CmdArgs.push_back("-pie");
7353
Rafael Espindola1c76c592010-11-07 22:57:16 +00007354 if (Args.hasArg(options::OPT_rdynamic))
7355 CmdArgs.push_back("-export-dynamic");
7356
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007357 if (Args.hasArg(options::OPT_s))
7358 CmdArgs.push_back("-s");
7359
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007360 for (const auto &Opt : ToolChain.ExtraOpts)
7361 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007362
7363 if (!Args.hasArg(options::OPT_static)) {
7364 CmdArgs.push_back("--eh-frame-hdr");
7365 }
7366
7367 CmdArgs.push_back("-m");
7368 if (ToolChain.getArch() == llvm::Triple::x86)
7369 CmdArgs.push_back("elf_i386");
Tim Northover40956e62014-07-23 12:32:58 +00007370 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Tim Northover9bb857a2013-01-31 12:13:10 +00007371 CmdArgs.push_back("aarch64linux");
Tim Northover40956e62014-07-23 12:32:58 +00007372 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007373 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00007374 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00007375 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007376 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007377 else if (ToolChain.getArch() == llvm::Triple::armeb
7378 || ToolChain.getArch() == llvm::Triple::thumbeb)
7379 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00007380 else if (ToolChain.getArch() == llvm::Triple::ppc)
7381 CmdArgs.push_back("elf32ppclinux");
7382 else if (ToolChain.getArch() == llvm::Triple::ppc64)
7383 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007384 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7385 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00007386 else if (ToolChain.getArch() == llvm::Triple::sparc)
7387 CmdArgs.push_back("elf32_sparc");
7388 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7389 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00007390 else if (ToolChain.getArch() == llvm::Triple::mips)
7391 CmdArgs.push_back("elf32btsmip");
7392 else if (ToolChain.getArch() == llvm::Triple::mipsel)
7393 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007394 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007395 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007396 CmdArgs.push_back("elf32btsmipn32");
7397 else
7398 CmdArgs.push_back("elf64btsmip");
7399 }
7400 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007401 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007402 CmdArgs.push_back("elf32ltsmipn32");
7403 else
7404 CmdArgs.push_back("elf64ltsmip");
7405 }
Ulrich Weigand47445072013-05-06 16:26:41 +00007406 else if (ToolChain.getArch() == llvm::Triple::systemz)
7407 CmdArgs.push_back("elf64_s390");
Zinovy Nis1db95732014-07-10 15:27:19 +00007408 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7409 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7410 CmdArgs.push_back("elf32_x86_64");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007411 else
7412 CmdArgs.push_back("elf_x86_64");
7413
7414 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007415 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007416 ToolChain.getArch() == llvm::Triple::armeb ||
7417 ToolChain.getArch() == llvm::Triple::thumb ||
7418 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007419 CmdArgs.push_back("-Bstatic");
7420 else
7421 CmdArgs.push_back("-static");
7422 } else if (Args.hasArg(options::OPT_shared)) {
7423 CmdArgs.push_back("-shared");
7424 }
7425
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007426 if (ToolChain.getArch() == llvm::Triple::arm ||
7427 ToolChain.getArch() == llvm::Triple::armeb ||
7428 ToolChain.getArch() == llvm::Triple::thumb ||
7429 ToolChain.getArch() == llvm::Triple::thumbeb ||
7430 (!Args.hasArg(options::OPT_static) &&
7431 !Args.hasArg(options::OPT_shared))) {
7432 CmdArgs.push_back("-dynamic-linker");
7433 CmdArgs.push_back(Args.MakeArgString(
7434 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7435 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007436
7437 CmdArgs.push_back("-o");
7438 CmdArgs.push_back(Output.getFilename());
7439
Rafael Espindola81937ec2010-12-01 01:52:43 +00007440 if (!Args.hasArg(options::OPT_nostdlib) &&
7441 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007442 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007443 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007444 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007445 if (Args.hasArg(options::OPT_pg))
7446 crt1 = "gcrt1.o";
7447 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007448 crt1 = "Scrt1.o";
7449 else
7450 crt1 = "crt1.o";
7451 }
7452 if (crt1)
7453 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007454
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007455 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7456 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007457
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007458 const char *crtbegin;
7459 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007460 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007461 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007462 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007463 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007464 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007465 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007466 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007467 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007468
7469 // Add crtfastmath.o if available and fast math is enabled.
7470 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007471 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007472
7473 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007474 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007475
7476 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7477
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007478 for (const auto &Path : Paths)
7479 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007480
Alp Tokerce365ca2013-12-02 12:43:03 +00007481 if (D.IsUsingLTO(Args))
7482 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007483
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007484 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7485 CmdArgs.push_back("--no-demangle");
7486
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007487 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7488
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007489 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007490 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007491 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007492
Hans Wennborg70850d82013-07-18 20:29:38 +00007493 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007494 !Args.hasArg(options::OPT_nostdlib) &&
7495 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007496 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7497 !Args.hasArg(options::OPT_static);
7498 if (OnlyLibstdcxxStatic)
7499 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007500 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007501 if (OnlyLibstdcxxStatic)
7502 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007503 CmdArgs.push_back("-lm");
7504 }
7505
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007506 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007507 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7508 if (Args.hasArg(options::OPT_static))
7509 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007510
Alexey Bataev186b28a2014-03-06 05:43:53 +00007511 LibOpenMP UsedOpenMPLib = LibUnknown;
7512 if (Args.hasArg(options::OPT_fopenmp)) {
7513 UsedOpenMPLib = LibGOMP;
7514 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7515 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7516 .Case("libgomp", LibGOMP)
7517 .Case("libiomp5", LibIOMP5)
7518 .Default(LibUnknown);
7519 if (UsedOpenMPLib == LibUnknown)
7520 D.Diag(diag::err_drv_unsupported_option_argument)
7521 << A->getOption().getName() << A->getValue();
7522 }
7523 switch (UsedOpenMPLib) {
7524 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007525 CmdArgs.push_back("-lgomp");
7526
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007527 // FIXME: Exclude this for platforms with libgomp that don't require
7528 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007529 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007530 break;
7531 case LibIOMP5:
7532 CmdArgs.push_back("-liomp5");
7533 break;
7534 case LibUnknown:
7535 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007536 }
Renato Golinc4b49242014-02-13 10:01:16 +00007537 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007538
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007539 if ((Args.hasArg(options::OPT_pthread) ||
7540 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7541 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007542 CmdArgs.push_back("-lpthread");
7543
7544 CmdArgs.push_back("-lc");
7545
7546 if (Args.hasArg(options::OPT_static))
7547 CmdArgs.push_back("--end-group");
7548 else
Renato Golinc4b49242014-02-13 10:01:16 +00007549 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007550 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007551
Rafael Espindola81937ec2010-12-01 01:52:43 +00007552 if (!Args.hasArg(options::OPT_nostartfiles)) {
7553 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007554 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007555 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007556 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007557 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007558 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007559 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007560
Rafael Espindola81937ec2010-12-01 01:52:43 +00007561 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007562 if (!isAndroid)
7563 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007564 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007565 }
7566
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007567 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007568}
7569
Chris Lattner3e2ee142010-07-07 16:01:42 +00007570void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007571 const InputInfo &Output,
7572 const InputInfoList &Inputs,
7573 const ArgList &Args,
7574 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007575 ArgStringList CmdArgs;
7576
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007577 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007578
7579 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007580 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007582 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007583 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007584
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007585 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007586 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007587}
7588
7589void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007590 const InputInfo &Output,
7591 const InputInfoList &Inputs,
7592 const ArgList &Args,
7593 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007594 const Driver &D = getToolChain().getDriver();
7595 ArgStringList CmdArgs;
7596
Daniel Dunbarb440f562010-08-02 02:38:21 +00007597 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007598 CmdArgs.push_back("-o");
7599 CmdArgs.push_back(Output.getFilename());
7600 } else {
7601 assert(Output.isNothing() && "Invalid output.");
7602 }
7603
7604 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007605 !Args.hasArg(options::OPT_nostartfiles)) {
7606 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7607 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7608 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7609 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7610 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007611
7612 Args.AddAllArgs(CmdArgs, options::OPT_L);
7613 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7614 Args.AddAllArgs(CmdArgs, options::OPT_e);
7615
Daniel Dunbar54423b22010-09-17 00:24:54 +00007616 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007617
Alexey Samsonov7811d192014-02-20 13:57:37 +00007618 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007619
Chris Lattner3e2ee142010-07-07 16:01:42 +00007620 if (!Args.hasArg(options::OPT_nostdlib) &&
7621 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007622 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007623 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007624 CmdArgs.push_back("-lm");
7625 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007626 }
7627
7628 if (!Args.hasArg(options::OPT_nostdlib) &&
7629 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007630 if (Args.hasArg(options::OPT_pthread))
7631 CmdArgs.push_back("-lpthread");
7632 CmdArgs.push_back("-lc");
7633 CmdArgs.push_back("-lCompilerRT-Generic");
7634 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7635 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007636 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007637 }
7638
Logan Chieneb9162f2014-06-26 14:23:45 +00007639 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007640 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007641}
7642
Daniel Dunbarcc912342009-05-02 18:28:39 +00007643/// DragonFly Tools
7644
7645// For now, DragonFly Assemble does just about the same as for
7646// FreeBSD, but this may change soon.
7647void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007648 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007649 const InputInfoList &Inputs,
7650 const ArgList &Args,
7651 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007652 ArgStringList CmdArgs;
7653
7654 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7655 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007656 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007657 CmdArgs.push_back("--32");
7658
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007659 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007660
7661 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007662 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007663
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007664 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007665 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007666
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007667 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007668 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007669}
7670
7671void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007672 const InputInfo &Output,
7673 const InputInfoList &Inputs,
7674 const ArgList &Args,
7675 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007676 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007677 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007678 ArgStringList CmdArgs;
7679
John McCall65b8da02013-04-11 22:55:55 +00007680 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7681 UseGCC47 = false;
7682
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007683 if (!D.SysRoot.empty())
7684 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7685
John McCall65b8da02013-04-11 22:55:55 +00007686 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007687 if (Args.hasArg(options::OPT_static)) {
7688 CmdArgs.push_back("-Bstatic");
7689 } else {
John McCall65b8da02013-04-11 22:55:55 +00007690 if (Args.hasArg(options::OPT_rdynamic))
7691 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007692 if (Args.hasArg(options::OPT_shared))
7693 CmdArgs.push_back("-Bshareable");
7694 else {
7695 CmdArgs.push_back("-dynamic-linker");
7696 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7697 }
John McCall65b8da02013-04-11 22:55:55 +00007698 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007699 }
7700
7701 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7702 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007703 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007704 CmdArgs.push_back("-m");
7705 CmdArgs.push_back("elf_i386");
7706 }
7707
Daniel Dunbarb440f562010-08-02 02:38:21 +00007708 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007709 CmdArgs.push_back("-o");
7710 CmdArgs.push_back(Output.getFilename());
7711 } else {
7712 assert(Output.isNothing() && "Invalid output.");
7713 }
7714
7715 if (!Args.hasArg(options::OPT_nostdlib) &&
7716 !Args.hasArg(options::OPT_nostartfiles)) {
7717 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007718 if (Args.hasArg(options::OPT_pg))
7719 CmdArgs.push_back(Args.MakeArgString(
7720 getToolChain().GetFilePath("gcrt1.o")));
7721 else {
7722 if (Args.hasArg(options::OPT_pie))
7723 CmdArgs.push_back(Args.MakeArgString(
7724 getToolChain().GetFilePath("Scrt1.o")));
7725 else
7726 CmdArgs.push_back(Args.MakeArgString(
7727 getToolChain().GetFilePath("crt1.o")));
7728 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007729 }
John McCall65b8da02013-04-11 22:55:55 +00007730 CmdArgs.push_back(Args.MakeArgString(
7731 getToolChain().GetFilePath("crti.o")));
7732 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7733 CmdArgs.push_back(Args.MakeArgString(
7734 getToolChain().GetFilePath("crtbeginS.o")));
7735 else
7736 CmdArgs.push_back(Args.MakeArgString(
7737 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007738 }
7739
7740 Args.AddAllArgs(CmdArgs, options::OPT_L);
7741 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7742 Args.AddAllArgs(CmdArgs, options::OPT_e);
7743
Daniel Dunbar54423b22010-09-17 00:24:54 +00007744 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007745
7746 if (!Args.hasArg(options::OPT_nostdlib) &&
7747 !Args.hasArg(options::OPT_nodefaultlibs)) {
7748 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7749 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007750 if (UseGCC47)
7751 CmdArgs.push_back("-L/usr/lib/gcc47");
7752 else
7753 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007754
7755 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007756 if (UseGCC47) {
7757 CmdArgs.push_back("-rpath");
7758 CmdArgs.push_back("/usr/lib/gcc47");
7759 } else {
7760 CmdArgs.push_back("-rpath");
7761 CmdArgs.push_back("/usr/lib/gcc44");
7762 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007763 }
7764
Hans Wennborg70850d82013-07-18 20:29:38 +00007765 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007766 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007767 CmdArgs.push_back("-lm");
7768 }
7769
Daniel Dunbarcc912342009-05-02 18:28:39 +00007770 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007771 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007772
7773 if (!Args.hasArg(options::OPT_nolibc)) {
7774 CmdArgs.push_back("-lc");
7775 }
7776
John McCall65b8da02013-04-11 22:55:55 +00007777 if (UseGCC47) {
7778 if (Args.hasArg(options::OPT_static) ||
7779 Args.hasArg(options::OPT_static_libgcc)) {
7780 CmdArgs.push_back("-lgcc");
7781 CmdArgs.push_back("-lgcc_eh");
7782 } else {
7783 if (Args.hasArg(options::OPT_shared_libgcc)) {
7784 CmdArgs.push_back("-lgcc_pic");
7785 if (!Args.hasArg(options::OPT_shared))
7786 CmdArgs.push_back("-lgcc");
7787 } else {
7788 CmdArgs.push_back("-lgcc");
7789 CmdArgs.push_back("--as-needed");
7790 CmdArgs.push_back("-lgcc_pic");
7791 CmdArgs.push_back("--no-as-needed");
7792 }
7793 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007794 } else {
John McCall65b8da02013-04-11 22:55:55 +00007795 if (Args.hasArg(options::OPT_shared)) {
7796 CmdArgs.push_back("-lgcc_pic");
7797 } else {
7798 CmdArgs.push_back("-lgcc");
7799 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007800 }
7801 }
7802
7803 if (!Args.hasArg(options::OPT_nostdlib) &&
7804 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007805 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007806 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007807 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007808 else
7809 CmdArgs.push_back(Args.MakeArgString(
7810 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007811 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007812 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007813 }
7814
Alexey Samsonov7811d192014-02-20 13:57:37 +00007815 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007816
Logan Chieneb9162f2014-06-26 14:23:45 +00007817 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007818 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007819}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007820
Alexey Samsonov6424e022014-05-12 20:20:20 +00007821static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7822 ArgStringList &CmdArgs,
7823 const StringRef RTName) {
7824 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7825 llvm::sys::path::append(LibSanitizer,
7826 Twine("clang_rt.") + RTName + ".lib");
7827 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7828}
7829
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007830void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7831 const InputInfo &Output,
7832 const InputInfoList &Inputs,
7833 const ArgList &Args,
7834 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007835 ArgStringList CmdArgs;
7836
7837 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007838 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7839 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007840 } else {
7841 assert(Output.isNothing() && "Invalid output.");
7842 }
7843
7844 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007845 !Args.hasArg(options::OPT_nostartfiles) &&
7846 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007847 CmdArgs.push_back("-defaultlib:libcmt");
7848 }
7849
7850 CmdArgs.push_back("-nologo");
7851
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007852 if (Args.hasArg(options::OPT_g_Group)) {
7853 CmdArgs.push_back("-debug");
7854 }
7855
Hans Wennborgf1a74252013-09-10 20:18:04 +00007856 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7857
7858 if (DLL) {
7859 CmdArgs.push_back(Args.MakeArgString("-dll"));
7860
7861 SmallString<128> ImplibName(Output.getFilename());
7862 llvm::sys::path::replace_extension(ImplibName, "lib");
7863 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7864 ImplibName.str()));
7865 }
7866
Peter Collingbourne32701642013-11-01 18:16:25 +00007867 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007868 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007869 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007870 // FIXME: Handle 64-bit.
Alexey Samsonov6424e022014-05-12 20:20:20 +00007871 if (DLL) {
7872 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7873 "asan_dll_thunk-i386");
7874 } else {
7875 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7876 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7877 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007878 }
7879
Michael J. Spencere2f49362012-06-18 16:56:04 +00007880 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007881 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007882
7883 // Add filenames immediately.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007884 for (const auto &Input : Inputs)
7885 if (Input.isFilename())
7886 CmdArgs.push_back(Input.getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007887 else
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007888 Input.getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007889
7890 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007891 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7893}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007894
7895void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7896 const InputInfo &Output,
7897 const InputInfoList &Inputs,
7898 const ArgList &Args,
7899 const char *LinkingOutput) const {
7900 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7901}
7902
Hans Wennborg188382e2013-09-20 18:16:35 +00007903// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7904// If one cannot be found, return FallbackName.
7905// We do this special search to prevent clang-cl from falling back onto itself
7906// if it's available as cl.exe on the path.
7907static std::string FindFallback(const char *FallbackName,
7908 const char *ClangProgramPath) {
7909 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7910 if (!OptPath.hasValue())
7911 return FallbackName;
7912
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007913 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Hans Wennborg188382e2013-09-20 18:16:35 +00007914 SmallVector<StringRef, 8> PathSegments;
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007915 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
Hans Wennborg188382e2013-09-20 18:16:35 +00007916
7917 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7918 const StringRef &PathSegment = PathSegments[i];
7919 if (PathSegment.empty())
7920 continue;
7921
7922 SmallString<128> FilePath(PathSegment);
7923 llvm::sys::path::append(FilePath, FallbackName);
7924 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7925 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7926 return FilePath.str();
7927 }
7928
7929 return FallbackName;
7930}
7931
Hans Wennborg87cfa712013-09-19 20:32:16 +00007932Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7933 const InputInfo &Output,
7934 const InputInfoList &Inputs,
7935 const ArgList &Args,
7936 const char *LinkingOutput) const {
7937 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007938 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007939 CmdArgs.push_back("/c"); // Compile only.
7940 CmdArgs.push_back("/W0"); // No warnings.
7941
7942 // The goal is to be able to invoke this tool correctly based on
7943 // any flag accepted by clang-cl.
7944
7945 // These are spelled the same way in clang and cl.exe,.
7946 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7947 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007948
7949 // Optimization level.
7950 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7951 if (A->getOption().getID() == options::OPT_O0) {
7952 CmdArgs.push_back("/Od");
7953 } else {
7954 StringRef OptLevel = A->getValue();
7955 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7956 A->render(Args, CmdArgs);
7957 else if (OptLevel == "3")
7958 CmdArgs.push_back("/Ox");
7959 }
7960 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007961
7962 // Flags for which clang-cl have an alias.
7963 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7964
David Majnemerf6072342014-07-01 22:24:56 +00007965 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7966 /*default=*/false))
7967 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007968 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7969 options::OPT_fno_function_sections))
7970 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7971 ? "/Gy"
7972 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007973 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7974 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007975 CmdArgs.push_back(
7976 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007977 if (Args.hasArg(options::OPT_fsyntax_only))
7978 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007979 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7980 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007981
Hans Wennborg260ff402013-09-27 17:54:18 +00007982 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007983 for (const auto &Include : Includes)
7984 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00007985
Hans Wennborg87cfa712013-09-19 20:32:16 +00007986 // Flags that can simply be passed through.
7987 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7988 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00007989 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007990
7991 // The order of these flags is relevant, so pick the last one.
7992 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7993 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7994 A->render(Args, CmdArgs);
7995
7996
7997 // Input filename.
7998 assert(Inputs.size() == 1);
7999 const InputInfo &II = Inputs[0];
8000 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8001 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8002 if (II.isFilename())
8003 CmdArgs.push_back(II.getFilename());
8004 else
8005 II.getInputArg().renderAsInput(Args, CmdArgs);
8006
8007 // Output filename.
8008 assert(Output.getType() == types::TY_Object);
8009 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8010 Output.getFilename());
8011 CmdArgs.push_back(Fo);
8012
Hans Wennborg188382e2013-09-20 18:16:35 +00008013 const Driver &D = getToolChain().getDriver();
8014 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg188382e2013-09-20 18:16:35 +00008015 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008016}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008017
8018
8019/// XCore Tools
8020// We pass assemble and link construction to the xcc tool.
8021
8022void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8023 const InputInfo &Output,
8024 const InputInfoList &Inputs,
8025 const ArgList &Args,
8026 const char *LinkingOutput) const {
8027 ArgStringList CmdArgs;
8028
8029 CmdArgs.push_back("-o");
8030 CmdArgs.push_back(Output.getFilename());
8031
8032 CmdArgs.push_back("-c");
8033
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008034 if (Args.hasArg(options::OPT_v))
8035 CmdArgs.push_back("-v");
8036
Robert Lytton894d25c2014-05-02 09:33:25 +00008037 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8038 if (!A->getOption().matches(options::OPT_g0))
8039 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008040
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008041 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8042 false))
8043 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008044
8045 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8046 options::OPT_Xassembler);
8047
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008048 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008049 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008050
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008051 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008052 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
8053}
8054
8055void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8056 const InputInfo &Output,
8057 const InputInfoList &Inputs,
8058 const ArgList &Args,
8059 const char *LinkingOutput) const {
8060 ArgStringList CmdArgs;
8061
8062 if (Output.isFilename()) {
8063 CmdArgs.push_back("-o");
8064 CmdArgs.push_back(Output.getFilename());
8065 } else {
8066 assert(Output.isNothing() && "Invalid output.");
8067 }
8068
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008069 if (Args.hasArg(options::OPT_v))
8070 CmdArgs.push_back("-v");
8071
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008072 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
8073 if (EH.ShouldUseExceptionTables)
8074 CmdArgs.push_back("-fexceptions");
8075
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008076 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8077
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008078 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008079 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
8080}