blob: 28e92f9beddc5a8ec8092bc9003b0377987c00da [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000013#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000032#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000039#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000041
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042using namespace clang::driver;
43using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000045using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000046
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000047static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
48 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
49 options::OPT_fpic, options::OPT_fno_pic,
50 options::OPT_fPIE, options::OPT_fno_PIE,
51 options::OPT_fpie, options::OPT_fno_pie);
52 if (!LastPICArg)
53 return;
54 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
55 LastPICArg->getOption().matches(options::OPT_fpic) ||
56 LastPICArg->getOption().matches(options::OPT_fPIE) ||
57 LastPICArg->getOption().matches(options::OPT_fpie)) {
58 CmdArgs.push_back("-KPIC");
59 }
60}
61
Daniel Dunbar64198ef2009-09-10 01:21:05 +000062/// CheckPreprocessingOptions - Perform some validation of preprocessing
63/// arguments that is shared with gcc.
64static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000065 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
66 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
67 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000069 << A->getBaseArg().getAsString(Args)
70 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
71 }
72 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000073}
74
Daniel Dunbar4eadb602009-09-10 01:21:12 +000075/// CheckCodeGenerationOptions - Perform some validation of code generation
76/// arguments that is shared with gcc.
77static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
78 // In gcc, only ARM checks this, but it seems reasonable to check universally.
79 if (Args.hasArg(options::OPT_static))
80 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
81 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000082 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000083 << A->getAsString(Args) << "-static";
84}
85
Chris Lattnerbf2803f2010-03-29 17:55:58 +000086// Quote target names for inclusion in GNU Make dependency files.
87// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000088static void QuoteTarget(StringRef Target,
89 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000090 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
91 switch (Target[i]) {
92 case ' ':
93 case '\t':
94 // Escape the preceding backslashes
95 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
96 Res.push_back('\\');
97
98 // Escape the space/tab
99 Res.push_back('\\');
100 break;
101 case '$':
102 Res.push_back('$');
103 break;
104 case '#':
105 Res.push_back('\\');
106 break;
107 default:
108 break;
109 }
110
111 Res.push_back(Target[i]);
112 }
113}
114
Bill Wendlingc0938f32012-03-12 22:10:06 +0000115static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000116 ArgStringList &CmdArgs,
117 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000118 const char *EnvVar) {
119 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000120 bool CombinedArg = false;
121
Bill Wendling281ca292012-03-12 21:22:35 +0000122 if (!DirList)
123 return; // Nothing to do.
124
Chad Rosier616e8a52012-10-30 21:42:09 +0000125 StringRef Name(ArgName);
126 if (Name.equals("-I") || Name.equals("-L"))
127 CombinedArg = true;
128
Bill Wendling281ca292012-03-12 21:22:35 +0000129 StringRef Dirs(DirList);
130 if (Dirs.empty()) // Empty string should not add '.'.
131 return;
132
133 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000134 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000135 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(".");
141 }
Bill Wendling281ca292012-03-12 21:22:35 +0000142 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 if (CombinedArg) {
144 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
145 } else {
146 CmdArgs.push_back(ArgName);
147 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
148 }
Bill Wendling281ca292012-03-12 21:22:35 +0000149 }
Nico Weber89355782012-03-19 15:00:03 +0000150 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000151 }
152
153 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 if (CombinedArg) {
155 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
156 } else {
157 CmdArgs.push_back(ArgName);
158 CmdArgs.push_back(".");
159 }
Bill Wendling281ca292012-03-12 21:22:35 +0000160 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000161 if (CombinedArg) {
162 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
163 } else {
164 CmdArgs.push_back(ArgName);
165 CmdArgs.push_back(Args.MakeArgString(Dirs));
166 }
Bill Wendling281ca292012-03-12 21:22:35 +0000167 }
168}
169
Daniel Dunbar54423b22010-09-17 00:24:54 +0000170static void AddLinkerInputs(const ToolChain &TC,
171 const InputInfoList &Inputs, const ArgList &Args,
172 ArgStringList &CmdArgs) {
173 const Driver &D = TC.getDriver();
174
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000175 // Add extra linker input arguments which are not treated as inputs
176 // (constructed via -Xarch_).
177 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
178
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000179 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000180 if (!TC.HasNativeLLVMSupport()) {
181 // Don't try to pass LLVM inputs unless we have native support.
182 if (II.getType() == types::TY_LLVM_IR ||
183 II.getType() == types::TY_LTO_IR ||
184 II.getType() == types::TY_LLVM_BC ||
185 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000186 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000187 << TC.getTripleString();
188 }
189
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000190 // Add filenames immediately.
191 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000192 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000193 continue;
194 }
195
196 // Otherwise, this is a linker input argument.
197 const Arg &A = II.getInputArg();
198
199 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000200 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000201 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000202 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000203 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000204 else if (A.getOption().matches(options::OPT_z)) {
205 // Pass -z prefix for gcc linker compatibility.
206 A.claim();
207 A.render(Args, CmdArgs);
208 } else {
209 A.renderAsInput(Args, CmdArgs);
210 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 }
Bill Wendling281ca292012-03-12 21:22:35 +0000212
213 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000214 // and only supported on native toolchains.
215 if (!TC.isCrossCompiling())
216 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217}
218
John McCall31168b02011-06-15 23:02:42 +0000219/// \brief Determine whether Objective-C automated reference counting is
220/// enabled.
221static bool isObjCAutoRefCount(const ArgList &Args) {
222 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
223}
224
Ted Kremeneke65b0862012-03-06 20:05:56 +0000225/// \brief Determine whether we are linking the ObjC runtime.
226static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000227 if (isObjCAutoRefCount(Args)) {
228 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000229 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000230 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231 return Args.hasArg(options::OPT_fobjc_link_runtime);
232}
233
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000234static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000235 // Don't forward inputs from the original command line. They are added from
236 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000237 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000238 !O.hasFlag(options::DriverOption) &&
239 !O.hasFlag(options::LinkerInput);
240}
241
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000242void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000243 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000244 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000245 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000246 ArgStringList &CmdArgs,
247 const InputInfo &Output,
248 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000250
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000251 CheckPreprocessingOptions(D, Args);
252
253 Args.AddLastArg(CmdArgs, options::OPT_C);
254 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000255
256 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000257 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000258 (A = Args.getLastArg(options::OPT_MD)) ||
259 (A = Args.getLastArg(options::OPT_MMD))) {
260 // Determine the output location.
261 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000262 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000263 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000264 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 } else if (Output.getType() == types::TY_Dependencies) {
266 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000267 } else if (A->getOption().matches(options::OPT_M) ||
268 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 DepFile = "-";
270 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000271 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000272 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 }
274 CmdArgs.push_back("-dependency-file");
275 CmdArgs.push_back(DepFile);
276
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000277 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000278 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
279 const char *DepTarget;
280
281 // If user provided -o, that is the dependency target, except
282 // when we are only generating a dependency file.
283 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
284 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000285 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000286 } else {
287 // Otherwise derive from the base input.
288 //
289 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000290 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000291 llvm::sys::path::replace_extension(P, "o");
292 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 }
294
295 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000296 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000297 QuoteTarget(DepTarget, Quoted);
298 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 }
300
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000301 if (A->getOption().matches(options::OPT_M) ||
302 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000304
305 if (isa<PrecompileJobAction>(JA))
306 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 }
308
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000309 if (Args.hasArg(options::OPT_MG)) {
310 if (!A || A->getOption().matches(options::OPT_MD) ||
311 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000312 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 CmdArgs.push_back("-MG");
314 }
315
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000317
318 // Convert all -MQ <target> args to -MT <quoted target>
319 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
320 options::OPT_MQ),
321 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000322 const Arg *A = *it;
323 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000324
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000327 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000328 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000329 CmdArgs.push_back(Args.MakeArgString(Quoted));
330
331 // -MT flag - no change
332 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000333 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 }
335 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000336
Douglas Gregor111af7d2009-04-18 00:34:01 +0000337 // Add -i* options, and automatically translate to
338 // -include-pch/-include-pth for transparent PCH support. It's
339 // wonky, but we include looking for .gch so we can support seamless
340 // replacement into a build system already set up to be generating
341 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000343 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
344 ie = Args.filtered_end(); it != ie; ++it) {
345 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346
347 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000348 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
349 RenderedImplicitInclude = true;
350
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000351 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000353
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000354 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000356 SmallString<128> P(A->getValue());
357 // We want the files to have a name like foo.h.pch. Add a dummy extension
358 // so that replace_extension does the right thing.
359 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000360 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000361 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000362 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000364 }
365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000367 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000368 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000370 }
371
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000373 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000374 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000375 FoundPCH = UsePCH;
376 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000378 }
379
380 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000381 if (IsFirstImplicitInclude) {
382 A->claim();
383 if (UsePCH)
384 CmdArgs.push_back("-include-pch");
385 else
386 CmdArgs.push_back("-include-pth");
387 CmdArgs.push_back(Args.MakeArgString(P.str()));
388 continue;
389 } else {
390 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000391 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 << P.str() << A->getAsString(Args);
393 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394 }
395 }
396
397 // Not translated, render as usual.
398 A->claim();
399 A->render(Args, CmdArgs);
400 }
401
402 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000403 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
404 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000405
406 // Add -Wp, and -Xassembler if using the preprocessor.
407
408 // FIXME: There is a very unfortunate problem here, some troubled
409 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
410 // really support that we would have to parse and then translate
411 // those options. :(
412 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
413 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000414
415 // -I- is a deprecated GCC feature, reject it.
416 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418
419 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
420 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000421 StringRef sysroot = C.getSysRoot();
422 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000423 if (!Args.hasArg(options::OPT_isysroot)) {
424 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000425 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000426 }
427 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000428
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000430 // FIXME: We should probably sink the logic for handling these from the
431 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // CPATH - included following the user specified includes (but prior to
433 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000436 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000437 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000438 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000439 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000440 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000441 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000442 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000444 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000445 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000446 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000447
448 // Add system include arguments.
449 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000450}
451
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000452// FIXME: Move to target hook.
453static bool isSignedCharDefault(const llvm::Triple &Triple) {
454 switch (Triple.getArch()) {
455 default:
456 return true;
457
Tim Northover9bb857a2013-01-31 12:13:10 +0000458 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000459 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000460 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000461 case llvm::Triple::armeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000462 if (Triple.isOSDarwin() || Triple.isOSWindows())
463 return true;
464 return false;
465
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000466 case llvm::Triple::ppc:
467 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000468 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000469 return true;
470 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000471
Bill Schmidt778d3872013-07-26 01:36:11 +0000472 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000473 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000474 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000476 }
477}
478
Robert Lytton0e076492013-08-13 09:43:10 +0000479static bool isNoCommonDefault(const llvm::Triple &Triple) {
480 switch (Triple.getArch()) {
481 default:
482 return false;
483
484 case llvm::Triple::xcore:
485 return true;
486 }
487}
488
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000489// Handle -mhwdiv=.
490static void getARMHWDivFeatures(const Driver &D, const Arg *A,
491 const ArgList &Args,
492 std::vector<const char *> &Features) {
493 StringRef HWDiv = A->getValue();
494 if (HWDiv == "arm") {
495 Features.push_back("+hwdiv-arm");
496 Features.push_back("-hwdiv");
497 } else if (HWDiv == "thumb") {
498 Features.push_back("-hwdiv-arm");
499 Features.push_back("+hwdiv");
500 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
501 Features.push_back("+hwdiv-arm");
502 Features.push_back("+hwdiv");
503 } else if (HWDiv == "none") {
504 Features.push_back("-hwdiv-arm");
505 Features.push_back("-hwdiv");
506 } else
507 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
508}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000509
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000510// Handle -mfpu=.
511//
512// FIXME: Centralize feature selection, defaulting shouldn't be also in the
513// frontend target.
514static void getARMFPUFeatures(const Driver &D, const Arg *A,
515 const ArgList &Args,
516 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000517 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000518
519 // Set the target features based on the FPU.
520 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
521 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000522 Features.push_back("-vfp2");
523 Features.push_back("-vfp3");
524 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000525 } else if (FPU == "vfp") {
526 Features.push_back("+vfp2");
527 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000528 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000529 Features.push_back("+vfp3");
530 Features.push_back("+d16");
531 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000532 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000533 Features.push_back("+vfp3");
534 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000535 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
536 Features.push_back("+vfp4");
537 Features.push_back("+d16");
538 Features.push_back("-neon");
539 } else if (FPU == "vfp4" || FPU == "vfpv4") {
540 Features.push_back("+vfp4");
541 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000542 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
543 Features.push_back("+vfp4");
544 Features.push_back("+d16");
545 Features.push_back("+fp-only-sp");
546 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000547 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
548 Features.push_back("+fp-armv8");
549 Features.push_back("+fp-only-sp");
550 Features.push_back("+d16");
551 Features.push_back("-neon");
552 Features.push_back("-crypto");
553 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
554 FPU == "fp5-d16" || FPU == "fpv5-d16") {
555 Features.push_back("+fp-armv8");
556 Features.push_back("+d16");
557 Features.push_back("-neon");
558 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000559 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000560 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000561 Features.push_back("-neon");
562 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000563 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000564 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000565 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000566 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000567 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000568 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000569 Features.push_back("+neon");
570 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000571 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000572 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000573 } else if (FPU == "none") {
574 Features.push_back("-vfp2");
575 Features.push_back("-vfp3");
576 Features.push_back("-vfp4");
577 Features.push_back("-fp-armv8");
578 Features.push_back("-crypto");
579 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000580 } else
581 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
582}
583
Asiri Rathnayakefcd41ce2014-10-02 09:56:07 +0000584// Select the float ABI as determined by -msoft-float, -mhard-float,
585// -mfpu=... and -mfloat-abi=...
Tim Northover9c7e0352013-12-12 11:55:52 +0000586StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayakefcd41ce2014-10-02 09:56:07 +0000587 const llvm::Triple &Triple,
588 bool *ExplicitNoFloat) {
589
590 // FIXME: -msoft-float and -mhard-float identify the nature of floating point
591 // ops, whereas -mfloat-abi=... identifies the floating point argument passing
592 // convention. But here we are mushing them together into FloatABI = soft/
593 // softfp/hard, which is a bit confusing. For example, this means -msoft-float
594 // and -mfloat-abi=soft are equivalent options to clang. But when we pass
595 // arguments to the backend (AddARMTargetArgs), these two options take their
596 // original interpretations.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000597 StringRef FloatABI;
Asiri Rathnayakefcd41ce2014-10-02 09:56:07 +0000598 const Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ);
601 if (A) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000602 if (A->getOption().matches(options::OPT_msoft_float))
603 FloatABI = "soft";
604 else if (A->getOption().matches(options::OPT_mhard_float))
605 FloatABI = "hard";
606 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000607 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000608 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000609 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000610 << A->getAsString(Args);
611 FloatABI = "soft";
612 }
613 }
614 }
615
Asiri Rathnayakefcd41ce2014-10-02 09:56:07 +0000616 // Some -mfpu=... options are incompatible with some mfloat-abi=... options
617 if (Arg *B = Args.getLastArg(options::OPT_mfpu_EQ)) {
618 StringRef FPU = B->getValue();
619 if (FPU == "none") {
620 // Signal incompatible -mfloat-abi=... options
621 if (FloatABI == "hard")
622 D.Diag(diag::warn_drv_implied_soft_float_conflict)
623 << B->getAsString(Args) << A->getAsString(Args);
624 else if (FloatABI == "softfp")
625 D.Diag(diag::warn_drv_implied_soft_float_assumed)
626 << B->getAsString(Args) << A->getAsString(Args);
627 // Assume soft-float
628 FloatABI = "soft";
629 } else if (FloatABI.empty() || FloatABI == "soft") {
630 // Need -mhard-float for floating point ops
631 FloatABI = "softfp";
632 }
633 }
634
635 // This allows us to differentiate between a user specified soft-float and
636 // an inferred soft-float. The latter may be overridden under other conditions
637 // but the former has higher priority.
638 if (FloatABI == "soft" && ExplicitNoFloat)
639 *ExplicitNoFloat = true;
640
Daniel Dunbar78485922009-09-10 23:00:09 +0000641 // If unspecified, choose the default based on the platform.
642 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000643 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000644 case llvm::Triple::Darwin:
645 case llvm::Triple::MacOSX:
646 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000647 // Darwin defaults to "softfp" for v6 and v7.
648 //
649 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000651 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000652 if (StringRef(ArchName).startswith("v6") ||
653 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000654 FloatABI = "softfp";
655 else
656 FloatABI = "soft";
657 break;
658 }
659
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000660 // FIXME: this is invalid for WindowsCE
661 case llvm::Triple::Win32:
662 FloatABI = "hard";
663 break;
664
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000665 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000666 switch(Triple.getEnvironment()) {
667 case llvm::Triple::GNUEABIHF:
668 FloatABI = "hard";
669 break;
670 default:
671 // FreeBSD defaults to soft float
672 FloatABI = "soft";
673 break;
674 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000675 break;
676
Daniel Dunbar78485922009-09-10 23:00:09 +0000677 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000679 case llvm::Triple::GNUEABIHF:
680 FloatABI = "hard";
681 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000682 case llvm::Triple::GNUEABI:
683 FloatABI = "softfp";
684 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000685 case llvm::Triple::EABIHF:
686 FloatABI = "hard";
687 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000688 case llvm::Triple::EABI:
689 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
690 FloatABI = "softfp";
691 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000692 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000693 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000694 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000695 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000696 FloatABI = "softfp";
697 else
698 FloatABI = "soft";
699 break;
700 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000701 default:
702 // Assume "soft", but warn the user we are guessing.
703 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000704 if (Triple.getOS() != llvm::Triple::UnknownOS ||
705 !Triple.isOSBinFormatMachO())
706 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000707 break;
708 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000709 }
710 }
711
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000712 return FloatABI;
713}
714
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000715static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
716 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000717 std::vector<const char *> &Features,
718 bool ForAS) {
Asiri Rathnayakefcd41ce2014-10-02 09:56:07 +0000719 bool ExplicitNoFloat = false;
720 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple, &ExplicitNoFloat);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000721 if (!ForAS) {
722 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
723 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
724 // stripped out by the ARM target. We should probably pass this a new
725 // -target-option, which is handled by the -cc1/-cc1as invocation.
726 //
727 // FIXME2: For consistency, it would be ideal if we set up the target
728 // machine state the same when using the frontend or the assembler. We don't
729 // currently do that for the assembler, we pass the options directly to the
730 // backend and never even instantiate the frontend TargetInfo. If we did,
731 // and used its handleTargetFeatures hook, then we could ensure the
732 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000733
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000734 // Use software floating point operations?
735 if (FloatABI == "soft")
736 Features.push_back("+soft-float");
737
738 // Use software floating point argument passing?
739 if (FloatABI != "hard")
740 Features.push_back("+soft-float-abi");
741 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000742
743 // Honor -mfpu=.
744 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000745 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000746 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
747 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000748
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000749 // Setting -msoft-float effectively disables NEON because of the GCC
750 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000751 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000752 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000753 // Also need to explicitly disable features which imply NEON.
754 Features.push_back("-crypto");
Asiri Rathnayakefcd41ce2014-10-02 09:56:07 +0000755 // Disable remaining floating-point features if soft-float is explicitly
756 // requested.
757 if (ExplicitNoFloat) {
758 Features.push_back("-vfp2");
759 Features.push_back("-vfp3");
760 Features.push_back("-vfp4");
761 Features.push_back("-fp-armv8");
762 }
Amara Emersonecbe18e2014-02-12 10:22:35 +0000763 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000764
765 // En/disable crc
766 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
767 options::OPT_mnocrc)) {
768 if (A->getOption().matches(options::OPT_mcrc))
769 Features.push_back("+crc");
770 else
771 Features.push_back("-crc");
772 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000773}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000774
775void Clang::AddARMTargetArgs(const ArgList &Args,
776 ArgStringList &CmdArgs,
777 bool KernelOrKext) const {
778 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000779 // Get the effective triple, which takes into account the deployment target.
780 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
781 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000782 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000783
784 // Select the ABI to use.
785 //
786 // FIXME: Support -meabi.
Craig Topper92fc2df2014-05-17 16:56:41 +0000787 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000788 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000789 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000790 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000791 // The backend is hardwired to assume AAPCS for M-class processors, ensure
792 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000793 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000794 (Triple.getOS() == llvm::Triple::UnknownOS &&
795 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northovere66c9462013-10-03 14:23:28 +0000796 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000797 ABIName = "aapcs";
798 } else {
799 ABIName = "apcs-gnu";
800 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000801 } else if (Triple.isOSWindows()) {
802 // FIXME: this is invalid for WindowsCE
803 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000804 } else {
805 // Select the default based on the platform.
806 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000807 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000809 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000810 ABIName = "aapcs-linux";
811 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000812 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000813 case llvm::Triple::EABI:
814 ABIName = "aapcs";
815 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000816 default:
817 if (Triple.getOS() == llvm::Triple::NetBSD)
818 ABIName = "apcs-gnu";
819 else
820 ABIName = "aapcs";
821 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822 }
823 }
824 CmdArgs.push_back("-target-abi");
825 CmdArgs.push_back(ABIName);
826
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000827 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000828 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000829 if (FloatABI == "soft") {
830 // Floating point operations and argument passing are soft.
831 //
832 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000833 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000834 CmdArgs.push_back("-mfloat-abi");
835 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000836 } else if (FloatABI == "softfp") {
837 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000838 CmdArgs.push_back("-mfloat-abi");
839 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000840 } else {
841 // Floating point operations and argument passing are hard.
842 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000843 CmdArgs.push_back("-mfloat-abi");
844 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000845 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000846
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000847 // Kernel code has more strict alignment requirements.
848 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000849 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000850 CmdArgs.push_back("-backend-option");
851 CmdArgs.push_back("-arm-long-calls");
852 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000853
Daniel Dunbar12100e22011-03-22 16:48:17 +0000854 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000855 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000856
857 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000858 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000859 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000860 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000861
Bob Wilson0874e532014-07-29 00:23:18 +0000862 // -mkernel implies -mstrict-align; don't add the redundant option.
863 if (!KernelOrKext) {
864 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
865 options::OPT_munaligned_access)) {
866 CmdArgs.push_back("-backend-option");
867 if (A->getOption().matches(options::OPT_mno_unaligned_access))
868 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000869 else {
870 if (getToolChain().getTriple().getSubArch() ==
871 llvm::Triple::SubArchType::ARMSubArch_v6m)
872 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000873 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000874 }
Bob Wilson0874e532014-07-29 00:23:18 +0000875 }
876 }
877
Chad Rosierba3df1d2011-08-26 00:26:29 +0000878 // Setting -mno-global-merge disables the codegen global merge pass. Setting
879 // -mglobal-merge has no effect as the pass is enabled by default.
880 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
881 options::OPT_mno_global_merge)) {
882 if (A->getOption().matches(options::OPT_mno_global_merge))
883 CmdArgs.push_back("-mno-global-merge");
884 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000885
Bob Wilson9c8af452013-04-11 18:53:25 +0000886 if (!Args.hasFlag(options::OPT_mimplicit_float,
887 options::OPT_mno_implicit_float,
888 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000889 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000890
Logan Chien749763e2014-04-03 13:12:44 +0000891 // llvm does not support reserving registers in general. There is support
892 // for reserving r9 on ARM though (defined as a platform-specific register
893 // in ARM EABI).
894 if (Args.hasArg(options::OPT_ffixed_r9)) {
895 CmdArgs.push_back("-backend-option");
896 CmdArgs.push_back("-arm-reserve-r9");
897 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000898}
899
Tim Northover573cbee2014-05-24 12:52:07 +0000900/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
901/// targeting.
902static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000903 Arg *A;
904 std::string CPU;
905 // If we have -mtune or -mcpu, use that.
906 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
907 CPU = A->getValue();
908 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
909 StringRef Mcpu = A->getValue();
910 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000911 }
912
Kevin Qin110db6f2014-07-18 07:03:22 +0000913 // Handle CPU name is 'native'.
914 if (CPU == "native")
915 return llvm::sys::getHostCPUName();
916 else if (CPU.size())
917 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000918
James Molloy9b1586b2014-04-17 12:51:17 +0000919 // Make sure we pick "cyclone" if -arch is used.
920 // FIXME: Should this be picked by checking the target triple instead?
921 if (Args.getLastArg(options::OPT_arch))
922 return "cyclone";
923
924 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000925}
926
Tim Northover573cbee2014-05-24 12:52:07 +0000927void Clang::AddAArch64TargetArgs(const ArgList &Args,
928 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000929 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
930 llvm::Triple Triple(TripleStr);
931
932 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
933 Args.hasArg(options::OPT_mkernel) ||
934 Args.hasArg(options::OPT_fapple_kext))
935 CmdArgs.push_back("-disable-red-zone");
936
937 if (!Args.hasFlag(options::OPT_mimplicit_float,
938 options::OPT_mno_implicit_float, true))
939 CmdArgs.push_back("-no-implicit-float");
940
Craig Topper92fc2df2014-05-17 16:56:41 +0000941 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000942 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
943 ABIName = A->getValue();
944 else if (Triple.isOSDarwin())
945 ABIName = "darwinpcs";
946 else
947 ABIName = "aapcs";
948
949 CmdArgs.push_back("-target-abi");
950 CmdArgs.push_back(ABIName);
951
Bob Wilson0874e532014-07-29 00:23:18 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
953 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000954 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000955 if (A->getOption().matches(options::OPT_mno_unaligned_access))
956 CmdArgs.push_back("-aarch64-strict-align");
957 else
958 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000959 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000960
961 // Setting -mno-global-merge disables the codegen global merge pass. Setting
962 // -mglobal-merge has no effect as the pass is enabled by default.
963 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
964 options::OPT_mno_global_merge)) {
965 if (A->getOption().matches(options::OPT_mno_global_merge))
966 CmdArgs.push_back("-mno-global-merge");
967 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000968}
969
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000970// Get CPU and ABI names. They are not independent
971// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000972void mips::getMipsCPUAndABI(const ArgList &Args,
973 const llvm::Triple &Triple,
974 StringRef &CPUName,
975 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000976 const char *DefMips32CPU = "mips32r2";
977 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000978
Daniel Sanders2bf13662014-07-10 14:40:57 +0000979 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
980 // default for mips64(el)?-img-linux-gnu.
981 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
982 Triple.getEnvironment() == llvm::Triple::GNU) {
983 DefMips32CPU = "mips32r6";
984 DefMips64CPU = "mips64r6";
985 }
986
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000987 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000988 options::OPT_mcpu_EQ))
989 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000990
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000991 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000992 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000993 // Convert a GNU style Mips ABI name to the name
994 // accepted by LLVM Mips backend.
995 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
996 .Case("32", "o32")
997 .Case("64", "n64")
998 .Default(ABIName);
999 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001000
1001 // Setup default CPU and ABI names.
1002 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001003 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001004 default:
1005 llvm_unreachable("Unexpected triple arch name");
1006 case llvm::Triple::mips:
1007 case llvm::Triple::mipsel:
1008 CPUName = DefMips32CPU;
1009 break;
1010 case llvm::Triple::mips64:
1011 case llvm::Triple::mips64el:
1012 CPUName = DefMips64CPU;
1013 break;
1014 }
1015 }
1016
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001017 if (ABIName.empty()) {
1018 // Deduce ABI name from the target triple.
1019 if (Triple.getArch() == llvm::Triple::mips ||
1020 Triple.getArch() == llvm::Triple::mipsel)
1021 ABIName = "o32";
1022 else
1023 ABIName = "n64";
1024 }
1025
1026 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001027 // Deduce CPU name from ABI name.
1028 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001029 .Cases("o32", "eabi", DefMips32CPU)
1030 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001031 .Default("");
1032 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001033
1034 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001035}
1036
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001037// Convert ABI name to the GNU tools acceptable variant.
1038static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1039 return llvm::StringSwitch<llvm::StringRef>(ABI)
1040 .Case("o32", "32")
1041 .Case("n64", "64")
1042 .Default(ABI);
1043}
1044
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001045// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1046// and -mfloat-abi=.
1047static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001048 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001049 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001050 options::OPT_mhard_float,
1051 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001052 if (A->getOption().matches(options::OPT_msoft_float))
1053 FloatABI = "soft";
1054 else if (A->getOption().matches(options::OPT_mhard_float))
1055 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001056 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001057 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001058 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001059 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001060 FloatABI = "hard";
1061 }
1062 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001063 }
1064
1065 // If unspecified, choose the default based on the platform.
1066 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001067 // Assume "hard", because it's a default value used by gcc.
1068 // When we start to recognize specific target MIPS processors,
1069 // we will be able to select the default more correctly.
1070 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001071 }
1072
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001073 return FloatABI;
1074}
1075
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001076static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001077 std::vector<const char *> &Features,
1078 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001079 StringRef FeatureName) {
1080 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001081 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001082 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001083 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001084 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001085 }
1086}
1087
Daniel Sanders379d44b2014-07-16 11:52:23 +00001088static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1089 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001090 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001091 StringRef CPUName;
1092 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001093 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001094 ABIName = getGnuCompatibleMipsABIName(ABIName);
1095
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001096 // Always override the backend's default ABI.
Aaron Ballman9eef74232014-07-17 13:28:50 +00001097 std::string ABIFeature = llvm::StringSwitch<StringRef>(ABIName)
1098 .Case("32", "+o32")
1099 .Case("n32", "+n32")
1100 .Case("64", "+n64")
1101 .Case("eabi", "+eabi")
1102 .Default(("+" + ABIName).str());
Daniel Sanders4dcbe812014-07-17 09:46:40 +00001103 Features.push_back("-o32");
1104 Features.push_back("-n64");
1105 Features.push_back(Args.MakeArgString(ABIFeature));
1106
Daniel Sandersfeb61302014-08-08 15:47:17 +00001107 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1108 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001109
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001110 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001111 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001112 // FIXME: Note, this is a hack. We need to pass the selected float
1113 // mode to the MipsTargetInfoBase to define appropriate macros there.
1114 // Now it is the only method.
1115 Features.push_back("+soft-float");
1116 }
1117
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001118 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001119 StringRef Val = StringRef(A->getValue());
1120 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001121 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001122 else if (Val == "legacy")
1123 Features.push_back("-nan2008");
1124 else
1125 D.Diag(diag::err_drv_unsupported_option_argument)
1126 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001127 }
1128
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001129 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1130 options::OPT_mdouble_float, "single-float");
1131 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1132 "mips16");
1133 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1134 options::OPT_mno_micromips, "micromips");
1135 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1136 "dsp");
1137 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1138 "dspr2");
1139 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1140 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001141
1142 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1143 // pass -mfpxx
1144 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1145 options::OPT_mfp64)) {
1146 if (A->getOption().matches(options::OPT_mfp32))
1147 Features.push_back(Args.MakeArgString("-fp64"));
1148 else if (A->getOption().matches(options::OPT_mfpxx)) {
1149 Features.push_back(Args.MakeArgString("+fpxx"));
1150 Features.push_back(Args.MakeArgString("+nooddspreg"));
1151 } else
1152 Features.push_back(Args.MakeArgString("+fp64"));
1153 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001154 Features.push_back(Args.MakeArgString("+fpxx"));
1155 Features.push_back(Args.MakeArgString("+nooddspreg"));
1156 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001157
Daniel Sanders28e5d392014-07-10 10:39:51 +00001158 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1159 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001160}
1161
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001162void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001163 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001164 const Driver &D = getToolChain().getDriver();
1165 StringRef CPUName;
1166 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001167 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001168 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001169
1170 CmdArgs.push_back("-target-abi");
1171 CmdArgs.push_back(ABIName.data());
1172
1173 StringRef FloatABI = getMipsFloatABI(D, Args);
1174
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001175 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001176 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001177 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001178 CmdArgs.push_back("-mfloat-abi");
1179 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001180 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001181 else {
1182 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001183 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001184 CmdArgs.push_back("-mfloat-abi");
1185 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001186 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001187
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001188 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1189 if (A->getOption().matches(options::OPT_mxgot)) {
1190 CmdArgs.push_back("-mllvm");
1191 CmdArgs.push_back("-mxgot");
1192 }
1193 }
1194
Simon Atanasyanc580b322013-05-11 06:33:44 +00001195 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1196 options::OPT_mno_ldc1_sdc1)) {
1197 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1198 CmdArgs.push_back("-mllvm");
1199 CmdArgs.push_back("-mno-ldc1-sdc1");
1200 }
1201 }
1202
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001203 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1204 options::OPT_mno_check_zero_division)) {
1205 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1206 CmdArgs.push_back("-mllvm");
1207 CmdArgs.push_back("-mno-check-zero-division");
1208 }
1209 }
1210
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001211 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001212 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001213 CmdArgs.push_back("-mllvm");
1214 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1215 A->claim();
1216 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001217}
1218
Hal Finkel8eb59282012-06-11 22:35:19 +00001219/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1220static std::string getPPCTargetCPU(const ArgList &Args) {
1221 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001222 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001223
1224 if (CPUName == "native") {
1225 std::string CPU = llvm::sys::getHostCPUName();
1226 if (!CPU.empty() && CPU != "generic")
1227 return CPU;
1228 else
1229 return "";
1230 }
1231
1232 return llvm::StringSwitch<const char *>(CPUName)
1233 .Case("common", "generic")
1234 .Case("440", "440")
1235 .Case("440fp", "440")
1236 .Case("450", "450")
1237 .Case("601", "601")
1238 .Case("602", "602")
1239 .Case("603", "603")
1240 .Case("603e", "603e")
1241 .Case("603ev", "603ev")
1242 .Case("604", "604")
1243 .Case("604e", "604e")
1244 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001245 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001246 .Case("G3", "g3")
1247 .Case("7400", "7400")
1248 .Case("G4", "g4")
1249 .Case("7450", "7450")
1250 .Case("G4+", "g4+")
1251 .Case("750", "750")
1252 .Case("970", "970")
1253 .Case("G5", "g5")
1254 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001255 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001256 .Case("e500mc", "e500mc")
1257 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001258 .Case("power3", "pwr3")
1259 .Case("power4", "pwr4")
1260 .Case("power5", "pwr5")
1261 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001262 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001264 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001265 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001266 .Case("pwr3", "pwr3")
1267 .Case("pwr4", "pwr4")
1268 .Case("pwr5", "pwr5")
1269 .Case("pwr5x", "pwr5x")
1270 .Case("pwr6", "pwr6")
1271 .Case("pwr6x", "pwr6x")
1272 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001273 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001274 .Case("powerpc", "ppc")
1275 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001276 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001277 .Default("");
1278 }
1279
1280 return "";
1281}
1282
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001283static void getPPCTargetFeatures(const ArgList &Args,
1284 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001285 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1286 ie = Args.filtered_end();
1287 it != ie; ++it) {
1288 StringRef Name = (*it)->getOption().getName();
1289 (*it)->claim();
1290
1291 // Skip over "-m".
1292 assert(Name.startswith("m") && "Invalid feature name.");
1293 Name = Name.substr(1);
1294
1295 bool IsNegative = Name.startswith("no-");
1296 if (IsNegative)
1297 Name = Name.substr(3);
1298
1299 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1300 // pass the correct option to the backend while calling the frontend
1301 // option the same.
1302 // TODO: Change the LLVM backend option maybe?
1303 if (Name == "mfcrf")
1304 Name = "mfocrf";
1305
1306 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1307 }
1308
1309 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001310 AddTargetFeature(Args, Features, options::OPT_faltivec,
1311 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001312}
1313
Ulrich Weigand8afad612014-07-28 13:17:52 +00001314void Clang::AddPPCTargetArgs(const ArgList &Args,
1315 ArgStringList &CmdArgs) const {
1316 // Select the ABI to use.
1317 const char *ABIName = nullptr;
1318 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1319 ABIName = A->getValue();
1320 } else if (getToolChain().getTriple().isOSLinux())
1321 switch(getToolChain().getArch()) {
1322 case llvm::Triple::ppc64:
1323 ABIName = "elfv1";
1324 break;
1325 case llvm::Triple::ppc64le:
1326 ABIName = "elfv2";
1327 break;
1328 default:
1329 break;
1330 }
1331
1332 if (ABIName) {
1333 CmdArgs.push_back("-target-abi");
1334 CmdArgs.push_back(ABIName);
1335 }
1336}
1337
1338bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1339 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1340 return A && (A->getValue() == StringRef(Value));
1341}
1342
Tom Stellard6674c702013-04-01 20:56:53 +00001343/// Get the (LLVM) name of the R600 gpu we are targeting.
1344static std::string getR600TargetGPU(const ArgList &Args) {
1345 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001346 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001347 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001348 .Cases("rv630", "rv635", "r600")
1349 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001350 .Case("rv740", "rv770")
1351 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001352 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001353 .Case("hemlock", "cypress")
1354 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001355 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001356 }
1357 return "";
1358}
1359
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001360static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001361 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001362 bool SoftFloatABI = true;
1363 if (Arg *A =
1364 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1365 if (A->getOption().matches(options::OPT_mhard_float))
1366 SoftFloatABI = false;
1367 }
1368 if (SoftFloatABI)
1369 Features.push_back("+soft-float");
1370}
1371
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001372void Clang::AddSparcTargetArgs(const ArgList &Args,
1373 ArgStringList &CmdArgs) const {
1374 const Driver &D = getToolChain().getDriver();
1375
Brad Smith10cd0f42014-07-11 20:12:08 +00001376 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001377 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001378 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1379 options::OPT_mhard_float)) {
1380 if (A->getOption().matches(options::OPT_msoft_float))
1381 FloatABI = "soft";
1382 else if (A->getOption().matches(options::OPT_mhard_float))
1383 FloatABI = "hard";
1384 }
1385
1386 // If unspecified, choose the default based on the platform.
1387 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001388 // Assume "soft", but warn the user we are guessing.
1389 FloatABI = "soft";
1390 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001391 }
1392
1393 if (FloatABI == "soft") {
1394 // Floating point operations and argument passing are soft.
1395 //
1396 // FIXME: This changes CPP defines, we need -target-soft-float.
1397 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001398 } else {
1399 assert(FloatABI == "hard" && "Invalid float abi!");
1400 CmdArgs.push_back("-mhard-float");
1401 }
1402}
1403
Richard Sandiford4652d892013-07-19 16:51:51 +00001404static const char *getSystemZTargetCPU(const ArgList &Args) {
1405 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1406 return A->getValue();
1407 return "z10";
1408}
1409
Chandler Carruth953fb082013-01-13 11:46:33 +00001410static const char *getX86TargetCPU(const ArgList &Args,
1411 const llvm::Triple &Triple) {
1412 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001413 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001414 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001415 return "core-avx2";
1416
Chandler Carruth953fb082013-01-13 11:46:33 +00001417 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001418 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001419
1420 // FIXME: Reject attempts to use -march=native unless the target matches
1421 // the host.
1422 //
1423 // FIXME: We should also incorporate the detected target features for use
1424 // with -native.
1425 std::string CPU = llvm::sys::getHostCPUName();
1426 if (!CPU.empty() && CPU != "generic")
1427 return Args.MakeArgString(CPU);
1428 }
1429
1430 // Select the default CPU if none was given (or detection failed).
1431
1432 if (Triple.getArch() != llvm::Triple::x86_64 &&
1433 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001434 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001435
1436 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1437
1438 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001439 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001440 if (Triple.getArchName() == "x86_64h")
1441 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001442 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001443 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001444
Alexey Bataev286d1b92014-01-31 04:07:13 +00001445 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001446 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001447 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001448
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001449 // Everything else goes to x86-64 in 64-bit mode.
1450 if (Is64Bit)
1451 return "x86-64";
1452
1453 switch (Triple.getOS()) {
1454 case llvm::Triple::FreeBSD:
1455 case llvm::Triple::NetBSD:
1456 case llvm::Triple::OpenBSD:
1457 return "i486";
1458 case llvm::Triple::Haiku:
1459 return "i586";
1460 case llvm::Triple::Bitrig:
1461 return "i686";
1462 default:
1463 // Fallback to p4.
1464 return "pentium4";
1465 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001466}
1467
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001468static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1469 switch(T.getArch()) {
1470 default:
1471 return "";
1472
Amara Emerson703da2e2013-10-31 09:32:33 +00001473 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001474 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001475 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001476
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001477 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001478 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001479 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001480 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001481 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001482
1483 case llvm::Triple::mips:
1484 case llvm::Triple::mipsel:
1485 case llvm::Triple::mips64:
1486 case llvm::Triple::mips64el: {
1487 StringRef CPUName;
1488 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001489 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001490 return CPUName;
1491 }
1492
1493 case llvm::Triple::ppc:
1494 case llvm::Triple::ppc64:
1495 case llvm::Triple::ppc64le: {
1496 std::string TargetCPUName = getPPCTargetCPU(Args);
1497 // LLVM may default to generating code for the native CPU,
1498 // but, like gcc, we default to a more generic option for
1499 // each architecture. (except on Darwin)
1500 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1501 if (T.getArch() == llvm::Triple::ppc64)
1502 TargetCPUName = "ppc64";
1503 else if (T.getArch() == llvm::Triple::ppc64le)
1504 TargetCPUName = "ppc64le";
1505 else
1506 TargetCPUName = "ppc";
1507 }
1508 return TargetCPUName;
1509 }
1510
1511 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001512 case llvm::Triple::sparcv9:
1513 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001514 return A->getValue();
1515 return "";
1516
1517 case llvm::Triple::x86:
1518 case llvm::Triple::x86_64:
1519 return getX86TargetCPU(Args, T);
1520
1521 case llvm::Triple::hexagon:
1522 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1523
1524 case llvm::Triple::systemz:
1525 return getSystemZTargetCPU(Args);
1526
1527 case llvm::Triple::r600:
1528 return getR600TargetGPU(Args);
1529 }
1530}
1531
Alp Tokerce365ca2013-12-02 12:43:03 +00001532static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1533 ArgStringList &CmdArgs) {
1534 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1535 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1536 // forward.
1537 CmdArgs.push_back("-plugin");
1538 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1539 CmdArgs.push_back(Args.MakeArgString(Plugin));
1540
1541 // Try to pass driver level flags relevant to LTO code generation down to
1542 // the plugin.
1543
1544 // Handle flags for selecting CPU variants.
1545 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1546 if (!CPU.empty())
1547 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1548}
1549
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001550static void getX86TargetFeatures(const Driver & D,
1551 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001552 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001553 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001554 if (Triple.getArchName() == "x86_64h") {
1555 // x86_64h implies quite a few of the more modern subtarget features
1556 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1557 Features.push_back("-rdrnd");
1558 Features.push_back("-aes");
1559 Features.push_back("-pclmul");
1560 Features.push_back("-rtm");
1561 Features.push_back("-hle");
1562 Features.push_back("-fsgsbase");
1563 }
1564
Alexey Volkov54ff0802014-06-25 12:15:36 +00001565 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001566 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001567 if (Triple.getArch() == llvm::Triple::x86_64) {
1568 Features.push_back("+sse4.2");
1569 Features.push_back("+popcnt");
1570 } else
1571 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001572 }
1573
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001574 // Set features according to the -arch flag on MSVC
1575 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1576 StringRef Arch = A->getValue();
1577 bool ArchUsed = false;
1578 // First, look for flags that are shared in x86 and x86-64.
1579 if (Triple.getArch() == llvm::Triple::x86_64 ||
1580 Triple.getArch() == llvm::Triple::x86) {
1581 if (Arch == "AVX" || Arch == "AVX2") {
1582 ArchUsed = true;
1583 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1584 }
1585 }
1586 // Then, look for x86-specific flags.
1587 if (Triple.getArch() == llvm::Triple::x86) {
1588 if (Arch == "IA32") {
1589 ArchUsed = true;
1590 } else if (Arch == "SSE" || Arch == "SSE2") {
1591 ArchUsed = true;
1592 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1593 }
1594 }
1595 if (!ArchUsed)
1596 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1597 }
1598
Jim Grosbach82eee262013-11-16 00:53:35 +00001599 // Now add any that the user explicitly requested on the command line,
1600 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001601 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1602 ie = Args.filtered_end();
1603 it != ie; ++it) {
1604 StringRef Name = (*it)->getOption().getName();
1605 (*it)->claim();
1606
1607 // Skip over "-m".
1608 assert(Name.startswith("m") && "Invalid feature name.");
1609 Name = Name.substr(1);
1610
1611 bool IsNegative = Name.startswith("no-");
1612 if (IsNegative)
1613 Name = Name.substr(3);
1614
1615 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1616 }
1617}
1618
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001619void Clang::AddX86TargetArgs(const ArgList &Args,
1620 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001621 if (!Args.hasFlag(options::OPT_mred_zone,
1622 options::OPT_mno_red_zone,
1623 true) ||
1624 Args.hasArg(options::OPT_mkernel) ||
1625 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001626 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001627
Bob Wilson2616e2e2013-02-10 16:01:41 +00001628 // Default to avoid implicit floating-point for kernel/kext code, but allow
1629 // that to be overridden with -mno-soft-float.
1630 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1631 Args.hasArg(options::OPT_fapple_kext));
1632 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1633 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001634 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001635 options::OPT_mno_implicit_float)) {
1636 const Option &O = A->getOption();
1637 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1638 O.matches(options::OPT_msoft_float));
1639 }
1640 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001641 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001642
1643 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1644 StringRef Value = A->getValue();
1645 if (Value == "intel" || Value == "att") {
1646 CmdArgs.push_back("-mllvm");
1647 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1648 } else {
1649 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1650 << A->getOption().getName() << Value;
1651 }
1652 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001653}
1654
Matthew Curtise8f80a12012-12-06 17:49:03 +00001655static inline bool HasPICArg(const ArgList &Args) {
1656 return Args.hasArg(options::OPT_fPIC)
1657 || Args.hasArg(options::OPT_fpic);
1658}
1659
1660static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1661 return Args.getLastArg(options::OPT_G,
1662 options::OPT_G_EQ,
1663 options::OPT_msmall_data_threshold_EQ);
1664}
1665
1666static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1667 std::string value;
1668 if (HasPICArg(Args))
1669 value = "0";
1670 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1671 value = A->getValue();
1672 A->claim();
1673 }
1674 return value;
1675}
1676
Tony Linthicum76329bf2011-12-12 21:14:55 +00001677void Clang::AddHexagonTargetArgs(const ArgList &Args,
1678 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001679 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001680 CmdArgs.push_back("-mqdsp6-compat");
1681 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001682
Matthew Curtise8f80a12012-12-06 17:49:03 +00001683 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1684 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001685 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001686 CmdArgs.push_back(Args.MakeArgString(
1687 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001688 }
1689
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001690 if (!Args.hasArg(options::OPT_fno_short_enums))
1691 CmdArgs.push_back("-fshort-enums");
1692 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1693 CmdArgs.push_back ("-mllvm");
1694 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1695 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001696 CmdArgs.push_back ("-mllvm");
1697 CmdArgs.push_back ("-machine-sink-split=0");
1698}
1699
Kevin Qin110db6f2014-07-18 07:03:22 +00001700// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001701static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001702 std::vector<const char *> &Features) {
1703 SmallVector<StringRef, 8> Split;
1704 text.split(Split, StringRef("+"), -1, false);
1705
1706 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1707 const char *result = llvm::StringSwitch<const char *>(Split[I])
1708 .Case("fp", "+fp-armv8")
1709 .Case("simd", "+neon")
1710 .Case("crc", "+crc")
1711 .Case("crypto", "+crypto")
1712 .Case("nofp", "-fp-armv8")
1713 .Case("nosimd", "-neon")
1714 .Case("nocrc", "-crc")
1715 .Case("nocrypto", "-crypto")
1716 .Default(nullptr);
1717 if (result)
1718 Features.push_back(result);
1719 else if (Split[I] == "neon" || Split[I] == "noneon")
1720 D.Diag(diag::err_drv_no_neon_modifier);
1721 else
1722 return false;
1723 }
1724 return true;
1725}
1726
1727// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1728// decode CPU and feature.
1729static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1730 std::vector<const char *> &Features) {
1731 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1732 CPU = Split.first;
1733 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1734 Features.push_back("+neon");
1735 Features.push_back("+crc");
1736 Features.push_back("+crypto");
1737 } else if (CPU == "generic") {
1738 Features.push_back("+neon");
1739 } else {
1740 return false;
1741 }
1742
1743 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1744 return false;
1745
1746 return true;
1747}
1748
1749static bool
1750getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1751 const ArgList &Args,
1752 std::vector<const char *> &Features) {
1753 std::pair<StringRef, StringRef> Split = March.split("+");
1754 if (Split.first != "armv8-a")
1755 return false;
1756
1757 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1758 return false;
1759
1760 return true;
1761}
1762
1763static bool
1764getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1765 const ArgList &Args,
1766 std::vector<const char *> &Features) {
1767 StringRef CPU;
1768 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1769 return false;
1770
1771 return true;
1772}
1773
1774static bool
1775getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1776 const ArgList &Args,
1777 std::vector<const char *> &Features) {
1778 // Handle CPU name is 'native'.
1779 if (Mtune == "native")
1780 Mtune = llvm::sys::getHostCPUName();
1781 if (Mtune == "cyclone") {
1782 Features.push_back("+zcm");
1783 Features.push_back("+zcz");
1784 }
1785 return true;
1786}
1787
1788static bool
1789getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1790 const ArgList &Args,
1791 std::vector<const char *> &Features) {
1792 StringRef CPU;
1793 std::vector<const char *> DecodedFeature;
1794 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1795 return false;
1796
1797 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1798}
1799
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001800static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1801 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001802 Arg *A;
1803 bool success = true;
1804 // Enable NEON by default.
1805 Features.push_back("+neon");
1806 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1807 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1808 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1809 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1810
1811 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1812 success =
1813 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1814 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1815 success =
1816 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
1817
1818 if (!success)
1819 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001820
1821 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1822 Features.push_back("-fp-armv8");
1823 Features.push_back("-crypto");
1824 Features.push_back("-neon");
1825 }
Bradley Smith418c5932014-05-02 15:17:51 +00001826
1827 // En/disable crc
1828 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1829 options::OPT_mnocrc)) {
1830 if (A->getOption().matches(options::OPT_mcrc))
1831 Features.push_back("+crc");
1832 else
1833 Features.push_back("-crc");
1834 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001835}
1836
1837static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001838 const ArgList &Args, ArgStringList &CmdArgs,
1839 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001840 std::vector<const char *> Features;
1841 switch (Triple.getArch()) {
1842 default:
1843 break;
1844 case llvm::Triple::mips:
1845 case llvm::Triple::mipsel:
1846 case llvm::Triple::mips64:
1847 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001848 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001849 break;
1850
1851 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001852 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001853 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001854 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001855 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001856 break;
1857
1858 case llvm::Triple::ppc:
1859 case llvm::Triple::ppc64:
1860 case llvm::Triple::ppc64le:
1861 getPPCTargetFeatures(Args, Features);
1862 break;
1863 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001864 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001865 getSparcTargetFeatures(Args, Features);
1866 break;
1867 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001868 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001869 getAArch64TargetFeatures(D, Args, Features);
1870 break;
1871 case llvm::Triple::x86:
1872 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001873 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001874 break;
1875 }
Rafael Espindola43964802013-08-21 17:34:32 +00001876
1877 // Find the last of each feature.
1878 llvm::StringMap<unsigned> LastOpt;
1879 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1880 const char *Name = Features[I];
1881 assert(Name[0] == '-' || Name[0] == '+');
1882 LastOpt[Name + 1] = I;
1883 }
1884
1885 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1886 // If this feature was overridden, ignore it.
1887 const char *Name = Features[I];
1888 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1889 assert(LastI != LastOpt.end());
1890 unsigned Last = LastI->second;
1891 if (Last != I)
1892 continue;
1893
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001894 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001895 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001896 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001897}
1898
Eric Christopher84fbdb42011-08-19 00:30:14 +00001899static bool
John McCall5fb5df92012-06-20 06:18:46 +00001900shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001901 const llvm::Triple &Triple) {
1902 // We use the zero-cost exception tables for Objective-C if the non-fragile
1903 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1904 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001905 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001906 return true;
1907
Bob Wilson83e723a2013-12-05 19:38:42 +00001908 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001909 return false;
1910
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001911 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001912 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001913 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001914}
1915
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001916namespace {
1917 struct ExceptionSettings {
1918 bool ExceptionsEnabled;
1919 bool ShouldUseExceptionTables;
1920 ExceptionSettings() : ExceptionsEnabled(false),
1921 ShouldUseExceptionTables(false) {}
1922 };
1923} // end anonymous namespace.
1924
Nico Webere8e53112014-05-11 01:04:02 +00001925// exceptionSettings() exists to share the logic between -cc1 and linker
1926// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001927static ExceptionSettings exceptionSettings(const ArgList &Args,
1928 const llvm::Triple &Triple) {
1929 ExceptionSettings ES;
1930
1931 // Are exceptions enabled by default?
1932 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1933
1934 // This keeps track of whether exceptions were explicitly turned on or off.
1935 bool DidHaveExplicitExceptionFlag = false;
1936
1937 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1938 options::OPT_fno_exceptions)) {
1939 if (A->getOption().matches(options::OPT_fexceptions))
1940 ES.ExceptionsEnabled = true;
1941 else
1942 ES.ExceptionsEnabled = false;
1943
1944 DidHaveExplicitExceptionFlag = true;
1945 }
1946
1947 // Exception tables and cleanups can be enabled with -fexceptions even if the
1948 // language itself doesn't support exceptions.
1949 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1950 ES.ShouldUseExceptionTables = true;
1951
1952 return ES;
1953}
1954
Anders Carlssone96ab552011-02-28 02:27:16 +00001955/// addExceptionArgs - Adds exception related arguments to the driver command
1956/// arguments. There's a master flag, -fexceptions and also language specific
1957/// flags to enable/disable C++ and Objective-C exceptions.
1958/// This makes it possible to for example disable C++ exceptions but enable
1959/// Objective-C exceptions.
1960static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1961 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001962 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001963 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001964 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001965 if (KernelOrKext) {
1966 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1967 // arguments now to avoid warnings about unused arguments.
1968 Args.ClaimAllArgs(options::OPT_fexceptions);
1969 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1970 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1971 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1972 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1973 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001974 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001975 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001976
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001977 // Gather the exception settings from the command line arguments.
1978 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001979
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001980 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1981 // is not necessarily sensible, but follows GCC.
1982 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001983 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001984 options::OPT_fno_objc_exceptions,
1985 true)) {
1986 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001987
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001988 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001989 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001990 }
1991
1992 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001993 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001994
Eric Christopher84fbdb42011-08-19 00:30:14 +00001995 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1996 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001997 options::OPT_fexceptions,
1998 options::OPT_fno_exceptions)) {
1999 if (A->getOption().matches(options::OPT_fcxx_exceptions))
2000 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00002001 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00002002 CXXExceptionsEnabled = false;
2003 }
2004
2005 if (CXXExceptionsEnabled) {
2006 CmdArgs.push_back("-fcxx-exceptions");
2007
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002008 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002009 }
2010 }
2011
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002012 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00002013 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002014}
2015
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002016static bool ShouldDisableAutolink(const ArgList &Args,
2017 const ToolChain &TC) {
2018 bool Default = true;
2019 if (TC.getTriple().isOSDarwin()) {
2020 // The native darwin assembler doesn't support the linker_option directives,
2021 // so we disable them if we think the .s file will be passed to it.
2022 Default = TC.useIntegratedAs();
2023 }
2024 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2025 Default);
2026}
2027
Ted Kremenek62093662013-03-12 17:02:12 +00002028static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2029 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002030 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2031 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002032 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002033 return !UseDwarfDirectory;
2034}
2035
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002036/// \brief Check whether the given input tree contains any compilation actions.
2037static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002038 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002039 return true;
2040
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002041 for (const auto &Act : *A)
2042 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002043 return true;
2044
2045 return false;
2046}
2047
2048/// \brief Check if -relax-all should be passed to the internal assembler.
2049/// This is done by default when compiling non-assembler source with -O0.
2050static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2051 bool RelaxDefault = true;
2052
2053 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2054 RelaxDefault = A->getOption().matches(options::OPT_O0);
2055
2056 if (RelaxDefault) {
2057 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002058 for (const auto &Act : C.getActions()) {
2059 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002060 RelaxDefault = true;
2061 break;
2062 }
2063 }
2064 }
2065
2066 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2067 RelaxDefault);
2068}
2069
David Blaikie9260ed62013-07-25 21:19:01 +00002070static void CollectArgsForIntegratedAssembler(Compilation &C,
2071 const ArgList &Args,
2072 ArgStringList &CmdArgs,
2073 const Driver &D) {
2074 if (UseRelaxAll(C, Args))
2075 CmdArgs.push_back("-mrelax-all");
2076
David Peixottodfb66142013-11-14 22:52:58 +00002077 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002078 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002079 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2080 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2081 // arg after parsing the '-I' arg.
2082 bool TakeNextArg = false;
2083
David Blaikie9260ed62013-07-25 21:19:01 +00002084 // When using an integrated assembler, translate -Wa, and -Xassembler
2085 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002086 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002087 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2088 options::OPT_Xassembler),
2089 ie = Args.filtered_end(); it != ie; ++it) {
2090 const Arg *A = *it;
2091 A->claim();
2092
2093 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2094 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002095 if (TakeNextArg) {
2096 CmdArgs.push_back(Value.data());
2097 TakeNextArg = false;
2098 continue;
2099 }
David Blaikie9260ed62013-07-25 21:19:01 +00002100
2101 if (Value == "-force_cpusubtype_ALL") {
2102 // Do nothing, this is the default and we don't support anything else.
2103 } else if (Value == "-L") {
2104 CmdArgs.push_back("-msave-temp-labels");
2105 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002106 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002107 } else if (Value == "--noexecstack") {
2108 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002109 } else if (Value == "-compress-debug-sections" ||
2110 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002111 CompressDebugSections = true;
2112 } else if (Value == "-nocompress-debug-sections" ||
2113 Value == "--nocompress-debug-sections") {
2114 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002115 } else if (Value.startswith("-I")) {
2116 CmdArgs.push_back(Value.data());
2117 // We need to consume the next argument if the current arg is a plain
2118 // -I. The next arg will be the include directory.
2119 if (Value == "-I")
2120 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002121 } else if (Value.startswith("-gdwarf-")) {
2122 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002123 } else {
2124 D.Diag(diag::err_drv_unsupported_option_argument)
2125 << A->getOption().getName() << Value;
2126 }
2127 }
2128 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002129 if (CompressDebugSections) {
2130 if (llvm::zlib::isAvailable())
2131 CmdArgs.push_back("-compress-debug-sections");
2132 else
2133 D.Diag(diag::warn_debug_compression_unavailable);
2134 }
David Blaikie9260ed62013-07-25 21:19:01 +00002135}
2136
Renato Goline807c122014-01-31 11:47:28 +00002137// Until ARM libraries are build separately, we have them all in one library
2138static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002139 if (TC.getArch() == llvm::Triple::arm ||
2140 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002141 return "arm";
2142 else
2143 return TC.getArchName();
2144}
2145
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002146static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2147 // The runtimes are located in the OS-specific resource directory.
2148 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002149 const llvm::Triple &Triple = TC.getTriple();
2150 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
2151 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
2152 "freebsd" : TC.getOS();
2153 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002154 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002155}
2156
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002157// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002158// FIXME: Make sure we can also emit shared objects if they're requested
2159// and available, check for possible errors, etc.
2160static void addClangRTLinux(
2161 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002162 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002163 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
2164 getArchNameForCompilerRTLib(TC) +
2165 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00002166
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002167 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00002168 CmdArgs.push_back("-lgcc_s");
2169 if (TC.getDriver().CCCIsCXX())
2170 CmdArgs.push_back("-lgcc_eh");
2171}
2172
Alexey Samsonov7811d192014-02-20 13:57:37 +00002173static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00002174 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002175 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2176 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002177 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002178 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002179 Args.hasArg(options::OPT_fcreate_profile) ||
2180 Args.hasArg(options::OPT_coverage)))
2181 return;
2182
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002183 // -fprofile-instr-generate requires position-independent code to build with
2184 // shared objects. Link against the right archive.
2185 const char *Lib = "libclang_rt.profile-";
2186 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2187 Args.hasArg(options::OPT_shared))
2188 Lib = "libclang_rt.profile-pic-";
2189
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002190 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
2191 llvm::sys::path::append(LibProfile,
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00002192 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00002193
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00002194 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00002195}
2196
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002197static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
Craig Topperbf3e3272014-08-30 16:55:52 +00002198 StringRef Sanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002199 bool Shared) {
2200 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
2201 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
2202 const char *EnvSuffix =
2203 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002204 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
2205 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002206 Twine("libclang_rt.") + Sanitizer + "-" +
2207 getArchNameForCompilerRTLib(TC) + EnvSuffix +
2208 (Shared ? ".so" : ".a"));
2209 return LibSanitizer;
2210}
2211
Alexey Samsonov52550342014-09-15 19:58:40 +00002212static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2213 ArgStringList &CmdArgs, StringRef Sanitizer,
2214 bool IsShared) {
2215 SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, IsShared);
2216 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002217 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002218 if (!IsShared)
2219 CmdArgs.push_back("-whole-archive");
2220 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
2221 if (!IsShared)
2222 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002223}
2224
Alexey Samsonov52550342014-09-15 19:58:40 +00002225// Tries to use a file with the list of dynamic symbols that need to be exported
2226// from the runtime library. Returns true if the file was found.
2227static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2228 ArgStringList &CmdArgs,
2229 StringRef Sanitizer) {
2230 SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, false);
2231 if (llvm::sys::fs::exists(LibSanitizer + ".syms")) {
2232 CmdArgs.push_back(
2233 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
2234 return true;
2235 }
2236 return false;
2237}
2238
2239static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2240 ArgStringList &CmdArgs) {
2241 // Force linking against the system libraries sanitizers depends on
2242 // (see PR15823 why this is necessary).
2243 CmdArgs.push_back("--no-as-needed");
2244 CmdArgs.push_back("-lpthread");
2245 CmdArgs.push_back("-lrt");
2246 CmdArgs.push_back("-lm");
2247 // There's no libdl on FreeBSD.
2248 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2249 CmdArgs.push_back("-ldl");
2250}
2251
2252static void
2253collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2254 SmallVectorImpl<StringRef> &SharedRuntimes,
2255 SmallVectorImpl<StringRef> &StaticRuntimes,
2256 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2257 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2258 // Collect shared runtimes.
2259 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2260 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002261 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002262
Alexey Samsonov52550342014-09-15 19:58:40 +00002263 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002264 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002265 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2266 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002267 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002268 }
2269 if (SanArgs.needsAsanRt()) {
2270 if (SanArgs.needsSharedAsanRt()) {
2271 HelperStaticRuntimes.push_back("asan-preinit");
2272 } else {
2273 StaticRuntimes.push_back("asan");
2274 if (SanArgs.linkCXXRuntimes())
2275 StaticRuntimes.push_back("asan_cxx");
2276 }
2277 }
2278 if (SanArgs.needsDfsanRt())
2279 StaticRuntimes.push_back("dfsan");
2280 if (SanArgs.needsLsanRt())
2281 StaticRuntimes.push_back("lsan");
2282 if (SanArgs.needsMsanRt())
2283 StaticRuntimes.push_back("msan");
2284 if (SanArgs.needsTsanRt())
2285 StaticRuntimes.push_back("tsan");
2286 // WARNING: UBSan should always go last.
2287 if (SanArgs.needsUbsanRt()) {
2288 // If UBSan is not combined with another sanitizer, we need to pull in
2289 // sanitizer_common explicitly.
2290 if (StaticRuntimes.empty())
2291 HelperStaticRuntimes.push_back("san");
2292 StaticRuntimes.push_back("ubsan");
2293 if (SanArgs.linkCXXRuntimes())
2294 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002295 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002296}
2297
Alexey Samsonov52550342014-09-15 19:58:40 +00002298// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2299// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2300static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002301 ArgStringList &CmdArgs) {
Alexey Samsonov58ae9ae2014-09-26 21:22:08 +00002302 // Don't link in any sanitizer runtimes if we have no system libraries.
2303 if (Args.hasArg(options::OPT_nostdlib) ||
2304 Args.hasArg(options::OPT_nodefaultlibs))
2305 return false;
Alexey Samsonov52550342014-09-15 19:58:40 +00002306 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2307 HelperStaticRuntimes;
2308 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2309 HelperStaticRuntimes);
2310 for (auto RT : SharedRuntimes)
2311 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2312 for (auto RT : HelperStaticRuntimes)
2313 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2314 bool AddExportDynamic = false;
2315 for (auto RT : StaticRuntimes) {
2316 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2317 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2318 }
2319 // If there is a static runtime with no dynamic list, force all the symbols
2320 // to be dynamic to be sure we export sanitizer interface functions.
2321 if (AddExportDynamic)
2322 CmdArgs.push_back("-export-dynamic");
2323 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002324}
2325
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002326static bool shouldUseFramePointerForTarget(const ArgList &Args,
2327 const llvm::Triple &Triple) {
2328 switch (Triple.getArch()) {
2329 // Don't use a frame pointer on linux if optimizing for certain targets.
2330 case llvm::Triple::mips64:
2331 case llvm::Triple::mips64el:
2332 case llvm::Triple::mips:
2333 case llvm::Triple::mipsel:
2334 case llvm::Triple::systemz:
2335 case llvm::Triple::x86:
2336 case llvm::Triple::x86_64:
2337 if (Triple.isOSLinux())
2338 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2339 if (!A->getOption().matches(options::OPT_O0))
2340 return false;
2341 return true;
2342 case llvm::Triple::xcore:
2343 return false;
2344 default:
2345 return true;
2346 }
2347}
2348
Rafael Espindola224dd632011-12-14 21:02:23 +00002349static bool shouldUseFramePointer(const ArgList &Args,
2350 const llvm::Triple &Triple) {
2351 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2352 options::OPT_fomit_frame_pointer))
2353 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2354
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002355 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002356}
2357
Eric Christopherb7d97e92013-04-03 01:58:53 +00002358static bool shouldUseLeafFramePointer(const ArgList &Args,
2359 const llvm::Triple &Triple) {
2360 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2361 options::OPT_momit_leaf_frame_pointer))
2362 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2363
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002364 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002365}
2366
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002367/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002368static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002369 SmallString<128> cwd;
2370 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002371 CmdArgs.push_back("-fdebug-compilation-dir");
2372 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002373 }
2374}
2375
Eric Christopherd3804002013-02-22 20:12:52 +00002376static const char *SplitDebugName(const ArgList &Args,
2377 const InputInfoList &Inputs) {
2378 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2379 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2380 SmallString<128> T(FinalOutput->getValue());
2381 llvm::sys::path::replace_extension(T, "dwo");
2382 return Args.MakeArgString(T);
2383 } else {
2384 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002385 SmallString<128> T(
2386 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002387 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2388 llvm::sys::path::replace_extension(F, "dwo");
2389 T += F;
2390 return Args.MakeArgString(F);
2391 }
2392}
2393
2394static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2395 const Tool &T, const JobAction &JA,
2396 const ArgList &Args, const InputInfo &Output,
2397 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002398 ArgStringList ExtractArgs;
2399 ExtractArgs.push_back("--extract-dwo");
2400
2401 ArgStringList StripArgs;
2402 StripArgs.push_back("--strip-dwo");
2403
2404 // Grabbing the output of the earlier compile step.
2405 StripArgs.push_back(Output.getFilename());
2406 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002407 ExtractArgs.push_back(OutFile);
2408
2409 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002410 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002411
2412 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002413 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002414
2415 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002416 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002417}
2418
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002419/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002420/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2421static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002422 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002423 if (A->getOption().matches(options::OPT_O4) ||
2424 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002425 return true;
2426
2427 if (A->getOption().matches(options::OPT_O0))
2428 return false;
2429
2430 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2431
Rafael Espindola91780de2013-08-26 14:05:41 +00002432 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002433 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002434 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002435 return true;
2436
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002437 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002438 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002439 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002440
2441 unsigned OptLevel = 0;
2442 if (S.getAsInteger(10, OptLevel))
2443 return false;
2444
2445 return OptLevel > 1;
2446 }
2447
2448 return false;
2449}
2450
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002451/// Add -x lang to \p CmdArgs for \p Input.
2452static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2453 ArgStringList &CmdArgs) {
2454 // When using -verify-pch, we don't want to provide the type
2455 // 'precompiled-header' if it was inferred from the file extension
2456 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2457 return;
2458
2459 CmdArgs.push_back("-x");
2460 if (Args.hasArg(options::OPT_rewrite_objc))
2461 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2462 else
2463 CmdArgs.push_back(types::getTypeName(Input.getType()));
2464}
2465
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002466static std::string getMSCompatibilityVersion(const char *VersionStr) {
2467 unsigned Version;
2468 if (StringRef(VersionStr).getAsInteger(10, Version))
2469 return "0";
2470
2471 if (Version < 100)
2472 return llvm::utostr_32(Version) + ".0";
2473
2474 if (Version < 10000)
2475 return llvm::utostr_32(Version / 100) + "." +
2476 llvm::utostr_32(Version % 100);
2477
2478 unsigned Build = 0, Factor = 1;
2479 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2480 Build = Build + (Version % 10) * Factor;
2481 return llvm::utostr_32(Version / 100) + "." +
2482 llvm::utostr_32(Version % 100) + "." +
2483 llvm::utostr_32(Build);
2484}
2485
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002486void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002487 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002488 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002489 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002490 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002491 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2492 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002493 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002494 ArgStringList CmdArgs;
2495
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002496 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002497 bool IsWindowsCygnus =
2498 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002499 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2500
Daniel Dunbare521a892009-03-31 20:53:55 +00002501 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2502
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002503 // Invoke ourselves in -cc1 mode.
2504 //
2505 // FIXME: Implement custom jobs for internal actions.
2506 CmdArgs.push_back("-cc1");
2507
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002508 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002509 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002510 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002511 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002512
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002513 const llvm::Triple TT(TripleStr);
2514 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2515 TT.getArch() == llvm::Triple::thumb)) {
2516 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2517 unsigned Version;
2518 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2519 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002520 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2521 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002522 }
2523
Tim Northover336f1892014-03-29 13:16:12 +00002524 // Push all default warning arguments that are specific to
2525 // the given target. These come before user provided warning options
2526 // are provided.
2527 getToolChain().addClangWarningOptions(CmdArgs);
2528
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002529 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002530 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002531
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002532 if (isa<AnalyzeJobAction>(JA)) {
2533 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2534 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002535 } else if (isa<MigrateJobAction>(JA)) {
2536 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002537 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002538 if (Output.getType() == types::TY_Dependencies)
2539 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002540 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002541 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002542 if (Args.hasArg(options::OPT_rewrite_objc) &&
2543 !Args.hasArg(options::OPT_g_Group))
2544 CmdArgs.push_back("-P");
2545 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002546 } else if (isa<AssembleJobAction>(JA)) {
2547 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002548
David Blaikie9260ed62013-07-25 21:19:01 +00002549 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002550
2551 // Also ignore explicit -force_cpusubtype_ALL option.
2552 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002553 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002554 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002555 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002556
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002557 if (JA.getType() == types::TY_Nothing)
2558 CmdArgs.push_back("-fsyntax-only");
2559 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002560 CmdArgs.push_back("-emit-pch");
2561 else
2562 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002563 } else if (isa<VerifyPCHJobAction>(JA)) {
2564 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002565 } else {
2566 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002567
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002568 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002569 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002570 } else if (JA.getType() == types::TY_LLVM_IR ||
2571 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002572 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002573 } else if (JA.getType() == types::TY_LLVM_BC ||
2574 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002575 CmdArgs.push_back("-emit-llvm-bc");
2576 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002577 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002578 } else if (JA.getType() == types::TY_AST) {
2579 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002580 } else if (JA.getType() == types::TY_ModuleFile) {
2581 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002582 } else if (JA.getType() == types::TY_RewrittenObjC) {
2583 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002584 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002585 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2586 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002587 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002588 } else {
2589 assert(JA.getType() == types::TY_PP_Asm &&
2590 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002591 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002592 }
2593
Justin Bognera88f0122014-06-20 22:59:50 +00002594 // We normally speed up the clang process a bit by skipping destructors at
2595 // exit, but when we're generating diagnostics we can rely on some of the
2596 // cleanup.
2597 if (!C.isForDiagnostics())
2598 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002599
John McCallbb79b5f2010-02-13 03:50:24 +00002600 // Disable the verification pass in -asserts builds.
2601#ifdef NDEBUG
2602 CmdArgs.push_back("-disable-llvm-verifier");
2603#endif
2604
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002605 // Set the main file name, so that debug info works even with
2606 // -save-temps.
2607 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002608 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002609
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002610 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002611 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002612 if (Args.hasArg(options::OPT_static))
2613 CmdArgs.push_back("-static-define");
2614
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002615 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002616 // Enable region store model by default.
2617 CmdArgs.push_back("-analyzer-store=region");
2618
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002619 // Treat blocks as analysis entry points.
2620 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2621
Ted Kremenek49c79792011-03-24 00:28:47 +00002622 CmdArgs.push_back("-analyzer-eagerly-assume");
2623
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002624 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002625 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002626 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002627
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002628 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002629 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002630
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002631 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002632 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002633
2634 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002635
Jordan Rose10ad0812013-04-05 17:55:07 +00002636 if (types::isCXX(Inputs[0].getType()))
2637 CmdArgs.push_back("-analyzer-checker=cplusplus");
2638
Nico Webere8e53112014-05-11 01:04:02 +00002639 // Enable the following experimental checkers for testing.
2640 CmdArgs.push_back(
2641 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002642 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2643 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2644 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2645 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2646 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002647 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002648
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002649 // Set the output format. The default is plist, for (lame) historical
2650 // reasons.
2651 CmdArgs.push_back("-analyzer-output");
2652 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002653 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002654 else
2655 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002656
Ted Kremenekfe449a22010-03-22 22:32:05 +00002657 // Disable the presentation of standard compiler warnings when
2658 // using --analyze. We only want to show static analyzer diagnostics
2659 // or frontend errors.
2660 CmdArgs.push_back("-w");
2661
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002662 // Add -Xanalyzer arguments when running as analyzer.
2663 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002664 }
2665
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002666 CheckCodeGenerationOptions(D, Args);
2667
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002668 bool PIE = getToolChain().isPIEDefault();
2669 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002670 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002671
Alexey Bataev40e75222014-01-28 06:30:35 +00002672 // Android-specific defaults for PIC/PIE
2673 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2674 switch (getToolChain().getTriple().getArch()) {
2675 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002676 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002677 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002678 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002679 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002680 case llvm::Triple::mips:
2681 case llvm::Triple::mipsel:
2682 case llvm::Triple::mips64:
2683 case llvm::Triple::mips64el:
2684 PIC = true; // "-fpic"
2685 break;
2686
2687 case llvm::Triple::x86:
2688 case llvm::Triple::x86_64:
2689 PIC = true; // "-fPIC"
2690 IsPICLevelTwo = true;
2691 break;
2692
2693 default:
2694 break;
2695 }
2696 }
2697
Brad Smith5b05db82014-06-24 19:51:29 +00002698 // OpenBSD-specific defaults for PIE
2699 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2700 switch (getToolChain().getTriple().getArch()) {
2701 case llvm::Triple::mips64:
2702 case llvm::Triple::mips64el:
2703 case llvm::Triple::sparc:
2704 case llvm::Triple::x86:
2705 case llvm::Triple::x86_64:
2706 IsPICLevelTwo = false; // "-fpie"
2707 break;
2708
2709 case llvm::Triple::ppc:
2710 case llvm::Triple::sparcv9:
2711 IsPICLevelTwo = true; // "-fPIE"
2712 break;
2713
2714 default:
2715 break;
2716 }
2717 }
2718
Alexey Samsonov090301e2013-04-09 12:28:19 +00002719 // For the PIC and PIE flag options, this logic is different from the
2720 // legacy logic in very old versions of GCC, as that logic was just
2721 // a bug no one had ever fixed. This logic is both more rational and
2722 // consistent with GCC's new logic now that the bugs are fixed. The last
2723 // argument relating to either PIC or PIE wins, and no other argument is
2724 // used. If the last argument is any flavor of the '-fno-...' arguments,
2725 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2726 // at the same level.
2727 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2728 options::OPT_fpic, options::OPT_fno_pic,
2729 options::OPT_fPIE, options::OPT_fno_PIE,
2730 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002731 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2732 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002733 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002734 if (LastPICArg) {
2735 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002736 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2737 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2738 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2739 PIC = PIE || O.matches(options::OPT_fPIC) ||
2740 O.matches(options::OPT_fpic);
2741 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2742 O.matches(options::OPT_fPIC);
2743 } else {
2744 PIE = PIC = false;
2745 }
2746 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002747 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002748
Nick Lewycky609dd662013-10-11 03:33:53 +00002749 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002750 // specified while enabling PIC enabled level 1 PIC, just force it back to
2751 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2752 // informal testing).
2753 if (PIC && getToolChain().getTriple().isOSDarwin())
2754 IsPICLevelTwo |= getToolChain().isPICDefault();
2755
Chandler Carruthc0c04552012-04-08 16:40:35 +00002756 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2757 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002758 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002759 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002760 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002761 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002762 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002763 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002764
Chandler Carruth76a943b2012-11-19 03:52:03 +00002765 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2766 // This is a very special mode. It trumps the other modes, almost no one
2767 // uses it, and it isn't even valid on any OS but Darwin.
2768 if (!getToolChain().getTriple().isOSDarwin())
2769 D.Diag(diag::err_drv_unsupported_opt_for_target)
2770 << A->getSpelling() << getToolChain().getTriple().str();
2771
2772 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2773
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002774 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002775 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002776
Chandler Carruth76a943b2012-11-19 03:52:03 +00002777 // Only a forced PIC mode can cause the actual compile to have PIC defines
2778 // etc., no flags are sufficient. This behavior was selected to closely
2779 // match that of llvm-gcc and Apple GCC before that.
2780 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2781 CmdArgs.push_back("-pic-level");
2782 CmdArgs.push_back("2");
2783 }
2784 } else {
2785 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2786 // handled in Clang's IRGen by the -pie-level flag.
2787 CmdArgs.push_back("-mrelocation-model");
2788 CmdArgs.push_back(PIC ? "pic" : "static");
2789
2790 if (PIC) {
2791 CmdArgs.push_back("-pic-level");
2792 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2793 if (PIE) {
2794 CmdArgs.push_back("-pie-level");
2795 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2796 }
2797 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002798 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002799
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002800 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2801 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002802 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002803
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002804 // LLVM Code Generator Options.
2805
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002806 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2807 StringRef v = A->getValue();
2808 CmdArgs.push_back("-mllvm");
2809 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2810 A->claim();
2811 }
2812
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002813 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2814 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002815 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002816 }
2817
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002818 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2819 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002820 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002821 D.Diag(diag::err_drv_unsupported_opt_for_target)
2822 << A->getSpelling() << getToolChain().getTriple().str();
2823 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2824 CmdArgs.push_back("-fpcc-struct-return");
2825 } else {
2826 assert(A->getOption().matches(options::OPT_freg_struct_return));
2827 CmdArgs.push_back("-freg-struct-return");
2828 }
2829 }
2830
Roman Divacky65b88cd2011-03-01 17:40:53 +00002831 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2832 CmdArgs.push_back("-mrtd");
2833
Rafael Espindola224dd632011-12-14 21:02:23 +00002834 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002835 CmdArgs.push_back("-mdisable-fp-elim");
2836 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2837 options::OPT_fno_zero_initialized_in_bss))
2838 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002839
2840 bool OFastEnabled = isOptimizationLevelFast(Args);
2841 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2842 // enabled. This alias option is being used to simplify the hasFlag logic.
2843 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2844 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002845 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2846 // doesn't do any TBAA.
2847 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002848 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002849 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002850 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002851 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2852 options::OPT_fno_struct_path_tbaa))
2853 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002854 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2855 false))
2856 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002857 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2858 options::OPT_fno_optimize_sibling_calls))
2859 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002860
Eric Christopher006208c2013-04-04 06:29:47 +00002861 // Handle segmented stacks.
2862 if (Args.hasArg(options::OPT_fsplit_stack))
2863 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002864
2865 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2866 // This alias option is being used to simplify the getLastArg logic.
2867 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2868 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002869
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002870 // Handle various floating point optimization flags, mapping them to the
2871 // appropriate LLVM code generation flags. The pattern for all of these is to
2872 // default off the codegen optimizations, and if any flag enables them and no
2873 // flag disables them after the flag enabling them, enable the codegen
2874 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002875 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002876 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002877 options::OPT_ffinite_math_only,
2878 options::OPT_fno_finite_math_only,
2879 options::OPT_fhonor_infinities,
2880 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002881 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2882 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002883 A->getOption().getID() != options::OPT_fhonor_infinities)
2884 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002885 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002886 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002887 options::OPT_ffinite_math_only,
2888 options::OPT_fno_finite_math_only,
2889 options::OPT_fhonor_nans,
2890 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002891 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2892 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002893 A->getOption().getID() != options::OPT_fhonor_nans)
2894 CmdArgs.push_back("-menable-no-nans");
2895
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002896 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2897 bool MathErrno = getToolChain().IsMathErrnoDefault();
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_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002901 options::OPT_fno_math_errno)) {
2902 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2903 // However, turning *off* -ffast_math merely restores the toolchain default
2904 // (which may be false).
2905 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2906 A->getOption().getID() == options::OPT_ffast_math ||
2907 A->getOption().getID() == options::OPT_Ofast)
2908 MathErrno = false;
2909 else if (A->getOption().getID() == options::OPT_fmath_errno)
2910 MathErrno = true;
2911 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002912 if (MathErrno)
2913 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002914
2915 // There are several flags which require disabling very specific
2916 // optimizations. Any of these being disabled forces us to turn off the
2917 // entire set of LLVM optimizations, so collect them through all the flag
2918 // madness.
2919 bool AssociativeMath = false;
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_fassociative_math,
2925 options::OPT_fno_associative_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_fno_associative_math)
2929 AssociativeMath = true;
2930 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002931 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002932 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002933 options::OPT_funsafe_math_optimizations,
2934 options::OPT_fno_unsafe_math_optimizations,
2935 options::OPT_freciprocal_math,
2936 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002937 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2938 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002939 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2940 ReciprocalMath = true;
2941 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002942 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002943 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002944 options::OPT_funsafe_math_optimizations,
2945 options::OPT_fno_unsafe_math_optimizations,
2946 options::OPT_fsigned_zeros,
2947 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002948 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2949 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002950 A->getOption().getID() != options::OPT_fsigned_zeros)
2951 SignedZeros = false;
2952 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002953 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002954 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002955 options::OPT_funsafe_math_optimizations,
2956 options::OPT_fno_unsafe_math_optimizations,
2957 options::OPT_ftrapping_math,
2958 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002959 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2960 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002961 A->getOption().getID() != options::OPT_ftrapping_math)
2962 TrappingMath = false;
2963 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2964 !TrappingMath)
2965 CmdArgs.push_back("-menable-unsafe-fp-math");
2966
Lang Hamesaa53b932012-07-06 00:59:19 +00002967
2968 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002969 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002970 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002971 options::OPT_ffp_contract)) {
2972 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002973 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002974 if (Val == "fast" || Val == "on" || Val == "off") {
2975 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2976 } else {
2977 D.Diag(diag::err_drv_unsupported_option_argument)
2978 << A->getOption().getName() << Val;
2979 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002980 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2981 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002982 // If fast-math is set then set the fp-contract mode to fast.
2983 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2984 }
2985 }
2986
Bob Wilson6a039162012-07-19 03:52:53 +00002987 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2988 // and if we find them, tell the frontend to provide the appropriate
2989 // preprocessor macros. This is distinct from enabling any optimizations as
2990 // these options induce language changes which must survive serialization
2991 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002992 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2993 options::OPT_fno_fast_math))
2994 if (!A->getOption().matches(options::OPT_fno_fast_math))
2995 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002996 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2997 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002998 if (A->getOption().matches(options::OPT_ffinite_math_only))
2999 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003000
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003001 // Decide whether to use verbose asm. Verbose assembly is the default on
3002 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003003 bool IsIntegratedAssemblerDefault =
3004 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003005 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003006 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003007 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003008 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003009
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003010 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003011 IsIntegratedAssemblerDefault))
3012 CmdArgs.push_back("-no-integrated-as");
3013
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003014 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3015 CmdArgs.push_back("-mdebug-pass");
3016 CmdArgs.push_back("Structure");
3017 }
3018 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3019 CmdArgs.push_back("-mdebug-pass");
3020 CmdArgs.push_back("Arguments");
3021 }
3022
John McCall8517abc2010-02-19 02:45:38 +00003023 // Enable -mconstructor-aliases except on darwin, where we have to
3024 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003025 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003026 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003027
John McCall7ef5cb32011-03-18 02:56:14 +00003028 // Darwin's kernel doesn't support guard variables; just die if we
3029 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003030 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003031 CmdArgs.push_back("-fforbid-guard-variables");
3032
Douglas Gregordbe39272011-02-01 15:15:22 +00003033 if (Args.hasArg(options::OPT_mms_bitfields)) {
3034 CmdArgs.push_back("-mms-bitfields");
3035 }
John McCall8517abc2010-02-19 02:45:38 +00003036
Daniel Dunbar306945d2009-09-16 06:17:29 +00003037 // This is a coarse approximation of what llvm-gcc actually does, both
3038 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3039 // complicated ways.
3040 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003041 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3042 options::OPT_fno_asynchronous_unwind_tables,
3043 (getToolChain().IsUnwindTablesDefault() ||
3044 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3045 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003046 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3047 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003048 CmdArgs.push_back("-munwind-tables");
3049
Chandler Carruth05fb5852012-11-21 23:40:23 +00003050 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003051
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003052 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3053 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003054 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003055 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003056
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003057 // FIXME: Handle -mtune=.
3058 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003059
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003060 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003061 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003062 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003063 }
3064
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003065 // Add the target cpu
3066 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3067 llvm::Triple ETriple(ETripleStr);
3068 std::string CPU = getCPUName(Args, ETriple);
3069 if (!CPU.empty()) {
3070 CmdArgs.push_back("-target-cpu");
3071 CmdArgs.push_back(Args.MakeArgString(CPU));
3072 }
3073
Rafael Espindolaeb265472013-08-21 21:59:03 +00003074 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3075 CmdArgs.push_back("-mfpmath");
3076 CmdArgs.push_back(A->getValue());
3077 }
3078
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003079 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003080 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003081
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003082 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003083 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003084 default:
3085 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003086
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003087 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003088 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003089 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003090 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003091 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003092 break;
3093
Tim Northover573cbee2014-05-24 12:52:07 +00003094 case llvm::Triple::aarch64:
3095 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003096 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003097 break;
3098
Eric Christopher0b26a612010-03-02 02:41:08 +00003099 case llvm::Triple::mips:
3100 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003101 case llvm::Triple::mips64:
3102 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003103 AddMIPSTargetArgs(Args, CmdArgs);
3104 break;
3105
Ulrich Weigand8afad612014-07-28 13:17:52 +00003106 case llvm::Triple::ppc:
3107 case llvm::Triple::ppc64:
3108 case llvm::Triple::ppc64le:
3109 AddPPCTargetArgs(Args, CmdArgs);
3110 break;
3111
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003112 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003113 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003114 AddSparcTargetArgs(Args, CmdArgs);
3115 break;
3116
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003117 case llvm::Triple::x86:
3118 case llvm::Triple::x86_64:
3119 AddX86TargetArgs(Args, CmdArgs);
3120 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003121
3122 case llvm::Triple::hexagon:
3123 AddHexagonTargetArgs(Args, CmdArgs);
3124 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003125 }
3126
Hans Wennborg75958c42013-08-08 00:17:41 +00003127 // Add clang-cl arguments.
3128 if (getToolChain().getDriver().IsCLMode())
3129 AddClangCLArgs(Args, CmdArgs);
3130
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003131 // Pass the linker version in use.
3132 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3133 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003134 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003135 }
3136
Eric Christopherb7d97e92013-04-03 01:58:53 +00003137 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003138 CmdArgs.push_back("-momit-leaf-frame-pointer");
3139
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003140 // Explicitly error on some things we know we don't support and can't just
3141 // ignore.
3142 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003143 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3144 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003145 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003146 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003147 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003148 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3149 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003150 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003151 << Unsupported->getOption().getName();
3152 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003153 }
3154
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003155 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003156 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003157 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003158 CmdArgs.push_back("-header-include-file");
3159 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3160 D.CCPrintHeadersFilename : "-");
3161 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003162 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003163 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003164
Chad Rosierbe10f982011-08-02 17:58:04 +00003165 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003166 CmdArgs.push_back("-diagnostic-log-file");
3167 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3168 D.CCLogDiagnosticsFilename : "-");
3169 }
3170
Manman Ren17bdb0f2013-11-20 20:22:14 +00003171 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3172 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003173 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003174 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00003175 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003176 // FIXME: we should support specifying dwarf version with
3177 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003178 CmdArgs.push_back("-gline-tables-only");
Brad Smith378e7f9b2014-06-13 03:35:37 +00003179 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3180 const llvm::Triple &Triple = getToolChain().getTriple();
3181 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3182 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003183 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003184 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003185 CmdArgs.push_back("-gdwarf-2");
3186 else if (A->getOption().matches(options::OPT_gdwarf_3))
3187 CmdArgs.push_back("-gdwarf-3");
3188 else if (A->getOption().matches(options::OPT_gdwarf_4))
3189 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003190 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003191 !A->getOption().matches(options::OPT_ggdb0)) {
Brad Smith378e7f9b2014-06-13 03:35:37 +00003192 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
3193 const llvm::Triple &Triple = getToolChain().getTriple();
3194 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
3195 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00003196 CmdArgs.push_back("-gdwarf-2");
3197 else
3198 CmdArgs.push_back("-g");
3199 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003200 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003201
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003202 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3203 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003204 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3205 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003206 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003207
Eric Christopher138c32b2013-09-13 22:37:55 +00003208 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003209 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3210 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003211 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003212 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003213 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003214 CmdArgs.push_back("-g");
3215 CmdArgs.push_back("-backend-option");
3216 CmdArgs.push_back("-split-dwarf=Enable");
3217 }
3218
Eric Christopher138c32b2013-09-13 22:37:55 +00003219 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3220 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3221 CmdArgs.push_back("-backend-option");
3222 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3223 }
Eric Christophereec89c22013-06-18 00:03:50 +00003224
Eric Christopher0d403d22014-02-14 01:27:03 +00003225 // -gdwarf-aranges turns on the emission of the aranges section in the
3226 // backend.
3227 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3228 CmdArgs.push_back("-backend-option");
3229 CmdArgs.push_back("-generate-arange-section");
3230 }
3231
David Blaikief36d9ba2014-01-27 18:52:43 +00003232 if (Args.hasFlag(options::OPT_fdebug_types_section,
3233 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003234 CmdArgs.push_back("-backend-option");
3235 CmdArgs.push_back("-generate-type-units");
3236 }
Eric Christophereec89c22013-06-18 00:03:50 +00003237
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003238 if (Args.hasFlag(options::OPT_ffunction_sections,
3239 options::OPT_fno_function_sections, false)) {
3240 CmdArgs.push_back("-ffunction-sections");
3241 }
3242
3243 if (Args.hasFlag(options::OPT_fdata_sections,
3244 options::OPT_fno_data_sections, false)) {
3245 CmdArgs.push_back("-fdata-sections");
3246 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003247
Chris Lattner3c77a352010-06-22 00:03:40 +00003248 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3249
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003250 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3251 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3252 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3253 D.Diag(diag::err_drv_argument_not_allowed_with)
3254 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3255
3256 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3257
3258 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3259 A->render(Args, CmdArgs);
3260 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3261 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3262
Nick Lewycky207bce32011-04-21 23:44:07 +00003263 if (Args.hasArg(options::OPT_ftest_coverage) ||
3264 Args.hasArg(options::OPT_coverage))
3265 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003266 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3267 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003268 Args.hasArg(options::OPT_coverage))
3269 CmdArgs.push_back("-femit-coverage-data");
3270
Alex Lorenzee024992014-08-04 18:41:51 +00003271 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3272 !Args.hasArg(options::OPT_fprofile_instr_generate))
3273 D.Diag(diag::err_drv_argument_only_allowed_with)
3274 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3275
3276 if (Args.hasArg(options::OPT_fcoverage_mapping))
3277 CmdArgs.push_back("-fcoverage-mapping");
3278
Nick Lewycky480cb992011-05-04 20:46:58 +00003279 if (C.getArgs().hasArg(options::OPT_c) ||
3280 C.getArgs().hasArg(options::OPT_S)) {
3281 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003282 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00003283 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00003284 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003285 SmallString<128> Pwd;
3286 if (!llvm::sys::fs::current_path(Pwd)) {
3287 llvm::sys::path::append(Pwd, CoverageFilename.str());
3288 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003289 }
3290 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003291 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003292 }
3293 }
3294
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003295 // Pass options for controlling the default header search paths.
3296 if (Args.hasArg(options::OPT_nostdinc)) {
3297 CmdArgs.push_back("-nostdsysteminc");
3298 CmdArgs.push_back("-nobuiltininc");
3299 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003300 if (Args.hasArg(options::OPT_nostdlibinc))
3301 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003302 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3303 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3304 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003305
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003306 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003307 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003308 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003309
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003310 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3311
Ted Kremenekf7639e12012-03-06 20:06:33 +00003312 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003313 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003314 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003315 options::OPT_ccc_arcmt_modify,
3316 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003317 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003318 switch (A->getOption().getID()) {
3319 default:
3320 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003321 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003322 CmdArgs.push_back("-arcmt-check");
3323 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003324 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003325 CmdArgs.push_back("-arcmt-modify");
3326 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003327 case options::OPT_ccc_arcmt_migrate:
3328 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003329 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003330 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003331
3332 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3333 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003334 break;
John McCalld70fb982011-06-15 23:25:17 +00003335 }
3336 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003337 } else {
3338 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3339 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3340 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003341 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003342
Ted Kremenekf7639e12012-03-06 20:06:33 +00003343 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3344 if (ARCMTEnabled) {
3345 D.Diag(diag::err_drv_argument_not_allowed_with)
3346 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3347 }
3348 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003349 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003350
3351 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003352 options::OPT_objcmt_migrate_subscripting,
3353 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003354 // None specified, means enable them all.
3355 CmdArgs.push_back("-objcmt-migrate-literals");
3356 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003357 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003358 } else {
3359 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003362 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003363 } else {
3364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3374 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3375 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3376 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003377 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003378 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003379 }
3380
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003381 // Add preprocessing options like -I, -D, etc. if we are using the
3382 // preprocessor.
3383 //
3384 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003385 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003386 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003387
Rafael Espindolaa7431922011-07-21 23:40:37 +00003388 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3389 // that "The compiler can only warn and ignore the option if not recognized".
3390 // When building with ccache, it will pass -D options to clang even on
3391 // preprocessed inputs and configure concludes that -fPIC is not supported.
3392 Args.ClaimAllArgs(options::OPT_D);
3393
Alp Toker7874bdc2013-11-15 20:40:58 +00003394 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003395 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3396 if (A->getOption().matches(options::OPT_O4)) {
3397 CmdArgs.push_back("-O3");
3398 D.Diag(diag::warn_O4_is_O3);
3399 } else {
3400 A->render(Args, CmdArgs);
3401 }
3402 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003403
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003404 // Warn about ignored options to clang.
3405 for (arg_iterator it = Args.filtered_begin(
3406 options::OPT_clang_ignored_gcc_optimization_f_Group),
3407 ie = Args.filtered_end(); it != ie; ++it) {
3408 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3409 }
3410
Chad Rosier86b82082012-12-12 20:06:31 +00003411 // Don't warn about unused -flto. This can happen when we're preprocessing or
3412 // precompiling.
3413 Args.ClaimAllArgs(options::OPT_flto);
3414
Richard Smith3be1cb22014-08-07 00:24:21 +00003415 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003416 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003417 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3418 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003419 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003420 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003421
3422 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003423 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003424 //
3425 // If a std is supplied, only add -trigraphs if it follows the
3426 // option.
3427 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3428 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003429 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003430 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003431 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003432 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003433 else
3434 Std->render(Args, CmdArgs);
3435
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003436 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3437 options::OPT_trigraphs))
3438 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003439 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003440 } else {
3441 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003442 //
3443 // FIXME: Clang doesn't correctly handle -std= when the input language
3444 // doesn't match. For the time being just ignore this for C++ inputs;
3445 // eventually we want to do all the standard defaulting here instead of
3446 // splitting it between the driver and clang -cc1.
3447 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003448 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3449 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003450 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003451 CmdArgs.push_back("-std=c++11");
3452
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003453 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003454 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003455
Richard Smith282b4492013-09-04 22:50:31 +00003456 // GCC's behavior for -Wwrite-strings is a bit strange:
3457 // * In C, this "warning flag" changes the types of string literals from
3458 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3459 // for the discarded qualifier.
3460 // * In C++, this is just a normal warning flag.
3461 //
3462 // Implementing this warning correctly in C is hard, so we follow GCC's
3463 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3464 // a non-const char* in C, rather than using this crude hack.
3465 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003466 // FIXME: This should behave just like a warning flag, and thus should also
3467 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3468 Arg *WriteStrings =
3469 Args.getLastArg(options::OPT_Wwrite_strings,
3470 options::OPT_Wno_write_strings, options::OPT_w);
3471 if (WriteStrings &&
3472 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003473 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003474 }
3475
Chandler Carruth61fbf622011-04-23 09:27:53 +00003476 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003477 // during C++ compilation, which it is by default. GCC keeps this define even
3478 // in the presence of '-w', match this behavior bug-for-bug.
3479 if (types::isCXX(InputType) &&
3480 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3481 true)) {
3482 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003483 }
3484
Chandler Carruthe0391482010-05-22 02:21:53 +00003485 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3486 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3487 if (Asm->getOption().matches(options::OPT_fasm))
3488 CmdArgs.push_back("-fgnu-keywords");
3489 else
3490 CmdArgs.push_back("-fno-gnu-keywords");
3491 }
3492
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003493 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3494 CmdArgs.push_back("-fno-dwarf-directory-asm");
3495
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003496 if (ShouldDisableAutolink(Args, getToolChain()))
3497 CmdArgs.push_back("-fno-autolink");
3498
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003499 // Add in -fdebug-compilation-dir if necessary.
3500 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003501
Richard Smith9a568822011-11-21 19:36:32 +00003502 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3503 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003504 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003505 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003506 }
3507
Richard Smith79c927b2013-11-06 19:31:51 +00003508 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3509 CmdArgs.push_back("-foperator-arrow-depth");
3510 CmdArgs.push_back(A->getValue());
3511 }
3512
Richard Smith9a568822011-11-21 19:36:32 +00003513 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3514 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003515 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003516 }
3517
Richard Smitha3d3bd22013-05-08 02:12:03 +00003518 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3519 CmdArgs.push_back("-fconstexpr-steps");
3520 CmdArgs.push_back(A->getValue());
3521 }
3522
Richard Smithb3a14522013-02-22 01:59:51 +00003523 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3524 CmdArgs.push_back("-fbracket-depth");
3525 CmdArgs.push_back(A->getValue());
3526 }
3527
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003528 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3529 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003530 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003531 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003532 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3533 } else
3534 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003535 }
3536
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003537
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003538 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003539 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003540
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003541 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3542 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003543 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003544 }
David Chisnall5778fce2009-08-31 16:41:57 +00003545
Chris Lattnere23003d2010-01-09 21:54:33 +00003546 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3547 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003548 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003549 }
3550
Chris Lattnerb35583d2010-04-07 20:49:23 +00003551 CmdArgs.push_back("-ferror-limit");
3552 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003553 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003554 else
3555 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003556
Chandler Carrutha77a7272010-05-06 04:55:18 +00003557 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3558 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003559 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003560 }
3561
3562 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3563 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003564 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003565 }
3566
Richard Smithf6f003a2011-12-16 19:06:07 +00003567 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3568 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003569 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003570 }
3571
Daniel Dunbar2c978472009-11-04 06:24:47 +00003572 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003573 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003574 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003575 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003576 } else {
3577 // If -fmessage-length=N was not specified, determine whether this is a
3578 // terminal and, if so, implicitly define -fmessage-length appropriately.
3579 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003580 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003581 }
3582
John McCallb4a99d32013-02-19 01:57:35 +00003583 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3584 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3585 options::OPT_fvisibility_ms_compat)) {
3586 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3587 CmdArgs.push_back("-fvisibility");
3588 CmdArgs.push_back(A->getValue());
3589 } else {
3590 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3591 CmdArgs.push_back("-fvisibility");
3592 CmdArgs.push_back("hidden");
3593 CmdArgs.push_back("-ftype-visibility");
3594 CmdArgs.push_back("default");
3595 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003596 }
3597
Douglas Gregor08329632010-06-15 17:05:35 +00003598 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003599
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003600 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3601
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003602 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003603 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3604 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003605 CmdArgs.push_back("-ffreestanding");
3606
Daniel Dunbare357d562009-12-03 18:42:11 +00003607 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003608 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003609 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003610 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3611 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003612 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003613 // AltiVec language extensions aren't relevant for assembling.
3614 if (!isa<PreprocessJobAction>(JA) ||
3615 Output.getType() != types::TY_PP_Asm)
3616 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003617 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3618 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003619
Peter Collingbourne32701642013-11-01 18:16:25 +00003620 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3621 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003622
Will Dietz3676d562012-12-30 20:53:28 +00003623 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3624 options::OPT_fno_sanitize_recover,
3625 true))
3626 CmdArgs.push_back("-fno-sanitize-recover");
3627
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003628 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003629 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3630 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3631
Eric Christopher459d2712013-02-19 06:16:53 +00003632 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003633 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003634 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003635 getToolChain().getArch() == llvm::Triple::ppc64 ||
3636 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003637 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003638 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003639
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003640 if (getToolChain().SupportsProfiling())
3641 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003642
3643 // -flax-vector-conversions is default.
3644 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3645 options::OPT_fno_lax_vector_conversions))
3646 CmdArgs.push_back("-fno-lax-vector-conversions");
3647
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003648 if (Args.getLastArg(options::OPT_fapple_kext))
3649 CmdArgs.push_back("-fapple-kext");
3650
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003651 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003652 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003653 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003654 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3655 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003656
3657 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3658 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003659 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003660 }
3661
Bob Wilson14adb362012-02-03 06:27:22 +00003662 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003663
Chandler Carruth6e501032011-03-27 00:04:55 +00003664 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3665 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3666 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3667 options::OPT_fno_wrapv)) {
3668 if (A->getOption().matches(options::OPT_fwrapv))
3669 CmdArgs.push_back("-fwrapv");
3670 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3671 options::OPT_fno_strict_overflow)) {
3672 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3673 CmdArgs.push_back("-fwrapv");
3674 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003675
3676 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3677 options::OPT_fno_reroll_loops))
3678 if (A->getOption().matches(options::OPT_freroll_loops))
3679 CmdArgs.push_back("-freroll-loops");
3680
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003681 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003682 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3683 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003684
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003685 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3686
Mahesha S6a682be42012-10-27 07:47:56 +00003687
Daniel Dunbar4930e332009-11-17 08:07:36 +00003688 // -stack-protector=0 is default.
3689 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003690 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3691 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003692 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003693 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003694 if (A->getOption().matches(options::OPT_fstack_protector)) {
3695 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3696 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3697 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003698 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003699 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003700 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003701 } else {
3702 StackProtectorLevel =
3703 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3704 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003705 if (StackProtectorLevel) {
3706 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003707 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003708 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003709
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003710 // --param ssp-buffer-size=
3711 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3712 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003713 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003714 if (Str.startswith("ssp-buffer-size=")) {
3715 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003716 CmdArgs.push_back("-stack-protector-buffer-size");
3717 // FIXME: Verify the argument is a valid integer.
3718 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003719 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003720 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003721 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003722 }
3723
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003724 // Translate -mstackrealign
3725 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3726 false)) {
3727 CmdArgs.push_back("-backend-option");
3728 CmdArgs.push_back("-force-align-stack");
3729 }
3730 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3731 false)) {
3732 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3733 }
3734
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003735 if (Args.hasArg(options::OPT_mstack_alignment)) {
3736 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3737 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003738 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003739
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003740 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3741 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3742 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3743
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003744 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3745 options::OPT_mno_restrict_it)) {
3746 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3747 CmdArgs.push_back("-backend-option");
3748 CmdArgs.push_back("-arm-restrict-it");
3749 } else {
3750 CmdArgs.push_back("-backend-option");
3751 CmdArgs.push_back("-arm-no-restrict-it");
3752 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003753 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3754 TT.getArch() == llvm::Triple::thumb)) {
3755 // Windows on ARM expects restricted IT blocks
3756 CmdArgs.push_back("-backend-option");
3757 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003758 }
3759
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003760 if (TT.getArch() == llvm::Triple::arm ||
3761 TT.getArch() == llvm::Triple::thumb) {
3762 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3763 options::OPT_mno_long_calls)) {
3764 if (A->getOption().matches(options::OPT_mlong_calls)) {
3765 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003766 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003767 }
3768 }
3769 }
3770
Daniel Dunbard18049a2009-04-07 21:16:11 +00003771 // Forward -f options with positive and negative forms; we translate
3772 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003773 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3774 StringRef fname = A->getValue();
3775 if (!llvm::sys::fs::exists(fname))
3776 D.Diag(diag::err_drv_no_such_file) << fname;
3777 else
3778 A->render(Args, CmdArgs);
3779 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003780
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003781 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003782 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003783 CmdArgs.push_back("-fapple-kext");
3784 if (!Args.hasArg(options::OPT_fbuiltin))
3785 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003786 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003787 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003788 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003789 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003790 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003791
Nuno Lopes13c88c72009-12-16 16:59:22 +00003792 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3793 options::OPT_fno_assume_sane_operator_new))
3794 CmdArgs.push_back("-fno-assume-sane-operator-new");
3795
Daniel Dunbar4930e332009-11-17 08:07:36 +00003796 // -fblocks=0 is default.
3797 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003798 getToolChain().IsBlocksDefault()) ||
3799 (Args.hasArg(options::OPT_fgnu_runtime) &&
3800 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3801 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003802 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003803
3804 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3805 !getToolChain().hasBlocksRuntime())
3806 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003807 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003808
Richard Smithffb65082014-09-30 23:10:19 +00003809 // -fmodules enables modules (off by default).
3810 // Users can pass -fno-cxx-modules to turn off modules support for
3811 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003812 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003813 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3814 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3815 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003816 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003817 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003818 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003819 HaveModules = true;
3820 }
3821 }
3822
Daniel Jasper07e6c402013-08-05 20:26:17 +00003823 // -fmodule-maps enables module map processing (off by default) for header
3824 // checking. It is implied by -fmodules.
3825 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3826 false)) {
3827 CmdArgs.push_back("-fmodule-maps");
3828 }
3829
Daniel Jasperac42b752013-10-21 06:34:34 +00003830 // -fmodules-decluse checks that modules used are declared so (off by
3831 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003832 if (Args.hasFlag(options::OPT_fmodules_decluse,
3833 options::OPT_fno_modules_decluse,
3834 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003835 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003836 }
3837
Daniel Jasper962b38e2014-04-11 11:47:45 +00003838 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3839 // all #included headers are part of modules.
3840 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3841 options::OPT_fno_modules_strict_decluse,
3842 false)) {
3843 CmdArgs.push_back("-fmodules-strict-decluse");
3844 }
3845
Daniel Jasperac42b752013-10-21 06:34:34 +00003846 // -fmodule-name specifies the module that is currently being built (or
3847 // used for header checking by -fmodule-maps).
Justin Bogner5443ad52014-06-20 21:12:53 +00003848 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasperac42b752013-10-21 06:34:34 +00003849 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003850
3851 // -fmodule-map-file can be used to specify a file containing module
3852 // definitions.
Justin Bogner5443ad52014-06-20 21:12:53 +00003853 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasperac42b752013-10-21 06:34:34 +00003854 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003855
Justin Bognera88f0122014-06-20 22:59:50 +00003856 // -fmodule-cache-path specifies where our module files should be written.
3857 SmallString<128> ModuleCachePath;
3858 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3859 ModuleCachePath = A->getValue();
3860 if (HaveModules) {
3861 if (C.isForDiagnostics()) {
3862 // When generating crash reports, we want to emit the modules along with
3863 // the reproduction sources, so we ignore any provided module path.
3864 ModuleCachePath = Output.getFilename();
3865 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3866 llvm::sys::path::append(ModuleCachePath, "modules");
3867 } else if (ModuleCachePath.empty()) {
3868 // No module path was provided: use the default.
3869 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3870 ModuleCachePath);
3871 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3872 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3873 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003874 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003875 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3876 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3877 }
3878
3879 // When building modules and generating crashdumps, we need to dump a module
3880 // dependency VFS alongside the output.
3881 if (HaveModules && C.isForDiagnostics()) {
3882 SmallString<128> VFSDir(Output.getFilename());
3883 llvm::sys::path::replace_extension(VFSDir, ".cache");
3884 llvm::sys::path::append(VFSDir, "vfs");
3885 CmdArgs.push_back("-module-dependency-dir");
3886 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003887 }
3888
Justin Bogner5443ad52014-06-20 21:12:53 +00003889 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3890 if (HaveModules)
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003891 A->render(Args, CmdArgs);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003892
Douglas Gregor35b04d62013-02-07 19:01:24 +00003893 // Pass through all -fmodules-ignore-macro arguments.
3894 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003895 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3896 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003897
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003898 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3899
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003900 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3901 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3902 D.Diag(diag::err_drv_argument_not_allowed_with)
3903 << A->getAsString(Args) << "-fbuild-session-timestamp";
3904
3905 llvm::sys::fs::file_status Status;
3906 if (llvm::sys::fs::status(A->getValue(), Status))
3907 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003908 char TimeStamp[48];
3909 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3910 (uint64_t)Status.getLastModificationTime().toEpochTime());
3911 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003912 }
3913
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003914 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003915 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3916 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003917 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3918
3919 Args.AddLastArg(CmdArgs,
3920 options::OPT_fmodules_validate_once_per_build_session);
3921 }
3922
Ben Langmuirdcf73862014-03-12 00:06:17 +00003923 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3924
John McCalldfea9982010-04-09 19:12:06 +00003925 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003926 if (Args.hasFlag(options::OPT_fno_access_control,
3927 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003928 false))
John McCall3155f572010-04-09 19:03:51 +00003929 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003930
Anders Carlssond470fef2010-11-21 00:09:52 +00003931 // -felide-constructors is the default.
3932 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3933 options::OPT_felide_constructors,
3934 false))
3935 CmdArgs.push_back("-fno-elide-constructors");
3936
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003937 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003938 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003939 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003940 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003941
Richard Smith52be6192012-11-05 22:04:41 +00003942 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003943 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003944 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003945 Args.getLastArg(options::OPT_mkernel,
3946 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003947 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003948 D.Diag(diag::err_drv_argument_not_allowed_with)
3949 << "-fsanitize=vptr" << NoRttiArg;
3950 }
3951 }
3952
Tony Linthicum76329bf2011-12-12 21:14:55 +00003953 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003954 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003955 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003956 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003957 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003958 CmdArgs.push_back("-fshort-enums");
3959
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003960 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003961 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003962 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003963 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003964
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003965 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003966 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003967 options::OPT_fno_threadsafe_statics))
3968 CmdArgs.push_back("-fno-threadsafe-statics");
3969
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003970 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003971 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3972 options::OPT_fno_use_cxa_atexit,
3973 !IsWindowsCygnus && !IsWindowsGNU &&
3974 getToolChain().getArch() != llvm::Triple::hexagon &&
3975 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003976 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003977 CmdArgs.push_back("-fno-use-cxa-atexit");
3978
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003979 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003980 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003981 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003982 CmdArgs.push_back("-fms-extensions");
3983
Francois Pichet1b4f1632011-09-17 04:32:15 +00003984 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003985 if (Args.hasFlag(options::OPT_fms_compatibility,
3986 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003987 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3988 options::OPT_fno_ms_extensions,
3989 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003990 CmdArgs.push_back("-fms-compatibility");
3991
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003992 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003993 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003994 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
3995 Args.hasArg(options::OPT_fms_compatibility_version)) {
3996 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3997 const Arg *MSCompatibilityVersion =
3998 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003999
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004000 if (MSCVersion && MSCompatibilityVersion)
4001 D.Diag(diag::err_drv_argument_not_allowed_with)
4002 << MSCVersion->getAsString(Args)
4003 << MSCompatibilityVersion->getAsString(Args);
4004
4005 std::string Ver;
4006 if (MSCompatibilityVersion)
4007 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4008 else if (MSCVersion)
4009 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4010
4011 if (Ver.empty())
4012 CmdArgs.push_back("-fms-compatibility-version=17.00");
4013 else
4014 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4015 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004016
Eric Christopher5ecce122013-02-18 00:38:31 +00004017 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004018 if (Args.hasFlag(options::OPT_fborland_extensions,
4019 options::OPT_fno_borland_extensions, false))
4020 CmdArgs.push_back("-fborland-extensions");
4021
Francois Pichet02744872011-09-01 16:38:08 +00004022 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4023 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004024 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004025 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004026 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004027
Chandler Carruthe03aa552010-04-17 20:17:31 +00004028 // -fgnu-keywords default varies depending on language; only pass if
4029 // specified.
4030 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004031 options::OPT_fno_gnu_keywords))
4032 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004033
Rafael Espindola922a6242011-06-02 17:30:53 +00004034 if (Args.hasFlag(options::OPT_fgnu89_inline,
4035 options::OPT_fno_gnu89_inline,
4036 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004037 CmdArgs.push_back("-fgnu89-inline");
4038
Chad Rosier9c76d242012-03-15 22:31:42 +00004039 if (Args.hasArg(options::OPT_fno_inline))
4040 CmdArgs.push_back("-fno-inline");
4041
Chad Rosier64d6be92012-03-06 21:17:19 +00004042 if (Args.hasArg(options::OPT_fno_inline_functions))
4043 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004044
John McCall5fb5df92012-06-20 06:18:46 +00004045 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004046
John McCall5fb5df92012-06-20 06:18:46 +00004047 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004048 // legacy is the default. Except for deployment taget of 10.5,
4049 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4050 // gets ignored silently.
4051 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004052 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4053 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004054 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004055 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004056 if (getToolChain().UseObjCMixedDispatch())
4057 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4058 else
4059 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4060 }
4061 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004062
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004063 // When ObjectiveC legacy runtime is in effect on MacOSX,
4064 // turn on the option to do Array/Dictionary subscripting
4065 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004066 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4067 getToolChain().getTriple().isMacOSX() &&
4068 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4069 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004070 objcRuntime.isNeXTFamily())
4071 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4072
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004073 // -fencode-extended-block-signature=1 is default.
4074 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4075 CmdArgs.push_back("-fencode-extended-block-signature");
4076 }
4077
John McCall24fc0de2011-07-06 00:26:06 +00004078 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4079 // NOTE: This logic is duplicated in ToolChains.cpp.
4080 bool ARC = isObjCAutoRefCount(Args);
4081 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004082 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004083
John McCall24fc0de2011-07-06 00:26:06 +00004084 CmdArgs.push_back("-fobjc-arc");
4085
Chandler Carruth491db322011-11-04 07:34:47 +00004086 // FIXME: It seems like this entire block, and several around it should be
4087 // wrapped in isObjC, but for now we just use it here as this is where it
4088 // was being used previously.
4089 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4090 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4091 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4092 else
4093 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4094 }
4095
John McCall24fc0de2011-07-06 00:26:06 +00004096 // Allow the user to enable full exceptions code emission.
4097 // We define off for Objective-CC, on for Objective-C++.
4098 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4099 options::OPT_fno_objc_arc_exceptions,
4100 /*default*/ types::isCXX(InputType)))
4101 CmdArgs.push_back("-fobjc-arc-exceptions");
4102 }
4103
4104 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4105 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004106 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004107 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004108
John McCall24fc0de2011-07-06 00:26:06 +00004109 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4110 // takes precedence.
4111 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4112 if (!GCArg)
4113 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4114 if (GCArg) {
4115 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004116 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004117 << GCArg->getAsString(Args);
4118 } else if (getToolChain().SupportsObjCGC()) {
4119 GCArg->render(Args, CmdArgs);
4120 } else {
4121 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004122 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004123 << GCArg->getAsString(Args);
4124 }
4125 }
4126
Reid Klecknerc542d372014-06-27 17:02:02 +00004127 // Handle GCC-style exception args.
4128 if (!C.getDriver().IsCLMode())
4129 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4130 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004131
4132 if (getToolChain().UseSjLjExceptions())
4133 CmdArgs.push_back("-fsjlj-exceptions");
Reid Kleckner8f45c9c2014-09-15 17:19:16 +00004134 else if (getToolChain().UseSEHExceptions())
4135 CmdArgs.push_back("-fseh-exceptions");
John McCallb5f652e2011-06-22 00:53:57 +00004136
4137 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004138 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4139 options::OPT_fno_assume_sane_operator_new))
4140 CmdArgs.push_back("-fno-assume-sane-operator-new");
4141
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004142 // -fconstant-cfstrings is default, and may be subject to argument translation
4143 // on Darwin.
4144 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4145 options::OPT_fno_constant_cfstrings) ||
4146 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4147 options::OPT_mno_constant_cfstrings))
4148 CmdArgs.push_back("-fno-constant-cfstrings");
4149
John Thompsoned4e2952009-11-05 20:14:16 +00004150 // -fshort-wchar default varies depending on platform; only
4151 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004152 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4153 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004154 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004155
Hans Wennborg28c96312013-07-31 23:39:13 +00004156 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004157 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004158 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004159 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004160 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004161
Daniel Dunbar096ed292011-10-05 21:04:55 +00004162 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4163 // -fno-pack-struct doesn't apply to -fpack-struct=.
4164 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004165 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004166 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004167 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004168 } else if (Args.hasFlag(options::OPT_fpack_struct,
4169 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004170 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004171 }
4172
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004173 // Handle -fmax-type-align=N and -fno-type-align
4174 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4175 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4176 if (!SkipMaxTypeAlign) {
4177 std::string MaxTypeAlignStr = "-fmax-type-align=";
4178 MaxTypeAlignStr += A->getValue();
4179 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4180 }
4181 } else if (getToolChain().getTriple().isOSDarwin()) {
4182 if (!SkipMaxTypeAlign) {
4183 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4184 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4185 }
4186 }
4187
Robert Lytton0e076492013-08-13 09:43:10 +00004188 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004189 if (!Args.hasArg(options::OPT_fcommon))
4190 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004191 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004192 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004193
Daniel Dunbard18049a2009-04-07 21:16:11 +00004194 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004195 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004196 CmdArgs.push_back("-fno-common");
4197
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004198 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004199 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004200 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004201 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004202 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004203 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4204
Daniel Dunbar6358d682010-10-15 22:30:42 +00004205 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4206 if (!Args.hasFlag(options::OPT_ffor_scope,
4207 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004208 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004209 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4210
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004211 // -finput_charset=UTF-8 is default. Reject others
4212 if (Arg *inputCharset = Args.getLastArg(
4213 options::OPT_finput_charset_EQ)) {
4214 StringRef value = inputCharset->getValue();
4215 if (value != "UTF-8")
4216 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4217 }
4218
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004219 // -fexec_charset=UTF-8 is default. Reject others
4220 if (Arg *execCharset = Args.getLastArg(
4221 options::OPT_fexec_charset_EQ)) {
4222 StringRef value = execCharset->getValue();
4223 if (value != "UTF-8")
4224 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4225 }
4226
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004227 // -fcaret-diagnostics is default.
4228 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4229 options::OPT_fno_caret_diagnostics, true))
4230 CmdArgs.push_back("-fno-caret-diagnostics");
4231
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004232 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004233 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004234 options::OPT_fno_diagnostics_fixit_info))
4235 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004236
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004237 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004238 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004239 options::OPT_fno_diagnostics_show_option))
4240 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004241
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004242 if (const Arg *A =
4243 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4244 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004245 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004246 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004247
Douglas Gregor643c9222011-05-21 17:07:29 +00004248 if (const Arg *A =
4249 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4250 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004251 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004252 }
4253
Chandler Carruthb6766f02011-03-27 01:50:55 +00004254 if (Arg *A = Args.getLastArg(
4255 options::OPT_fdiagnostics_show_note_include_stack,
4256 options::OPT_fno_diagnostics_show_note_include_stack)) {
4257 if (A->getOption().matches(
4258 options::OPT_fdiagnostics_show_note_include_stack))
4259 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4260 else
4261 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4262 }
4263
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004264 // Color diagnostics are the default, unless the terminal doesn't support
4265 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004266 // Support both clang's -f[no-]color-diagnostics and gcc's
4267 // -f[no-]diagnostics-colors[=never|always|auto].
4268 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004269 for (const auto &Arg : Args) {
4270 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004271 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4272 !O.matches(options::OPT_fdiagnostics_color) &&
4273 !O.matches(options::OPT_fno_color_diagnostics) &&
4274 !O.matches(options::OPT_fno_diagnostics_color) &&
4275 !O.matches(options::OPT_fdiagnostics_color_EQ))
4276 continue;
4277
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004278 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004279 if (O.matches(options::OPT_fcolor_diagnostics) ||
4280 O.matches(options::OPT_fdiagnostics_color)) {
4281 ShowColors = Colors_On;
4282 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4283 O.matches(options::OPT_fno_diagnostics_color)) {
4284 ShowColors = Colors_Off;
4285 } else {
4286 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004287 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004288 if (value == "always")
4289 ShowColors = Colors_On;
4290 else if (value == "never")
4291 ShowColors = Colors_Off;
4292 else if (value == "auto")
4293 ShowColors = Colors_Auto;
4294 else
4295 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4296 << ("-fdiagnostics-color=" + value).str();
4297 }
4298 }
4299 if (ShowColors == Colors_On ||
4300 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004301 CmdArgs.push_back("-fcolor-diagnostics");
4302
Nico Rieck7857d462013-09-11 00:38:02 +00004303 if (Args.hasArg(options::OPT_fansi_escape_codes))
4304 CmdArgs.push_back("-fansi-escape-codes");
4305
Daniel Dunbardb097022009-06-08 21:13:54 +00004306 if (!Args.hasFlag(options::OPT_fshow_source_location,
4307 options::OPT_fno_show_source_location))
4308 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004309
Douglas Gregor643c9222011-05-21 17:07:29 +00004310 if (!Args.hasFlag(options::OPT_fshow_column,
4311 options::OPT_fno_show_column,
4312 true))
4313 CmdArgs.push_back("-fno-show-column");
4314
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004315 if (!Args.hasFlag(options::OPT_fspell_checking,
4316 options::OPT_fno_spell_checking))
4317 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004318
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004319
Chad Rosierc8e56e82012-12-05 21:08:21 +00004320 // -fno-asm-blocks is default.
4321 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4322 false))
4323 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004324
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004325 // Enable vectorization per default according to the optimization level
4326 // selected. For optimization levels that want vectorization we use the alias
4327 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004328 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004329 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004330 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004331 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004332 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004333 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004334
Chad Rosier136d67d2014-04-28 19:30:57 +00004335 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004336 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4337 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004338 options::OPT_fslp_vectorize;
4339 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004340 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004341 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004342
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004343 // -fno-slp-vectorize-aggressive is default.
4344 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004345 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004346 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004347
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004348 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4349 A->render(Args, CmdArgs);
4350
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004351 // -fdollars-in-identifiers default varies depending on platform and
4352 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004353 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004354 options::OPT_fno_dollars_in_identifiers)) {
4355 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004356 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004357 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004358 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004359 }
4360
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004361 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4362 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004363 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004364 options::OPT_fno_unit_at_a_time)) {
4365 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004366 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004367 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004368
Eli Friedman055c9702011-11-02 01:53:16 +00004369 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4370 options::OPT_fno_apple_pragma_pack, false))
4371 CmdArgs.push_back("-fapple-pragma-pack");
4372
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004373 // le32-specific flags:
4374 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4375 // by default.
4376 if (getToolChain().getArch() == llvm::Triple::le32) {
4377 CmdArgs.push_back("-fno-math-builtin");
4378 }
4379
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004380 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004381 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004382 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004383#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004384 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004385 (getToolChain().getArch() == llvm::Triple::arm ||
4386 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004387 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4388 CmdArgs.push_back("-fno-builtin-strcat");
4389 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4390 CmdArgs.push_back("-fno-builtin-strcpy");
4391 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004392#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004393
Justin Bognera88f0122014-06-20 22:59:50 +00004394 // Enable rewrite includes if the user's asked for it or if we're generating
4395 // diagnostics.
4396 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4397 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004398 if (Args.hasFlag(options::OPT_frewrite_includes,
4399 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004400 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004401 CmdArgs.push_back("-frewrite-includes");
4402
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004403 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004404 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004405 options::OPT_traditional_cpp)) {
4406 if (isa<PreprocessJobAction>(JA))
4407 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004408 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004409 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004410 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004411
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004412 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004413 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004414
4415 // Handle serialized diagnostics.
4416 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4417 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004418 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004419 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004420
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004421 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4422 CmdArgs.push_back("-fretain-comments-from-system-headers");
4423
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004424 // Forward -fcomment-block-commands to -cc1.
4425 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004426 // Forward -fparse-all-comments to -cc1.
4427 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004428
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004429 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4430 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004431 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004432 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4433 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004434 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004435
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004436 // We translate this by hand to the -cc1 argument, since nightly test uses
4437 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004438 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004439 CmdArgs.push_back("-disable-llvm-optzns");
4440 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004441 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004442 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004443
Daniel Dunbard67a3222009-03-30 06:36:42 +00004444 if (Output.getType() == types::TY_Dependencies) {
4445 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004446 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004447 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004448 CmdArgs.push_back(Output.getFilename());
4449 } else {
4450 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004451 }
4452
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004453 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004454 addDashXForInput(Args, II, CmdArgs);
4455
Daniel Dunbarb440f562010-08-02 02:38:21 +00004456 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004457 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004458 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004459 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004460 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004461
Chris Lattnere9d7d782009-11-03 19:50:27 +00004462 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4463
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004464 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004465
4466 // Optionally embed the -cc1 level arguments into the debug info, for build
4467 // analysis.
4468 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004469 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004470 for (const auto &Arg : Args)
4471 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004472
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004473 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004474 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004475 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004476 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004477 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004478 }
4479 CmdArgs.push_back("-dwarf-debug-flags");
4480 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4481 }
4482
Eric Christopherd3804002013-02-22 20:12:52 +00004483 // Add the split debug info name to the command lines here so we
4484 // can propagate it to the backend.
4485 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004486 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004487 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004488 const char *SplitDwarfOut;
4489 if (SplitDwarf) {
4490 CmdArgs.push_back("-split-dwarf-file");
4491 SplitDwarfOut = SplitDebugName(Args, Inputs);
4492 CmdArgs.push_back(SplitDwarfOut);
4493 }
4494
4495 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004496 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004497 Output.getType() == types::TY_Object &&
4498 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004499 auto CLCommand =
4500 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4501 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4502 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004503 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004504 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004505 }
4506
Daniel Dunbar17731772009-03-23 19:03:36 +00004507
Eric Christopherf1545832013-02-22 23:50:16 +00004508 // Handle the debug info splitting at object creation time if we're
4509 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004510 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004511 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004512 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004513
Roman Divacky178e01602011-02-10 16:52:03 +00004514 if (Arg *A = Args.getLastArg(options::OPT_pg))
4515 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004516 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004517 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004518
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004519 // Claim some arguments which clang supports automatically.
4520
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004521 // -fpch-preprocess is used with gcc to add a special marker in the output to
4522 // include the PCH file. Clang's PTH solution is completely transparent, so we
4523 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004524 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004525
Daniel Dunbar17731772009-03-23 19:03:36 +00004526 // Claim some arguments which clang doesn't support, but we don't
4527 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004528 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4529 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004530
Rafael Espindolab0092d72013-09-04 19:37:35 +00004531 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004532 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004533}
4534
John McCall5fb5df92012-06-20 06:18:46 +00004535/// Add options related to the Objective-C runtime/ABI.
4536///
4537/// Returns true if the runtime is non-fragile.
4538ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4539 ArgStringList &cmdArgs,
4540 RewriteKind rewriteKind) const {
4541 // Look for the controlling runtime option.
4542 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4543 options::OPT_fgnu_runtime,
4544 options::OPT_fobjc_runtime_EQ);
4545
4546 // Just forward -fobjc-runtime= to the frontend. This supercedes
4547 // options about fragility.
4548 if (runtimeArg &&
4549 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4550 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004551 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004552 if (runtime.tryParse(value)) {
4553 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4554 << value;
4555 }
4556
4557 runtimeArg->render(args, cmdArgs);
4558 return runtime;
4559 }
4560
4561 // Otherwise, we'll need the ABI "version". Version numbers are
4562 // slightly confusing for historical reasons:
4563 // 1 - Traditional "fragile" ABI
4564 // 2 - Non-fragile ABI, version 1
4565 // 3 - Non-fragile ABI, version 2
4566 unsigned objcABIVersion = 1;
4567 // If -fobjc-abi-version= is present, use that to set the version.
4568 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004569 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004570 if (value == "1")
4571 objcABIVersion = 1;
4572 else if (value == "2")
4573 objcABIVersion = 2;
4574 else if (value == "3")
4575 objcABIVersion = 3;
4576 else
4577 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4578 << value;
4579 } else {
4580 // Otherwise, determine if we are using the non-fragile ABI.
4581 bool nonFragileABIIsDefault =
4582 (rewriteKind == RK_NonFragile ||
4583 (rewriteKind == RK_None &&
4584 getToolChain().IsObjCNonFragileABIDefault()));
4585 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4586 options::OPT_fno_objc_nonfragile_abi,
4587 nonFragileABIIsDefault)) {
4588 // Determine the non-fragile ABI version to use.
4589#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4590 unsigned nonFragileABIVersion = 1;
4591#else
4592 unsigned nonFragileABIVersion = 2;
4593#endif
4594
4595 if (Arg *abiArg = args.getLastArg(
4596 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004597 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004598 if (value == "1")
4599 nonFragileABIVersion = 1;
4600 else if (value == "2")
4601 nonFragileABIVersion = 2;
4602 else
4603 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4604 << value;
4605 }
4606
4607 objcABIVersion = 1 + nonFragileABIVersion;
4608 } else {
4609 objcABIVersion = 1;
4610 }
4611 }
4612
4613 // We don't actually care about the ABI version other than whether
4614 // it's non-fragile.
4615 bool isNonFragile = objcABIVersion != 1;
4616
4617 // If we have no runtime argument, ask the toolchain for its default runtime.
4618 // However, the rewriter only really supports the Mac runtime, so assume that.
4619 ObjCRuntime runtime;
4620 if (!runtimeArg) {
4621 switch (rewriteKind) {
4622 case RK_None:
4623 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4624 break;
4625 case RK_Fragile:
4626 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4627 break;
4628 case RK_NonFragile:
4629 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4630 break;
4631 }
4632
4633 // -fnext-runtime
4634 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4635 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004636 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004637 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4638
4639 // Otherwise, build for a generic macosx port.
4640 } else {
4641 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4642 }
4643
4644 // -fgnu-runtime
4645 } else {
4646 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004647 // Legacy behaviour is to target the gnustep runtime if we are i
4648 // non-fragile mode or the GCC runtime in fragile mode.
4649 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004650 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004651 else
4652 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004653 }
4654
4655 cmdArgs.push_back(args.MakeArgString(
4656 "-fobjc-runtime=" + runtime.getAsString()));
4657 return runtime;
4658}
4659
Reid Klecknerc542d372014-06-27 17:02:02 +00004660static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4661 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4662 I += HaveDash;
4663 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004664}
Reid Klecknerc542d372014-06-27 17:02:02 +00004665
4666struct EHFlags {
4667 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4668 bool Synch;
4669 bool Asynch;
4670 bool NoExceptC;
4671};
4672
4673/// /EH controls whether to run destructor cleanups when exceptions are
4674/// thrown. There are three modifiers:
4675/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4676/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4677/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4678/// - c: Assume that extern "C" functions are implicitly noexcept. This
4679/// modifier is an optimization, so we ignore it for now.
4680/// The default is /EHs-c-, meaning cleanups are disabled.
4681static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4682 EHFlags EH;
4683 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4684 for (auto EHVal : EHArgs) {
4685 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4686 switch (EHVal[I]) {
4687 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4688 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4689 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4690 default: break;
4691 }
4692 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4693 break;
4694 }
4695 }
4696 return EH;
4697}
4698
Hans Wennborg75958c42013-08-08 00:17:41 +00004699void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4700 unsigned RTOptionID = options::OPT__SLASH_MT;
4701
Hans Wennborgf1a74252013-09-10 20:18:04 +00004702 if (Args.hasArg(options::OPT__SLASH_LDd))
4703 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4704 // but defining _DEBUG is sticky.
4705 RTOptionID = options::OPT__SLASH_MTd;
4706
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004707 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004708 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004709
Hans Wennborg75958c42013-08-08 00:17:41 +00004710 switch(RTOptionID) {
4711 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004712 if (Args.hasArg(options::OPT__SLASH_LDd))
4713 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004714 CmdArgs.push_back("-D_MT");
4715 CmdArgs.push_back("-D_DLL");
4716 CmdArgs.push_back("--dependent-lib=msvcrt");
4717 break;
4718 case options::OPT__SLASH_MDd:
4719 CmdArgs.push_back("-D_DEBUG");
4720 CmdArgs.push_back("-D_MT");
4721 CmdArgs.push_back("-D_DLL");
4722 CmdArgs.push_back("--dependent-lib=msvcrtd");
4723 break;
4724 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004725 if (Args.hasArg(options::OPT__SLASH_LDd))
4726 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004727 CmdArgs.push_back("-D_MT");
4728 CmdArgs.push_back("--dependent-lib=libcmt");
4729 break;
4730 case options::OPT__SLASH_MTd:
4731 CmdArgs.push_back("-D_DEBUG");
4732 CmdArgs.push_back("-D_MT");
4733 CmdArgs.push_back("--dependent-lib=libcmtd");
4734 break;
4735 default:
4736 llvm_unreachable("Unexpected option ID.");
4737 }
4738
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004739 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4740 // users want. The /Za flag to cl.exe turns this off, but it's not
4741 // implemented in clang.
4742 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004743
Hans Wennborg8858a032014-07-21 23:42:07 +00004744 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4745 // would produce interleaved output, so ignore /showIncludes in such cases.
4746 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4747 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4748 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004749
David Majnemerf6072342014-07-01 22:24:56 +00004750 // This controls whether or not we emit RTTI data for polymorphic types.
4751 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4752 /*default=*/false))
4753 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004754
Reid Klecknerc542d372014-06-27 17:02:02 +00004755 const Driver &D = getToolChain().getDriver();
4756 EHFlags EH = parseClangCLEHFlags(D, Args);
4757 // FIXME: Do something with NoExceptC.
4758 if (EH.Synch || EH.Asynch) {
4759 CmdArgs.push_back("-fexceptions");
4760 CmdArgs.push_back("-fcxx-exceptions");
4761 }
4762
Hans Wennborge50cec32014-06-13 20:59:54 +00004763 // /EP should expand to -E -P.
4764 if (Args.hasArg(options::OPT__SLASH_EP)) {
4765 CmdArgs.push_back("-E");
4766 CmdArgs.push_back("-P");
4767 }
4768
David Majnemer86c318f2014-02-11 21:05:00 +00004769 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4770 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4771 if (MostGeneralArg && BestCaseArg)
4772 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4773 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4774
4775 if (MostGeneralArg) {
4776 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4777 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4778 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4779
4780 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4781 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4782 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4783 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4784 << FirstConflict->getAsString(Args)
4785 << SecondConflict->getAsString(Args);
4786
4787 if (SingleArg)
4788 CmdArgs.push_back("-fms-memptr-rep=single");
4789 else if (MultipleArg)
4790 CmdArgs.push_back("-fms-memptr-rep=multiple");
4791 else
4792 CmdArgs.push_back("-fms-memptr-rep=virtual");
4793 }
4794
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004795 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4796 A->render(Args, CmdArgs);
4797
Hans Wennborg81f74482013-09-10 01:07:07 +00004798 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4799 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004800 if (Args.hasArg(options::OPT__SLASH_fallback))
4801 CmdArgs.push_back("msvc-fallback");
4802 else
4803 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004804 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004805}
4806
Hans Wennborg1da044a2014-06-26 19:59:02 +00004807visualstudio::Compile *Clang::getCLFallback() const {
4808 if (!CLFallback)
4809 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4810 return CLFallback.get();
4811}
4812
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004813void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004814 const InputInfo &Output,
4815 const InputInfoList &Inputs,
4816 const ArgList &Args,
4817 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004818 ArgStringList CmdArgs;
4819
4820 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4821 const InputInfo &Input = Inputs[0];
4822
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004823 // Don't warn about "clang -w -c foo.s"
4824 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004825 // and "clang -emit-llvm -c foo.s"
4826 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004827
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004828 // Invoke ourselves in -cc1as mode.
4829 //
4830 // FIXME: Implement custom jobs for internal actions.
4831 CmdArgs.push_back("-cc1as");
4832
4833 // Add the "effective" target triple.
4834 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004835 std::string TripleStr =
4836 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004837 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4838
4839 // Set the output mode, we currently only expect to be used as a real
4840 // assembler.
4841 CmdArgs.push_back("-filetype");
4842 CmdArgs.push_back("obj");
4843
Eric Christopher45f2e712012-12-18 00:31:10 +00004844 // Set the main file name, so that debug info works even with
4845 // -save-temps or preprocessed assembly.
4846 CmdArgs.push_back("-main-file-name");
4847 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4848
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004849 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004850 const llvm::Triple &Triple = getToolChain().getTriple();
4851 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004852 if (!CPU.empty()) {
4853 CmdArgs.push_back("-target-cpu");
4854 CmdArgs.push_back(Args.MakeArgString(CPU));
4855 }
4856
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004857 // Add the target features
4858 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004859 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004860
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004861 // Ignore explicit -force_cpusubtype_ALL option.
4862 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004863
Eric Christopherfc3ee562012-01-10 00:38:01 +00004864 // Determine the original source input.
4865 const Action *SourceAction = &JA;
4866 while (SourceAction->getKind() != Action::InputClass) {
4867 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4868 SourceAction = SourceAction->getInputs()[0];
4869 }
4870
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004871 // Forward -g and handle debug info related flags, assuming we are dealing
4872 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004873 if (SourceAction->getType() == types::TY_Asm ||
4874 SourceAction->getType() == types::TY_PP_Asm) {
4875 Args.ClaimAllArgs(options::OPT_g_Group);
4876 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4877 if (!A->getOption().matches(options::OPT_g0))
4878 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004879
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004880 if (Args.hasArg(options::OPT_gdwarf_2))
4881 CmdArgs.push_back("-gdwarf-2");
4882 if (Args.hasArg(options::OPT_gdwarf_3))
4883 CmdArgs.push_back("-gdwarf-3");
4884 if (Args.hasArg(options::OPT_gdwarf_4))
4885 CmdArgs.push_back("-gdwarf-4");
4886
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004887 // Add the -fdebug-compilation-dir flag if needed.
4888 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004889
4890 // Set the AT_producer to the clang version when using the integrated
4891 // assembler on assembly source files.
4892 CmdArgs.push_back("-dwarf-debug-producer");
4893 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004894 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004895
4896 // Optionally embed the -cc1as level arguments into the debug info, for build
4897 // analysis.
4898 if (getToolChain().UseDwarfDebugFlags()) {
4899 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004900 for (const auto &Arg : Args)
4901 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004902
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004903 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004904 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4905 Flags += Exec;
4906 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4907 Flags += " ";
4908 Flags += OriginalArgs[i];
4909 }
4910 CmdArgs.push_back("-dwarf-debug-flags");
4911 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4912 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004913
4914 // FIXME: Add -static support, once we have it.
4915
David Blaikie372d9502014-01-17 03:17:40 +00004916 // Consume all the warning flags. Usually this would be handled more
4917 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4918 // doesn't handle that so rather than warning about unused flags that are
4919 // actually used, we'll lie by omission instead.
4920 // FIXME: Stop lying and consume only the appropriate driver flags
4921 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4922 ie = Args.filtered_end();
4923 it != ie; ++it)
4924 (*it)->claim();
4925
David Blaikie9260ed62013-07-25 21:19:01 +00004926 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4927 getToolChain().getDriver());
4928
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004929 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004930
4931 assert(Output.isFilename() && "Unexpected lipo output.");
4932 CmdArgs.push_back("-o");
4933 CmdArgs.push_back(Output.getFilename());
4934
Daniel Dunbarb440f562010-08-02 02:38:21 +00004935 assert(Input.isFilename() && "Invalid input.");
4936 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004937
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004938 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00004939 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004940
4941 // Handle the debug info splitting at object creation time if we're
4942 // creating an object.
4943 // TODO: Currently only works on linux with newer objcopy.
4944 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004945 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004946 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4947 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004948}
4949
Reid Kleckner0290c9c2014-09-15 17:45:39 +00004950void GnuTool::anchor() {}
4951
Daniel Dunbara3246a02009-03-18 08:07:30 +00004952void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004953 const InputInfo &Output,
4954 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004955 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004956 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004957 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004958 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004959
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004960 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004961 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004962 // Don't forward any -g arguments to assembly steps.
4963 if (isa<AssembleJobAction>(JA) &&
4964 A->getOption().matches(options::OPT_g_Group))
4965 continue;
4966
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004967 // Don't forward any -W arguments to assembly and link steps.
4968 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4969 A->getOption().matches(options::OPT_W_Group))
4970 continue;
4971
Daniel Dunbar2da02722009-03-19 07:55:12 +00004972 // It is unfortunate that we have to claim here, as this means
4973 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004974 // platforms using a generic gcc, even if we are just using gcc
4975 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004976 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004977 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004978 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004979 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004980
Daniel Dunbar4e295052010-01-25 22:35:08 +00004981 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004982
4983 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004984 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004985 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00004986 CmdArgs.push_back(
4987 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004988 }
4989
Daniel Dunbar5716d872009-05-02 21:41:52 +00004990 // Try to force gcc to match the tool chain we want, if we recognize
4991 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004992 //
4993 // FIXME: The triple class should directly provide the information we want
4994 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00004995 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004996 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004997 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004998 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4999 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005000 CmdArgs.push_back("-m64");
5001
Daniel Dunbarb440f562010-08-02 02:38:21 +00005002 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005003 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005004 CmdArgs.push_back(Output.getFilename());
5005 } else {
5006 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005007 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005008 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005009
Tony Linthicum76329bf2011-12-12 21:14:55 +00005010 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5011 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005012
5013 // Only pass -x if gcc will understand it; otherwise hope gcc
5014 // understands the suffix correctly. The main use case this would go
5015 // wrong in is for linker inputs if they happened to have an odd
5016 // suffix; really the only way to get this to happen is a command
5017 // like '-x foobar a.c' which will treat a.c like a linker input.
5018 //
5019 // FIXME: For the linker case specifically, can we safely convert
5020 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005021 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005022 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005023 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5024 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005025 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005026 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005027 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005028 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005029 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005030 else if (II.getType() == types::TY_ModuleFile)
5031 D.Diag(diag::err_drv_no_module_support)
5032 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005033
Daniel Dunbara3246a02009-03-18 08:07:30 +00005034 if (types::canTypeBeUserSpecified(II.getType())) {
5035 CmdArgs.push_back("-x");
5036 CmdArgs.push_back(types::getTypeName(II.getType()));
5037 }
5038
Daniel Dunbarb440f562010-08-02 02:38:21 +00005039 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005040 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005041 else {
5042 const Arg &A = II.getInputArg();
5043
5044 // Reverse translate some rewritten options.
5045 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5046 CmdArgs.push_back("-lstdc++");
5047 continue;
5048 }
5049
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005050 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005051 A.render(Args, CmdArgs);
5052 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005053 }
5054
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005055 const std::string customGCCName = D.getCCCGenericGCCName();
5056 const char *GCCName;
5057 if (!customGCCName.empty())
5058 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005059 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005060 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005061 } else
5062 GCCName = "gcc";
5063
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005064 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005065 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005067}
5068
Daniel Dunbar4e295052010-01-25 22:35:08 +00005069void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5070 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005071 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005072}
5073
Daniel Dunbar4e295052010-01-25 22:35:08 +00005074void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5075 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005076 const Driver &D = getToolChain().getDriver();
5077
Daniel Dunbar4e295052010-01-25 22:35:08 +00005078 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005079 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
5080 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00005081 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005082 else {
5083 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005084 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005085 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005086
Daniel Dunbar4e295052010-01-25 22:35:08 +00005087 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005088 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005089}
5090
Daniel Dunbar4e295052010-01-25 22:35:08 +00005091void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5092 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005093 // The types are (hopefully) good enough.
5094}
5095
Tony Linthicum76329bf2011-12-12 21:14:55 +00005096// Hexagon tools start.
5097void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5098 ArgStringList &CmdArgs) const {
5099
5100}
5101void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5102 const InputInfo &Output,
5103 const InputInfoList &Inputs,
5104 const ArgList &Args,
5105 const char *LinkingOutput) const {
5106
5107 const Driver &D = getToolChain().getDriver();
5108 ArgStringList CmdArgs;
5109
5110 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005111 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005112 CmdArgs.push_back(Args.MakeArgString(MarchString));
5113
5114 RenderExtraToolArgs(JA, CmdArgs);
5115
5116 if (Output.isFilename()) {
5117 CmdArgs.push_back("-o");
5118 CmdArgs.push_back(Output.getFilename());
5119 } else {
5120 assert(Output.isNothing() && "Unexpected output");
5121 CmdArgs.push_back("-fsyntax-only");
5122 }
5123
Matthew Curtise8f80a12012-12-06 17:49:03 +00005124 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5125 if (!SmallDataThreshold.empty())
5126 CmdArgs.push_back(
5127 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005128
Matthew Curtise5df3812012-12-07 17:23:04 +00005129 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5130 options::OPT_Xassembler);
5131
Tony Linthicum76329bf2011-12-12 21:14:55 +00005132 // Only pass -x if gcc will understand it; otherwise hope gcc
5133 // understands the suffix correctly. The main use case this would go
5134 // wrong in is for linker inputs if they happened to have an odd
5135 // suffix; really the only way to get this to happen is a command
5136 // like '-x foobar a.c' which will treat a.c like a linker input.
5137 //
5138 // FIXME: For the linker case specifically, can we safely convert
5139 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005140 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005141 // Don't try to pass LLVM or AST inputs to a generic gcc.
5142 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5143 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5144 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5145 << getToolChain().getTripleString();
5146 else if (II.getType() == types::TY_AST)
5147 D.Diag(clang::diag::err_drv_no_ast_support)
5148 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005149 else if (II.getType() == types::TY_ModuleFile)
5150 D.Diag(diag::err_drv_no_module_support)
5151 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005152
5153 if (II.isFilename())
5154 CmdArgs.push_back(II.getFilename());
5155 else
5156 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5157 II.getInputArg().render(Args, CmdArgs);
5158 }
5159
5160 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005161 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005162 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005163}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005164
Tony Linthicum76329bf2011-12-12 21:14:55 +00005165void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5166 ArgStringList &CmdArgs) const {
5167 // The types are (hopefully) good enough.
5168}
5169
5170void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5171 const InputInfo &Output,
5172 const InputInfoList &Inputs,
5173 const ArgList &Args,
5174 const char *LinkingOutput) const {
5175
Matthew Curtise689b052012-12-06 15:46:07 +00005176 const toolchains::Hexagon_TC& ToolChain =
5177 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5178 const Driver &D = ToolChain.getDriver();
5179
Tony Linthicum76329bf2011-12-12 21:14:55 +00005180 ArgStringList CmdArgs;
5181
Matthew Curtise689b052012-12-06 15:46:07 +00005182 //----------------------------------------------------------------------------
5183 //
5184 //----------------------------------------------------------------------------
5185 bool hasStaticArg = Args.hasArg(options::OPT_static);
5186 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005187 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005188 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5189 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5190 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5191 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005192
Matthew Curtise689b052012-12-06 15:46:07 +00005193 //----------------------------------------------------------------------------
5194 // Silence warnings for various options
5195 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005196
Matthew Curtise689b052012-12-06 15:46:07 +00005197 Args.ClaimAllArgs(options::OPT_g_Group);
5198 Args.ClaimAllArgs(options::OPT_emit_llvm);
5199 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5200 // handled somewhere else.
5201 Args.ClaimAllArgs(options::OPT_static_libgcc);
5202
5203 //----------------------------------------------------------------------------
5204 //
5205 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005206 for (const auto &Opt : ToolChain.ExtraOpts)
5207 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005208
Matthew Curtisf10a5952012-12-06 14:16:43 +00005209 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5210 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005211
Matthew Curtise689b052012-12-06 15:46:07 +00005212 if (buildingLib) {
5213 CmdArgs.push_back("-shared");
5214 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5215 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005216 }
5217
Matthew Curtise689b052012-12-06 15:46:07 +00005218 if (hasStaticArg)
5219 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005220
Matthew Curtise8f80a12012-12-06 17:49:03 +00005221 if (buildPIE && !buildingLib)
5222 CmdArgs.push_back("-pie");
5223
5224 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5225 if (!SmallDataThreshold.empty()) {
5226 CmdArgs.push_back(
5227 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5228 }
5229
Matthew Curtise689b052012-12-06 15:46:07 +00005230 //----------------------------------------------------------------------------
5231 //
5232 //----------------------------------------------------------------------------
5233 CmdArgs.push_back("-o");
5234 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005235
Matthew Curtise689b052012-12-06 15:46:07 +00005236 const std::string MarchSuffix = "/" + MarchString;
5237 const std::string G0Suffix = "/G0";
5238 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
5239 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
5240 + "/";
5241 const std::string StartFilesDir = RootDir
5242 + "hexagon/lib"
5243 + (buildingLib
5244 ? MarchG0Suffix : MarchSuffix);
5245
5246 //----------------------------------------------------------------------------
5247 // moslib
5248 //----------------------------------------------------------------------------
5249 std::vector<std::string> oslibs;
5250 bool hasStandalone= false;
5251
5252 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5253 ie = Args.filtered_end(); it != ie; ++it) {
5254 (*it)->claim();
5255 oslibs.push_back((*it)->getValue());
5256 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005257 }
Matthew Curtise689b052012-12-06 15:46:07 +00005258 if (oslibs.empty()) {
5259 oslibs.push_back("standalone");
5260 hasStandalone = true;
5261 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005262
Matthew Curtise689b052012-12-06 15:46:07 +00005263 //----------------------------------------------------------------------------
5264 // Start Files
5265 //----------------------------------------------------------------------------
5266 if (incStdLib && incStartFiles) {
5267
5268 if (!buildingLib) {
5269 if (hasStandalone) {
5270 CmdArgs.push_back(
5271 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5272 }
5273 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5274 }
5275 std::string initObj = useShared ? "/initS.o" : "/init.o";
5276 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5277 }
5278
5279 //----------------------------------------------------------------------------
5280 // Library Search Paths
5281 //----------------------------------------------------------------------------
5282 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005283 for (const auto &LibPath : LibPaths)
5284 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005285
5286 //----------------------------------------------------------------------------
5287 //
5288 //----------------------------------------------------------------------------
5289 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5290 Args.AddAllArgs(CmdArgs, options::OPT_e);
5291 Args.AddAllArgs(CmdArgs, options::OPT_s);
5292 Args.AddAllArgs(CmdArgs, options::OPT_t);
5293 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5294
5295 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5296
5297 //----------------------------------------------------------------------------
5298 // Libraries
5299 //----------------------------------------------------------------------------
5300 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005301 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005302 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5303 CmdArgs.push_back("-lm");
5304 }
5305
5306 CmdArgs.push_back("--start-group");
5307
5308 if (!buildingLib) {
5309 for(std::vector<std::string>::iterator i = oslibs.begin(),
5310 e = oslibs.end(); i != e; ++i)
5311 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5312 CmdArgs.push_back("-lc");
5313 }
5314 CmdArgs.push_back("-lgcc");
5315
5316 CmdArgs.push_back("--end-group");
5317 }
5318
5319 //----------------------------------------------------------------------------
5320 // End files
5321 //----------------------------------------------------------------------------
5322 if (incStdLib && incStartFiles) {
5323 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5324 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5325 }
5326
5327 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005328 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5329 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005330}
5331// Hexagon tools end.
5332
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005333/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005334const char *arm::getARMCPUForMArch(const ArgList &Args,
5335 const llvm::Triple &Triple) {
5336 StringRef MArch;
5337 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5338 // Otherwise, if we have -march= choose the base CPU for that arch.
5339 MArch = A->getValue();
5340 } else {
5341 // Otherwise, use the Arch from the triple.
5342 MArch = Triple.getArchName();
5343 }
5344
5345 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005346 if (MArch == "native") {
5347 std::string CPU = llvm::sys::getHostCPUName();
5348 if (CPU != "generic") {
5349 // Translate the native cpu into the architecture. The switch below will
5350 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005351 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005352 }
5353 }
5354
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005355 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005356}
5357
5358/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005359StringRef arm::getARMTargetCPU(const ArgList &Args,
5360 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005361 // FIXME: Warn on inconsistent use of -mcpu and -march.
5362 // If we have -mcpu=, use that.
5363 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5364 StringRef MCPU = A->getValue();
5365 // Handle -mcpu=native.
5366 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005367 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005368 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005369 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005370 }
5371
5372 return getARMCPUForMArch(Args, Triple);
5373}
5374
5375/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5376/// CPU.
5377//
5378// FIXME: This is redundant with -mcpu, why does LLVM use this.
5379// FIXME: tblgen this, or kill it!
5380const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5381 return llvm::StringSwitch<const char *>(CPU)
5382 .Case("strongarm", "v4")
5383 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5384 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5385 .Cases("arm920", "arm920t", "arm922t", "v4t")
5386 .Cases("arm940t", "ep9312","v4t")
5387 .Cases("arm10tdmi", "arm1020t", "v5")
5388 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5389 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5390 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5391 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5392 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5393 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00005394 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005395 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5396 .Cases("cortex-r4", "cortex-r5", "v7r")
5397 .Case("cortex-m0", "v6m")
5398 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005399 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005400 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005401 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005402 .Cases("cortex-a53", "cortex-a57", "v8")
5403 .Default("");
5404}
5405
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005406bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5407 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5408 return A && (A->getValue() == StringRef(Value));
5409}
5410
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005411bool mips::isUCLibc(const ArgList &Args) {
5412 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005413 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005414}
5415
Daniel Sanders2bf13662014-07-10 14:40:57 +00005416bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005417 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5418 return llvm::StringSwitch<bool>(NaNArg->getValue())
5419 .Case("2008", true)
5420 .Case("legacy", false)
5421 .Default(false);
5422
5423 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005424 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5425 .Cases("mips32r6", "mips64r6", true)
5426 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005427
5428 return false;
5429}
5430
Daniel Sanders379d44b2014-07-16 11:52:23 +00005431bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5432 StringRef ABIName) {
5433 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005434 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005435 return false;
5436
5437 if (ABIName != "32")
5438 return false;
5439
5440 return llvm::StringSwitch<bool>(CPUName)
5441 .Cases("mips2", "mips3", "mips4", "mips5", true)
5442 .Cases("mips32", "mips32r2", true)
5443 .Cases("mips64", "mips64r2", true)
5444 .Default(false);
5445}
5446
Tim Northover157d9112014-01-16 08:48:16 +00005447llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005448 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5449 // archs which Darwin doesn't use.
5450
5451 // The matching this routine does is fairly pointless, since it is neither the
5452 // complete architecture list, nor a reasonable subset. The problem is that
5453 // historically the driver driver accepts this and also ties its -march=
5454 // handling to the architecture name, so we need to be careful before removing
5455 // support for it.
5456
5457 // This code must be kept in sync with Clang's Darwin specific argument
5458 // translation.
5459
5460 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5461 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5462 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5463 .Case("ppc64", llvm::Triple::ppc64)
5464 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5465 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5466 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005467 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005468 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005469 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005470 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005471 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005472 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005473 .Case("r600", llvm::Triple::r600)
5474 .Case("nvptx", llvm::Triple::nvptx)
5475 .Case("nvptx64", llvm::Triple::nvptx64)
5476 .Case("amdil", llvm::Triple::amdil)
5477 .Case("spir", llvm::Triple::spir)
5478 .Default(llvm::Triple::UnknownArch);
5479}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005480
Tim Northover157d9112014-01-16 08:48:16 +00005481void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5482 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5483 T.setArch(Arch);
5484
5485 if (Str == "x86_64h")
5486 T.setArchName(Str);
5487 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5488 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005489 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005490 }
5491}
5492
Bob Wilsondecc03e2012-11-23 06:14:39 +00005493const char *Clang::getBaseInputName(const ArgList &Args,
5494 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005495 return Args.MakeArgString(
5496 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005497}
5498
Bob Wilsondecc03e2012-11-23 06:14:39 +00005499const char *Clang::getBaseInputStem(const ArgList &Args,
5500 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005501 const char *Str = getBaseInputName(Args, Inputs);
5502
Chris Lattner906bb902011-01-16 08:14:11 +00005503 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005504 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005505
5506 return Str;
5507}
5508
Bob Wilsondecc03e2012-11-23 06:14:39 +00005509const char *Clang::getDependencyFileName(const ArgList &Args,
5510 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005511 // FIXME: Think about this more.
5512 std::string Res;
5513
5514 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005515 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005516 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005517 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005518 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005519 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005520 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005521}
5522
Daniel Dunbarbe220842009-03-20 16:06:39 +00005523void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005524 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005525 const InputInfoList &Inputs,
5526 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005527 const char *LinkingOutput) const {
5528 ArgStringList CmdArgs;
5529
5530 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5531 const InputInfo &Input = Inputs[0];
5532
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005533 // Determine the original source input.
5534 const Action *SourceAction = &JA;
5535 while (SourceAction->getKind() != Action::InputClass) {
5536 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5537 SourceAction = SourceAction->getInputs()[0];
5538 }
5539
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005540 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005541 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005542 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5543 // FIXME: at run-time detect assembler capabilities or rely on version
5544 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005545 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005546 const llvm::Triple &T(getToolChain().getTriple());
5547 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005548 CmdArgs.push_back("-Q");
5549 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005550
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005551 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005552 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005553 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005554 if (Args.hasArg(options::OPT_gstabs))
5555 CmdArgs.push_back("--gstabs");
5556 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005557 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005558 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005559
Daniel Dunbarbe220842009-03-20 16:06:39 +00005560 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005561 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005562
Daniel Dunbar6d484762010-07-22 01:47:22 +00005563 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005564 if (getToolChain().getArch() == llvm::Triple::x86 ||
5565 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005566 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5567 CmdArgs.push_back("-force_cpusubtype_ALL");
5568
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005569 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005570 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005571 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005572 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005573 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005574 CmdArgs.push_back("-static");
5575
Daniel Dunbarbe220842009-03-20 16:06:39 +00005576 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5577 options::OPT_Xassembler);
5578
5579 assert(Output.isFilename() && "Unexpected lipo output.");
5580 CmdArgs.push_back("-o");
5581 CmdArgs.push_back(Output.getFilename());
5582
Daniel Dunbarb440f562010-08-02 02:38:21 +00005583 assert(Input.isFilename() && "Invalid input.");
5584 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005585
5586 // asm_final spec is empty.
5587
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005588 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005589 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005590 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005591}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005592
Tim Northover157d9112014-01-16 08:48:16 +00005593void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005594
Tim Northover157d9112014-01-16 08:48:16 +00005595void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5596 ArgStringList &CmdArgs) const {
5597 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005598
Daniel Dunbarc1964212009-03-26 16:23:12 +00005599 // Derived from darwin_arch spec.
5600 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005601 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005602
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005603 // FIXME: Is this needed anymore?
5604 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005605 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005606}
5607
Bill Wendling3b2000f2012-10-02 18:02:50 +00005608bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5609 // We only need to generate a temp path for LTO if we aren't compiling object
5610 // files. When compiling source files, we run 'dsymutil' after linking. We
5611 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005612 for (const auto &Input : Inputs)
5613 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005614 return true;
5615
5616 return false;
5617}
5618
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005619void darwin::Link::AddLinkArgs(Compilation &C,
5620 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005621 ArgStringList &CmdArgs,
5622 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005623 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005624 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005625
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005626 unsigned Version[3] = { 0, 0, 0 };
5627 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5628 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005629 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005630 Version[1], Version[2], HadExtra) ||
5631 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005632 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005633 << A->getAsString(Args);
5634 }
5635
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005636 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005637 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005638 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5639 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005640
Bob Wilson3d27dad2013-08-02 22:25:34 +00005641 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5642 CmdArgs.push_back("-export_dynamic");
5643
Bill Wendling313b6bf2012-11-16 23:03:00 +00005644 // If we are using LTO, then automatically create a temporary file path for
5645 // the linker to use, so that it's lifetime will extend past a possible
5646 // dsymutil step.
5647 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5648 const char *TmpPath = C.getArgs().MakeArgString(
5649 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5650 C.addTempFile(TmpPath);
5651 CmdArgs.push_back("-object_path_lto");
5652 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005653 }
5654
Daniel Dunbarc1964212009-03-26 16:23:12 +00005655 // Derived from the "link" spec.
5656 Args.AddAllArgs(CmdArgs, options::OPT_static);
5657 if (!Args.hasArg(options::OPT_static))
5658 CmdArgs.push_back("-dynamic");
5659 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5660 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5661 // here. How do we wish to handle such things?
5662 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005663
Daniel Dunbarc1964212009-03-26 16:23:12 +00005664 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005665 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005666 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005667 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005668
5669 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5670 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5671 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5672
5673 Arg *A;
5674 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5675 (A = Args.getLastArg(options::OPT_current__version)) ||
5676 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005677 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005678 << A->getAsString(Args) << "-dynamiclib";
5679
5680 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5681 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5682 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5683 } else {
5684 CmdArgs.push_back("-dylib");
5685
5686 Arg *A;
5687 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5688 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5689 (A = Args.getLastArg(options::OPT_client__name)) ||
5690 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5691 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5692 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005693 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005694 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005695
Daniel Dunbarc1964212009-03-26 16:23:12 +00005696 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5697 "-dylib_compatibility_version");
5698 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5699 "-dylib_current_version");
5700
Tim Northover157d9112014-01-16 08:48:16 +00005701 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005702
5703 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5704 "-dylib_install_name");
5705 }
5706
5707 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5708 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5709 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005710 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005711 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005712 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5713 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5714 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5715 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5716 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5717 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005718 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005719 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5720 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5721 Args.AddAllArgs(CmdArgs, options::OPT_init);
5722
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005723 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005724 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005725
Daniel Dunbarc1964212009-03-26 16:23:12 +00005726 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5727 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5728 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5729 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5730 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005731
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005732 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5733 options::OPT_fno_pie,
5734 options::OPT_fno_PIE)) {
5735 if (A->getOption().matches(options::OPT_fpie) ||
5736 A->getOption().matches(options::OPT_fPIE))
5737 CmdArgs.push_back("-pie");
5738 else
5739 CmdArgs.push_back("-no_pie");
5740 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005741
5742 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5743 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5744 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5745 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5746 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5747 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5748 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5749 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5750 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5751 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5752 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5753 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5754 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5755 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5756 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5757 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005758
Daniel Dunbar84384642011-05-02 21:03:47 +00005759 // Give --sysroot= preference, over the Apple specific behavior to also use
5760 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005761 StringRef sysroot = C.getSysRoot();
5762 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005763 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005764 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005765 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5766 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005767 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005768 }
5769
Daniel Dunbarc1964212009-03-26 16:23:12 +00005770 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5771 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5772 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5773 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5774 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005775 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005776 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5777 Args.AddAllArgs(CmdArgs, options::OPT_y);
5778 Args.AddLastArg(CmdArgs, options::OPT_w);
5779 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5780 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5781 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5782 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5783 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5784 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5785 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5786 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5787 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5788 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5789 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5790 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5791}
5792
Alexey Bataev186b28a2014-03-06 05:43:53 +00005793enum LibOpenMP {
5794 LibUnknown,
5795 LibGOMP,
5796 LibIOMP5
5797};
5798
Daniel Dunbarc1964212009-03-26 16:23:12 +00005799void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005800 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005801 const InputInfoList &Inputs,
5802 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005803 const char *LinkingOutput) const {
5804 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005805
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005806 // If the number of arguments surpasses the system limits, we will encode the
5807 // input files in a separate file, shortening the command line. To this end,
5808 // build a list of input file names that can be passed via a file with the
5809 // -filelist linker option.
5810 llvm::opt::ArgStringList InputFileList;
5811
Daniel Dunbarc1964212009-03-26 16:23:12 +00005812 // The logic here is derived from gcc's behavior; most of which
5813 // comes from specs (starting with link_command). Consult gcc for
5814 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005815 ArgStringList CmdArgs;
5816
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005817 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5818 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5819 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005820 for (const auto &Arg : Args)
5821 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005822 const char *Exec =
5823 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5824 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005825 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005826 return;
5827 }
5828
Daniel Dunbarc1964212009-03-26 16:23:12 +00005829 // I'm not sure why this particular decomposition exists in gcc, but
5830 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005831 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005832
Daniel Dunbarc1964212009-03-26 16:23:12 +00005833 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5834 Args.AddAllArgs(CmdArgs, options::OPT_s);
5835 Args.AddAllArgs(CmdArgs, options::OPT_t);
5836 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5837 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005838 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005839 Args.AddAllArgs(CmdArgs, options::OPT_r);
5840
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005841 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5842 // members of static archive libraries which implement Objective-C classes or
5843 // categories.
5844 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5845 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005846
Daniel Dunbarc1964212009-03-26 16:23:12 +00005847 CmdArgs.push_back("-o");
5848 CmdArgs.push_back(Output.getFilename());
5849
Chad Rosier06fd3c62012-05-16 23:45:12 +00005850 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005851 !Args.hasArg(options::OPT_nostartfiles))
5852 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005853
5854 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005855
Alexey Bataev186b28a2014-03-06 05:43:53 +00005856 LibOpenMP UsedOpenMPLib = LibUnknown;
5857 if (Args.hasArg(options::OPT_fopenmp)) {
5858 UsedOpenMPLib = LibGOMP;
5859 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5860 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5861 .Case("libgomp", LibGOMP)
5862 .Case("libiomp5", LibIOMP5)
5863 .Default(LibUnknown);
5864 if (UsedOpenMPLib == LibUnknown)
5865 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5866 << A->getOption().getName() << A->getValue();
5867 }
5868 switch (UsedOpenMPLib) {
5869 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005870 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005871 break;
5872 case LibIOMP5:
5873 CmdArgs.push_back("-liomp5");
5874 break;
5875 case LibUnknown:
5876 break;
5877 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005878
Douglas Gregor9295df02012-05-15 21:00:27 +00005879 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005880 // Build the input file for -filelist (list of linker input files) in case we
5881 // need it later
5882 for (const auto &II : Inputs) {
5883 if (!II.isFilename()) {
5884 // This is a linker input argument.
5885 // We cannot mix input arguments and file names in a -filelist input, thus
5886 // we prematurely stop our list (remaining files shall be passed as
5887 // arguments).
5888 if (InputFileList.size() > 0)
5889 break;
5890
5891 continue;
5892 }
5893
5894 InputFileList.push_back(II.getFilename());
5895 }
5896
Bob Wilson16d93952012-05-15 18:57:39 +00005897 if (isObjCRuntimeLinked(Args) &&
5898 !Args.hasArg(options::OPT_nostdlib) &&
5899 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005900 // We use arclite library for both ARC and subscripting support.
5901 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5902
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005903 CmdArgs.push_back("-framework");
5904 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005905 // Link libobj.
5906 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005907 }
John McCall31168b02011-06-15 23:02:42 +00005908
Daniel Dunbarc1964212009-03-26 16:23:12 +00005909 if (LinkingOutput) {
5910 CmdArgs.push_back("-arch_multiple");
5911 CmdArgs.push_back("-final_output");
5912 CmdArgs.push_back(LinkingOutput);
5913 }
5914
Daniel Dunbarc1964212009-03-26 16:23:12 +00005915 if (Args.hasArg(options::OPT_fnested_functions))
5916 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005917
Daniel Dunbarc1964212009-03-26 16:23:12 +00005918 if (!Args.hasArg(options::OPT_nostdlib) &&
5919 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005920 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005921 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005922
Daniel Dunbarc1964212009-03-26 16:23:12 +00005923 // link_ssp spec is empty.
5924
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005925 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005926 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005927 }
5928
Chad Rosier06fd3c62012-05-16 23:45:12 +00005929 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005930 !Args.hasArg(options::OPT_nostartfiles)) {
5931 // endfile_spec is empty.
5932 }
5933
5934 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5935 Args.AddAllArgs(CmdArgs, options::OPT_F);
5936
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005937 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00005938 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005939 std::unique_ptr<Command> Cmd =
5940 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
5941 Cmd->setInputFileList(std::move(InputFileList));
5942 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005943}
5944
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005945void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005946 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005947 const InputInfoList &Inputs,
5948 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005949 const char *LinkingOutput) const {
5950 ArgStringList CmdArgs;
5951
5952 CmdArgs.push_back("-create");
5953 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005954
5955 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005956 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005957
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005958 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005959 assert(II.isFilename() && "Unexpected lipo input.");
5960 CmdArgs.push_back(II.getFilename());
5961 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005962
5963 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00005964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005965}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005966
Daniel Dunbar88299622010-06-04 18:28:36 +00005967void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005968 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005969 const InputInfoList &Inputs,
5970 const ArgList &Args,
5971 const char *LinkingOutput) const {
5972 ArgStringList CmdArgs;
5973
Daniel Dunbareb86b042011-05-09 17:23:16 +00005974 CmdArgs.push_back("-o");
5975 CmdArgs.push_back(Output.getFilename());
5976
Daniel Dunbar88299622010-06-04 18:28:36 +00005977 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5978 const InputInfo &Input = Inputs[0];
5979 assert(Input.isFilename() && "Unexpected dsymutil input.");
5980 CmdArgs.push_back(Input.getFilename());
5981
Daniel Dunbar88299622010-06-04 18:28:36 +00005982 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005983 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00005984 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005985}
5986
Eric Christopher551ef452011-08-23 17:56:55 +00005987void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005988 const InputInfo &Output,
5989 const InputInfoList &Inputs,
5990 const ArgList &Args,
5991 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005992 ArgStringList CmdArgs;
5993 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005994 CmdArgs.push_back("--debug-info");
5995 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005996 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005997
5998 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5999 const InputInfo &Input = Inputs[0];
6000 assert(Input.isFilename() && "Unexpected verify input");
6001
6002 // Grabbing the output of the earlier dsymutil run.
6003 CmdArgs.push_back(Input.getFilename());
6004
6005 const char *Exec =
6006 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006007 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006008}
6009
David Chisnallf571cde2012-02-15 13:39:01 +00006010void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6011 const InputInfo &Output,
6012 const InputInfoList &Inputs,
6013 const ArgList &Args,
6014 const char *LinkingOutput) const {
6015 ArgStringList CmdArgs;
6016
6017 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6018 options::OPT_Xassembler);
6019
6020 CmdArgs.push_back("-o");
6021 CmdArgs.push_back(Output.getFilename());
6022
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006023 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006024 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006025
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006026 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006027 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006028}
6029
David Chisnallf571cde2012-02-15 13:39:01 +00006030void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6031 const InputInfo &Output,
6032 const InputInfoList &Inputs,
6033 const ArgList &Args,
6034 const char *LinkingOutput) const {
6035 // FIXME: Find a real GCC, don't hard-code versions here
6036 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6037 const llvm::Triple &T = getToolChain().getTriple();
6038 std::string LibPath = "/usr/lib/";
6039 llvm::Triple::ArchType Arch = T.getArch();
6040 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006041 case llvm::Triple::x86:
6042 GCCLibPath +=
6043 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6044 break;
6045 case llvm::Triple::x86_64:
6046 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6047 GCCLibPath += "/4.5.2/amd64/";
6048 LibPath += "amd64/";
6049 break;
6050 default:
6051 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006052 }
6053
6054 ArgStringList CmdArgs;
6055
David Chisnall272a0712012-02-29 15:06:12 +00006056 // Demangle C++ names in errors
6057 CmdArgs.push_back("-C");
6058
David Chisnallf571cde2012-02-15 13:39:01 +00006059 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6060 (!Args.hasArg(options::OPT_shared))) {
6061 CmdArgs.push_back("-e");
6062 CmdArgs.push_back("_start");
6063 }
6064
6065 if (Args.hasArg(options::OPT_static)) {
6066 CmdArgs.push_back("-Bstatic");
6067 CmdArgs.push_back("-dn");
6068 } else {
6069 CmdArgs.push_back("-Bdynamic");
6070 if (Args.hasArg(options::OPT_shared)) {
6071 CmdArgs.push_back("-shared");
6072 } else {
6073 CmdArgs.push_back("--dynamic-linker");
6074 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6075 }
6076 }
6077
6078 if (Output.isFilename()) {
6079 CmdArgs.push_back("-o");
6080 CmdArgs.push_back(Output.getFilename());
6081 } else {
6082 assert(Output.isNothing() && "Invalid output.");
6083 }
6084
6085 if (!Args.hasArg(options::OPT_nostdlib) &&
6086 !Args.hasArg(options::OPT_nostartfiles)) {
6087 if (!Args.hasArg(options::OPT_shared)) {
6088 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6089 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006090 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006091 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6092 } else {
6093 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006094 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6095 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006096 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006097 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006098 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006099 }
6100
6101 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6102
6103 Args.AddAllArgs(CmdArgs, options::OPT_L);
6104 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6105 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006106 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006107
6108 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6109
6110 if (!Args.hasArg(options::OPT_nostdlib) &&
6111 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006112 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006113 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006114 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006115 if (!Args.hasArg(options::OPT_shared)) {
6116 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006117 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006118 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006119 }
David Chisnallf571cde2012-02-15 13:39:01 +00006120 }
6121
6122 if (!Args.hasArg(options::OPT_nostdlib) &&
6123 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006124 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006125 }
David Chisnall96de9932012-02-16 16:00:47 +00006126 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006127
Alexey Samsonov7811d192014-02-20 13:57:37 +00006128 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006129
6130 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006131 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006132 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006133}
6134
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006135void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006136 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006137 const InputInfoList &Inputs,
6138 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006139 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006140 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006141 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006142
Rafael Espindolacc126272014-02-28 01:55:21 +00006143 switch (getToolChain().getArch()) {
6144 case llvm::Triple::x86:
6145 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6146 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006147 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006148 break;
6149
6150 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006151 CmdArgs.push_back("-mppc");
6152 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006153 break;
6154
6155 case llvm::Triple::sparc:
6156 CmdArgs.push_back("-32");
6157 NeedsKPIC = true;
6158 break;
6159
6160 case llvm::Triple::sparcv9:
6161 CmdArgs.push_back("-64");
6162 CmdArgs.push_back("-Av9a");
6163 NeedsKPIC = true;
6164 break;
6165
6166 case llvm::Triple::mips64:
6167 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006168 StringRef CPUName;
6169 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006170 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006171
6172 CmdArgs.push_back("-mabi");
6173 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6174
6175 if (getToolChain().getArch() == llvm::Triple::mips64)
6176 CmdArgs.push_back("-EB");
6177 else
6178 CmdArgs.push_back("-EL");
6179
Rafael Espindolacc126272014-02-28 01:55:21 +00006180 NeedsKPIC = true;
6181 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006182 }
6183
Rafael Espindolacc126272014-02-28 01:55:21 +00006184 default:
6185 break;
6186 }
6187
6188 if (NeedsKPIC)
6189 addAssemblerKPIC(Args, CmdArgs);
6190
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6192 options::OPT_Xassembler);
6193
6194 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006195 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006197 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006199
6200 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006201 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006202 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006203}
6204
6205void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006206 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006207 const InputInfoList &Inputs,
6208 const ArgList &Args,
6209 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006210 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006211 ArgStringList CmdArgs;
6212
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006213 // Silence warning for "clang -g foo.o -o foo"
6214 Args.ClaimAllArgs(options::OPT_g_Group);
6215 // and "clang -emit-llvm foo.o -o foo"
6216 Args.ClaimAllArgs(options::OPT_emit_llvm);
6217 // and for "clang -w foo.o -o foo". Other warning options are already
6218 // handled somewhere else.
6219 Args.ClaimAllArgs(options::OPT_w);
6220
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006221 if (getToolChain().getArch() == llvm::Triple::mips64)
6222 CmdArgs.push_back("-EB");
6223 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6224 CmdArgs.push_back("-EL");
6225
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006226 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006227 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006228 CmdArgs.push_back("-e");
6229 CmdArgs.push_back("__start");
6230 }
6231
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006232 if (Args.hasArg(options::OPT_static)) {
6233 CmdArgs.push_back("-Bstatic");
6234 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006235 if (Args.hasArg(options::OPT_rdynamic))
6236 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006237 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006238 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006239 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006240 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006241 } else {
6242 CmdArgs.push_back("-dynamic-linker");
6243 CmdArgs.push_back("/usr/libexec/ld.so");
6244 }
6245 }
6246
Rafael Espindola044f7832013-06-05 04:28:55 +00006247 if (Args.hasArg(options::OPT_nopie))
6248 CmdArgs.push_back("-nopie");
6249
Daniel Dunbarb440f562010-08-02 02:38:21 +00006250 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006251 CmdArgs.push_back("-o");
6252 CmdArgs.push_back(Output.getFilename());
6253 } else {
6254 assert(Output.isNothing() && "Invalid output.");
6255 }
6256
6257 if (!Args.hasArg(options::OPT_nostdlib) &&
6258 !Args.hasArg(options::OPT_nostartfiles)) {
6259 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006260 if (Args.hasArg(options::OPT_pg))
6261 CmdArgs.push_back(Args.MakeArgString(
6262 getToolChain().GetFilePath("gcrt0.o")));
6263 else
6264 CmdArgs.push_back(Args.MakeArgString(
6265 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006266 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006267 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006268 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006269 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006270 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006271 }
6272 }
6273
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006274 std::string Triple = getToolChain().getTripleString();
6275 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006276 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006277 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006278 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006279
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006280 Args.AddAllArgs(CmdArgs, options::OPT_L);
6281 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6282 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006283 Args.AddAllArgs(CmdArgs, options::OPT_s);
6284 Args.AddAllArgs(CmdArgs, options::OPT_t);
6285 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6286 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006287
Daniel Dunbar54423b22010-09-17 00:24:54 +00006288 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006289
6290 if (!Args.hasArg(options::OPT_nostdlib) &&
6291 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006292 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006293 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006294 if (Args.hasArg(options::OPT_pg))
6295 CmdArgs.push_back("-lm_p");
6296 else
6297 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006298 }
6299
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006300 // FIXME: For some reason GCC passes -lgcc before adding
6301 // the default system libraries. Just mimic this for now.
6302 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006303
Eric Christopher17674ec2012-09-13 06:32:34 +00006304 if (Args.hasArg(options::OPT_pthread)) {
6305 if (!Args.hasArg(options::OPT_shared) &&
6306 Args.hasArg(options::OPT_pg))
6307 CmdArgs.push_back("-lpthread_p");
6308 else
6309 CmdArgs.push_back("-lpthread");
6310 }
6311
Chandler Carruth45661652011-12-17 22:32:42 +00006312 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006313 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006314 CmdArgs.push_back("-lc_p");
6315 else
6316 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006317 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006318
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006319 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006320 }
6321
6322 if (!Args.hasArg(options::OPT_nostdlib) &&
6323 !Args.hasArg(options::OPT_nostartfiles)) {
6324 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006325 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006326 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006327 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006328 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006329 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006330 }
6331
6332 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006333 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006334 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006335}
Ed Schoutene33194b2009-04-02 19:13:12 +00006336
Eli Friedman9fa28852012-08-08 23:57:20 +00006337void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6338 const InputInfo &Output,
6339 const InputInfoList &Inputs,
6340 const ArgList &Args,
6341 const char *LinkingOutput) const {
6342 ArgStringList CmdArgs;
6343
6344 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6345 options::OPT_Xassembler);
6346
6347 CmdArgs.push_back("-o");
6348 CmdArgs.push_back(Output.getFilename());
6349
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006350 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006351 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006352
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006353 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006354 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006355}
6356
6357void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6358 const InputInfo &Output,
6359 const InputInfoList &Inputs,
6360 const ArgList &Args,
6361 const char *LinkingOutput) const {
6362 const Driver &D = getToolChain().getDriver();
6363 ArgStringList CmdArgs;
6364
6365 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6366 (!Args.hasArg(options::OPT_shared))) {
6367 CmdArgs.push_back("-e");
6368 CmdArgs.push_back("__start");
6369 }
6370
6371 if (Args.hasArg(options::OPT_static)) {
6372 CmdArgs.push_back("-Bstatic");
6373 } else {
6374 if (Args.hasArg(options::OPT_rdynamic))
6375 CmdArgs.push_back("-export-dynamic");
6376 CmdArgs.push_back("--eh-frame-hdr");
6377 CmdArgs.push_back("-Bdynamic");
6378 if (Args.hasArg(options::OPT_shared)) {
6379 CmdArgs.push_back("-shared");
6380 } else {
6381 CmdArgs.push_back("-dynamic-linker");
6382 CmdArgs.push_back("/usr/libexec/ld.so");
6383 }
6384 }
6385
6386 if (Output.isFilename()) {
6387 CmdArgs.push_back("-o");
6388 CmdArgs.push_back(Output.getFilename());
6389 } else {
6390 assert(Output.isNothing() && "Invalid output.");
6391 }
6392
6393 if (!Args.hasArg(options::OPT_nostdlib) &&
6394 !Args.hasArg(options::OPT_nostartfiles)) {
6395 if (!Args.hasArg(options::OPT_shared)) {
6396 if (Args.hasArg(options::OPT_pg))
6397 CmdArgs.push_back(Args.MakeArgString(
6398 getToolChain().GetFilePath("gcrt0.o")));
6399 else
6400 CmdArgs.push_back(Args.MakeArgString(
6401 getToolChain().GetFilePath("crt0.o")));
6402 CmdArgs.push_back(Args.MakeArgString(
6403 getToolChain().GetFilePath("crtbegin.o")));
6404 } else {
6405 CmdArgs.push_back(Args.MakeArgString(
6406 getToolChain().GetFilePath("crtbeginS.o")));
6407 }
6408 }
6409
6410 Args.AddAllArgs(CmdArgs, options::OPT_L);
6411 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6412 Args.AddAllArgs(CmdArgs, options::OPT_e);
6413
6414 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6415
6416 if (!Args.hasArg(options::OPT_nostdlib) &&
6417 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006418 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006419 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6420 if (Args.hasArg(options::OPT_pg))
6421 CmdArgs.push_back("-lm_p");
6422 else
6423 CmdArgs.push_back("-lm");
6424 }
6425
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006426 if (Args.hasArg(options::OPT_pthread)) {
6427 if (!Args.hasArg(options::OPT_shared) &&
6428 Args.hasArg(options::OPT_pg))
6429 CmdArgs.push_back("-lpthread_p");
6430 else
6431 CmdArgs.push_back("-lpthread");
6432 }
6433
Eli Friedman9fa28852012-08-08 23:57:20 +00006434 if (!Args.hasArg(options::OPT_shared)) {
6435 if (Args.hasArg(options::OPT_pg))
6436 CmdArgs.push_back("-lc_p");
6437 else
6438 CmdArgs.push_back("-lc");
6439 }
6440
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006441 StringRef MyArch;
6442 switch (getToolChain().getTriple().getArch()) {
6443 case llvm::Triple::arm:
6444 MyArch = "arm";
6445 break;
6446 case llvm::Triple::x86:
6447 MyArch = "i386";
6448 break;
6449 case llvm::Triple::x86_64:
6450 MyArch = "amd64";
6451 break;
6452 default:
6453 llvm_unreachable("Unsupported architecture");
6454 }
6455 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006456 }
6457
6458 if (!Args.hasArg(options::OPT_nostdlib) &&
6459 !Args.hasArg(options::OPT_nostartfiles)) {
6460 if (!Args.hasArg(options::OPT_shared))
6461 CmdArgs.push_back(Args.MakeArgString(
6462 getToolChain().GetFilePath("crtend.o")));
6463 else
6464 CmdArgs.push_back(Args.MakeArgString(
6465 getToolChain().GetFilePath("crtendS.o")));
6466 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006467
6468 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006469 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006470 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006471}
6472
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006473void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006474 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006475 const InputInfoList &Inputs,
6476 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006477 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006478 ArgStringList CmdArgs;
6479
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006480 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6481 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006482 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006483 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006484 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006485 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006486 else if (getToolChain().getArch() == llvm::Triple::mips ||
6487 getToolChain().getArch() == llvm::Triple::mipsel ||
6488 getToolChain().getArch() == llvm::Triple::mips64 ||
6489 getToolChain().getArch() == llvm::Triple::mips64el) {
6490 StringRef CPUName;
6491 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006492 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006493
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006494 CmdArgs.push_back("-march");
6495 CmdArgs.push_back(CPUName.data());
6496
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006497 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006498 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006499
6500 if (getToolChain().getArch() == llvm::Triple::mips ||
6501 getToolChain().getArch() == llvm::Triple::mips64)
6502 CmdArgs.push_back("-EB");
6503 else
6504 CmdArgs.push_back("-EL");
6505
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006506 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006507 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006508 getToolChain().getArch() == llvm::Triple::armeb ||
6509 getToolChain().getArch() == llvm::Triple::thumb ||
6510 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006511 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006512 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006513 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6514
6515 if (FloatABI == "hard") {
6516 CmdArgs.push_back("-mfpu=vfp");
6517 } else {
6518 CmdArgs.push_back("-mfpu=softvfp");
6519 }
6520
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006521 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006522 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006523 case llvm::Triple::GNUEABI:
6524 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006525 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006526 break;
6527
6528 default:
6529 CmdArgs.push_back("-matpcs");
6530 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006531 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006532 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006533 if (getToolChain().getArch() == llvm::Triple::sparc)
6534 CmdArgs.push_back("-Av8plusa");
6535 else
6536 CmdArgs.push_back("-Av9a");
6537
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006538 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006539 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006540
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006541 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6542 options::OPT_Xassembler);
6543
6544 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006545 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006546
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006547 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006548 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006549
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006550 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006551 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006552}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006553
6554void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006555 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006556 const InputInfoList &Inputs,
6557 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006558 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006559 const toolchains::FreeBSD& ToolChain =
6560 static_cast<const toolchains::FreeBSD&>(getToolChain());
6561 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006562 const bool IsPIE =
6563 !Args.hasArg(options::OPT_shared) &&
6564 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006565 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006566
6567 // Silence warning for "clang -g foo.o -o foo"
6568 Args.ClaimAllArgs(options::OPT_g_Group);
6569 // and "clang -emit-llvm foo.o -o foo"
6570 Args.ClaimAllArgs(options::OPT_emit_llvm);
6571 // and for "clang -w foo.o -o foo". Other warning options are already
6572 // handled somewhere else.
6573 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006574
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006575 if (!D.SysRoot.empty())
6576 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6577
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006578 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006579 CmdArgs.push_back("-pie");
6580
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006581 if (Args.hasArg(options::OPT_static)) {
6582 CmdArgs.push_back("-Bstatic");
6583 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006584 if (Args.hasArg(options::OPT_rdynamic))
6585 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006586 CmdArgs.push_back("--eh-frame-hdr");
6587 if (Args.hasArg(options::OPT_shared)) {
6588 CmdArgs.push_back("-Bshareable");
6589 } else {
6590 CmdArgs.push_back("-dynamic-linker");
6591 CmdArgs.push_back("/libexec/ld-elf.so.1");
6592 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006593 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6594 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006595 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6596 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6597 CmdArgs.push_back("--hash-style=both");
6598 }
6599 }
6600 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006601 }
6602
6603 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6604 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006605 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006606 CmdArgs.push_back("-m");
6607 CmdArgs.push_back("elf_i386_fbsd");
6608 }
6609
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006610 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006611 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006612 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006613 }
6614
Daniel Dunbarb440f562010-08-02 02:38:21 +00006615 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006616 CmdArgs.push_back("-o");
6617 CmdArgs.push_back(Output.getFilename());
6618 } else {
6619 assert(Output.isNothing() && "Invalid output.");
6620 }
6621
6622 if (!Args.hasArg(options::OPT_nostdlib) &&
6623 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006624 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006625 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006626 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006627 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006628 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006629 crt1 = "Scrt1.o";
6630 else
6631 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006632 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006633 if (crt1)
6634 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6635
6636 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6637
Craig Topper92fc2df2014-05-17 16:56:41 +00006638 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006639 if (Args.hasArg(options::OPT_static))
6640 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006641 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006642 crtbegin = "crtbeginS.o";
6643 else
6644 crtbegin = "crtbegin.o";
6645
6646 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006647 }
6648
6649 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006650 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006651 for (const auto &Path : Paths)
6652 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006653 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6654 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006655 Args.AddAllArgs(CmdArgs, options::OPT_s);
6656 Args.AddAllArgs(CmdArgs, options::OPT_t);
6657 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6658 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006659
Alp Tokerce365ca2013-12-02 12:43:03 +00006660 if (D.IsUsingLTO(Args))
6661 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006662
Alexey Samsonov52550342014-09-15 19:58:40 +00006663 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006664 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006665
6666 if (!Args.hasArg(options::OPT_nostdlib) &&
6667 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006668 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006669 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006670 if (Args.hasArg(options::OPT_pg))
6671 CmdArgs.push_back("-lm_p");
6672 else
6673 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006674 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006675 if (NeedsSanitizerDeps)
6676 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006677 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6678 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006679 if (Args.hasArg(options::OPT_pg))
6680 CmdArgs.push_back("-lgcc_p");
6681 else
6682 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006683 if (Args.hasArg(options::OPT_static)) {
6684 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006685 } else if (Args.hasArg(options::OPT_pg)) {
6686 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006687 } else {
6688 CmdArgs.push_back("--as-needed");
6689 CmdArgs.push_back("-lgcc_s");
6690 CmdArgs.push_back("--no-as-needed");
6691 }
6692
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006693 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006694 if (Args.hasArg(options::OPT_pg))
6695 CmdArgs.push_back("-lpthread_p");
6696 else
6697 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006698 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006699
Roman Divacky66f22762011-02-10 16:59:40 +00006700 if (Args.hasArg(options::OPT_pg)) {
6701 if (Args.hasArg(options::OPT_shared))
6702 CmdArgs.push_back("-lc");
6703 else
6704 CmdArgs.push_back("-lc_p");
6705 CmdArgs.push_back("-lgcc_p");
6706 } else {
6707 CmdArgs.push_back("-lc");
6708 CmdArgs.push_back("-lgcc");
6709 }
6710
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006711 if (Args.hasArg(options::OPT_static)) {
6712 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006713 } else if (Args.hasArg(options::OPT_pg)) {
6714 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006715 } else {
6716 CmdArgs.push_back("--as-needed");
6717 CmdArgs.push_back("-lgcc_s");
6718 CmdArgs.push_back("--no-as-needed");
6719 }
6720 }
6721
6722 if (!Args.hasArg(options::OPT_nostdlib) &&
6723 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006724 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006725 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006726 else
6727 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006728 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006729 }
6730
Alexey Samsonov7811d192014-02-20 13:57:37 +00006731 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006732
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006733 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006734 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006735 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006736}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006737
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006738void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6739 const InputInfo &Output,
6740 const InputInfoList &Inputs,
6741 const ArgList &Args,
6742 const char *LinkingOutput) const {
6743 ArgStringList CmdArgs;
6744
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006745 // GNU as needs different flags for creating the correct output format
6746 // on architectures with different ABIs or optional feature sets.
6747 switch (getToolChain().getArch()) {
6748 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006749 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006750 break;
6751 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006752 case llvm::Triple::armeb:
6753 case llvm::Triple::thumb:
6754 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006755 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006756 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006757 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006758 }
6759
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006760 case llvm::Triple::mips:
6761 case llvm::Triple::mipsel:
6762 case llvm::Triple::mips64:
6763 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006764 StringRef CPUName;
6765 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006766 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006767
6768 CmdArgs.push_back("-march");
6769 CmdArgs.push_back(CPUName.data());
6770
6771 CmdArgs.push_back("-mabi");
6772 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6773
6774 if (getToolChain().getArch() == llvm::Triple::mips ||
6775 getToolChain().getArch() == llvm::Triple::mips64)
6776 CmdArgs.push_back("-EB");
6777 else
6778 CmdArgs.push_back("-EL");
6779
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006780 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006781 break;
6782 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006783
6784 case llvm::Triple::sparc:
6785 CmdArgs.push_back("-32");
6786 addAssemblerKPIC(Args, CmdArgs);
6787 break;
6788
6789 case llvm::Triple::sparcv9:
6790 CmdArgs.push_back("-64");
6791 CmdArgs.push_back("-Av9");
6792 addAssemblerKPIC(Args, CmdArgs);
6793 break;
6794
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006795 default:
6796 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006797 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006798
6799 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6800 options::OPT_Xassembler);
6801
6802 CmdArgs.push_back("-o");
6803 CmdArgs.push_back(Output.getFilename());
6804
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006805 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006806 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006807
David Chisnallddbd68f2011-09-27 22:03:18 +00006808 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006809 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006810}
6811
6812void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6813 const InputInfo &Output,
6814 const InputInfoList &Inputs,
6815 const ArgList &Args,
6816 const char *LinkingOutput) const {
6817 const Driver &D = getToolChain().getDriver();
6818 ArgStringList CmdArgs;
6819
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006820 if (!D.SysRoot.empty())
6821 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6822
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006823 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006824 if (Args.hasArg(options::OPT_static)) {
6825 CmdArgs.push_back("-Bstatic");
6826 } else {
6827 if (Args.hasArg(options::OPT_rdynamic))
6828 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006829 if (Args.hasArg(options::OPT_shared)) {
6830 CmdArgs.push_back("-Bshareable");
6831 } else {
6832 CmdArgs.push_back("-dynamic-linker");
6833 CmdArgs.push_back("/libexec/ld.elf_so");
6834 }
6835 }
6836
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006837 // Many NetBSD architectures support more than one ABI.
6838 // Determine the correct emulation for ld.
6839 switch (getToolChain().getArch()) {
6840 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006841 CmdArgs.push_back("-m");
6842 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006843 break;
6844 case llvm::Triple::arm:
6845 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006846 CmdArgs.push_back("-m");
6847 switch (getToolChain().getTriple().getEnvironment()) {
6848 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006849 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006850 CmdArgs.push_back("armelf_nbsd_eabi");
6851 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006852 case llvm::Triple::EABIHF:
6853 case llvm::Triple::GNUEABIHF:
6854 CmdArgs.push_back("armelf_nbsd_eabihf");
6855 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006856 default:
6857 CmdArgs.push_back("armelf_nbsd");
6858 break;
6859 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006860 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006861 case llvm::Triple::armeb:
6862 case llvm::Triple::thumbeb:
6863 CmdArgs.push_back("-m");
6864 switch (getToolChain().getTriple().getEnvironment()) {
6865 case llvm::Triple::EABI:
6866 case llvm::Triple::GNUEABI:
6867 CmdArgs.push_back("armelfb_nbsd_eabi");
6868 break;
6869 case llvm::Triple::EABIHF:
6870 case llvm::Triple::GNUEABIHF:
6871 CmdArgs.push_back("armelfb_nbsd_eabihf");
6872 break;
6873 default:
6874 CmdArgs.push_back("armelfb_nbsd");
6875 break;
6876 }
6877 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006878 case llvm::Triple::mips64:
6879 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006880 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006881 CmdArgs.push_back("-m");
6882 if (getToolChain().getArch() == llvm::Triple::mips64)
6883 CmdArgs.push_back("elf32btsmip");
6884 else
6885 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006886 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006887 CmdArgs.push_back("-m");
6888 if (getToolChain().getArch() == llvm::Triple::mips64)
6889 CmdArgs.push_back("elf64btsmip");
6890 else
6891 CmdArgs.push_back("elf64ltsmip");
6892 }
6893 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00006894 case llvm::Triple::ppc:
6895 CmdArgs.push_back("-m");
6896 CmdArgs.push_back("elf32ppc_nbsd");
6897 break;
6898
6899 case llvm::Triple::ppc64:
6900 case llvm::Triple::ppc64le:
6901 CmdArgs.push_back("-m");
6902 CmdArgs.push_back("elf64ppc");
6903 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006904
6905 case llvm::Triple::sparc:
6906 CmdArgs.push_back("-m");
6907 CmdArgs.push_back("elf32_sparc");
6908 break;
6909
6910 case llvm::Triple::sparcv9:
6911 CmdArgs.push_back("-m");
6912 CmdArgs.push_back("elf64_sparc");
6913 break;
6914
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006915 default:
6916 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006917 }
6918
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006919 if (Output.isFilename()) {
6920 CmdArgs.push_back("-o");
6921 CmdArgs.push_back(Output.getFilename());
6922 } else {
6923 assert(Output.isNothing() && "Invalid output.");
6924 }
6925
6926 if (!Args.hasArg(options::OPT_nostdlib) &&
6927 !Args.hasArg(options::OPT_nostartfiles)) {
6928 if (!Args.hasArg(options::OPT_shared)) {
6929 CmdArgs.push_back(Args.MakeArgString(
6930 getToolChain().GetFilePath("crt0.o")));
6931 CmdArgs.push_back(Args.MakeArgString(
6932 getToolChain().GetFilePath("crti.o")));
6933 CmdArgs.push_back(Args.MakeArgString(
6934 getToolChain().GetFilePath("crtbegin.o")));
6935 } else {
6936 CmdArgs.push_back(Args.MakeArgString(
6937 getToolChain().GetFilePath("crti.o")));
6938 CmdArgs.push_back(Args.MakeArgString(
6939 getToolChain().GetFilePath("crtbeginS.o")));
6940 }
6941 }
6942
6943 Args.AddAllArgs(CmdArgs, options::OPT_L);
6944 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6945 Args.AddAllArgs(CmdArgs, options::OPT_e);
6946 Args.AddAllArgs(CmdArgs, options::OPT_s);
6947 Args.AddAllArgs(CmdArgs, options::OPT_t);
6948 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6949 Args.AddAllArgs(CmdArgs, options::OPT_r);
6950
6951 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6952
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006953 unsigned Major, Minor, Micro;
6954 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6955 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006956 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006957 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00006958 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006959 case llvm::Triple::arm:
6960 case llvm::Triple::armeb:
6961 case llvm::Triple::thumb:
6962 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00006963 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00006964 case llvm::Triple::ppc64:
6965 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006966 case llvm::Triple::x86:
6967 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006968 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006969 break;
6970 default:
6971 break;
6972 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006973 }
6974
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006975 if (!Args.hasArg(options::OPT_nostdlib) &&
6976 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006977 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006978 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6979 CmdArgs.push_back("-lm");
6980 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006981 if (Args.hasArg(options::OPT_pthread))
6982 CmdArgs.push_back("-lpthread");
6983 CmdArgs.push_back("-lc");
6984
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006985 if (useLibgcc) {
6986 if (Args.hasArg(options::OPT_static)) {
6987 // libgcc_eh depends on libc, so resolve as much as possible,
6988 // pull in any new requirements from libc and then get the rest
6989 // of libgcc.
6990 CmdArgs.push_back("-lgcc_eh");
6991 CmdArgs.push_back("-lc");
6992 CmdArgs.push_back("-lgcc");
6993 } else {
6994 CmdArgs.push_back("-lgcc");
6995 CmdArgs.push_back("--as-needed");
6996 CmdArgs.push_back("-lgcc_s");
6997 CmdArgs.push_back("--no-as-needed");
6998 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006999 }
7000 }
7001
7002 if (!Args.hasArg(options::OPT_nostdlib) &&
7003 !Args.hasArg(options::OPT_nostartfiles)) {
7004 if (!Args.hasArg(options::OPT_shared))
7005 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7006 "crtend.o")));
7007 else
7008 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7009 "crtendS.o")));
7010 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7011 "crtn.o")));
7012 }
7013
Alexey Samsonov7811d192014-02-20 13:57:37 +00007014 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007015
Logan Chieneb9162f2014-06-26 14:23:45 +00007016 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007017 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007018}
7019
Thomas Schwinge4e555262013-03-28 19:04:25 +00007020void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7021 const InputInfo &Output,
7022 const InputInfoList &Inputs,
7023 const ArgList &Args,
7024 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00007025 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007026 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007027
7028 // Add --32/--64 to make sure we get the format we want.
7029 // This is incomplete
7030 if (getToolChain().getArch() == llvm::Triple::x86) {
7031 CmdArgs.push_back("--32");
7032 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007033 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7034 CmdArgs.push_back("--x32");
7035 else
7036 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007037 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7038 CmdArgs.push_back("-a32");
7039 CmdArgs.push_back("-mppc");
7040 CmdArgs.push_back("-many");
7041 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7042 CmdArgs.push_back("-a64");
7043 CmdArgs.push_back("-mppc64");
7044 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007045 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7046 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007047 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007048 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007049 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007050 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7051 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007052 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007053 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007054 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7055 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007056 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007057 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007058 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7059 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007060 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007061 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7062 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007063 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7064 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007065 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007066
Tim Northover9c7e0352013-12-12 11:55:52 +00007067 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7068 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007069 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007070
7071 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007072
7073 // FIXME: remove krait check when GNU tools support krait cpu
7074 // for now replace it with -march=armv7-a to avoid a lower
7075 // march from being picked in the absence of a cpu flag.
7076 Arg *A;
7077 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7078 StringRef(A->getValue()) == "krait")
7079 CmdArgs.push_back("-march=armv7-a");
7080 else
7081 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007082 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007083 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7084 getToolChain().getArch() == llvm::Triple::mipsel ||
7085 getToolChain().getArch() == llvm::Triple::mips64 ||
7086 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007087 StringRef CPUName;
7088 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007089 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007090 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007091
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007092 CmdArgs.push_back("-march");
7093 CmdArgs.push_back(CPUName.data());
7094
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007095 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007096 CmdArgs.push_back(ABIName.data());
7097
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007098 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7099 // or -mshared (not implemented) is in effect.
7100 bool IsPicOrPie = false;
7101 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7102 options::OPT_fpic, options::OPT_fno_pic,
7103 options::OPT_fPIE, options::OPT_fno_PIE,
7104 options::OPT_fpie, options::OPT_fno_pie)) {
7105 if (A->getOption().matches(options::OPT_fPIC) ||
7106 A->getOption().matches(options::OPT_fpic) ||
7107 A->getOption().matches(options::OPT_fPIE) ||
7108 A->getOption().matches(options::OPT_fpie))
7109 IsPicOrPie = true;
7110 }
7111 if (!IsPicOrPie)
7112 CmdArgs.push_back("-mno-shared");
7113
Daniel Sanders379d44b2014-07-16 11:52:23 +00007114 // LLVM doesn't support -mplt yet and acts as if it is always given.
7115 // However, -mplt has no effect with the N64 ABI.
7116 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007117
7118 if (getToolChain().getArch() == llvm::Triple::mips ||
7119 getToolChain().getArch() == llvm::Triple::mips64)
7120 CmdArgs.push_back("-EB");
7121 else
7122 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007123
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007124 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7125 if (StringRef(A->getValue()) == "2008")
7126 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7127 }
7128
Daniel Sanders379d44b2014-07-16 11:52:23 +00007129 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7130 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7131 options::OPT_mfp64)) {
7132 A->claim();
7133 A->render(Args, CmdArgs);
7134 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7135 ABIName))
7136 CmdArgs.push_back("-mfpxx");
7137
7138 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7139 // -mno-mips16 is actually -no-mips16.
7140 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7141 options::OPT_mno_mips16)) {
7142 if (A->getOption().matches(options::OPT_mips16)) {
7143 A->claim();
7144 A->render(Args, CmdArgs);
7145 } else {
7146 A->claim();
7147 CmdArgs.push_back("-no-mips16");
7148 }
7149 }
7150
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007151 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7152 options::OPT_mno_micromips);
7153 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7154 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7155
Simon Atanasyanbd986632013-11-26 11:58:04 +00007156 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7157 // Do not use AddLastArg because not all versions of MIPS assembler
7158 // support -mmsa / -mno-msa options.
7159 if (A->getOption().matches(options::OPT_mmsa))
7160 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7161 }
7162
Daniel Sanders379d44b2014-07-16 11:52:23 +00007163 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7164 options::OPT_msoft_float);
7165
7166 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7167 options::OPT_mno_odd_spreg);
7168
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007169 NeedsKPIC = true;
7170 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7171 // Always pass an -march option, since our default of z10 is later
7172 // than the GNU assembler's default.
7173 StringRef CPUName = getSystemZTargetCPU(Args);
7174 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7175 }
7176
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007177 if (NeedsKPIC)
7178 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007179
7180 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7181 options::OPT_Xassembler);
7182
7183 CmdArgs.push_back("-o");
7184 CmdArgs.push_back(Output.getFilename());
7185
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007186 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007187 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007188
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007189 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007190 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007191
7192 // Handle the debug info splitting at object creation time if we're
7193 // creating an object.
7194 // TODO: Currently only works on linux with newer objcopy.
7195 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007196 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007197 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7198 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007199}
7200
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007201static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007202 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007203 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007204 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7205 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007206 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007207 CmdArgs.push_back("-lgcc");
7208
Logan Chien3d3373c2012-11-19 12:04:11 +00007209 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007210 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007211 CmdArgs.push_back("-lgcc");
7212 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007213 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007214 CmdArgs.push_back("--as-needed");
7215 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007216 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007217 CmdArgs.push_back("--no-as-needed");
7218 }
7219
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007220 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007221 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007222 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007223 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007224
7225 // According to Android ABI, we have to link with libdl if we are
7226 // linking with non-static libgcc.
7227 //
7228 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7229 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7230 if (isAndroid && !StaticLibgcc)
7231 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007232}
7233
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007234static std::string getLinuxDynamicLinker(const ArgList &Args,
7235 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007236 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7237 if (ToolChain.getTriple().isArch64Bit())
7238 return "/system/bin/linker64";
7239 else
7240 return "/system/bin/linker";
7241 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7242 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007243 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007244 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007245 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007246 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007247 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007248 else if (ToolChain.getArch() == llvm::Triple::arm ||
7249 ToolChain.getArch() == llvm::Triple::thumb) {
7250 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7251 return "/lib/ld-linux-armhf.so.3";
7252 else
7253 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007254 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7255 ToolChain.getArch() == llvm::Triple::thumbeb) {
7256 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7257 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7258 else
7259 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007260 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007261 ToolChain.getArch() == llvm::Triple::mipsel ||
7262 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007263 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007264 StringRef CPUName;
7265 StringRef ABIName;
7266 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7267 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7268
7269 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7270 .Case("o32", "/lib")
7271 .Case("n32", "/lib32")
7272 .Case("n64", "/lib64")
7273 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007274 StringRef LibName;
7275 if (mips::isUCLibc(Args))
7276 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7277 else
7278 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007279
7280 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007281 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7282 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007283 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7284 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7285 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007286 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007287 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7288 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7289 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007290 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007291 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7292 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007293 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7294 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007295 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7296 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7297 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007298 else
7299 return "/lib64/ld-linux-x86-64.so.2";
7300}
7301
Renato Golinc4b49242014-02-13 10:01:16 +00007302static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7303 ArgStringList &CmdArgs, const ArgList &Args) {
7304 // Make use of compiler-rt if --rtlib option is used
7305 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7306
7307 switch(RLT) {
7308 case ToolChain::RLT_CompilerRT:
7309 addClangRTLinux(TC, Args, CmdArgs);
7310 break;
7311 case ToolChain::RLT_Libgcc:
7312 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7313 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007314 }
7315}
7316
Rafael Espindola1e085772014-08-15 17:14:35 +00007317static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7318 switch (T.getArch()) {
7319 case llvm::Triple::x86:
7320 return "elf_i386";
7321 case llvm::Triple::aarch64:
7322 return "aarch64linux";
7323 case llvm::Triple::aarch64_be:
7324 return "aarch64_be_linux";
7325 case llvm::Triple::arm:
7326 case llvm::Triple::thumb:
7327 return "armelf_linux_eabi";
7328 case llvm::Triple::armeb:
7329 case llvm::Triple::thumbeb:
7330 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7331 case llvm::Triple::ppc:
7332 return "elf32ppclinux";
7333 case llvm::Triple::ppc64:
7334 return "elf64ppc";
7335 case llvm::Triple::ppc64le:
7336 return "elf64lppc";
7337 case llvm::Triple::sparc:
7338 return "elf32_sparc";
7339 case llvm::Triple::sparcv9:
7340 return "elf64_sparc";
7341 case llvm::Triple::mips:
7342 return "elf32btsmip";
7343 case llvm::Triple::mipsel:
7344 return "elf32ltsmip";
7345 case llvm::Triple::mips64:
7346 if (mips::hasMipsAbiArg(Args, "n32"))
7347 return "elf32btsmipn32";
7348 return "elf64btsmip";
7349 case llvm::Triple::mips64el:
7350 if (mips::hasMipsAbiArg(Args, "n32"))
7351 return "elf32ltsmipn32";
7352 return "elf64ltsmip";
7353 case llvm::Triple::systemz:
7354 return "elf64_s390";
7355 case llvm::Triple::x86_64:
7356 if (T.getEnvironment() == llvm::Triple::GNUX32)
7357 return "elf32_x86_64";
7358 return "elf_x86_64";
7359 default:
7360 llvm_unreachable("Unexpected arch");
7361 }
7362}
7363
Thomas Schwinge4e555262013-03-28 19:04:25 +00007364void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7365 const InputInfo &Output,
7366 const InputInfoList &Inputs,
7367 const ArgList &Args,
7368 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007369 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007370 static_cast<const toolchains::Linux&>(getToolChain());
7371 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007372 const bool isAndroid =
7373 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007374 const bool IsPIE =
7375 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007376 !Args.hasArg(options::OPT_static) &&
7377 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7378 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007379 // Cannot use isPIEDefault here since otherwise
7380 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007381 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007382
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007383 ArgStringList CmdArgs;
7384
Rafael Espindolad1002f62010-11-15 18:28:16 +00007385 // Silence warning for "clang -g foo.o -o foo"
7386 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007387 // and "clang -emit-llvm foo.o -o foo"
7388 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007389 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007390 // handled somewhere else.
7391 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007392
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007393 if (!D.SysRoot.empty())
7394 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007395
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007396 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007397 CmdArgs.push_back("-pie");
7398
Rafael Espindola1c76c592010-11-07 22:57:16 +00007399 if (Args.hasArg(options::OPT_rdynamic))
7400 CmdArgs.push_back("-export-dynamic");
7401
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007402 if (Args.hasArg(options::OPT_s))
7403 CmdArgs.push_back("-s");
7404
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007405 for (const auto &Opt : ToolChain.ExtraOpts)
7406 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007407
7408 if (!Args.hasArg(options::OPT_static)) {
7409 CmdArgs.push_back("--eh-frame-hdr");
7410 }
7411
7412 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007413 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007414
7415 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007416 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007417 ToolChain.getArch() == llvm::Triple::armeb ||
7418 ToolChain.getArch() == llvm::Triple::thumb ||
7419 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007420 CmdArgs.push_back("-Bstatic");
7421 else
7422 CmdArgs.push_back("-static");
7423 } else if (Args.hasArg(options::OPT_shared)) {
7424 CmdArgs.push_back("-shared");
7425 }
7426
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007427 if (ToolChain.getArch() == llvm::Triple::arm ||
7428 ToolChain.getArch() == llvm::Triple::armeb ||
7429 ToolChain.getArch() == llvm::Triple::thumb ||
7430 ToolChain.getArch() == llvm::Triple::thumbeb ||
7431 (!Args.hasArg(options::OPT_static) &&
7432 !Args.hasArg(options::OPT_shared))) {
7433 CmdArgs.push_back("-dynamic-linker");
7434 CmdArgs.push_back(Args.MakeArgString(
7435 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7436 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007437
7438 CmdArgs.push_back("-o");
7439 CmdArgs.push_back(Output.getFilename());
7440
Rafael Espindola81937ec2010-12-01 01:52:43 +00007441 if (!Args.hasArg(options::OPT_nostdlib) &&
7442 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007443 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007444 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007445 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007446 if (Args.hasArg(options::OPT_pg))
7447 crt1 = "gcrt1.o";
7448 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007449 crt1 = "Scrt1.o";
7450 else
7451 crt1 = "crt1.o";
7452 }
7453 if (crt1)
7454 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007455
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007456 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7457 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007458
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007459 const char *crtbegin;
7460 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007461 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007462 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007463 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007464 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007465 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007466 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007467 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007468 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007469
7470 // Add crtfastmath.o if available and fast math is enabled.
7471 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007472 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007473
7474 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007475 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007476
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007477 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007478
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007479 for (const auto &Path : Paths)
7480 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007481
Alp Tokerce365ca2013-12-02 12:43:03 +00007482 if (D.IsUsingLTO(Args))
7483 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007484
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007485 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7486 CmdArgs.push_back("--no-demangle");
7487
Alexey Samsonov52550342014-09-15 19:58:40 +00007488 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007489 AddLinkerInputs(ToolChain, Inputs, 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 Samsonov52550342014-09-15 19:58:40 +00007511 if (NeedsSanitizerDeps)
7512 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7513
Alexey Bataev186b28a2014-03-06 05:43:53 +00007514 LibOpenMP UsedOpenMPLib = LibUnknown;
7515 if (Args.hasArg(options::OPT_fopenmp)) {
7516 UsedOpenMPLib = LibGOMP;
7517 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7518 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7519 .Case("libgomp", LibGOMP)
7520 .Case("libiomp5", LibIOMP5)
7521 .Default(LibUnknown);
7522 if (UsedOpenMPLib == LibUnknown)
7523 D.Diag(diag::err_drv_unsupported_option_argument)
7524 << A->getOption().getName() << A->getValue();
7525 }
7526 switch (UsedOpenMPLib) {
7527 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007528 CmdArgs.push_back("-lgomp");
7529
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007530 // FIXME: Exclude this for platforms with libgomp that don't require
7531 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007532 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007533 break;
7534 case LibIOMP5:
7535 CmdArgs.push_back("-liomp5");
7536 break;
7537 case LibUnknown:
7538 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007539 }
Renato Golinc4b49242014-02-13 10:01:16 +00007540 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007541
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007542 if ((Args.hasArg(options::OPT_pthread) ||
7543 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7544 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007545 CmdArgs.push_back("-lpthread");
7546
7547 CmdArgs.push_back("-lc");
7548
7549 if (Args.hasArg(options::OPT_static))
7550 CmdArgs.push_back("--end-group");
7551 else
Renato Golinc4b49242014-02-13 10:01:16 +00007552 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007553 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007554
Rafael Espindola81937ec2010-12-01 01:52:43 +00007555 if (!Args.hasArg(options::OPT_nostartfiles)) {
7556 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007557 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007558 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007559 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007560 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007561 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007562 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007563
Rafael Espindola81937ec2010-12-01 01:52:43 +00007564 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007565 if (!isAndroid)
7566 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007567 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007568 }
7569
David Blaikiec11bf802014-09-04 16:04:28 +00007570 C.addCommand(
7571 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007572}
7573
Chris Lattner3e2ee142010-07-07 16:01:42 +00007574void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007575 const InputInfo &Output,
7576 const InputInfoList &Inputs,
7577 const ArgList &Args,
7578 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007579 ArgStringList CmdArgs;
7580
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007581 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007582
7583 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007584 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007586 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007587 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007588
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007589 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007590 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007591}
7592
7593void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007594 const InputInfo &Output,
7595 const InputInfoList &Inputs,
7596 const ArgList &Args,
7597 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007598 const Driver &D = getToolChain().getDriver();
7599 ArgStringList CmdArgs;
7600
Daniel Dunbarb440f562010-08-02 02:38:21 +00007601 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007602 CmdArgs.push_back("-o");
7603 CmdArgs.push_back(Output.getFilename());
7604 } else {
7605 assert(Output.isNothing() && "Invalid output.");
7606 }
7607
7608 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007609 !Args.hasArg(options::OPT_nostartfiles)) {
7610 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7611 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7612 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7613 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7614 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007615
7616 Args.AddAllArgs(CmdArgs, options::OPT_L);
7617 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7618 Args.AddAllArgs(CmdArgs, options::OPT_e);
7619
Daniel Dunbar54423b22010-09-17 00:24:54 +00007620 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007621
Alexey Samsonov7811d192014-02-20 13:57:37 +00007622 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007623
Chris Lattner3e2ee142010-07-07 16:01:42 +00007624 if (!Args.hasArg(options::OPT_nostdlib) &&
7625 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007626 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007627 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007628 CmdArgs.push_back("-lm");
7629 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007630 }
7631
7632 if (!Args.hasArg(options::OPT_nostdlib) &&
7633 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007634 if (Args.hasArg(options::OPT_pthread))
7635 CmdArgs.push_back("-lpthread");
7636 CmdArgs.push_back("-lc");
7637 CmdArgs.push_back("-lCompilerRT-Generic");
7638 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7639 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007640 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007641 }
7642
Logan Chieneb9162f2014-06-26 14:23:45 +00007643 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007644 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007645}
7646
Daniel Dunbarcc912342009-05-02 18:28:39 +00007647/// DragonFly Tools
7648
7649// For now, DragonFly Assemble does just about the same as for
7650// FreeBSD, but this may change soon.
7651void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007652 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007653 const InputInfoList &Inputs,
7654 const ArgList &Args,
7655 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007656 ArgStringList CmdArgs;
7657
7658 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7659 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007660 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007661 CmdArgs.push_back("--32");
7662
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007663 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007664
7665 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007666 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007667
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007668 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007669 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007670
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007671 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007672 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007673}
7674
7675void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007676 const InputInfo &Output,
7677 const InputInfoList &Inputs,
7678 const ArgList &Args,
7679 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007680 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007681 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007682 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007683
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007684 if (!D.SysRoot.empty())
7685 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7686
John McCall65b8da02013-04-11 22:55:55 +00007687 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007688 if (Args.hasArg(options::OPT_static)) {
7689 CmdArgs.push_back("-Bstatic");
7690 } else {
John McCall65b8da02013-04-11 22:55:55 +00007691 if (Args.hasArg(options::OPT_rdynamic))
7692 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007693 if (Args.hasArg(options::OPT_shared))
7694 CmdArgs.push_back("-Bshareable");
7695 else {
7696 CmdArgs.push_back("-dynamic-linker");
7697 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7698 }
John McCall65b8da02013-04-11 22:55:55 +00007699 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007700 }
7701
7702 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7703 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007704 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007705 CmdArgs.push_back("-m");
7706 CmdArgs.push_back("elf_i386");
7707 }
7708
Daniel Dunbarb440f562010-08-02 02:38:21 +00007709 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007710 CmdArgs.push_back("-o");
7711 CmdArgs.push_back(Output.getFilename());
7712 } else {
7713 assert(Output.isNothing() && "Invalid output.");
7714 }
7715
7716 if (!Args.hasArg(options::OPT_nostdlib) &&
7717 !Args.hasArg(options::OPT_nostartfiles)) {
7718 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007719 if (Args.hasArg(options::OPT_pg))
7720 CmdArgs.push_back(Args.MakeArgString(
7721 getToolChain().GetFilePath("gcrt1.o")));
7722 else {
7723 if (Args.hasArg(options::OPT_pie))
7724 CmdArgs.push_back(Args.MakeArgString(
7725 getToolChain().GetFilePath("Scrt1.o")));
7726 else
7727 CmdArgs.push_back(Args.MakeArgString(
7728 getToolChain().GetFilePath("crt1.o")));
7729 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007730 }
John McCall65b8da02013-04-11 22:55:55 +00007731 CmdArgs.push_back(Args.MakeArgString(
7732 getToolChain().GetFilePath("crti.o")));
7733 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7734 CmdArgs.push_back(Args.MakeArgString(
7735 getToolChain().GetFilePath("crtbeginS.o")));
7736 else
7737 CmdArgs.push_back(Args.MakeArgString(
7738 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007739 }
7740
7741 Args.AddAllArgs(CmdArgs, options::OPT_L);
7742 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7743 Args.AddAllArgs(CmdArgs, options::OPT_e);
7744
Daniel Dunbar54423b22010-09-17 00:24:54 +00007745 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007746
7747 if (!Args.hasArg(options::OPT_nostdlib) &&
7748 !Args.hasArg(options::OPT_nodefaultlibs)) {
7749 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7750 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007751 if (UseGCC47)
7752 CmdArgs.push_back("-L/usr/lib/gcc47");
7753 else
7754 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007755
7756 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007757 if (UseGCC47) {
7758 CmdArgs.push_back("-rpath");
7759 CmdArgs.push_back("/usr/lib/gcc47");
7760 } else {
7761 CmdArgs.push_back("-rpath");
7762 CmdArgs.push_back("/usr/lib/gcc44");
7763 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007764 }
7765
Hans Wennborg70850d82013-07-18 20:29:38 +00007766 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007767 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007768 CmdArgs.push_back("-lm");
7769 }
7770
Daniel Dunbarcc912342009-05-02 18:28:39 +00007771 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007772 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007773
7774 if (!Args.hasArg(options::OPT_nolibc)) {
7775 CmdArgs.push_back("-lc");
7776 }
7777
John McCall65b8da02013-04-11 22:55:55 +00007778 if (UseGCC47) {
7779 if (Args.hasArg(options::OPT_static) ||
7780 Args.hasArg(options::OPT_static_libgcc)) {
7781 CmdArgs.push_back("-lgcc");
7782 CmdArgs.push_back("-lgcc_eh");
7783 } else {
7784 if (Args.hasArg(options::OPT_shared_libgcc)) {
7785 CmdArgs.push_back("-lgcc_pic");
7786 if (!Args.hasArg(options::OPT_shared))
7787 CmdArgs.push_back("-lgcc");
7788 } else {
7789 CmdArgs.push_back("-lgcc");
7790 CmdArgs.push_back("--as-needed");
7791 CmdArgs.push_back("-lgcc_pic");
7792 CmdArgs.push_back("--no-as-needed");
7793 }
7794 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007795 } else {
John McCall65b8da02013-04-11 22:55:55 +00007796 if (Args.hasArg(options::OPT_shared)) {
7797 CmdArgs.push_back("-lgcc_pic");
7798 } else {
7799 CmdArgs.push_back("-lgcc");
7800 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007801 }
7802 }
7803
7804 if (!Args.hasArg(options::OPT_nostdlib) &&
7805 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007806 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007807 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007808 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007809 else
7810 CmdArgs.push_back(Args.MakeArgString(
7811 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007812 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007813 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007814 }
7815
Alexey Samsonov7811d192014-02-20 13:57:37 +00007816 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007817
Logan Chieneb9162f2014-06-26 14:23:45 +00007818 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007819 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007820}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007821
Alexey Samsonov6424e022014-05-12 20:20:20 +00007822static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7823 ArgStringList &CmdArgs,
Craig Topperbf3e3272014-08-30 16:55:52 +00007824 StringRef RTName) {
Alexey Samsonov6424e022014-05-12 20:20:20 +00007825 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7826 llvm::sys::path::append(LibSanitizer,
7827 Twine("clang_rt.") + RTName + ".lib");
7828 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7829}
7830
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007831void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7832 const InputInfo &Output,
7833 const InputInfoList &Inputs,
7834 const ArgList &Args,
7835 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007836 ArgStringList CmdArgs;
7837
7838 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007839 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7840 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007841 } else {
7842 assert(Output.isNothing() && "Invalid output.");
7843 }
7844
7845 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007846 !Args.hasArg(options::OPT_nostartfiles) &&
7847 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007848 CmdArgs.push_back("-defaultlib:libcmt");
7849 }
7850
7851 CmdArgs.push_back("-nologo");
7852
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007853 if (Args.hasArg(options::OPT_g_Group)) {
7854 CmdArgs.push_back("-debug");
7855 }
7856
Hans Wennborgf1a74252013-09-10 20:18:04 +00007857 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7858
7859 if (DLL) {
7860 CmdArgs.push_back(Args.MakeArgString("-dll"));
7861
7862 SmallString<128> ImplibName(Output.getFilename());
7863 llvm::sys::path::replace_extension(ImplibName, "lib");
7864 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7865 ImplibName.str()));
7866 }
7867
Peter Collingbourne32701642013-11-01 18:16:25 +00007868 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007869 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007870 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007871 // FIXME: Handle 64-bit.
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00007872 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
7873 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_dynamic-i386");
Timur Iskhodzhanov92c06012014-09-12 13:21:02 +00007874 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7875 "asan_dynamic_runtime_thunk-i386");
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00007876 // Make sure the dynamic runtime thunk is not optimized out at link time
7877 // to ensure proper SEH handling.
7878 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00007879 } else if (DLL) {
Alexey Samsonov6424e022014-05-12 20:20:20 +00007880 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7881 "asan_dll_thunk-i386");
7882 } else {
7883 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7884 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7885 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007886 }
7887
Hans Wennborg2e274592013-08-13 23:38:57 +00007888 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007889
Reid Kleckner337188f2014-09-16 19:22:00 +00007890 // Add filenames, libraries, and other linker inputs.
7891 for (const auto &Input : Inputs) {
7892 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007893 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00007894 continue;
7895 }
7896
7897 const Arg &A = Input.getInputArg();
7898
7899 // Render -l options differently for the MSVC linker.
7900 if (A.getOption().matches(options::OPT_l)) {
7901 StringRef Lib = A.getValue();
7902 const char *LinkLibArg;
7903 if (Lib.endswith(".lib"))
7904 LinkLibArg = Args.MakeArgString(Lib);
7905 else
7906 LinkLibArg = Args.MakeArgString(Lib + ".lib");
7907 CmdArgs.push_back(LinkLibArg);
7908 continue;
7909 }
7910
7911 // Otherwise, this is some other kind of linker input option like -Wl, -z,
7912 // or -L. Render it, even if MSVC doesn't understand it.
7913 A.renderAsInput(Args, CmdArgs);
7914 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007915
7916 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007917 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
David Blaikiec11bf802014-09-04 16:04:28 +00007918 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007919}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007920
7921void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7922 const InputInfo &Output,
7923 const InputInfoList &Inputs,
7924 const ArgList &Args,
7925 const char *LinkingOutput) const {
7926 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7927}
7928
Hans Wennborg188382e2013-09-20 18:16:35 +00007929// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7930// If one cannot be found, return FallbackName.
7931// We do this special search to prevent clang-cl from falling back onto itself
7932// if it's available as cl.exe on the path.
7933static std::string FindFallback(const char *FallbackName,
7934 const char *ClangProgramPath) {
7935 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7936 if (!OptPath.hasValue())
7937 return FallbackName;
7938
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007939 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Hans Wennborg188382e2013-09-20 18:16:35 +00007940 SmallVector<StringRef, 8> PathSegments;
Ehsan Akhgaride8c93b2014-06-30 19:56:37 +00007941 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
Hans Wennborg188382e2013-09-20 18:16:35 +00007942
7943 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
Craig Topperbf3e3272014-08-30 16:55:52 +00007944 StringRef PathSegment = PathSegments[i];
Hans Wennborg188382e2013-09-20 18:16:35 +00007945 if (PathSegment.empty())
7946 continue;
7947
7948 SmallString<128> FilePath(PathSegment);
7949 llvm::sys::path::append(FilePath, FallbackName);
7950 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7951 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7952 return FilePath.str();
7953 }
7954
7955 return FallbackName;
7956}
7957
David Blaikiec11bf802014-09-04 16:04:28 +00007958std::unique_ptr<Command> visualstudio::Compile::GetCommand(
7959 Compilation &C, const JobAction &JA, const InputInfo &Output,
7960 const InputInfoList &Inputs, const ArgList &Args,
7961 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00007962 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007963 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007964 CmdArgs.push_back("/c"); // Compile only.
7965 CmdArgs.push_back("/W0"); // No warnings.
7966
7967 // The goal is to be able to invoke this tool correctly based on
7968 // any flag accepted by clang-cl.
7969
7970 // These are spelled the same way in clang and cl.exe,.
7971 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7972 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007973
7974 // Optimization level.
7975 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7976 if (A->getOption().getID() == options::OPT_O0) {
7977 CmdArgs.push_back("/Od");
7978 } else {
7979 StringRef OptLevel = A->getValue();
7980 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7981 A->render(Args, CmdArgs);
7982 else if (OptLevel == "3")
7983 CmdArgs.push_back("/Ox");
7984 }
7985 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007986
7987 // Flags for which clang-cl have an alias.
7988 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7989
David Majnemerf6072342014-07-01 22:24:56 +00007990 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7991 /*default=*/false))
7992 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007993 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7994 options::OPT_fno_function_sections))
7995 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7996 ? "/Gy"
7997 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007998 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7999 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008000 CmdArgs.push_back(
8001 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008002 if (Args.hasArg(options::OPT_fsyntax_only))
8003 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008004 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8005 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008006
Hans Wennborg260ff402013-09-27 17:54:18 +00008007 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008008 for (const auto &Include : Includes)
8009 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008010
Hans Wennborg87cfa712013-09-19 20:32:16 +00008011 // Flags that can simply be passed through.
8012 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8013 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008014 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008015
8016 // The order of these flags is relevant, so pick the last one.
8017 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8018 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8019 A->render(Args, CmdArgs);
8020
8021
8022 // Input filename.
8023 assert(Inputs.size() == 1);
8024 const InputInfo &II = Inputs[0];
8025 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8026 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8027 if (II.isFilename())
8028 CmdArgs.push_back(II.getFilename());
8029 else
8030 II.getInputArg().renderAsInput(Args, CmdArgs);
8031
8032 // Output filename.
8033 assert(Output.getType() == types::TY_Object);
8034 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8035 Output.getFilename());
8036 CmdArgs.push_back(Fo);
8037
Hans Wennborg188382e2013-09-20 18:16:35 +00008038 const Driver &D = getToolChain().getDriver();
8039 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008040 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8041 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008042}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008043
8044
8045/// XCore Tools
8046// We pass assemble and link construction to the xcc tool.
8047
8048void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8049 const InputInfo &Output,
8050 const InputInfoList &Inputs,
8051 const ArgList &Args,
8052 const char *LinkingOutput) const {
8053 ArgStringList CmdArgs;
8054
8055 CmdArgs.push_back("-o");
8056 CmdArgs.push_back(Output.getFilename());
8057
8058 CmdArgs.push_back("-c");
8059
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008060 if (Args.hasArg(options::OPT_v))
8061 CmdArgs.push_back("-v");
8062
Robert Lytton894d25c2014-05-02 09:33:25 +00008063 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8064 if (!A->getOption().matches(options::OPT_g0))
8065 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008066
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008067 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8068 false))
8069 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008070
8071 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8072 options::OPT_Xassembler);
8073
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008074 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008075 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008076
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008077 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008078 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008079}
8080
8081void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8082 const InputInfo &Output,
8083 const InputInfoList &Inputs,
8084 const ArgList &Args,
8085 const char *LinkingOutput) const {
8086 ArgStringList CmdArgs;
8087
8088 if (Output.isFilename()) {
8089 CmdArgs.push_back("-o");
8090 CmdArgs.push_back(Output.getFilename());
8091 } else {
8092 assert(Output.isNothing() && "Invalid output.");
8093 }
8094
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008095 if (Args.hasArg(options::OPT_v))
8096 CmdArgs.push_back("-v");
8097
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008098 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
8099 if (EH.ShouldUseExceptionTables)
8100 CmdArgs.push_back("-fexceptions");
8101
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008102 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8103
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008104 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008105 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008106}