blob: 50ad7e65eb36bd6e3d3605e04bbd844f09a9dd1f [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"
Chandler Carruth3a022472012-12-04 09:13:33 +000032#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000033#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000034#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000035#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000036#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000038#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000039#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000040#include <sys/stat.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) {
65 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000066 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000067 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000068 << A->getAsString(Args) << "-E";
69}
70
Daniel Dunbar4eadb602009-09-10 01:21:12 +000071/// CheckCodeGenerationOptions - Perform some validation of code generation
72/// arguments that is shared with gcc.
73static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
74 // In gcc, only ARM checks this, but it seems reasonable to check universally.
75 if (Args.hasArg(options::OPT_static))
76 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
77 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000078 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000079 << A->getAsString(Args) << "-static";
80}
81
Chris Lattnerbf2803f2010-03-29 17:55:58 +000082// Quote target names for inclusion in GNU Make dependency files.
83// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000084static void QuoteTarget(StringRef Target,
85 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000086 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
87 switch (Target[i]) {
88 case ' ':
89 case '\t':
90 // Escape the preceding backslashes
91 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
92 Res.push_back('\\');
93
94 // Escape the space/tab
95 Res.push_back('\\');
96 break;
97 case '$':
98 Res.push_back('$');
99 break;
100 case '#':
101 Res.push_back('\\');
102 break;
103 default:
104 break;
105 }
106
107 Res.push_back(Target[i]);
108 }
109}
110
Bill Wendlingc0938f32012-03-12 22:10:06 +0000111static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000112 ArgStringList &CmdArgs,
113 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000114 const char *EnvVar) {
115 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000116 bool CombinedArg = false;
117
Bill Wendling281ca292012-03-12 21:22:35 +0000118 if (!DirList)
119 return; // Nothing to do.
120
Chad Rosier616e8a52012-10-30 21:42:09 +0000121 StringRef Name(ArgName);
122 if (Name.equals("-I") || Name.equals("-L"))
123 CombinedArg = true;
124
Bill Wendling281ca292012-03-12 21:22:35 +0000125 StringRef Dirs(DirList);
126 if (Dirs.empty()) // Empty string should not add '.'.
127 return;
128
129 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000130 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000131 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000132 if (CombinedArg) {
133 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
134 } else {
135 CmdArgs.push_back(ArgName);
136 CmdArgs.push_back(".");
137 }
Bill Wendling281ca292012-03-12 21:22:35 +0000138 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000139 if (CombinedArg) {
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
141 } else {
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
144 }
Bill Wendling281ca292012-03-12 21:22:35 +0000145 }
Nico Weber89355782012-03-19 15:00:03 +0000146 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000147 }
148
149 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000150 if (CombinedArg) {
151 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
152 } else {
153 CmdArgs.push_back(ArgName);
154 CmdArgs.push_back(".");
155 }
Bill Wendling281ca292012-03-12 21:22:35 +0000156 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000157 if (CombinedArg) {
158 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
159 } else {
160 CmdArgs.push_back(ArgName);
161 CmdArgs.push_back(Args.MakeArgString(Dirs));
162 }
Bill Wendling281ca292012-03-12 21:22:35 +0000163 }
164}
165
Daniel Dunbar54423b22010-09-17 00:24:54 +0000166static void AddLinkerInputs(const ToolChain &TC,
167 const InputInfoList &Inputs, const ArgList &Args,
168 ArgStringList &CmdArgs) {
169 const Driver &D = TC.getDriver();
170
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000171 // Add extra linker input arguments which are not treated as inputs
172 // (constructed via -Xarch_).
173 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
174
Daniel Dunbar54423b22010-09-17 00:24:54 +0000175 for (InputInfoList::const_iterator
176 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
177 const InputInfo &II = *it;
178
179 if (!TC.HasNativeLLVMSupport()) {
180 // Don't try to pass LLVM inputs unless we have native support.
181 if (II.getType() == types::TY_LLVM_IR ||
182 II.getType() == types::TY_LTO_IR ||
183 II.getType() == types::TY_LLVM_BC ||
184 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000185 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000186 << TC.getTripleString();
187 }
188
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000189 // Add filenames immediately.
190 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000191 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000192 continue;
193 }
194
195 // Otherwise, this is a linker input argument.
196 const Arg &A = II.getInputArg();
197
198 // Handle reserved library options.
199 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000200 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000201 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
202 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000203 } else
204 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206
207 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000208 // and only supported on native toolchains.
209 if (!TC.isCrossCompiling())
210 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211}
212
John McCall31168b02011-06-15 23:02:42 +0000213/// \brief Determine whether Objective-C automated reference counting is
214/// enabled.
215static bool isObjCAutoRefCount(const ArgList &Args) {
216 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
217}
218
Ted Kremeneke65b0862012-03-06 20:05:56 +0000219/// \brief Determine whether we are linking the ObjC runtime.
220static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000221 if (isObjCAutoRefCount(Args)) {
222 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000223 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000224 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000225 return Args.hasArg(options::OPT_fobjc_link_runtime);
226}
227
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000228static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000229 // Don't forward inputs from the original command line. They are added from
230 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000231 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000232 !O.hasFlag(options::DriverOption) &&
233 !O.hasFlag(options::LinkerInput);
234}
235
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000236void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000237 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000238 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000239 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000240 ArgStringList &CmdArgs,
241 const InputInfo &Output,
242 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000243 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000244
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000245 CheckPreprocessingOptions(D, Args);
246
247 Args.AddLastArg(CmdArgs, options::OPT_C);
248 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000249
250 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000251 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 (A = Args.getLastArg(options::OPT_MD)) ||
253 (A = Args.getLastArg(options::OPT_MMD))) {
254 // Determine the output location.
255 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000256 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000257 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000258 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000259 } else if (Output.getType() == types::TY_Dependencies) {
260 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 } else if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 DepFile = "-";
264 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000265 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 }
268 CmdArgs.push_back("-dependency-file");
269 CmdArgs.push_back(DepFile);
270
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000271 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
273 const char *DepTarget;
274
275 // If user provided -o, that is the dependency target, except
276 // when we are only generating a dependency file.
277 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
278 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000279 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000280 } else {
281 // Otherwise derive from the base input.
282 //
283 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000285 llvm::sys::path::replace_extension(P, "o");
286 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 }
288
289 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000290 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 QuoteTarget(DepTarget, Quoted);
292 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 }
294
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000295 if (A->getOption().matches(options::OPT_M) ||
296 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 CmdArgs.push_back("-sys-header-deps");
298 }
299
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000300 if (Args.hasArg(options::OPT_MG)) {
301 if (!A || A->getOption().matches(options::OPT_MD) ||
302 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000303 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000304 CmdArgs.push_back("-MG");
305 }
306
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000308
309 // Convert all -MQ <target> args to -MT <quoted target>
310 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
311 options::OPT_MQ),
312 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000313 const Arg *A = *it;
314 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000315
Daniel Dunbara442fd52010-06-11 22:00:13 +0000316 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000317 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000318 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000319 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 CmdArgs.push_back(Args.MakeArgString(Quoted));
321
322 // -MT flag - no change
323 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000324 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 }
326 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327
Douglas Gregor111af7d2009-04-18 00:34:01 +0000328 // Add -i* options, and automatically translate to
329 // -include-pch/-include-pth for transparent PCH support. It's
330 // wonky, but we include looking for .gch so we can support seamless
331 // replacement into a build system already set up to be generating
332 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000333 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000334 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
335 ie = Args.filtered_end(); it != ie; ++it) {
336 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000337
338 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000339 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
340 RenderedImplicitInclude = true;
341
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000342 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000343 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000344
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000345 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000346 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000347 SmallString<128> P(A->getValue());
348 // We want the files to have a name like foo.h.pch. Add a dummy extension
349 // so that replace_extension does the right thing.
350 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000352 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000353 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356
Douglas Gregor111af7d2009-04-18 00:34:01 +0000357 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000358 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000359 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000361 }
362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000364 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000365 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000366 FoundPCH = UsePCH;
367 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 }
370
371 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000372 if (IsFirstImplicitInclude) {
373 A->claim();
374 if (UsePCH)
375 CmdArgs.push_back("-include-pch");
376 else
377 CmdArgs.push_back("-include-pth");
378 CmdArgs.push_back(Args.MakeArgString(P.str()));
379 continue;
380 } else {
381 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000382 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000383 << P.str() << A->getAsString(Args);
384 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000385 }
386 }
387
388 // Not translated, render as usual.
389 A->claim();
390 A->render(Args, CmdArgs);
391 }
392
393 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000394 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
395 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000396
397 // Add -Wp, and -Xassembler if using the preprocessor.
398
399 // FIXME: There is a very unfortunate problem here, some troubled
400 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
401 // really support that we would have to parse and then translate
402 // those options. :(
403 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
404 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000405
406 // -I- is a deprecated GCC feature, reject it.
407 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000408 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000409
410 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
411 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000412 StringRef sysroot = C.getSysRoot();
413 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000414 if (!Args.hasArg(options::OPT_isysroot)) {
415 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000416 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417 }
418 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000419
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000420 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000421 // FIXME: We should probably sink the logic for handling these from the
422 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000423 // CPATH - included following the user specified includes (but prior to
424 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000426 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000434
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000435 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000436 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000437 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000438
439 // Add system include arguments.
440 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000441}
442
Amara Emerson703da2e2013-10-31 09:32:33 +0000443/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
444//
445// FIXME: tblgen this.
446static std::string getAArch64TargetCPU(const ArgList &Args,
447 const llvm::Triple &Triple) {
448 // FIXME: Warn on inconsistent use of -mcpu and -march.
449
450 // If we have -mcpu=, use that.
451 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
452 StringRef MCPU = A->getValue();
453 // Handle -mcpu=native.
454 if (MCPU == "native")
455 return llvm::sys::getHostCPUName();
456 else
457 return MCPU;
458 }
459
460 return "generic";
461}
462
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000463// FIXME: Move to target hook.
464static bool isSignedCharDefault(const llvm::Triple &Triple) {
465 switch (Triple.getArch()) {
466 default:
467 return true;
468
Tim Northover9bb857a2013-01-31 12:13:10 +0000469 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000470 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000471 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000472 case llvm::Triple::ppc:
473 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000474 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000475 return true;
476 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000477
Bill Schmidt778d3872013-07-26 01:36:11 +0000478 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000479 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000480 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000481 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000482 }
483}
484
Robert Lytton0e076492013-08-13 09:43:10 +0000485static bool isNoCommonDefault(const llvm::Triple &Triple) {
486 switch (Triple.getArch()) {
487 default:
488 return false;
489
490 case llvm::Triple::xcore:
491 return true;
492 }
493}
494
Chad Rosiercfbfc582012-04-04 20:51:35 +0000495// Handle -mfpu=.
496//
497// FIXME: Centralize feature selection, defaulting shouldn't be also in the
498// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000499static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
500 const ArgList &Args,
501 std::vector<const char *> &Features) {
502 StringRef FPU = A->getValue();
503 if (FPU == "fp-armv8") {
504 Features.push_back("+fp-armv8");
505 } else if (FPU == "neon-fp-armv8") {
506 Features.push_back("+fp-armv8");
507 Features.push_back("+neon");
508 } else if (FPU == "crypto-neon-fp-armv8") {
509 Features.push_back("+fp-armv8");
510 Features.push_back("+neon");
511 Features.push_back("+crypto");
512 } else if (FPU == "neon") {
513 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000514 } else
515 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
516}
517
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000518// Handle -mhwdiv=.
519static void getARMHWDivFeatures(const Driver &D, const Arg *A,
520 const ArgList &Args,
521 std::vector<const char *> &Features) {
522 StringRef HWDiv = A->getValue();
523 if (HWDiv == "arm") {
524 Features.push_back("+hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else if (HWDiv == "thumb") {
527 Features.push_back("-hwdiv-arm");
528 Features.push_back("+hwdiv");
529 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
530 Features.push_back("+hwdiv-arm");
531 Features.push_back("+hwdiv");
532 } else if (HWDiv == "none") {
533 Features.push_back("-hwdiv-arm");
534 Features.push_back("-hwdiv");
535 } else
536 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
537}
538
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539// Handle -mfpu=.
540//
541// FIXME: Centralize feature selection, defaulting shouldn't be also in the
542// frontend target.
543static void getARMFPUFeatures(const Driver &D, const Arg *A,
544 const ArgList &Args,
545 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000546 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000547
548 // Set the target features based on the FPU.
549 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
550 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000551 Features.push_back("-vfp2");
552 Features.push_back("-vfp3");
553 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000554 } else if (FPU == "vfp") {
555 Features.push_back("+vfp2");
556 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000557 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000558 Features.push_back("+vfp3");
559 Features.push_back("+d16");
560 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000561 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000562 Features.push_back("+vfp3");
563 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000564 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
565 Features.push_back("+vfp4");
566 Features.push_back("+d16");
567 Features.push_back("-neon");
568 } else if (FPU == "vfp4" || FPU == "vfpv4") {
569 Features.push_back("+vfp4");
570 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000571 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
572 Features.push_back("+vfp4");
573 Features.push_back("+d16");
574 Features.push_back("+fp-only-sp");
575 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000576 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000577 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000578 Features.push_back("-neon");
579 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000580 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000581 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000582 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000583 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000584 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000585 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000586 Features.push_back("+neon");
587 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000588 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000589 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000590 } else if (FPU == "none") {
591 Features.push_back("-vfp2");
592 Features.push_back("-vfp3");
593 Features.push_back("-vfp4");
594 Features.push_back("-fp-armv8");
595 Features.push_back("-crypto");
596 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000597 } else
598 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
599}
600
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000601// Select the float ABI as determined by -msoft-float, -mhard-float, and
602// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000603StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
604 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000605 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000606 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
607 options::OPT_mhard_float,
608 options::OPT_mfloat_abi_EQ)) {
609 if (A->getOption().matches(options::OPT_msoft_float))
610 FloatABI = "soft";
611 else if (A->getOption().matches(options::OPT_mhard_float))
612 FloatABI = "hard";
613 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000614 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000615 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000616 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 << A->getAsString(Args);
618 FloatABI = "soft";
619 }
620 }
621 }
622
623 // If unspecified, choose the default based on the platform.
624 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000625 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000626 case llvm::Triple::Darwin:
627 case llvm::Triple::MacOSX:
628 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000629 // Darwin defaults to "softfp" for v6 and v7.
630 //
631 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000632 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000633 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000634 if (StringRef(ArchName).startswith("v6") ||
635 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000636 FloatABI = "softfp";
637 else
638 FloatABI = "soft";
639 break;
640 }
641
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000642 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000643 switch(Triple.getEnvironment()) {
644 case llvm::Triple::GNUEABIHF:
645 FloatABI = "hard";
646 break;
647 default:
648 // FreeBSD defaults to soft float
649 FloatABI = "soft";
650 break;
651 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000652 break;
653
Daniel Dunbar78485922009-09-10 23:00:09 +0000654 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000656 case llvm::Triple::GNUEABIHF:
657 FloatABI = "hard";
658 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000659 case llvm::Triple::GNUEABI:
660 FloatABI = "softfp";
661 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000662 case llvm::Triple::EABIHF:
663 FloatABI = "hard";
664 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000665 case llvm::Triple::EABI:
666 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
667 FloatABI = "softfp";
668 break;
Tim Northover5a68c4b2014-01-23 15:00:01 +0000669 case llvm::Triple::MachO: {
670 FloatABI = "soft";
671 break;
672 }
Logan Chienc6fd8202012-09-02 09:30:11 +0000673 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000674 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000675 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000676 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000677 FloatABI = "softfp";
678 else
679 FloatABI = "soft";
680 break;
681 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000682 default:
683 // Assume "soft", but warn the user we are guessing.
684 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000685 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000686 break;
687 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000688 }
689 }
690
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000691 return FloatABI;
692}
693
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000694static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
695 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000696 std::vector<const char *> &Features,
697 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000698 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000699 if (!ForAS) {
700 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
701 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
702 // stripped out by the ARM target. We should probably pass this a new
703 // -target-option, which is handled by the -cc1/-cc1as invocation.
704 //
705 // FIXME2: For consistency, it would be ideal if we set up the target
706 // machine state the same when using the frontend or the assembler. We don't
707 // currently do that for the assembler, we pass the options directly to the
708 // backend and never even instantiate the frontend TargetInfo. If we did,
709 // and used its handleTargetFeatures hook, then we could ensure the
710 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000711
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000712 // Use software floating point operations?
713 if (FloatABI == "soft")
714 Features.push_back("+soft-float");
715
716 // Use software floating point argument passing?
717 if (FloatABI != "hard")
718 Features.push_back("+soft-float-abi");
719 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000720
721 // Honor -mfpu=.
722 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000723 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000724 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
725 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000726
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000727 // Setting -msoft-float effectively disables NEON because of the GCC
728 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000729 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000730 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000731 // Also need to explicitly disable features which imply NEON.
732 Features.push_back("-crypto");
733 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000734
735 // En/disable crc
736 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
737 options::OPT_mnocrc)) {
738 if (A->getOption().matches(options::OPT_mcrc))
739 Features.push_back("+crc");
740 else
741 Features.push_back("-crc");
742 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000743}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000744
745void Clang::AddARMTargetArgs(const ArgList &Args,
746 ArgStringList &CmdArgs,
747 bool KernelOrKext) const {
748 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000749 // Get the effective triple, which takes into account the deployment target.
750 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
751 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000752 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000753
754 // Select the ABI to use.
755 //
756 // FIXME: Support -meabi.
757 const char *ABIName = 0;
758 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000759 ABIName = A->getValue();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000760 } else if (Triple.isOSDarwin()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000761 // The backend is hardwired to assume AAPCS for M-class processors, ensure
762 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000763 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Tim Northover157d9112014-01-16 08:48:16 +0000764 Triple.getEnvironment() == llvm::Triple::MachO ||
Tim Northovere66c9462013-10-03 14:23:28 +0000765 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000766 ABIName = "aapcs";
767 } else {
768 ABIName = "apcs-gnu";
769 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770 } else {
771 // Select the default based on the platform.
772 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000773 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000774 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000775 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000776 ABIName = "aapcs-linux";
777 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000778 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000779 case llvm::Triple::EABI:
780 ABIName = "aapcs";
781 break;
782 default:
783 ABIName = "apcs-gnu";
784 }
785 }
786 CmdArgs.push_back("-target-abi");
787 CmdArgs.push_back(ABIName);
788
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000789 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000790 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000791 if (FloatABI == "soft") {
792 // Floating point operations and argument passing are soft.
793 //
794 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000795 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000796 CmdArgs.push_back("-mfloat-abi");
797 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000798 } else if (FloatABI == "softfp") {
799 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000800 CmdArgs.push_back("-mfloat-abi");
801 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000802 } else {
803 // Floating point operations and argument passing are hard.
804 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000805 CmdArgs.push_back("-mfloat-abi");
806 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000807 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000808
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000809 // Kernel code has more strict alignment requirements.
810 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000811 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000812 CmdArgs.push_back("-backend-option");
813 CmdArgs.push_back("-arm-long-calls");
814 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000815
Daniel Dunbar12100e22011-03-22 16:48:17 +0000816 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000817 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000818
819 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000820 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000821 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000822 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000823
824 // Setting -mno-global-merge disables the codegen global merge pass. Setting
825 // -mglobal-merge has no effect as the pass is enabled by default.
826 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
827 options::OPT_mno_global_merge)) {
828 if (A->getOption().matches(options::OPT_mno_global_merge))
829 CmdArgs.push_back("-mno-global-merge");
830 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000831
Bob Wilson9c8af452013-04-11 18:53:25 +0000832 if (!Args.hasFlag(options::OPT_mimplicit_float,
833 options::OPT_mno_implicit_float,
834 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000835 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000836
837 // llvm does not support reserving registers in general. There is support
838 // for reserving r9 on ARM though (defined as a platform-specific register
839 // in ARM EABI).
840 if (Args.hasArg(options::OPT_ffixed_r9)) {
841 CmdArgs.push_back("-backend-option");
842 CmdArgs.push_back("-arm-reserve-r9");
843 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000844}
845
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000846// Get CPU and ABI names. They are not independent
847// so we have to calculate them together.
848static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000849 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000850 StringRef &CPUName,
851 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000852 const char *DefMips32CPU = "mips32r2";
853 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000854
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000855 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000856 options::OPT_mcpu_EQ))
857 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000858
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000859 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000860 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000861 // Convert a GNU style Mips ABI name to the name
862 // accepted by LLVM Mips backend.
863 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
864 .Case("32", "o32")
865 .Case("64", "n64")
866 .Default(ABIName);
867 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000868
869 // Setup default CPU and ABI names.
870 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000871 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000872 default:
873 llvm_unreachable("Unexpected triple arch name");
874 case llvm::Triple::mips:
875 case llvm::Triple::mipsel:
876 CPUName = DefMips32CPU;
877 break;
878 case llvm::Triple::mips64:
879 case llvm::Triple::mips64el:
880 CPUName = DefMips64CPU;
881 break;
882 }
883 }
884
885 if (!ABIName.empty()) {
886 // Deduce CPU name from ABI name.
887 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000888 .Cases("32", "o32", "eabi", DefMips32CPU)
889 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000890 .Default("");
891 }
892 else if (!CPUName.empty()) {
893 // Deduce ABI name from CPU name.
894 ABIName = llvm::StringSwitch<const char *>(CPUName)
895 .Cases("mips32", "mips32r2", "o32")
896 .Cases("mips64", "mips64r2", "n64")
897 .Default("");
898 }
899
900 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000901}
902
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000903// Convert ABI name to the GNU tools acceptable variant.
904static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
905 return llvm::StringSwitch<llvm::StringRef>(ABI)
906 .Case("o32", "32")
907 .Case("n64", "64")
908 .Default(ABI);
909}
910
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000911// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
912// and -mfloat-abi=.
913static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000914 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000915 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000916 options::OPT_mhard_float,
917 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000918 if (A->getOption().matches(options::OPT_msoft_float))
919 FloatABI = "soft";
920 else if (A->getOption().matches(options::OPT_mhard_float))
921 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000922 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000923 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000924 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000925 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000926 FloatABI = "hard";
927 }
928 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000929 }
930
931 // If unspecified, choose the default based on the platform.
932 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000933 // Assume "hard", because it's a default value used by gcc.
934 // When we start to recognize specific target MIPS processors,
935 // we will be able to select the default more correctly.
936 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000937 }
938
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000939 return FloatABI;
940}
941
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000942static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000943 std::vector<const char *> &Features,
944 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000945 StringRef FeatureName) {
946 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000947 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000948 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000949 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000950 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000951 }
952}
953
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000954static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
955 std::vector<const char *> &Features) {
956 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000957 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000958 // FIXME: Note, this is a hack. We need to pass the selected float
959 // mode to the MipsTargetInfoBase to define appropriate macros there.
960 // Now it is the only method.
961 Features.push_back("+soft-float");
962 }
963
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000964 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
965 if (StringRef(A->getValue()) == "2008")
966 Features.push_back("+nan2008");
967 }
968
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000969 AddTargetFeature(Args, Features, options::OPT_msingle_float,
970 options::OPT_mdouble_float, "single-float");
971 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
972 "mips16");
973 AddTargetFeature(Args, Features, options::OPT_mmicromips,
974 options::OPT_mno_micromips, "micromips");
975 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
976 "dsp");
977 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
978 "dspr2");
979 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
980 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +0000981 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
982 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000983}
984
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000985void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000986 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000987 const Driver &D = getToolChain().getDriver();
988 StringRef CPUName;
989 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000990 const llvm::Triple &Triple = getToolChain().getTriple();
991 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000992
993 CmdArgs.push_back("-target-abi");
994 CmdArgs.push_back(ABIName.data());
995
996 StringRef FloatABI = getMipsFloatABI(D, Args);
997
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000998 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001000 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001001 CmdArgs.push_back("-mfloat-abi");
1002 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001003 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001004 else {
1005 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001006 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001007 CmdArgs.push_back("-mfloat-abi");
1008 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001009 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001010
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1012 if (A->getOption().matches(options::OPT_mxgot)) {
1013 CmdArgs.push_back("-mllvm");
1014 CmdArgs.push_back("-mxgot");
1015 }
1016 }
1017
Simon Atanasyanc580b322013-05-11 06:33:44 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1019 options::OPT_mno_ldc1_sdc1)) {
1020 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1021 CmdArgs.push_back("-mllvm");
1022 CmdArgs.push_back("-mno-ldc1-sdc1");
1023 }
1024 }
1025
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001026 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1027 options::OPT_mno_check_zero_division)) {
1028 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1029 CmdArgs.push_back("-mllvm");
1030 CmdArgs.push_back("-mno-check-zero-division");
1031 }
1032 }
1033
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001034 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001035 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001036 CmdArgs.push_back("-mllvm");
1037 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1038 A->claim();
1039 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001040}
1041
Hal Finkel8eb59282012-06-11 22:35:19 +00001042/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1043static std::string getPPCTargetCPU(const ArgList &Args) {
1044 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001045 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001046
1047 if (CPUName == "native") {
1048 std::string CPU = llvm::sys::getHostCPUName();
1049 if (!CPU.empty() && CPU != "generic")
1050 return CPU;
1051 else
1052 return "";
1053 }
1054
1055 return llvm::StringSwitch<const char *>(CPUName)
1056 .Case("common", "generic")
1057 .Case("440", "440")
1058 .Case("440fp", "440")
1059 .Case("450", "450")
1060 .Case("601", "601")
1061 .Case("602", "602")
1062 .Case("603", "603")
1063 .Case("603e", "603e")
1064 .Case("603ev", "603ev")
1065 .Case("604", "604")
1066 .Case("604e", "604e")
1067 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001069 .Case("G3", "g3")
1070 .Case("7400", "7400")
1071 .Case("G4", "g4")
1072 .Case("7450", "7450")
1073 .Case("G4+", "g4+")
1074 .Case("750", "750")
1075 .Case("970", "970")
1076 .Case("G5", "g5")
1077 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001078 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001079 .Case("e500mc", "e500mc")
1080 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001081 .Case("power3", "pwr3")
1082 .Case("power4", "pwr4")
1083 .Case("power5", "pwr5")
1084 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001085 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001086 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001087 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001088 .Case("pwr3", "pwr3")
1089 .Case("pwr4", "pwr4")
1090 .Case("pwr5", "pwr5")
1091 .Case("pwr5x", "pwr5x")
1092 .Case("pwr6", "pwr6")
1093 .Case("pwr6x", "pwr6x")
1094 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001095 .Case("powerpc", "ppc")
1096 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001097 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001098 .Default("");
1099 }
1100
1101 return "";
1102}
1103
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001104static void getPPCTargetFeatures(const ArgList &Args,
1105 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001106 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1107 ie = Args.filtered_end();
1108 it != ie; ++it) {
1109 StringRef Name = (*it)->getOption().getName();
1110 (*it)->claim();
1111
1112 // Skip over "-m".
1113 assert(Name.startswith("m") && "Invalid feature name.");
1114 Name = Name.substr(1);
1115
1116 bool IsNegative = Name.startswith("no-");
1117 if (IsNegative)
1118 Name = Name.substr(3);
1119
1120 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1121 // pass the correct option to the backend while calling the frontend
1122 // option the same.
1123 // TODO: Change the LLVM backend option maybe?
1124 if (Name == "mfcrf")
1125 Name = "mfocrf";
1126
1127 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1128 }
1129
1130 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001131 AddTargetFeature(Args, Features, options::OPT_faltivec,
1132 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001133}
1134
Tom Stellard6674c702013-04-01 20:56:53 +00001135/// Get the (LLVM) name of the R600 gpu we are targeting.
1136static std::string getR600TargetGPU(const ArgList &Args) {
1137 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001138 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001139 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001140 .Cases("rv630", "rv635", "r600")
1141 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001142 .Case("rv740", "rv770")
1143 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001144 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001145 .Case("hemlock", "cypress")
1146 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001147 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001148 }
1149 return "";
1150}
1151
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152static void getSparcTargetFeatures(const ArgList &Args,
1153 std::vector<const char *> Features) {
1154 bool SoftFloatABI = true;
1155 if (Arg *A =
1156 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1157 if (A->getOption().matches(options::OPT_mhard_float))
1158 SoftFloatABI = false;
1159 }
1160 if (SoftFloatABI)
1161 Features.push_back("+soft-float");
1162}
1163
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001164void Clang::AddSparcTargetArgs(const ArgList &Args,
1165 ArgStringList &CmdArgs) const {
1166 const Driver &D = getToolChain().getDriver();
1167
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001168 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001169 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001170 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1171 options::OPT_mhard_float)) {
1172 if (A->getOption().matches(options::OPT_msoft_float))
1173 FloatABI = "soft";
1174 else if (A->getOption().matches(options::OPT_mhard_float))
1175 FloatABI = "hard";
1176 }
1177
1178 // If unspecified, choose the default based on the platform.
1179 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001180 // Assume "soft", but warn the user we are guessing.
1181 FloatABI = "soft";
1182 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001183 }
1184
1185 if (FloatABI == "soft") {
1186 // Floating point operations and argument passing are soft.
1187 //
1188 // FIXME: This changes CPP defines, we need -target-soft-float.
1189 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001190 } else {
1191 assert(FloatABI == "hard" && "Invalid float abi!");
1192 CmdArgs.push_back("-mhard-float");
1193 }
1194}
1195
Richard Sandiford4652d892013-07-19 16:51:51 +00001196static const char *getSystemZTargetCPU(const ArgList &Args) {
1197 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1198 return A->getValue();
1199 return "z10";
1200}
1201
Chandler Carruth953fb082013-01-13 11:46:33 +00001202static const char *getX86TargetCPU(const ArgList &Args,
1203 const llvm::Triple &Triple) {
1204 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001205 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001206 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001207 return "core-avx2";
1208
Chandler Carruth953fb082013-01-13 11:46:33 +00001209 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001210 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001211
1212 // FIXME: Reject attempts to use -march=native unless the target matches
1213 // the host.
1214 //
1215 // FIXME: We should also incorporate the detected target features for use
1216 // with -native.
1217 std::string CPU = llvm::sys::getHostCPUName();
1218 if (!CPU.empty() && CPU != "generic")
1219 return Args.MakeArgString(CPU);
1220 }
1221
1222 // Select the default CPU if none was given (or detection failed).
1223
1224 if (Triple.getArch() != llvm::Triple::x86_64 &&
1225 Triple.getArch() != llvm::Triple::x86)
1226 return 0; // This routine is only handling x86 targets.
1227
1228 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1229
1230 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001231 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001232 if (Triple.getArchName() == "x86_64h")
1233 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001234 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001235 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001236
Alexey Bataev286d1b92014-01-31 04:07:13 +00001237 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001238 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001239 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001240
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001241 // Everything else goes to x86-64 in 64-bit mode.
1242 if (Is64Bit)
1243 return "x86-64";
1244
1245 switch (Triple.getOS()) {
1246 case llvm::Triple::FreeBSD:
1247 case llvm::Triple::NetBSD:
1248 case llvm::Triple::OpenBSD:
1249 return "i486";
1250 case llvm::Triple::Haiku:
1251 return "i586";
1252 case llvm::Triple::Bitrig:
1253 return "i686";
1254 default:
1255 // Fallback to p4.
1256 return "pentium4";
1257 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001258}
1259
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001260static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1261 switch(T.getArch()) {
1262 default:
1263 return "";
1264
Amara Emerson703da2e2013-10-31 09:32:33 +00001265 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001266 case llvm::Triple::aarch64_be:
Amara Emerson703da2e2013-10-31 09:32:33 +00001267 return getAArch64TargetCPU(Args, T);
1268
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001269 case llvm::Triple::arm:
1270 case llvm::Triple::thumb:
Bernard Ogden31561762013-12-12 13:27:11 +00001271 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001272
1273 case llvm::Triple::mips:
1274 case llvm::Triple::mipsel:
1275 case llvm::Triple::mips64:
1276 case llvm::Triple::mips64el: {
1277 StringRef CPUName;
1278 StringRef ABIName;
1279 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1280 return CPUName;
1281 }
1282
1283 case llvm::Triple::ppc:
1284 case llvm::Triple::ppc64:
1285 case llvm::Triple::ppc64le: {
1286 std::string TargetCPUName = getPPCTargetCPU(Args);
1287 // LLVM may default to generating code for the native CPU,
1288 // but, like gcc, we default to a more generic option for
1289 // each architecture. (except on Darwin)
1290 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1291 if (T.getArch() == llvm::Triple::ppc64)
1292 TargetCPUName = "ppc64";
1293 else if (T.getArch() == llvm::Triple::ppc64le)
1294 TargetCPUName = "ppc64le";
1295 else
1296 TargetCPUName = "ppc";
1297 }
1298 return TargetCPUName;
1299 }
1300
1301 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001302 case llvm::Triple::sparcv9:
1303 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001304 return A->getValue();
1305 return "";
1306
1307 case llvm::Triple::x86:
1308 case llvm::Triple::x86_64:
1309 return getX86TargetCPU(Args, T);
1310
1311 case llvm::Triple::hexagon:
1312 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1313
1314 case llvm::Triple::systemz:
1315 return getSystemZTargetCPU(Args);
1316
1317 case llvm::Triple::r600:
1318 return getR600TargetGPU(Args);
1319 }
1320}
1321
Alp Tokerce365ca2013-12-02 12:43:03 +00001322static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1323 ArgStringList &CmdArgs) {
1324 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1325 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1326 // forward.
1327 CmdArgs.push_back("-plugin");
1328 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1329 CmdArgs.push_back(Args.MakeArgString(Plugin));
1330
1331 // Try to pass driver level flags relevant to LTO code generation down to
1332 // the plugin.
1333
1334 // Handle flags for selecting CPU variants.
1335 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1336 if (!CPU.empty())
1337 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1338}
1339
Jim Grosbach82eee262013-11-16 00:53:35 +00001340static void getX86TargetFeatures(const llvm::Triple &Triple,
1341 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001342 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001343 if (Triple.getArchName() == "x86_64h") {
1344 // x86_64h implies quite a few of the more modern subtarget features
1345 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1346 Features.push_back("-rdrnd");
1347 Features.push_back("-aes");
1348 Features.push_back("-pclmul");
1349 Features.push_back("-rtm");
1350 Features.push_back("-hle");
1351 Features.push_back("-fsgsbase");
1352 }
1353
Alexey Bataev286d1b92014-01-31 04:07:13 +00001354 if (Triple.getEnvironment() == llvm::Triple::Android) {
1355 // Add sse3 feature to comply with gcc on Android
1356 Features.push_back("+sse3");
1357 }
1358
Jim Grosbach82eee262013-11-16 00:53:35 +00001359 // Now add any that the user explicitly requested on the command line,
1360 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001361 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1362 ie = Args.filtered_end();
1363 it != ie; ++it) {
1364 StringRef Name = (*it)->getOption().getName();
1365 (*it)->claim();
1366
1367 // Skip over "-m".
1368 assert(Name.startswith("m") && "Invalid feature name.");
1369 Name = Name.substr(1);
1370
1371 bool IsNegative = Name.startswith("no-");
1372 if (IsNegative)
1373 Name = Name.substr(3);
1374
1375 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1376 }
1377}
1378
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001379void Clang::AddX86TargetArgs(const ArgList &Args,
1380 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001381 if (!Args.hasFlag(options::OPT_mred_zone,
1382 options::OPT_mno_red_zone,
1383 true) ||
1384 Args.hasArg(options::OPT_mkernel) ||
1385 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001386 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001387
Bob Wilson2616e2e2013-02-10 16:01:41 +00001388 // Default to avoid implicit floating-point for kernel/kext code, but allow
1389 // that to be overridden with -mno-soft-float.
1390 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1391 Args.hasArg(options::OPT_fapple_kext));
1392 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1393 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001394 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001395 options::OPT_mno_implicit_float)) {
1396 const Option &O = A->getOption();
1397 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1398 O.matches(options::OPT_msoft_float));
1399 }
1400 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001401 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001402}
1403
Matthew Curtise8f80a12012-12-06 17:49:03 +00001404static inline bool HasPICArg(const ArgList &Args) {
1405 return Args.hasArg(options::OPT_fPIC)
1406 || Args.hasArg(options::OPT_fpic);
1407}
1408
1409static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1410 return Args.getLastArg(options::OPT_G,
1411 options::OPT_G_EQ,
1412 options::OPT_msmall_data_threshold_EQ);
1413}
1414
1415static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1416 std::string value;
1417 if (HasPICArg(Args))
1418 value = "0";
1419 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1420 value = A->getValue();
1421 A->claim();
1422 }
1423 return value;
1424}
1425
Tony Linthicum76329bf2011-12-12 21:14:55 +00001426void Clang::AddHexagonTargetArgs(const ArgList &Args,
1427 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001428 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001429 CmdArgs.push_back("-mqdsp6-compat");
1430 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001431
Matthew Curtise8f80a12012-12-06 17:49:03 +00001432 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1433 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001434 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001435 CmdArgs.push_back(Args.MakeArgString(
1436 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001437 }
1438
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001439 if (!Args.hasArg(options::OPT_fno_short_enums))
1440 CmdArgs.push_back("-fshort-enums");
1441 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1442 CmdArgs.push_back ("-mllvm");
1443 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1444 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001445 CmdArgs.push_back ("-mllvm");
1446 CmdArgs.push_back ("-machine-sink-split=0");
1447}
1448
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001449static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1450 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001451 // Honor -mfpu=.
1452 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001453 getAArch64FPUFeatures(D, A, Args, Features);
Jiangning Liub19c5b62014-02-14 04:37:46 +00001454 else
1455 Features.push_back("+neon");
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001456
1457 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1458 Features.push_back("-fp-armv8");
1459 Features.push_back("-crypto");
1460 Features.push_back("-neon");
1461 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001462}
1463
1464static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001465 const ArgList &Args, ArgStringList &CmdArgs,
1466 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001467 std::vector<const char *> Features;
1468 switch (Triple.getArch()) {
1469 default:
1470 break;
1471 case llvm::Triple::mips:
1472 case llvm::Triple::mipsel:
1473 case llvm::Triple::mips64:
1474 case llvm::Triple::mips64el:
1475 getMIPSTargetFeatures(D, Args, Features);
1476 break;
1477
1478 case llvm::Triple::arm:
1479 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001480 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001481 break;
1482
1483 case llvm::Triple::ppc:
1484 case llvm::Triple::ppc64:
1485 case llvm::Triple::ppc64le:
1486 getPPCTargetFeatures(Args, Features);
1487 break;
1488 case llvm::Triple::sparc:
1489 getSparcTargetFeatures(Args, Features);
1490 break;
1491 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001492 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001493 getAArch64TargetFeatures(D, Args, Features);
1494 break;
1495 case llvm::Triple::x86:
1496 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001497 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001498 break;
1499 }
Rafael Espindola43964802013-08-21 17:34:32 +00001500
1501 // Find the last of each feature.
1502 llvm::StringMap<unsigned> LastOpt;
1503 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1504 const char *Name = Features[I];
1505 assert(Name[0] == '-' || Name[0] == '+');
1506 LastOpt[Name + 1] = I;
1507 }
1508
1509 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1510 // If this feature was overridden, ignore it.
1511 const char *Name = Features[I];
1512 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1513 assert(LastI != LastOpt.end());
1514 unsigned Last = LastI->second;
1515 if (Last != I)
1516 continue;
1517
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001518 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001519 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001520 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001521}
1522
Eric Christopher84fbdb42011-08-19 00:30:14 +00001523static bool
John McCall5fb5df92012-06-20 06:18:46 +00001524shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001525 const llvm::Triple &Triple) {
1526 // We use the zero-cost exception tables for Objective-C if the non-fragile
1527 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1528 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001529 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001530 return true;
1531
Bob Wilson83e723a2013-12-05 19:38:42 +00001532 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001533 return false;
1534
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001535 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001536 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001537 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001538}
1539
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001540namespace {
1541 struct ExceptionSettings {
1542 bool ExceptionsEnabled;
1543 bool ShouldUseExceptionTables;
1544 ExceptionSettings() : ExceptionsEnabled(false),
1545 ShouldUseExceptionTables(false) {}
1546 };
1547} // end anonymous namespace.
1548
Robert Lytton694f8842014-02-13 10:38:56 +00001549// exceptionSettings() exists to share the logic between -cc1 and linker invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001550static ExceptionSettings exceptionSettings(const ArgList &Args,
1551 const llvm::Triple &Triple) {
1552 ExceptionSettings ES;
1553
1554 // Are exceptions enabled by default?
1555 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1556
1557 // This keeps track of whether exceptions were explicitly turned on or off.
1558 bool DidHaveExplicitExceptionFlag = false;
1559
1560 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1561 options::OPT_fno_exceptions)) {
1562 if (A->getOption().matches(options::OPT_fexceptions))
1563 ES.ExceptionsEnabled = true;
1564 else
1565 ES.ExceptionsEnabled = false;
1566
1567 DidHaveExplicitExceptionFlag = true;
1568 }
1569
1570 // Exception tables and cleanups can be enabled with -fexceptions even if the
1571 // language itself doesn't support exceptions.
1572 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1573 ES.ShouldUseExceptionTables = true;
1574
1575 return ES;
1576}
1577
Anders Carlssone96ab552011-02-28 02:27:16 +00001578/// addExceptionArgs - Adds exception related arguments to the driver command
1579/// arguments. There's a master flag, -fexceptions and also language specific
1580/// flags to enable/disable C++ and Objective-C exceptions.
1581/// This makes it possible to for example disable C++ exceptions but enable
1582/// Objective-C exceptions.
1583static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1584 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001585 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001586 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001587 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001588 if (KernelOrKext) {
1589 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1590 // arguments now to avoid warnings about unused arguments.
1591 Args.ClaimAllArgs(options::OPT_fexceptions);
1592 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1593 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1594 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1595 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1596 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001597 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001598 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001599
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001600 // Gather the exception settings from the command line arguments.
1601 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001602
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001603 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1604 // is not necessarily sensible, but follows GCC.
1605 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001606 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001607 options::OPT_fno_objc_exceptions,
1608 true)) {
1609 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001610
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001611 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001612 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001613 }
1614
1615 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001616 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001617
Eric Christopher84fbdb42011-08-19 00:30:14 +00001618 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1619 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001620 options::OPT_fexceptions,
1621 options::OPT_fno_exceptions)) {
1622 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1623 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001624 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001625 CXXExceptionsEnabled = false;
1626 }
1627
1628 if (CXXExceptionsEnabled) {
1629 CmdArgs.push_back("-fcxx-exceptions");
1630
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001631 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001632 }
1633 }
1634
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001635 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001636 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001637}
1638
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001639static bool ShouldDisableAutolink(const ArgList &Args,
1640 const ToolChain &TC) {
1641 bool Default = true;
1642 if (TC.getTriple().isOSDarwin()) {
1643 // The native darwin assembler doesn't support the linker_option directives,
1644 // so we disable them if we think the .s file will be passed to it.
1645 Default = TC.useIntegratedAs();
1646 }
1647 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1648 Default);
1649}
1650
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001651static bool ShouldDisableCFI(const ArgList &Args,
1652 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001653 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001654 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001655 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001656 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001657 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001658 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001659 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001660 options::OPT_fno_dwarf2_cfi_asm,
1661 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001662}
1663
Ted Kremenek62093662013-03-12 17:02:12 +00001664static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1665 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001666 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1667 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001668 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001669 return !UseDwarfDirectory;
1670}
1671
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001672/// \brief Check whether the given input tree contains any compilation actions.
1673static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001674 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001675 return true;
1676
1677 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1678 if (ContainsCompileAction(*it))
1679 return true;
1680
1681 return false;
1682}
1683
1684/// \brief Check if -relax-all should be passed to the internal assembler.
1685/// This is done by default when compiling non-assembler source with -O0.
1686static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1687 bool RelaxDefault = true;
1688
1689 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1690 RelaxDefault = A->getOption().matches(options::OPT_O0);
1691
1692 if (RelaxDefault) {
1693 RelaxDefault = false;
1694 for (ActionList::const_iterator it = C.getActions().begin(),
1695 ie = C.getActions().end(); it != ie; ++it) {
1696 if (ContainsCompileAction(*it)) {
1697 RelaxDefault = true;
1698 break;
1699 }
1700 }
1701 }
1702
1703 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1704 RelaxDefault);
1705}
1706
David Blaikie9260ed62013-07-25 21:19:01 +00001707static void CollectArgsForIntegratedAssembler(Compilation &C,
1708 const ArgList &Args,
1709 ArgStringList &CmdArgs,
1710 const Driver &D) {
1711 if (UseRelaxAll(C, Args))
1712 CmdArgs.push_back("-mrelax-all");
1713
David Peixottodfb66142013-11-14 22:52:58 +00001714 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001715 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001716 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1717 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1718 // arg after parsing the '-I' arg.
1719 bool TakeNextArg = false;
1720
David Blaikie9260ed62013-07-25 21:19:01 +00001721 // When using an integrated assembler, translate -Wa, and -Xassembler
1722 // options.
1723 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1724 options::OPT_Xassembler),
1725 ie = Args.filtered_end(); it != ie; ++it) {
1726 const Arg *A = *it;
1727 A->claim();
1728
1729 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1730 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001731 if (TakeNextArg) {
1732 CmdArgs.push_back(Value.data());
1733 TakeNextArg = false;
1734 continue;
1735 }
David Blaikie9260ed62013-07-25 21:19:01 +00001736
1737 if (Value == "-force_cpusubtype_ALL") {
1738 // Do nothing, this is the default and we don't support anything else.
1739 } else if (Value == "-L") {
1740 CmdArgs.push_back("-msave-temp-labels");
1741 } else if (Value == "--fatal-warnings") {
1742 CmdArgs.push_back("-mllvm");
1743 CmdArgs.push_back("-fatal-assembler-warnings");
1744 } else if (Value == "--noexecstack") {
1745 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001746 } else if (Value == "-compress-debug-sections" ||
1747 Value == "--compress-debug-sections") {
David Blaikie372d9502014-01-17 03:17:40 +00001748 D.Diag(diag::warn_missing_debug_compression);
David Peixottodfb66142013-11-14 22:52:58 +00001749 } else if (Value.startswith("-I")) {
1750 CmdArgs.push_back(Value.data());
1751 // We need to consume the next argument if the current arg is a plain
1752 // -I. The next arg will be the include directory.
1753 if (Value == "-I")
1754 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001755 } else {
1756 D.Diag(diag::err_drv_unsupported_option_argument)
1757 << A->getOption().getName() << Value;
1758 }
1759 }
1760 }
1761}
1762
Renato Goline807c122014-01-31 11:47:28 +00001763// Until ARM libraries are build separately, we have them all in one library
1764static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
1765 if (TC.getArch() == llvm::Triple::arm)
1766 return "arm";
1767 else
1768 return TC.getArchName();
1769}
1770
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001771static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1772 // The runtimes are located in the OS-specific resource directory.
1773 SmallString<128> Res(TC.getDriver().ResourceDir);
1774 llvm::sys::path::append(Res, "lib", TC.getOS());
1775 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00001776}
1777
Renato Golinc4b49242014-02-13 10:01:16 +00001778// This adds the static libclang_rt.arch.a directly to the command line
1779// FIXME: Make sure we can also emit shared objects if they're requested
1780// and available, check for possible errors, etc.
1781static void addClangRTLinux(
1782 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001783 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
1784 llvm::sys::path::append(LibClangRT,
Renato Golinc4b49242014-02-13 10:01:16 +00001785 Twine("libclang_rt.") + getArchNameForCompilerRTLib(TC) + ".a");
1786
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001787 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00001788 CmdArgs.push_back("-lgcc_s");
1789 if (TC.getDriver().CCCIsCXX())
1790 CmdArgs.push_back("-lgcc_eh");
1791}
1792
Alexey Samsonov7811d192014-02-20 13:57:37 +00001793static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00001794 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1795 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1796 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001797 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001798 Args.hasArg(options::OPT_fcreate_profile) ||
1799 Args.hasArg(options::OPT_coverage)))
1800 return;
1801
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001802 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1803 llvm::sys::path::append(LibProfile,
Renato Goline807c122014-01-31 11:47:28 +00001804 Twine("libclang_rt.profile-") + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00001805
1806 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1807}
1808
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001809static void addSanitizerRTLinkFlags(
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001810 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001811 const StringRef Sanitizer, bool BeforeLibStdCXX,
1812 bool ExportSymbols = true) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001813 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1814 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1815 llvm::sys::path::append(LibSanitizer,
1816 (Twine("libclang_rt.") + Sanitizer + "-" +
1817 getArchNameForCompilerRTLib(TC) + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001818
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001819 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1820 // etc.) so that the linker picks custom versions of the global 'operator
1821 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001822 // strategy of inserting it at the front of the link command. It also
1823 // needs to be forced to end up in the executable, so wrap it in
1824 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001825 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001826 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001827 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001828 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001829
1830 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1831 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1832
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001833 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001834 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001835 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001836 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001837
1838 // If possible, use a dynamic symbols file to export the symbols from the
1839 // runtime library. If we can't do so, use -export-dynamic instead to export
1840 // all symbols from the binary.
1841 if (ExportSymbols) {
1842 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1843 CmdArgs.push_back(
1844 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1845 else
1846 CmdArgs.push_back("-export-dynamic");
1847 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001848}
1849
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001850/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1851/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001852static void addAsanRT(const ToolChain &TC, const ArgList &Args,
1853 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001854 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001855 SmallString<128> LibAsan = getCompilerRTLibDir(TC);
1856 llvm::sys::path::append(LibAsan,
1857 (Twine("libclang_rt.asan-") +
1858 getArchNameForCompilerRTLib(TC) + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001859 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001860 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001861 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001862 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001863 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001864}
1865
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001866/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1867/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001868static void addTsanRT(const ToolChain &TC, const ArgList &Args,
1869 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001870 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001871 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001872}
1873
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001874/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1875/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001876static void addMsanRT(const ToolChain &TC, const ArgList &Args,
1877 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001878 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001879 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001880}
1881
1882/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1883/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001884static void addLsanRT(const ToolChain &TC, const ArgList &Args,
1885 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001886 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001887 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001888}
1889
Richard Smithe30752c2012-10-09 19:52:38 +00001890/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1891/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001892static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
1893 ArgStringList &CmdArgs, bool IsCXX,
1894 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001895 // Need a copy of sanitizer_common. This could come from another sanitizer
1896 // runtime; if we're not including one, include our own copy.
1897 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001898 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001899
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001900 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001901
1902 // Only include the bits of the runtime which need a C++ ABI library if
1903 // we're linking in C++ mode.
1904 if (IsCXX)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001905 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001906}
1907
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001908static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
1909 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00001910 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001911 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
1912}
1913
1914// Should be called before we add C++ ABI library.
1915static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
1916 ArgStringList &CmdArgs) {
1917 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
1918 const Driver &D = TC.getDriver();
1919 if (Sanitize.needsUbsanRt())
1920 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
1921 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
1922 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
1923 if (Sanitize.needsAsanRt())
1924 addAsanRT(TC, Args, CmdArgs);
1925 if (Sanitize.needsTsanRt())
1926 addTsanRT(TC, Args, CmdArgs);
1927 if (Sanitize.needsMsanRt())
1928 addMsanRT(TC, Args, CmdArgs);
1929 if (Sanitize.needsLsanRt())
1930 addLsanRT(TC, Args, CmdArgs);
1931 if (Sanitize.needsDfsanRt())
1932 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00001933}
1934
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001935static bool shouldUseFramePointerForTarget(const ArgList &Args,
1936 const llvm::Triple &Triple) {
1937 switch (Triple.getArch()) {
1938 // Don't use a frame pointer on linux if optimizing for certain targets.
1939 case llvm::Triple::mips64:
1940 case llvm::Triple::mips64el:
1941 case llvm::Triple::mips:
1942 case llvm::Triple::mipsel:
1943 case llvm::Triple::systemz:
1944 case llvm::Triple::x86:
1945 case llvm::Triple::x86_64:
1946 if (Triple.isOSLinux())
1947 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1948 if (!A->getOption().matches(options::OPT_O0))
1949 return false;
1950 return true;
1951 case llvm::Triple::xcore:
1952 return false;
1953 default:
1954 return true;
1955 }
1956}
1957
Rafael Espindola224dd632011-12-14 21:02:23 +00001958static bool shouldUseFramePointer(const ArgList &Args,
1959 const llvm::Triple &Triple) {
1960 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1961 options::OPT_fomit_frame_pointer))
1962 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1963
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001964 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001965}
1966
Eric Christopherb7d97e92013-04-03 01:58:53 +00001967static bool shouldUseLeafFramePointer(const ArgList &Args,
1968 const llvm::Triple &Triple) {
1969 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1970 options::OPT_momit_leaf_frame_pointer))
1971 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1972
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001973 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001974}
1975
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001976/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001977static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001978 SmallString<128> cwd;
1979 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001980 CmdArgs.push_back("-fdebug-compilation-dir");
1981 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001982 }
1983}
1984
Eric Christopherd3804002013-02-22 20:12:52 +00001985static const char *SplitDebugName(const ArgList &Args,
1986 const InputInfoList &Inputs) {
1987 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1988 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1989 SmallString<128> T(FinalOutput->getValue());
1990 llvm::sys::path::replace_extension(T, "dwo");
1991 return Args.MakeArgString(T);
1992 } else {
1993 // Use the compilation dir.
1994 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1995 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1996 llvm::sys::path::replace_extension(F, "dwo");
1997 T += F;
1998 return Args.MakeArgString(F);
1999 }
2000}
2001
2002static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2003 const Tool &T, const JobAction &JA,
2004 const ArgList &Args, const InputInfo &Output,
2005 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002006 ArgStringList ExtractArgs;
2007 ExtractArgs.push_back("--extract-dwo");
2008
2009 ArgStringList StripArgs;
2010 StripArgs.push_back("--strip-dwo");
2011
2012 // Grabbing the output of the earlier compile step.
2013 StripArgs.push_back(Output.getFilename());
2014 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002015 ExtractArgs.push_back(OutFile);
2016
2017 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002018 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002019
2020 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002021 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002022
2023 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002024 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002025}
2026
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002027static bool isOptimizationLevelFast(const ArgList &Args) {
2028 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2029 if (A->getOption().matches(options::OPT_Ofast))
2030 return true;
2031 return false;
2032}
2033
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002034/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2035static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2036 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002037 if (A->getOption().matches(options::OPT_O4) ||
2038 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002039 return true;
2040
2041 if (A->getOption().matches(options::OPT_O0))
2042 return false;
2043
2044 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2045
Rafael Espindola91780de2013-08-26 14:05:41 +00002046 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002047 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002048 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002049 return true;
2050
2051 // Don't vectorize -Oz.
2052 if (S == "z")
2053 return false;
2054
2055 unsigned OptLevel = 0;
2056 if (S.getAsInteger(10, OptLevel))
2057 return false;
2058
2059 return OptLevel > 1;
2060 }
2061
2062 return false;
2063}
2064
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002065/// Add -x lang to \p CmdArgs for \p Input.
2066static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2067 ArgStringList &CmdArgs) {
2068 // When using -verify-pch, we don't want to provide the type
2069 // 'precompiled-header' if it was inferred from the file extension
2070 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2071 return;
2072
2073 CmdArgs.push_back("-x");
2074 if (Args.hasArg(options::OPT_rewrite_objc))
2075 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2076 else
2077 CmdArgs.push_back(types::getTypeName(Input.getType()));
2078}
2079
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002080void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002081 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002082 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002083 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002084 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002085 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2086 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002087 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002088 ArgStringList CmdArgs;
2089
Daniel Dunbare521a892009-03-31 20:53:55 +00002090 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2091
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002092 // Invoke ourselves in -cc1 mode.
2093 //
2094 // FIXME: Implement custom jobs for internal actions.
2095 CmdArgs.push_back("-cc1");
2096
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002097 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002098 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002099 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002100 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002101
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002102 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002103 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002104
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002105 if (isa<AnalyzeJobAction>(JA)) {
2106 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2107 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002108 } else if (isa<MigrateJobAction>(JA)) {
2109 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002111 if (Output.getType() == types::TY_Dependencies)
2112 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002113 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002114 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002115 if (Args.hasArg(options::OPT_rewrite_objc) &&
2116 !Args.hasArg(options::OPT_g_Group))
2117 CmdArgs.push_back("-P");
2118 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002119 } else if (isa<AssembleJobAction>(JA)) {
2120 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002121
David Blaikie9260ed62013-07-25 21:19:01 +00002122 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002123
2124 // Also ignore explicit -force_cpusubtype_ALL option.
2125 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002126 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002127 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002128 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002129
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002130 if (JA.getType() == types::TY_Nothing)
2131 CmdArgs.push_back("-fsyntax-only");
2132 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002133 CmdArgs.push_back("-emit-pch");
2134 else
2135 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002136 } else if (isa<VerifyPCHJobAction>(JA)) {
2137 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002138 } else {
2139 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002140
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002141 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002142 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002143 } else if (JA.getType() == types::TY_LLVM_IR ||
2144 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002145 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002146 } else if (JA.getType() == types::TY_LLVM_BC ||
2147 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002148 CmdArgs.push_back("-emit-llvm-bc");
2149 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002150 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002151 } else if (JA.getType() == types::TY_AST) {
2152 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002153 } else if (JA.getType() == types::TY_ModuleFile) {
2154 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002155 } else if (JA.getType() == types::TY_RewrittenObjC) {
2156 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002157 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002158 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2159 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002160 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002161 } else {
2162 assert(JA.getType() == types::TY_PP_Asm &&
2163 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002164 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002165 }
2166
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002167 // The make clang go fast button.
2168 CmdArgs.push_back("-disable-free");
2169
John McCallbb79b5f2010-02-13 03:50:24 +00002170 // Disable the verification pass in -asserts builds.
2171#ifdef NDEBUG
2172 CmdArgs.push_back("-disable-llvm-verifier");
2173#endif
2174
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002175 // Set the main file name, so that debug info works even with
2176 // -save-temps.
2177 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002178 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002179
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002180 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002181 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002182 if (Args.hasArg(options::OPT_static))
2183 CmdArgs.push_back("-static-define");
2184
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002185 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002186 // Enable region store model by default.
2187 CmdArgs.push_back("-analyzer-store=region");
2188
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002189 // Treat blocks as analysis entry points.
2190 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2191
Ted Kremenek49c79792011-03-24 00:28:47 +00002192 CmdArgs.push_back("-analyzer-eagerly-assume");
2193
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002194 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002195 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002196 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002197
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002198 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2199 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002200
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002201 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002202 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002203
2204 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002205
Jordan Rose10ad0812013-04-05 17:55:07 +00002206 if (types::isCXX(Inputs[0].getType()))
2207 CmdArgs.push_back("-analyzer-checker=cplusplus");
2208
Ted Kremenek37e96522012-01-26 02:27:38 +00002209 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002210 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2211 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2212 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2213 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2214 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2215 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002216 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002217
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002218 // Set the output format. The default is plist, for (lame) historical
2219 // reasons.
2220 CmdArgs.push_back("-analyzer-output");
2221 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002222 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002223 else
2224 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002225
Ted Kremenekfe449a22010-03-22 22:32:05 +00002226 // Disable the presentation of standard compiler warnings when
2227 // using --analyze. We only want to show static analyzer diagnostics
2228 // or frontend errors.
2229 CmdArgs.push_back("-w");
2230
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002231 // Add -Xanalyzer arguments when running as analyzer.
2232 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002233 }
2234
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002235 CheckCodeGenerationOptions(D, Args);
2236
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002237 bool PIE = getToolChain().isPIEDefault();
2238 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002239 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002240
Alexey Bataev40e75222014-01-28 06:30:35 +00002241 // Android-specific defaults for PIC/PIE
2242 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2243 switch (getToolChain().getTriple().getArch()) {
2244 case llvm::Triple::arm:
2245 case llvm::Triple::thumb:
2246 case llvm::Triple::mips:
2247 case llvm::Triple::mipsel:
2248 case llvm::Triple::mips64:
2249 case llvm::Triple::mips64el:
2250 PIC = true; // "-fpic"
2251 break;
2252
2253 case llvm::Triple::x86:
2254 case llvm::Triple::x86_64:
2255 PIC = true; // "-fPIC"
2256 IsPICLevelTwo = true;
2257 break;
2258
2259 default:
2260 break;
2261 }
2262 }
2263
Alexey Samsonov090301e2013-04-09 12:28:19 +00002264 // For the PIC and PIE flag options, this logic is different from the
2265 // legacy logic in very old versions of GCC, as that logic was just
2266 // a bug no one had ever fixed. This logic is both more rational and
2267 // consistent with GCC's new logic now that the bugs are fixed. The last
2268 // argument relating to either PIC or PIE wins, and no other argument is
2269 // used. If the last argument is any flavor of the '-fno-...' arguments,
2270 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2271 // at the same level.
2272 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2273 options::OPT_fpic, options::OPT_fno_pic,
2274 options::OPT_fPIE, options::OPT_fno_PIE,
2275 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002276 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2277 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002278 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002279 if (LastPICArg) {
2280 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002281 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2282 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2283 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2284 PIC = PIE || O.matches(options::OPT_fPIC) ||
2285 O.matches(options::OPT_fpic);
2286 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2287 O.matches(options::OPT_fPIC);
2288 } else {
2289 PIE = PIC = false;
2290 }
2291 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002292 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002293
Nick Lewycky609dd662013-10-11 03:33:53 +00002294 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002295 // specified while enabling PIC enabled level 1 PIC, just force it back to
2296 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2297 // informal testing).
2298 if (PIC && getToolChain().getTriple().isOSDarwin())
2299 IsPICLevelTwo |= getToolChain().isPICDefault();
2300
Chandler Carruthc0c04552012-04-08 16:40:35 +00002301 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2302 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002303 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002304 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002305 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002306 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002307 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002308 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002309
Chandler Carruth76a943b2012-11-19 03:52:03 +00002310 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2311 // This is a very special mode. It trumps the other modes, almost no one
2312 // uses it, and it isn't even valid on any OS but Darwin.
2313 if (!getToolChain().getTriple().isOSDarwin())
2314 D.Diag(diag::err_drv_unsupported_opt_for_target)
2315 << A->getSpelling() << getToolChain().getTriple().str();
2316
2317 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2318
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002319 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002320 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002321
Chandler Carruth76a943b2012-11-19 03:52:03 +00002322 // Only a forced PIC mode can cause the actual compile to have PIC defines
2323 // etc., no flags are sufficient. This behavior was selected to closely
2324 // match that of llvm-gcc and Apple GCC before that.
2325 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2326 CmdArgs.push_back("-pic-level");
2327 CmdArgs.push_back("2");
2328 }
2329 } else {
2330 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2331 // handled in Clang's IRGen by the -pie-level flag.
2332 CmdArgs.push_back("-mrelocation-model");
2333 CmdArgs.push_back(PIC ? "pic" : "static");
2334
2335 if (PIC) {
2336 CmdArgs.push_back("-pic-level");
2337 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2338 if (PIE) {
2339 CmdArgs.push_back("-pie-level");
2340 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2341 }
2342 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002343 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002344
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002345 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2346 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002347 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002348
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002349 // LLVM Code Generator Options.
2350
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002351 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2352 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002353 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002354 }
2355
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002356 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2357 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002358 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002359 D.Diag(diag::err_drv_unsupported_opt_for_target)
2360 << A->getSpelling() << getToolChain().getTriple().str();
2361 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2362 CmdArgs.push_back("-fpcc-struct-return");
2363 } else {
2364 assert(A->getOption().matches(options::OPT_freg_struct_return));
2365 CmdArgs.push_back("-freg-struct-return");
2366 }
2367 }
2368
Roman Divacky65b88cd2011-03-01 17:40:53 +00002369 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2370 CmdArgs.push_back("-mrtd");
2371
Rafael Espindola224dd632011-12-14 21:02:23 +00002372 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002373 CmdArgs.push_back("-mdisable-fp-elim");
2374 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2375 options::OPT_fno_zero_initialized_in_bss))
2376 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002377
2378 bool OFastEnabled = isOptimizationLevelFast(Args);
2379 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2380 // enabled. This alias option is being used to simplify the hasFlag logic.
2381 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2382 options::OPT_fstrict_aliasing;
2383 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002384 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002385 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002386 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2387 options::OPT_fno_struct_path_tbaa))
2388 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002389 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2390 false))
2391 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002392 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2393 options::OPT_fno_optimize_sibling_calls))
2394 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002395
Eric Christopher006208c2013-04-04 06:29:47 +00002396 // Handle segmented stacks.
2397 if (Args.hasArg(options::OPT_fsplit_stack))
2398 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002399
2400 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2401 // This alias option is being used to simplify the getLastArg logic.
2402 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2403 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002404
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002405 // Handle various floating point optimization flags, mapping them to the
2406 // appropriate LLVM code generation flags. The pattern for all of these is to
2407 // default off the codegen optimizations, and if any flag enables them and no
2408 // flag disables them after the flag enabling them, enable the codegen
2409 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002410 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002411 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002412 options::OPT_ffinite_math_only,
2413 options::OPT_fno_finite_math_only,
2414 options::OPT_fhonor_infinities,
2415 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002416 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2417 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002418 A->getOption().getID() != options::OPT_fhonor_infinities)
2419 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002420 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002421 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002422 options::OPT_ffinite_math_only,
2423 options::OPT_fno_finite_math_only,
2424 options::OPT_fhonor_nans,
2425 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002426 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2427 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002428 A->getOption().getID() != options::OPT_fhonor_nans)
2429 CmdArgs.push_back("-menable-no-nans");
2430
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002431 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2432 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002433 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002434 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002435 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002436 options::OPT_fno_math_errno)) {
2437 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2438 // However, turning *off* -ffast_math merely restores the toolchain default
2439 // (which may be false).
2440 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2441 A->getOption().getID() == options::OPT_ffast_math ||
2442 A->getOption().getID() == options::OPT_Ofast)
2443 MathErrno = false;
2444 else if (A->getOption().getID() == options::OPT_fmath_errno)
2445 MathErrno = true;
2446 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002447 if (MathErrno)
2448 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002449
2450 // There are several flags which require disabling very specific
2451 // optimizations. Any of these being disabled forces us to turn off the
2452 // entire set of LLVM optimizations, so collect them through all the flag
2453 // madness.
2454 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002455 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002456 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002457 options::OPT_funsafe_math_optimizations,
2458 options::OPT_fno_unsafe_math_optimizations,
2459 options::OPT_fassociative_math,
2460 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002461 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2462 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002463 A->getOption().getID() != options::OPT_fno_associative_math)
2464 AssociativeMath = true;
2465 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002466 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002467 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002468 options::OPT_funsafe_math_optimizations,
2469 options::OPT_fno_unsafe_math_optimizations,
2470 options::OPT_freciprocal_math,
2471 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002472 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2473 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002474 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2475 ReciprocalMath = true;
2476 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002477 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002478 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002479 options::OPT_funsafe_math_optimizations,
2480 options::OPT_fno_unsafe_math_optimizations,
2481 options::OPT_fsigned_zeros,
2482 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002483 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2484 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002485 A->getOption().getID() != options::OPT_fsigned_zeros)
2486 SignedZeros = false;
2487 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002488 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002489 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002490 options::OPT_funsafe_math_optimizations,
2491 options::OPT_fno_unsafe_math_optimizations,
2492 options::OPT_ftrapping_math,
2493 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002494 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2495 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002496 A->getOption().getID() != options::OPT_ftrapping_math)
2497 TrappingMath = false;
2498 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2499 !TrappingMath)
2500 CmdArgs.push_back("-menable-unsafe-fp-math");
2501
Lang Hamesaa53b932012-07-06 00:59:19 +00002502
2503 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002504 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002505 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002506 options::OPT_ffp_contract)) {
2507 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002508 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002509 if (Val == "fast" || Val == "on" || Val == "off") {
2510 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2511 } else {
2512 D.Diag(diag::err_drv_unsupported_option_argument)
2513 << A->getOption().getName() << Val;
2514 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002515 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2516 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002517 // If fast-math is set then set the fp-contract mode to fast.
2518 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2519 }
2520 }
2521
Bob Wilson6a039162012-07-19 03:52:53 +00002522 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2523 // and if we find them, tell the frontend to provide the appropriate
2524 // preprocessor macros. This is distinct from enabling any optimizations as
2525 // these options induce language changes which must survive serialization
2526 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002527 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2528 options::OPT_fno_fast_math))
2529 if (!A->getOption().matches(options::OPT_fno_fast_math))
2530 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002531 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2532 if (A->getOption().matches(options::OPT_ffinite_math_only))
2533 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002534
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002535 // Decide whether to use verbose asm. Verbose assembly is the default on
2536 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002537 bool IsIntegratedAssemblerDefault =
2538 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002539 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002540 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002541 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002542 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002543
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002544 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002545 IsIntegratedAssemblerDefault))
2546 CmdArgs.push_back("-no-integrated-as");
2547
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002548 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2549 CmdArgs.push_back("-mdebug-pass");
2550 CmdArgs.push_back("Structure");
2551 }
2552 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2553 CmdArgs.push_back("-mdebug-pass");
2554 CmdArgs.push_back("Arguments");
2555 }
2556
John McCall8517abc2010-02-19 02:45:38 +00002557 // Enable -mconstructor-aliases except on darwin, where we have to
2558 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002559 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002560 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002561
John McCall7ef5cb32011-03-18 02:56:14 +00002562 // Darwin's kernel doesn't support guard variables; just die if we
2563 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002564 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002565 CmdArgs.push_back("-fforbid-guard-variables");
2566
Douglas Gregordbe39272011-02-01 15:15:22 +00002567 if (Args.hasArg(options::OPT_mms_bitfields)) {
2568 CmdArgs.push_back("-mms-bitfields");
2569 }
John McCall8517abc2010-02-19 02:45:38 +00002570
Daniel Dunbar306945d2009-09-16 06:17:29 +00002571 // This is a coarse approximation of what llvm-gcc actually does, both
2572 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2573 // complicated ways.
2574 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002575 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2576 options::OPT_fno_asynchronous_unwind_tables,
2577 (getToolChain().IsUnwindTablesDefault() ||
2578 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2579 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002580 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2581 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002582 CmdArgs.push_back("-munwind-tables");
2583
Chandler Carruth05fb5852012-11-21 23:40:23 +00002584 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002585
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002586 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2587 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002588 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002589 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002590
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002591 // FIXME: Handle -mtune=.
2592 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002593
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002594 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002595 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002596 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002597 }
2598
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002599 // Add the target cpu
2600 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2601 llvm::Triple ETriple(ETripleStr);
2602 std::string CPU = getCPUName(Args, ETriple);
2603 if (!CPU.empty()) {
2604 CmdArgs.push_back("-target-cpu");
2605 CmdArgs.push_back(Args.MakeArgString(CPU));
2606 }
2607
Rafael Espindolaeb265472013-08-21 21:59:03 +00002608 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2609 CmdArgs.push_back("-mfpmath");
2610 CmdArgs.push_back(A->getValue());
2611 }
2612
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002613 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002614 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002615
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002616 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002617 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002618 default:
2619 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002620
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002621 case llvm::Triple::arm:
2622 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002623 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002624 break;
2625
Eric Christopher0b26a612010-03-02 02:41:08 +00002626 case llvm::Triple::mips:
2627 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002628 case llvm::Triple::mips64:
2629 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002630 AddMIPSTargetArgs(Args, CmdArgs);
2631 break;
2632
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002633 case llvm::Triple::sparc:
2634 AddSparcTargetArgs(Args, CmdArgs);
2635 break;
2636
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002637 case llvm::Triple::x86:
2638 case llvm::Triple::x86_64:
2639 AddX86TargetArgs(Args, CmdArgs);
2640 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002641
2642 case llvm::Triple::hexagon:
2643 AddHexagonTargetArgs(Args, CmdArgs);
2644 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002645 }
2646
Hans Wennborg75958c42013-08-08 00:17:41 +00002647 // Add clang-cl arguments.
2648 if (getToolChain().getDriver().IsCLMode())
2649 AddClangCLArgs(Args, CmdArgs);
2650
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002651 // Pass the linker version in use.
2652 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2653 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002654 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002655 }
2656
Eric Christopherb7d97e92013-04-03 01:58:53 +00002657 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002658 CmdArgs.push_back("-momit-leaf-frame-pointer");
2659
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002660 // Explicitly error on some things we know we don't support and can't just
2661 // ignore.
2662 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002663 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2664 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002665 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002666 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002667 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002668 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2669 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002670 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002671 << Unsupported->getOption().getName();
2672 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002673 }
2674
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002675 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002676 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002677 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002678 CmdArgs.push_back("-header-include-file");
2679 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2680 D.CCPrintHeadersFilename : "-");
2681 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002682 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002683 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002684
Chad Rosierbe10f982011-08-02 17:58:04 +00002685 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002686 CmdArgs.push_back("-diagnostic-log-file");
2687 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2688 D.CCLogDiagnosticsFilename : "-");
2689 }
2690
Manman Ren17bdb0f2013-11-20 20:22:14 +00002691 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2692 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002693 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002694 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002695 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2696 // FIXME: we should support specifying dwarf version with
2697 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002698 CmdArgs.push_back("-gline-tables-only");
Adrian Prantl549c5142014-02-17 17:40:52 +00002699 // Default is dwarf-2 for darwin.
2700 if (getToolChain().getTriple().isOSDarwin())
2701 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002702 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002703 CmdArgs.push_back("-gdwarf-2");
2704 else if (A->getOption().matches(options::OPT_gdwarf_3))
2705 CmdArgs.push_back("-gdwarf-3");
2706 else if (A->getOption().matches(options::OPT_gdwarf_4))
2707 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002708 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00002709 !A->getOption().matches(options::OPT_ggdb0)) {
2710 // Default is dwarf-2 for darwin.
2711 if (getToolChain().getTriple().isOSDarwin())
2712 CmdArgs.push_back("-gdwarf-2");
2713 else
2714 CmdArgs.push_back("-g");
2715 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002716 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002717
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002718 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2719 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002720 if (Args.hasArg(options::OPT_gcolumn_info))
2721 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002722
Eric Christopher138c32b2013-09-13 22:37:55 +00002723 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002724 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2725 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002726 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002727 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002728 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002729 CmdArgs.push_back("-g");
2730 CmdArgs.push_back("-backend-option");
2731 CmdArgs.push_back("-split-dwarf=Enable");
2732 }
2733
Eric Christopher138c32b2013-09-13 22:37:55 +00002734 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2735 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2736 CmdArgs.push_back("-backend-option");
2737 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2738 }
Eric Christophereec89c22013-06-18 00:03:50 +00002739
Eric Christopher0d403d22014-02-14 01:27:03 +00002740 // -gdwarf-aranges turns on the emission of the aranges section in the
2741 // backend.
2742 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2743 CmdArgs.push_back("-backend-option");
2744 CmdArgs.push_back("-generate-arange-section");
2745 }
2746
David Blaikief36d9ba2014-01-27 18:52:43 +00002747 if (Args.hasFlag(options::OPT_fdebug_types_section,
2748 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002749 CmdArgs.push_back("-backend-option");
2750 CmdArgs.push_back("-generate-type-units");
2751 }
Eric Christophereec89c22013-06-18 00:03:50 +00002752
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002753 if (Args.hasFlag(options::OPT_ffunction_sections,
2754 options::OPT_fno_function_sections, false)) {
2755 CmdArgs.push_back("-ffunction-sections");
2756 }
2757
2758 if (Args.hasFlag(options::OPT_fdata_sections,
2759 options::OPT_fno_data_sections, false)) {
2760 CmdArgs.push_back("-fdata-sections");
2761 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002762
Chris Lattner3c77a352010-06-22 00:03:40 +00002763 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2764
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002765 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2766 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2767 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2768 D.Diag(diag::err_drv_argument_not_allowed_with)
2769 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2770
2771 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2772
2773 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2774 A->render(Args, CmdArgs);
2775 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2776 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2777
Nick Lewycky207bce32011-04-21 23:44:07 +00002778 if (Args.hasArg(options::OPT_ftest_coverage) ||
2779 Args.hasArg(options::OPT_coverage))
2780 CmdArgs.push_back("-femit-coverage-notes");
2781 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2782 Args.hasArg(options::OPT_coverage))
2783 CmdArgs.push_back("-femit-coverage-data");
2784
Nick Lewycky480cb992011-05-04 20:46:58 +00002785 if (C.getArgs().hasArg(options::OPT_c) ||
2786 C.getArgs().hasArg(options::OPT_S)) {
2787 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002788 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002789 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002790 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002791 SmallString<128> Pwd;
2792 if (!llvm::sys::fs::current_path(Pwd)) {
2793 llvm::sys::path::append(Pwd, CoverageFilename.str());
2794 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002795 }
2796 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002797 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002798 }
2799 }
2800
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002801 // Pass options for controlling the default header search paths.
2802 if (Args.hasArg(options::OPT_nostdinc)) {
2803 CmdArgs.push_back("-nostdsysteminc");
2804 CmdArgs.push_back("-nobuiltininc");
2805 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002806 if (Args.hasArg(options::OPT_nostdlibinc))
2807 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002808 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2809 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2810 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002811
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002812 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002813 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002814 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002815
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002816 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2817
Ted Kremenekf7639e12012-03-06 20:06:33 +00002818 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002819 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002820 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002821 options::OPT_ccc_arcmt_modify,
2822 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002823 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002824 switch (A->getOption().getID()) {
2825 default:
2826 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002827 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002828 CmdArgs.push_back("-arcmt-check");
2829 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002830 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002831 CmdArgs.push_back("-arcmt-modify");
2832 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002833 case options::OPT_ccc_arcmt_migrate:
2834 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002835 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002836 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002837
2838 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2839 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002840 break;
John McCalld70fb982011-06-15 23:25:17 +00002841 }
2842 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002843 } else {
2844 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2845 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2846 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002847 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002848
Ted Kremenekf7639e12012-03-06 20:06:33 +00002849 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2850 if (ARCMTEnabled) {
2851 D.Diag(diag::err_drv_argument_not_allowed_with)
2852 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2853 }
2854 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002855 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002856
2857 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002858 options::OPT_objcmt_migrate_subscripting,
2859 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002860 // None specified, means enable them all.
2861 CmdArgs.push_back("-objcmt-migrate-literals");
2862 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002863 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002864 } else {
2865 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2866 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002867 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002868 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002869 } else {
2870 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2871 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2872 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2873 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2874 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2875 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2876 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2877 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2878 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2879 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2880 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2881 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2882 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002883 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002884 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002885 }
2886
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002887 // Add preprocessing options like -I, -D, etc. if we are using the
2888 // preprocessor.
2889 //
2890 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002891 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002892 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002893
Rafael Espindolaa7431922011-07-21 23:40:37 +00002894 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2895 // that "The compiler can only warn and ignore the option if not recognized".
2896 // When building with ccache, it will pass -D options to clang even on
2897 // preprocessed inputs and configure concludes that -fPIC is not supported.
2898 Args.ClaimAllArgs(options::OPT_D);
2899
Alp Toker7874bdc2013-11-15 20:40:58 +00002900 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002901 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2902 if (A->getOption().matches(options::OPT_O4)) {
2903 CmdArgs.push_back("-O3");
2904 D.Diag(diag::warn_O4_is_O3);
2905 } else {
2906 A->render(Args, CmdArgs);
2907 }
2908 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002909
Chad Rosier86b82082012-12-12 20:06:31 +00002910 // Don't warn about unused -flto. This can happen when we're preprocessing or
2911 // precompiling.
2912 Args.ClaimAllArgs(options::OPT_flto);
2913
Daniel Dunbar945577c2009-10-29 02:24:45 +00002914 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002915 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2916 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002917 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002918 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002919
2920 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002921 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002922 //
2923 // If a std is supplied, only add -trigraphs if it follows the
2924 // option.
2925 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2926 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002927 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002928 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002929 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002930 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002931 else
2932 Std->render(Args, CmdArgs);
2933
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002934 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2935 options::OPT_trigraphs))
2936 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002937 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002938 } else {
2939 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002940 //
2941 // FIXME: Clang doesn't correctly handle -std= when the input language
2942 // doesn't match. For the time being just ignore this for C++ inputs;
2943 // eventually we want to do all the standard defaulting here instead of
2944 // splitting it between the driver and clang -cc1.
2945 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002946 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2947 "-std=", /*Joined=*/true);
2948 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2949 CmdArgs.push_back("-std=c++11");
2950
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002951 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002952 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002953
Richard Smith282b4492013-09-04 22:50:31 +00002954 // GCC's behavior for -Wwrite-strings is a bit strange:
2955 // * In C, this "warning flag" changes the types of string literals from
2956 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2957 // for the discarded qualifier.
2958 // * In C++, this is just a normal warning flag.
2959 //
2960 // Implementing this warning correctly in C is hard, so we follow GCC's
2961 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2962 // a non-const char* in C, rather than using this crude hack.
2963 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00002964 // FIXME: This should behave just like a warning flag, and thus should also
2965 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2966 Arg *WriteStrings =
2967 Args.getLastArg(options::OPT_Wwrite_strings,
2968 options::OPT_Wno_write_strings, options::OPT_w);
2969 if (WriteStrings &&
2970 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00002971 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002972 }
2973
Chandler Carruth61fbf622011-04-23 09:27:53 +00002974 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002975 // during C++ compilation, which it is by default. GCC keeps this define even
2976 // in the presence of '-w', match this behavior bug-for-bug.
2977 if (types::isCXX(InputType) &&
2978 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2979 true)) {
2980 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002981 }
2982
Chandler Carruthe0391482010-05-22 02:21:53 +00002983 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2984 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2985 if (Asm->getOption().matches(options::OPT_fasm))
2986 CmdArgs.push_back("-fgnu-keywords");
2987 else
2988 CmdArgs.push_back("-fno-gnu-keywords");
2989 }
2990
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002991 if (ShouldDisableCFI(Args, getToolChain()))
2992 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002993
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002994 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2995 CmdArgs.push_back("-fno-dwarf-directory-asm");
2996
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002997 if (ShouldDisableAutolink(Args, getToolChain()))
2998 CmdArgs.push_back("-fno-autolink");
2999
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003000 // Add in -fdebug-compilation-dir if necessary.
3001 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003002
Richard Smith9a568822011-11-21 19:36:32 +00003003 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3004 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003005 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003006 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003007 }
3008
Richard Smith79c927b2013-11-06 19:31:51 +00003009 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3010 CmdArgs.push_back("-foperator-arrow-depth");
3011 CmdArgs.push_back(A->getValue());
3012 }
3013
Richard Smith9a568822011-11-21 19:36:32 +00003014 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3015 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003016 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003017 }
3018
Richard Smitha3d3bd22013-05-08 02:12:03 +00003019 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3020 CmdArgs.push_back("-fconstexpr-steps");
3021 CmdArgs.push_back(A->getValue());
3022 }
3023
Richard Smithb3a14522013-02-22 01:59:51 +00003024 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3025 CmdArgs.push_back("-fbracket-depth");
3026 CmdArgs.push_back(A->getValue());
3027 }
3028
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003029 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3030 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003031 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003032 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003033 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3034 } else
3035 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003036 }
3037
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003038
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003039 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003040 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003041
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003042 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3043 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003044 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003045 }
David Chisnall5778fce2009-08-31 16:41:57 +00003046
Chris Lattnere23003d2010-01-09 21:54:33 +00003047 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3048 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003049 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003050 }
3051
Chris Lattnerb35583d2010-04-07 20:49:23 +00003052 CmdArgs.push_back("-ferror-limit");
3053 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003054 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003055 else
3056 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003057
Chandler Carrutha77a7272010-05-06 04:55:18 +00003058 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3059 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003060 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003061 }
3062
3063 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3064 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003065 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003066 }
3067
Richard Smithf6f003a2011-12-16 19:06:07 +00003068 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3069 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003070 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003071 }
3072
Daniel Dunbar2c978472009-11-04 06:24:47 +00003073 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003074 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003075 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003076 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003077 } else {
3078 // If -fmessage-length=N was not specified, determine whether this is a
3079 // terminal and, if so, implicitly define -fmessage-length appropriately.
3080 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003081 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003082 }
3083
John McCallb4a99d32013-02-19 01:57:35 +00003084 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3085 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3086 options::OPT_fvisibility_ms_compat)) {
3087 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3088 CmdArgs.push_back("-fvisibility");
3089 CmdArgs.push_back(A->getValue());
3090 } else {
3091 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3092 CmdArgs.push_back("-fvisibility");
3093 CmdArgs.push_back("hidden");
3094 CmdArgs.push_back("-ftype-visibility");
3095 CmdArgs.push_back("default");
3096 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003097 }
3098
Douglas Gregor08329632010-06-15 17:05:35 +00003099 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003100
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003101 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3102
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003103 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003104 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3105 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003106 CmdArgs.push_back("-ffreestanding");
3107
Daniel Dunbare357d562009-12-03 18:42:11 +00003108 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003109 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003110 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003111 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3112 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003113 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003114 // AltiVec language extensions aren't relevant for assembling.
3115 if (!isa<PreprocessJobAction>(JA) ||
3116 Output.getType() != types::TY_PP_Asm)
3117 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003118 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3119 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003120
Peter Collingbourne32701642013-11-01 18:16:25 +00003121 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3122 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003123
Will Dietz3676d562012-12-30 20:53:28 +00003124 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3125 options::OPT_fno_sanitize_recover,
3126 true))
3127 CmdArgs.push_back("-fno-sanitize-recover");
3128
Chad Rosierae229d52013-01-29 23:31:22 +00003129 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
3130 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3131 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3132 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3133
Eric Christopher459d2712013-02-19 06:16:53 +00003134 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003135 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003136 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003137 getToolChain().getArch() == llvm::Triple::ppc64 ||
3138 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003139 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003140 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003141
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003142 if (getToolChain().SupportsProfiling())
3143 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003144
3145 // -flax-vector-conversions is default.
3146 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3147 options::OPT_fno_lax_vector_conversions))
3148 CmdArgs.push_back("-fno-lax-vector-conversions");
3149
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003150 if (Args.getLastArg(options::OPT_fapple_kext))
3151 CmdArgs.push_back("-fapple-kext");
3152
David Blaikie690f21e2012-06-14 18:55:27 +00003153 if (Args.hasFlag(options::OPT_frewrite_includes,
3154 options::OPT_fno_rewrite_includes, false))
3155 CmdArgs.push_back("-frewrite-includes");
3156
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003157 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003158 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003159 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003160 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3161 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003162
3163 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3164 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003165 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003166 }
3167
Bob Wilson14adb362012-02-03 06:27:22 +00003168 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003169
Chandler Carruth6e501032011-03-27 00:04:55 +00003170 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3171 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3172 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3173 options::OPT_fno_wrapv)) {
3174 if (A->getOption().matches(options::OPT_fwrapv))
3175 CmdArgs.push_back("-fwrapv");
3176 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3177 options::OPT_fno_strict_overflow)) {
3178 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3179 CmdArgs.push_back("-fwrapv");
3180 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003181
3182 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3183 options::OPT_fno_reroll_loops))
3184 if (A->getOption().matches(options::OPT_freroll_loops))
3185 CmdArgs.push_back("-freroll-loops");
3186
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003187 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003188 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3189 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003190
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003191 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3192
Mahesha S6a682be42012-10-27 07:47:56 +00003193
Daniel Dunbar4930e332009-11-17 08:07:36 +00003194 // -stack-protector=0 is default.
3195 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003196 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3197 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003198 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003199 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003200 if (A->getOption().matches(options::OPT_fstack_protector))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003201 StackProtectorLevel = LangOptions::SSPOn;
3202 else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3203 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003204 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003205 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003206 } else {
3207 StackProtectorLevel =
3208 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3209 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003210 if (StackProtectorLevel) {
3211 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003212 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003213 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003214
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003215 // --param ssp-buffer-size=
3216 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3217 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003218 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003219 if (Str.startswith("ssp-buffer-size=")) {
3220 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003221 CmdArgs.push_back("-stack-protector-buffer-size");
3222 // FIXME: Verify the argument is a valid integer.
3223 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003224 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003225 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003226 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003227 }
3228
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003229 // Translate -mstackrealign
3230 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3231 false)) {
3232 CmdArgs.push_back("-backend-option");
3233 CmdArgs.push_back("-force-align-stack");
3234 }
3235 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3236 false)) {
3237 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3238 }
3239
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003240 if (Args.hasArg(options::OPT_mstack_alignment)) {
3241 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3242 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003243 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003244 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003245 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003246 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3247 options::OPT_munaligned_access)) {
3248 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3249 CmdArgs.push_back("-backend-option");
3250 CmdArgs.push_back("-arm-strict-align");
3251 } else {
3252 CmdArgs.push_back("-backend-option");
3253 CmdArgs.push_back("-arm-no-strict-align");
3254 }
Renato Golina146a482013-08-24 14:44:41 +00003255 }
Chad Rosier60027022012-11-09 17:29:19 +00003256 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003257
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003258 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3259 options::OPT_mno_restrict_it)) {
3260 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3261 CmdArgs.push_back("-backend-option");
3262 CmdArgs.push_back("-arm-restrict-it");
3263 } else {
3264 CmdArgs.push_back("-backend-option");
3265 CmdArgs.push_back("-arm-no-restrict-it");
3266 }
3267 }
3268
Daniel Dunbard18049a2009-04-07 21:16:11 +00003269 // Forward -f options with positive and negative forms; we translate
3270 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003271 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3272 StringRef fname = A->getValue();
3273 if (!llvm::sys::fs::exists(fname))
3274 D.Diag(diag::err_drv_no_such_file) << fname;
3275 else
3276 A->render(Args, CmdArgs);
3277 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003278
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003279 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003280 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003281 CmdArgs.push_back("-fapple-kext");
3282 if (!Args.hasArg(options::OPT_fbuiltin))
3283 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003284 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003285 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003286 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003287 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003288 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003289
Nuno Lopes13c88c72009-12-16 16:59:22 +00003290 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3291 options::OPT_fno_assume_sane_operator_new))
3292 CmdArgs.push_back("-fno-assume-sane-operator-new");
3293
Daniel Dunbar4930e332009-11-17 08:07:36 +00003294 // -fblocks=0 is default.
3295 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003296 getToolChain().IsBlocksDefault()) ||
3297 (Args.hasArg(options::OPT_fgnu_runtime) &&
3298 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3299 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003300 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003301
3302 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3303 !getToolChain().hasBlocksRuntime())
3304 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003305 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003306
Douglas Gregor226173a2012-01-18 15:19:58 +00003307 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3308 // users must also pass -fcxx-modules. The latter flag will disappear once the
3309 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003310 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003311 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3312 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3313 options::OPT_fno_cxx_modules,
3314 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003315 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003316 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003317 HaveModules = true;
3318 }
3319 }
3320
Daniel Jasper07e6c402013-08-05 20:26:17 +00003321 // -fmodule-maps enables module map processing (off by default) for header
3322 // checking. It is implied by -fmodules.
3323 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3324 false)) {
3325 CmdArgs.push_back("-fmodule-maps");
3326 }
3327
Daniel Jasperac42b752013-10-21 06:34:34 +00003328 // -fmodules-decluse checks that modules used are declared so (off by
3329 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003330 if (Args.hasFlag(options::OPT_fmodules_decluse,
3331 options::OPT_fno_modules_decluse,
3332 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003333 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003334 }
3335
Daniel Jasperac42b752013-10-21 06:34:34 +00003336 // -fmodule-name specifies the module that is currently being built (or
3337 // used for header checking by -fmodule-maps).
3338 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3339 A->claim();
3340 A->render(Args, CmdArgs);
3341 }
3342
3343 // -fmodule-map-file can be used to specify a file containing module
3344 // definitions.
3345 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3346 A->claim();
3347 A->render(Args, CmdArgs);
3348 }
3349
Douglas Gregor35b04d62013-02-07 19:01:24 +00003350 // If a module path was provided, pass it along. Otherwise, use a temporary
3351 // directory.
3352 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3353 A->claim();
3354 if (HaveModules) {
3355 A->render(Args, CmdArgs);
3356 }
3357 } else if (HaveModules) {
3358 SmallString<128> DefaultModuleCache;
3359 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3360 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003361 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3362 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003363 const char Arg[] = "-fmodules-cache-path=";
3364 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3365 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003366 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3367 }
3368
3369 // Pass through all -fmodules-ignore-macro arguments.
3370 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003371 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3372 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003373
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003374 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3375
3376 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3377 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3378 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3379
3380 Args.AddLastArg(CmdArgs,
3381 options::OPT_fmodules_validate_once_per_build_session);
3382 }
3383
John McCalldfea9982010-04-09 19:12:06 +00003384 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003385 if (Args.hasFlag(options::OPT_fno_access_control,
3386 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003387 false))
John McCall3155f572010-04-09 19:03:51 +00003388 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003389
Anders Carlssond470fef2010-11-21 00:09:52 +00003390 // -felide-constructors is the default.
3391 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3392 options::OPT_felide_constructors,
3393 false))
3394 CmdArgs.push_back("-fno-elide-constructors");
3395
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003396 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003397 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003398 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003399 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003400
Richard Smith52be6192012-11-05 22:04:41 +00003401 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003402 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003403 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003404 Args.getLastArg(options::OPT_mkernel,
3405 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003406 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003407 D.Diag(diag::err_drv_argument_not_allowed_with)
3408 << "-fsanitize=vptr" << NoRttiArg;
3409 }
3410 }
3411
Tony Linthicum76329bf2011-12-12 21:14:55 +00003412 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003413 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003414 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003415 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003416 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003417 CmdArgs.push_back("-fshort-enums");
3418
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003419 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003420 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003421 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003422 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003423
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003424 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003425 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003426 options::OPT_fno_threadsafe_statics))
3427 CmdArgs.push_back("-fno-threadsafe-statics");
3428
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003429 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003430 if (!Args.hasFlag(
3431 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3432 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3433 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003434 getToolChain().getArch() != llvm::Triple::hexagon &&
3435 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003436 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003437 CmdArgs.push_back("-fno-use-cxa-atexit");
3438
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003439 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003440 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003441 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3442 CmdArgs.push_back("-fms-extensions");
3443
Francois Pichet1b4f1632011-09-17 04:32:15 +00003444 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003445 if (Args.hasFlag(options::OPT_fms_compatibility,
3446 options::OPT_fno_ms_compatibility,
3447 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3448 Args.hasFlag(options::OPT_fms_extensions,
3449 options::OPT_fno_ms_extensions,
3450 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003451 CmdArgs.push_back("-fms-compatibility");
3452
Reid Klecknerc106fda2013-09-18 00:33:59 +00003453 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003454 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3455 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3456 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003457 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003458 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003459 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003460 else
3461 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3462 }
3463
3464
Eric Christopher5ecce122013-02-18 00:38:31 +00003465 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003466 if (Args.hasFlag(options::OPT_fborland_extensions,
3467 options::OPT_fno_borland_extensions, false))
3468 CmdArgs.push_back("-fborland-extensions");
3469
Francois Pichet02744872011-09-01 16:38:08 +00003470 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3471 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003472 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3473 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003474 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003475 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003476
Chandler Carruthe03aa552010-04-17 20:17:31 +00003477 // -fgnu-keywords default varies depending on language; only pass if
3478 // specified.
3479 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003480 options::OPT_fno_gnu_keywords))
3481 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003482
Rafael Espindola922a6242011-06-02 17:30:53 +00003483 if (Args.hasFlag(options::OPT_fgnu89_inline,
3484 options::OPT_fno_gnu89_inline,
3485 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003486 CmdArgs.push_back("-fgnu89-inline");
3487
Chad Rosier9c76d242012-03-15 22:31:42 +00003488 if (Args.hasArg(options::OPT_fno_inline))
3489 CmdArgs.push_back("-fno-inline");
3490
Chad Rosier64d6be92012-03-06 21:17:19 +00003491 if (Args.hasArg(options::OPT_fno_inline_functions))
3492 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003493
John McCall5fb5df92012-06-20 06:18:46 +00003494 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003495
John McCall5fb5df92012-06-20 06:18:46 +00003496 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003497 // legacy is the default. Except for deployment taget of 10.5,
3498 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3499 // gets ignored silently.
3500 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003501 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3502 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003503 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003504 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003505 if (getToolChain().UseObjCMixedDispatch())
3506 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3507 else
3508 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3509 }
3510 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003511
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003512 // When ObjectiveC legacy runtime is in effect on MacOSX,
3513 // turn on the option to do Array/Dictionary subscripting
3514 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003515 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3516 getToolChain().getTriple().isMacOSX() &&
3517 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3518 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003519 objcRuntime.isNeXTFamily())
3520 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3521
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003522 // -fencode-extended-block-signature=1 is default.
3523 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3524 CmdArgs.push_back("-fencode-extended-block-signature");
3525 }
3526
John McCall24fc0de2011-07-06 00:26:06 +00003527 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3528 // NOTE: This logic is duplicated in ToolChains.cpp.
3529 bool ARC = isObjCAutoRefCount(Args);
3530 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003531 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003532
John McCall24fc0de2011-07-06 00:26:06 +00003533 CmdArgs.push_back("-fobjc-arc");
3534
Chandler Carruth491db322011-11-04 07:34:47 +00003535 // FIXME: It seems like this entire block, and several around it should be
3536 // wrapped in isObjC, but for now we just use it here as this is where it
3537 // was being used previously.
3538 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3539 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3540 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3541 else
3542 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3543 }
3544
John McCall24fc0de2011-07-06 00:26:06 +00003545 // Allow the user to enable full exceptions code emission.
3546 // We define off for Objective-CC, on for Objective-C++.
3547 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3548 options::OPT_fno_objc_arc_exceptions,
3549 /*default*/ types::isCXX(InputType)))
3550 CmdArgs.push_back("-fobjc-arc-exceptions");
3551 }
3552
3553 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3554 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003555 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003556 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003557
John McCall24fc0de2011-07-06 00:26:06 +00003558 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3559 // takes precedence.
3560 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3561 if (!GCArg)
3562 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3563 if (GCArg) {
3564 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003565 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003566 << GCArg->getAsString(Args);
3567 } else if (getToolChain().SupportsObjCGC()) {
3568 GCArg->render(Args, CmdArgs);
3569 } else {
3570 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003571 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003572 << GCArg->getAsString(Args);
3573 }
3574 }
3575
John McCallb5f652e2011-06-22 00:53:57 +00003576 // Add exception args.
3577 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003578 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003579
3580 if (getToolChain().UseSjLjExceptions())
3581 CmdArgs.push_back("-fsjlj-exceptions");
3582
3583 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003584 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3585 options::OPT_fno_assume_sane_operator_new))
3586 CmdArgs.push_back("-fno-assume-sane-operator-new");
3587
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003588 // -fconstant-cfstrings is default, and may be subject to argument translation
3589 // on Darwin.
3590 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3591 options::OPT_fno_constant_cfstrings) ||
3592 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3593 options::OPT_mno_constant_cfstrings))
3594 CmdArgs.push_back("-fno-constant-cfstrings");
3595
John Thompsoned4e2952009-11-05 20:14:16 +00003596 // -fshort-wchar default varies depending on platform; only
3597 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00003598 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3599 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003600 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003601
Hans Wennborg28c96312013-07-31 23:39:13 +00003602 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003603 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003604 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003605 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003606 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003607
Daniel Dunbar096ed292011-10-05 21:04:55 +00003608 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3609 // -fno-pack-struct doesn't apply to -fpack-struct=.
3610 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003611 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003612 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003613 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003614 } else if (Args.hasFlag(options::OPT_fpack_struct,
3615 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003616 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003617 }
3618
Robert Lytton0e076492013-08-13 09:43:10 +00003619 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003620 if (!Args.hasArg(options::OPT_fcommon))
3621 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003622 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003623 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003624
Daniel Dunbard18049a2009-04-07 21:16:11 +00003625 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003626 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003627 CmdArgs.push_back("-fno-common");
3628
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003629 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003630 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003631 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003632 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003633 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003634 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3635
Daniel Dunbar6358d682010-10-15 22:30:42 +00003636 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3637 if (!Args.hasFlag(options::OPT_ffor_scope,
3638 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003639 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003640 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3641
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003642 // -fcaret-diagnostics is default.
3643 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3644 options::OPT_fno_caret_diagnostics, true))
3645 CmdArgs.push_back("-fno-caret-diagnostics");
3646
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003647 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003648 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003649 options::OPT_fno_diagnostics_fixit_info))
3650 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003651
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003652 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003653 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003654 options::OPT_fno_diagnostics_show_option))
3655 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003656
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003657 if (const Arg *A =
3658 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3659 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003660 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003661 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003662
Douglas Gregor643c9222011-05-21 17:07:29 +00003663 if (const Arg *A =
3664 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3665 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003666 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003667 }
3668
Chandler Carruthb6766f02011-03-27 01:50:55 +00003669 if (Arg *A = Args.getLastArg(
3670 options::OPT_fdiagnostics_show_note_include_stack,
3671 options::OPT_fno_diagnostics_show_note_include_stack)) {
3672 if (A->getOption().matches(
3673 options::OPT_fdiagnostics_show_note_include_stack))
3674 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3675 else
3676 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3677 }
3678
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003679 // Color diagnostics are the default, unless the terminal doesn't support
3680 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003681 // Support both clang's -f[no-]color-diagnostics and gcc's
3682 // -f[no-]diagnostics-colors[=never|always|auto].
3683 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3684 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3685 it != ie; ++it) {
3686 const Option &O = (*it)->getOption();
3687 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3688 !O.matches(options::OPT_fdiagnostics_color) &&
3689 !O.matches(options::OPT_fno_color_diagnostics) &&
3690 !O.matches(options::OPT_fno_diagnostics_color) &&
3691 !O.matches(options::OPT_fdiagnostics_color_EQ))
3692 continue;
3693
3694 (*it)->claim();
3695 if (O.matches(options::OPT_fcolor_diagnostics) ||
3696 O.matches(options::OPT_fdiagnostics_color)) {
3697 ShowColors = Colors_On;
3698 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3699 O.matches(options::OPT_fno_diagnostics_color)) {
3700 ShowColors = Colors_Off;
3701 } else {
3702 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3703 StringRef value((*it)->getValue());
3704 if (value == "always")
3705 ShowColors = Colors_On;
3706 else if (value == "never")
3707 ShowColors = Colors_Off;
3708 else if (value == "auto")
3709 ShowColors = Colors_Auto;
3710 else
3711 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3712 << ("-fdiagnostics-color=" + value).str();
3713 }
3714 }
3715 if (ShowColors == Colors_On ||
3716 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003717 CmdArgs.push_back("-fcolor-diagnostics");
3718
Nico Rieck7857d462013-09-11 00:38:02 +00003719 if (Args.hasArg(options::OPT_fansi_escape_codes))
3720 CmdArgs.push_back("-fansi-escape-codes");
3721
Daniel Dunbardb097022009-06-08 21:13:54 +00003722 if (!Args.hasFlag(options::OPT_fshow_source_location,
3723 options::OPT_fno_show_source_location))
3724 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003725
Douglas Gregor643c9222011-05-21 17:07:29 +00003726 if (!Args.hasFlag(options::OPT_fshow_column,
3727 options::OPT_fno_show_column,
3728 true))
3729 CmdArgs.push_back("-fno-show-column");
3730
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003731 if (!Args.hasFlag(options::OPT_fspell_checking,
3732 options::OPT_fno_spell_checking))
3733 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003734
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003735
Chad Rosierc8e56e82012-12-05 21:08:21 +00003736 // -fno-asm-blocks is default.
3737 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3738 false))
3739 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003740
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003741 // Enable vectorization per default according to the optimization level
3742 // selected. For optimization levels that want vectorization we use the alias
3743 // option to simplify the hasFlag logic.
3744 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3745 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003746 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003747 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003748 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003749 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003750
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003751 // -fslp-vectorize is default.
3752 if (Args.hasFlag(options::OPT_fslp_vectorize,
3753 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003754 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003755
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003756 // -fno-slp-vectorize-aggressive is default.
3757 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003758 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003759 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003760
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003761 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3762 A->render(Args, CmdArgs);
3763
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003764 // -fdollars-in-identifiers default varies depending on platform and
3765 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003766 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003767 options::OPT_fno_dollars_in_identifiers)) {
3768 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003769 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003770 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003771 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003772 }
3773
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003774 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3775 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003776 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003777 options::OPT_fno_unit_at_a_time)) {
3778 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003779 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003780 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003781
Eli Friedman055c9702011-11-02 01:53:16 +00003782 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3783 options::OPT_fno_apple_pragma_pack, false))
3784 CmdArgs.push_back("-fapple-pragma-pack");
3785
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003786 // le32-specific flags:
3787 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3788 // by default.
3789 if (getToolChain().getArch() == llvm::Triple::le32) {
3790 CmdArgs.push_back("-fno-math-builtin");
3791 }
3792
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003793 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003794 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003795 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003796#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003797 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003798 (getToolChain().getArch() == llvm::Triple::arm ||
3799 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003800 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3801 CmdArgs.push_back("-fno-builtin-strcat");
3802 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3803 CmdArgs.push_back("-fno-builtin-strcpy");
3804 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003805#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003806
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003807 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003808 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003809 options::OPT_traditional_cpp)) {
3810 if (isa<PreprocessJobAction>(JA))
3811 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003812 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003813 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003814 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003815
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003816 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003817 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003818
3819 // Handle serialized diagnostics.
3820 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3821 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003822 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003823 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003824
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003825 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3826 CmdArgs.push_back("-fretain-comments-from-system-headers");
3827
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003828 // Forward -fcomment-block-commands to -cc1.
3829 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003830 // Forward -fparse-all-comments to -cc1.
3831 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003832
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003833 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3834 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003835 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003836 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3837 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003838 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003839
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003840 // We translate this by hand to the -cc1 argument, since nightly test uses
3841 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003842 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003843 CmdArgs.push_back("-disable-llvm-optzns");
3844 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003845 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003846 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003847
Daniel Dunbard67a3222009-03-30 06:36:42 +00003848 if (Output.getType() == types::TY_Dependencies) {
3849 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003850 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003851 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003852 CmdArgs.push_back(Output.getFilename());
3853 } else {
3854 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003855 }
3856
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003857 for (InputInfoList::const_iterator
3858 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3859 const InputInfo &II = *it;
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003860
3861 addDashXForInput(Args, II, CmdArgs);
3862
Daniel Dunbarb440f562010-08-02 02:38:21 +00003863 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003864 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003865 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003866 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003867 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003868
Chris Lattnere9d7d782009-11-03 19:50:27 +00003869 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3870
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003871 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003872
3873 // Optionally embed the -cc1 level arguments into the debug info, for build
3874 // analysis.
3875 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003876 ArgStringList OriginalArgs;
3877 for (ArgList::const_iterator it = Args.begin(),
3878 ie = Args.end(); it != ie; ++it)
3879 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003880
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003881 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003882 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003883 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003884 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003885 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003886 }
3887 CmdArgs.push_back("-dwarf-debug-flags");
3888 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3889 }
3890
Eric Christopherd3804002013-02-22 20:12:52 +00003891 // Add the split debug info name to the command lines here so we
3892 // can propagate it to the backend.
3893 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003894 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003895 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003896 const char *SplitDwarfOut;
3897 if (SplitDwarf) {
3898 CmdArgs.push_back("-split-dwarf-file");
3899 SplitDwarfOut = SplitDebugName(Args, Inputs);
3900 CmdArgs.push_back(SplitDwarfOut);
3901 }
3902
3903 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00003904 if (Args.hasArg(options::OPT__SLASH_fallback) &&
3905 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00003906 tools::visualstudio::Compile CL(getToolChain());
3907 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3908 LinkingOutput);
3909 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3910 } else {
3911 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3912 }
3913
Daniel Dunbar17731772009-03-23 19:03:36 +00003914
Eric Christopherf1545832013-02-22 23:50:16 +00003915 // Handle the debug info splitting at object creation time if we're
3916 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003917 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003918 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003919 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003920
Roman Divacky178e01602011-02-10 16:52:03 +00003921 if (Arg *A = Args.getLastArg(options::OPT_pg))
3922 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003923 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003924 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003925
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003926 // Claim some arguments which clang supports automatically.
3927
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003928 // -fpch-preprocess is used with gcc to add a special marker in the output to
3929 // include the PCH file. Clang's PTH solution is completely transparent, so we
3930 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003931 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003932
Daniel Dunbar17731772009-03-23 19:03:36 +00003933 // Claim some arguments which clang doesn't support, but we don't
3934 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003935 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3936 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003937
Rafael Espindolab0092d72013-09-04 19:37:35 +00003938 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003939 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003940}
3941
John McCall5fb5df92012-06-20 06:18:46 +00003942/// Add options related to the Objective-C runtime/ABI.
3943///
3944/// Returns true if the runtime is non-fragile.
3945ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3946 ArgStringList &cmdArgs,
3947 RewriteKind rewriteKind) const {
3948 // Look for the controlling runtime option.
3949 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3950 options::OPT_fgnu_runtime,
3951 options::OPT_fobjc_runtime_EQ);
3952
3953 // Just forward -fobjc-runtime= to the frontend. This supercedes
3954 // options about fragility.
3955 if (runtimeArg &&
3956 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3957 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003958 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003959 if (runtime.tryParse(value)) {
3960 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3961 << value;
3962 }
3963
3964 runtimeArg->render(args, cmdArgs);
3965 return runtime;
3966 }
3967
3968 // Otherwise, we'll need the ABI "version". Version numbers are
3969 // slightly confusing for historical reasons:
3970 // 1 - Traditional "fragile" ABI
3971 // 2 - Non-fragile ABI, version 1
3972 // 3 - Non-fragile ABI, version 2
3973 unsigned objcABIVersion = 1;
3974 // If -fobjc-abi-version= is present, use that to set the version.
3975 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003976 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003977 if (value == "1")
3978 objcABIVersion = 1;
3979 else if (value == "2")
3980 objcABIVersion = 2;
3981 else if (value == "3")
3982 objcABIVersion = 3;
3983 else
3984 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3985 << value;
3986 } else {
3987 // Otherwise, determine if we are using the non-fragile ABI.
3988 bool nonFragileABIIsDefault =
3989 (rewriteKind == RK_NonFragile ||
3990 (rewriteKind == RK_None &&
3991 getToolChain().IsObjCNonFragileABIDefault()));
3992 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3993 options::OPT_fno_objc_nonfragile_abi,
3994 nonFragileABIIsDefault)) {
3995 // Determine the non-fragile ABI version to use.
3996#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3997 unsigned nonFragileABIVersion = 1;
3998#else
3999 unsigned nonFragileABIVersion = 2;
4000#endif
4001
4002 if (Arg *abiArg = args.getLastArg(
4003 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004004 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004005 if (value == "1")
4006 nonFragileABIVersion = 1;
4007 else if (value == "2")
4008 nonFragileABIVersion = 2;
4009 else
4010 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4011 << value;
4012 }
4013
4014 objcABIVersion = 1 + nonFragileABIVersion;
4015 } else {
4016 objcABIVersion = 1;
4017 }
4018 }
4019
4020 // We don't actually care about the ABI version other than whether
4021 // it's non-fragile.
4022 bool isNonFragile = objcABIVersion != 1;
4023
4024 // If we have no runtime argument, ask the toolchain for its default runtime.
4025 // However, the rewriter only really supports the Mac runtime, so assume that.
4026 ObjCRuntime runtime;
4027 if (!runtimeArg) {
4028 switch (rewriteKind) {
4029 case RK_None:
4030 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4031 break;
4032 case RK_Fragile:
4033 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4034 break;
4035 case RK_NonFragile:
4036 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4037 break;
4038 }
4039
4040 // -fnext-runtime
4041 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4042 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004043 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004044 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4045
4046 // Otherwise, build for a generic macosx port.
4047 } else {
4048 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4049 }
4050
4051 // -fgnu-runtime
4052 } else {
4053 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004054 // Legacy behaviour is to target the gnustep runtime if we are i
4055 // non-fragile mode or the GCC runtime in fragile mode.
4056 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004057 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004058 else
4059 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004060 }
4061
4062 cmdArgs.push_back(args.MakeArgString(
4063 "-fobjc-runtime=" + runtime.getAsString()));
4064 return runtime;
4065}
4066
Hans Wennborg75958c42013-08-08 00:17:41 +00004067void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4068 unsigned RTOptionID = options::OPT__SLASH_MT;
4069
Hans Wennborgf1a74252013-09-10 20:18:04 +00004070 if (Args.hasArg(options::OPT__SLASH_LDd))
4071 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4072 // but defining _DEBUG is sticky.
4073 RTOptionID = options::OPT__SLASH_MTd;
4074
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004075 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004076 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004077
Hans Wennborg75958c42013-08-08 00:17:41 +00004078 switch(RTOptionID) {
4079 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004080 if (Args.hasArg(options::OPT__SLASH_LDd))
4081 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004082 CmdArgs.push_back("-D_MT");
4083 CmdArgs.push_back("-D_DLL");
4084 CmdArgs.push_back("--dependent-lib=msvcrt");
4085 break;
4086 case options::OPT__SLASH_MDd:
4087 CmdArgs.push_back("-D_DEBUG");
4088 CmdArgs.push_back("-D_MT");
4089 CmdArgs.push_back("-D_DLL");
4090 CmdArgs.push_back("--dependent-lib=msvcrtd");
4091 break;
4092 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004093 if (Args.hasArg(options::OPT__SLASH_LDd))
4094 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004095 CmdArgs.push_back("-D_MT");
4096 CmdArgs.push_back("--dependent-lib=libcmt");
4097 break;
4098 case options::OPT__SLASH_MTd:
4099 CmdArgs.push_back("-D_DEBUG");
4100 CmdArgs.push_back("-D_MT");
4101 CmdArgs.push_back("--dependent-lib=libcmtd");
4102 break;
4103 default:
4104 llvm_unreachable("Unexpected option ID.");
4105 }
4106
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004107 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4108 // users want. The /Za flag to cl.exe turns this off, but it's not
4109 // implemented in clang.
4110 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004111
Hans Wennborg0fd62072013-08-09 00:32:23 +00004112 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4113 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004114
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004115 // RTTI is currently not supported, so disable it by default.
4116 if (!Args.hasArg(options::OPT_frtti, options::OPT_fno_rtti))
4117 CmdArgs.push_back("-fno-rtti");
4118
David Majnemer86c318f2014-02-11 21:05:00 +00004119 const Driver &D = getToolChain().getDriver();
4120 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4121 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4122 if (MostGeneralArg && BestCaseArg)
4123 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4124 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4125
4126 if (MostGeneralArg) {
4127 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4128 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4129 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4130
4131 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4132 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4133 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4134 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4135 << FirstConflict->getAsString(Args)
4136 << SecondConflict->getAsString(Args);
4137
4138 if (SingleArg)
4139 CmdArgs.push_back("-fms-memptr-rep=single");
4140 else if (MultipleArg)
4141 CmdArgs.push_back("-fms-memptr-rep=multiple");
4142 else
4143 CmdArgs.push_back("-fms-memptr-rep=virtual");
4144 }
4145
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004146 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4147 A->render(Args, CmdArgs);
4148
Hans Wennborg81f74482013-09-10 01:07:07 +00004149 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4150 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004151 if (Args.hasArg(options::OPT__SLASH_fallback))
4152 CmdArgs.push_back("msvc-fallback");
4153 else
4154 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004155 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004156}
4157
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004158void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004159 const InputInfo &Output,
4160 const InputInfoList &Inputs,
4161 const ArgList &Args,
4162 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004163 ArgStringList CmdArgs;
4164
4165 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4166 const InputInfo &Input = Inputs[0];
4167
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004168 // Don't warn about "clang -w -c foo.s"
4169 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004170 // and "clang -emit-llvm -c foo.s"
4171 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004172
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004173 // Invoke ourselves in -cc1as mode.
4174 //
4175 // FIXME: Implement custom jobs for internal actions.
4176 CmdArgs.push_back("-cc1as");
4177
4178 // Add the "effective" target triple.
4179 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004180 std::string TripleStr =
4181 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004182 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4183
4184 // Set the output mode, we currently only expect to be used as a real
4185 // assembler.
4186 CmdArgs.push_back("-filetype");
4187 CmdArgs.push_back("obj");
4188
Eric Christopher45f2e712012-12-18 00:31:10 +00004189 // Set the main file name, so that debug info works even with
4190 // -save-temps or preprocessed assembly.
4191 CmdArgs.push_back("-main-file-name");
4192 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4193
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004194 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004195 const llvm::Triple &Triple = getToolChain().getTriple();
4196 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004197 if (!CPU.empty()) {
4198 CmdArgs.push_back("-target-cpu");
4199 CmdArgs.push_back(Args.MakeArgString(CPU));
4200 }
4201
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004202 // Add the target features
4203 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004204 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004205
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004206 // Ignore explicit -force_cpusubtype_ALL option.
4207 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004208
Eric Christopherfc3ee562012-01-10 00:38:01 +00004209 // Determine the original source input.
4210 const Action *SourceAction = &JA;
4211 while (SourceAction->getKind() != Action::InputClass) {
4212 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4213 SourceAction = SourceAction->getInputs()[0];
4214 }
4215
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004216 // Forward -g and handle debug info related flags, assuming we are dealing
4217 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004218 if (SourceAction->getType() == types::TY_Asm ||
4219 SourceAction->getType() == types::TY_PP_Asm) {
4220 Args.ClaimAllArgs(options::OPT_g_Group);
4221 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4222 if (!A->getOption().matches(options::OPT_g0))
4223 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004224
4225 // Add the -fdebug-compilation-dir flag if needed.
4226 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004227
4228 // Set the AT_producer to the clang version when using the integrated
4229 // assembler on assembly source files.
4230 CmdArgs.push_back("-dwarf-debug-producer");
4231 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004232 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004233
4234 // Optionally embed the -cc1as level arguments into the debug info, for build
4235 // analysis.
4236 if (getToolChain().UseDwarfDebugFlags()) {
4237 ArgStringList OriginalArgs;
4238 for (ArgList::const_iterator it = Args.begin(),
4239 ie = Args.end(); it != ie; ++it)
4240 (*it)->render(Args, OriginalArgs);
4241
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004242 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004243 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4244 Flags += Exec;
4245 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4246 Flags += " ";
4247 Flags += OriginalArgs[i];
4248 }
4249 CmdArgs.push_back("-dwarf-debug-flags");
4250 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4251 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004252
4253 // FIXME: Add -static support, once we have it.
4254
David Blaikie372d9502014-01-17 03:17:40 +00004255 // Consume all the warning flags. Usually this would be handled more
4256 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4257 // doesn't handle that so rather than warning about unused flags that are
4258 // actually used, we'll lie by omission instead.
4259 // FIXME: Stop lying and consume only the appropriate driver flags
4260 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4261 ie = Args.filtered_end();
4262 it != ie; ++it)
4263 (*it)->claim();
4264
David Blaikie9260ed62013-07-25 21:19:01 +00004265 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4266 getToolChain().getDriver());
4267
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004268 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004269
4270 assert(Output.isFilename() && "Unexpected lipo output.");
4271 CmdArgs.push_back("-o");
4272 CmdArgs.push_back(Output.getFilename());
4273
Daniel Dunbarb440f562010-08-02 02:38:21 +00004274 assert(Input.isFilename() && "Invalid input.");
4275 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004276
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004277 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004278 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004279
4280 // Handle the debug info splitting at object creation time if we're
4281 // creating an object.
4282 // TODO: Currently only works on linux with newer objcopy.
4283 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004284 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004285 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4286 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004287}
4288
Daniel Dunbara3246a02009-03-18 08:07:30 +00004289void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004290 const InputInfo &Output,
4291 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004292 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004293 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004294 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004295 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004296
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004297 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004298 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004299 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004300 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004301 // Don't forward any -g arguments to assembly steps.
4302 if (isa<AssembleJobAction>(JA) &&
4303 A->getOption().matches(options::OPT_g_Group))
4304 continue;
4305
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004306 // Don't forward any -W arguments to assembly and link steps.
4307 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4308 A->getOption().matches(options::OPT_W_Group))
4309 continue;
4310
Daniel Dunbar2da02722009-03-19 07:55:12 +00004311 // It is unfortunate that we have to claim here, as this means
4312 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004313 // platforms using a generic gcc, even if we are just using gcc
4314 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004315 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004316 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004317 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004318 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004319
Daniel Dunbar4e295052010-01-25 22:35:08 +00004320 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004321
4322 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004323 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004324 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004325 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004326
4327 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004328 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004329 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004330 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004331 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004332 else if (Arch == llvm::Triple::ppc64le)
4333 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004334 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004335 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004336 }
4337
Daniel Dunbar5716d872009-05-02 21:41:52 +00004338 // Try to force gcc to match the tool chain we want, if we recognize
4339 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004340 //
4341 // FIXME: The triple class should directly provide the information we want
4342 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004343 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004344 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004345 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4346 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004347 CmdArgs.push_back("-m64");
4348
Daniel Dunbarb440f562010-08-02 02:38:21 +00004349 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004350 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004351 CmdArgs.push_back(Output.getFilename());
4352 } else {
4353 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004354 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004355 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004356
Tony Linthicum76329bf2011-12-12 21:14:55 +00004357 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4358 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004359
4360 // Only pass -x if gcc will understand it; otherwise hope gcc
4361 // understands the suffix correctly. The main use case this would go
4362 // wrong in is for linker inputs if they happened to have an odd
4363 // suffix; really the only way to get this to happen is a command
4364 // like '-x foobar a.c' which will treat a.c like a linker input.
4365 //
4366 // FIXME: For the linker case specifically, can we safely convert
4367 // inputs into '-Wl,' options?
4368 for (InputInfoList::const_iterator
4369 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4370 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004371
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004372 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004373 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4374 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004375 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004376 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004377 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004378 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004379 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004380 else if (II.getType() == types::TY_ModuleFile)
4381 D.Diag(diag::err_drv_no_module_support)
4382 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004383
Daniel Dunbara3246a02009-03-18 08:07:30 +00004384 if (types::canTypeBeUserSpecified(II.getType())) {
4385 CmdArgs.push_back("-x");
4386 CmdArgs.push_back(types::getTypeName(II.getType()));
4387 }
4388
Daniel Dunbarb440f562010-08-02 02:38:21 +00004389 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004390 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004391 else {
4392 const Arg &A = II.getInputArg();
4393
4394 // Reverse translate some rewritten options.
4395 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4396 CmdArgs.push_back("-lstdc++");
4397 continue;
4398 }
4399
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004400 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004401 A.render(Args, CmdArgs);
4402 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004403 }
4404
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004405 const std::string customGCCName = D.getCCCGenericGCCName();
4406 const char *GCCName;
4407 if (!customGCCName.empty())
4408 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004409 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004410 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004411 } else
4412 GCCName = "gcc";
4413
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004414 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004415 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004417}
4418
Daniel Dunbar4e295052010-01-25 22:35:08 +00004419void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4420 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004421 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004422}
4423
Daniel Dunbar4e295052010-01-25 22:35:08 +00004424void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4425 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004426 const Driver &D = getToolChain().getDriver();
4427
Daniel Dunbar4e295052010-01-25 22:35:08 +00004428 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004429 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4430 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004431 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004432 else {
4433 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004434 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004435 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004436
Daniel Dunbar4e295052010-01-25 22:35:08 +00004437 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004438 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004439}
4440
Daniel Dunbar4e295052010-01-25 22:35:08 +00004441void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4442 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004443 // The types are (hopefully) good enough.
4444}
4445
Tony Linthicum76329bf2011-12-12 21:14:55 +00004446// Hexagon tools start.
4447void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4448 ArgStringList &CmdArgs) const {
4449
4450}
4451void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4452 const InputInfo &Output,
4453 const InputInfoList &Inputs,
4454 const ArgList &Args,
4455 const char *LinkingOutput) const {
4456
4457 const Driver &D = getToolChain().getDriver();
4458 ArgStringList CmdArgs;
4459
4460 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004461 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004462 CmdArgs.push_back(Args.MakeArgString(MarchString));
4463
4464 RenderExtraToolArgs(JA, CmdArgs);
4465
4466 if (Output.isFilename()) {
4467 CmdArgs.push_back("-o");
4468 CmdArgs.push_back(Output.getFilename());
4469 } else {
4470 assert(Output.isNothing() && "Unexpected output");
4471 CmdArgs.push_back("-fsyntax-only");
4472 }
4473
Matthew Curtise8f80a12012-12-06 17:49:03 +00004474 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4475 if (!SmallDataThreshold.empty())
4476 CmdArgs.push_back(
4477 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004478
Matthew Curtise5df3812012-12-07 17:23:04 +00004479 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4480 options::OPT_Xassembler);
4481
Tony Linthicum76329bf2011-12-12 21:14:55 +00004482 // Only pass -x if gcc will understand it; otherwise hope gcc
4483 // understands the suffix correctly. The main use case this would go
4484 // wrong in is for linker inputs if they happened to have an odd
4485 // suffix; really the only way to get this to happen is a command
4486 // like '-x foobar a.c' which will treat a.c like a linker input.
4487 //
4488 // FIXME: For the linker case specifically, can we safely convert
4489 // inputs into '-Wl,' options?
4490 for (InputInfoList::const_iterator
4491 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4492 const InputInfo &II = *it;
4493
4494 // Don't try to pass LLVM or AST inputs to a generic gcc.
4495 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4496 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4497 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4498 << getToolChain().getTripleString();
4499 else if (II.getType() == types::TY_AST)
4500 D.Diag(clang::diag::err_drv_no_ast_support)
4501 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004502 else if (II.getType() == types::TY_ModuleFile)
4503 D.Diag(diag::err_drv_no_module_support)
4504 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004505
4506 if (II.isFilename())
4507 CmdArgs.push_back(II.getFilename());
4508 else
4509 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4510 II.getInputArg().render(Args, CmdArgs);
4511 }
4512
4513 const char *GCCName = "hexagon-as";
4514 const char *Exec =
4515 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4516 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4517
4518}
4519void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4520 ArgStringList &CmdArgs) const {
4521 // The types are (hopefully) good enough.
4522}
4523
4524void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4525 const InputInfo &Output,
4526 const InputInfoList &Inputs,
4527 const ArgList &Args,
4528 const char *LinkingOutput) const {
4529
Matthew Curtise689b052012-12-06 15:46:07 +00004530 const toolchains::Hexagon_TC& ToolChain =
4531 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4532 const Driver &D = ToolChain.getDriver();
4533
Tony Linthicum76329bf2011-12-12 21:14:55 +00004534 ArgStringList CmdArgs;
4535
Matthew Curtise689b052012-12-06 15:46:07 +00004536 //----------------------------------------------------------------------------
4537 //
4538 //----------------------------------------------------------------------------
4539 bool hasStaticArg = Args.hasArg(options::OPT_static);
4540 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004541 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004542 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4543 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4544 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4545 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004546
Matthew Curtise689b052012-12-06 15:46:07 +00004547 //----------------------------------------------------------------------------
4548 // Silence warnings for various options
4549 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004550
Matthew Curtise689b052012-12-06 15:46:07 +00004551 Args.ClaimAllArgs(options::OPT_g_Group);
4552 Args.ClaimAllArgs(options::OPT_emit_llvm);
4553 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4554 // handled somewhere else.
4555 Args.ClaimAllArgs(options::OPT_static_libgcc);
4556
4557 //----------------------------------------------------------------------------
4558 //
4559 //----------------------------------------------------------------------------
4560 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4561 e = ToolChain.ExtraOpts.end();
4562 i != e; ++i)
4563 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004564
Matthew Curtisf10a5952012-12-06 14:16:43 +00004565 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4566 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004567
Matthew Curtise689b052012-12-06 15:46:07 +00004568 if (buildingLib) {
4569 CmdArgs.push_back("-shared");
4570 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4571 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004572 }
4573
Matthew Curtise689b052012-12-06 15:46:07 +00004574 if (hasStaticArg)
4575 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004576
Matthew Curtise8f80a12012-12-06 17:49:03 +00004577 if (buildPIE && !buildingLib)
4578 CmdArgs.push_back("-pie");
4579
4580 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4581 if (!SmallDataThreshold.empty()) {
4582 CmdArgs.push_back(
4583 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4584 }
4585
Matthew Curtise689b052012-12-06 15:46:07 +00004586 //----------------------------------------------------------------------------
4587 //
4588 //----------------------------------------------------------------------------
4589 CmdArgs.push_back("-o");
4590 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004591
Matthew Curtise689b052012-12-06 15:46:07 +00004592 const std::string MarchSuffix = "/" + MarchString;
4593 const std::string G0Suffix = "/G0";
4594 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4595 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4596 + "/";
4597 const std::string StartFilesDir = RootDir
4598 + "hexagon/lib"
4599 + (buildingLib
4600 ? MarchG0Suffix : MarchSuffix);
4601
4602 //----------------------------------------------------------------------------
4603 // moslib
4604 //----------------------------------------------------------------------------
4605 std::vector<std::string> oslibs;
4606 bool hasStandalone= false;
4607
4608 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4609 ie = Args.filtered_end(); it != ie; ++it) {
4610 (*it)->claim();
4611 oslibs.push_back((*it)->getValue());
4612 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004613 }
Matthew Curtise689b052012-12-06 15:46:07 +00004614 if (oslibs.empty()) {
4615 oslibs.push_back("standalone");
4616 hasStandalone = true;
4617 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004618
Matthew Curtise689b052012-12-06 15:46:07 +00004619 //----------------------------------------------------------------------------
4620 // Start Files
4621 //----------------------------------------------------------------------------
4622 if (incStdLib && incStartFiles) {
4623
4624 if (!buildingLib) {
4625 if (hasStandalone) {
4626 CmdArgs.push_back(
4627 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4628 }
4629 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4630 }
4631 std::string initObj = useShared ? "/initS.o" : "/init.o";
4632 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4633 }
4634
4635 //----------------------------------------------------------------------------
4636 // Library Search Paths
4637 //----------------------------------------------------------------------------
4638 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4639 for (ToolChain::path_list::const_iterator
4640 i = LibPaths.begin(),
4641 e = LibPaths.end();
4642 i != e;
4643 ++i)
4644 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4645
4646 //----------------------------------------------------------------------------
4647 //
4648 //----------------------------------------------------------------------------
4649 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4650 Args.AddAllArgs(CmdArgs, options::OPT_e);
4651 Args.AddAllArgs(CmdArgs, options::OPT_s);
4652 Args.AddAllArgs(CmdArgs, options::OPT_t);
4653 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4654
4655 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4656
4657 //----------------------------------------------------------------------------
4658 // Libraries
4659 //----------------------------------------------------------------------------
4660 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004661 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004662 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4663 CmdArgs.push_back("-lm");
4664 }
4665
4666 CmdArgs.push_back("--start-group");
4667
4668 if (!buildingLib) {
4669 for(std::vector<std::string>::iterator i = oslibs.begin(),
4670 e = oslibs.end(); i != e; ++i)
4671 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4672 CmdArgs.push_back("-lc");
4673 }
4674 CmdArgs.push_back("-lgcc");
4675
4676 CmdArgs.push_back("--end-group");
4677 }
4678
4679 //----------------------------------------------------------------------------
4680 // End files
4681 //----------------------------------------------------------------------------
4682 if (incStdLib && incStartFiles) {
4683 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4684 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4685 }
4686
4687 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004688 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004689}
4690// Hexagon tools end.
4691
Bernard Ogden31561762013-12-12 13:27:11 +00004692/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4693//
4694// FIXME: tblgen this.
4695const char *arm::getARMCPUForMArch(const ArgList &Args,
4696 const llvm::Triple &Triple) {
4697 StringRef MArch;
4698 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4699 // Otherwise, if we have -march= choose the base CPU for that arch.
4700 MArch = A->getValue();
4701 } else {
4702 // Otherwise, use the Arch from the triple.
4703 MArch = Triple.getArchName();
4704 }
4705
4706 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004707 if (MArch == "native") {
4708 std::string CPU = llvm::sys::getHostCPUName();
4709 if (CPU != "generic") {
4710 // Translate the native cpu into the architecture. The switch below will
4711 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004712 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004713 }
4714 }
4715
4716 if (Triple.getOS() == llvm::Triple::NetBSD) {
4717 if (MArch == "armv6")
4718 return "arm1176jzf-s";
4719 }
4720
4721 const char *result = llvm::StringSwitch<const char *>(MArch)
4722 .Cases("armv2", "armv2a","arm2")
4723 .Case("armv3", "arm6")
4724 .Case("armv3m", "arm7m")
4725 .Case("armv4", "strongarm")
4726 .Case("armv4t", "arm7tdmi")
4727 .Case("thumbv4t", "arm7tdmi")
4728 .Cases("armv5", "armv5t", "arm10tdmi")
4729 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4730 .Cases("armv5e", "armv5te", "arm1022e")
4731 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4732 .Case("armv5tej", "arm926ej-s")
4733 .Case("thumbv5tej", "arm926ej-s")
4734 .Cases("armv6", "armv6k", "arm1136jf-s")
4735 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4736 .Case("armv6j", "arm1136j-s")
4737 .Case("thumbv6j", "arm1136j-s")
4738 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4739 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4740 .Case("armv6t2", "arm1156t2-s")
4741 .Case("thumbv6t2", "arm1156t2-s")
4742 .Cases("armv6m", "armv6-m", "cortex-m0")
4743 .Case("thumbv6m", "cortex-m0")
4744 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
4745 .Cases("thumbv7", "thumbv7a", "cortex-a8")
4746 .Cases("armv7l", "armv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004747 .Cases("armv7s", "armv7-s", "swift")
4748 .Cases("armv7r", "armv7-r", "cortex-r4")
4749 .Case("thumbv7r", "cortex-r4")
4750 .Cases("armv7m", "armv7-m", "cortex-m3")
4751 .Case("thumbv7m", "cortex-m3")
4752 .Cases("armv7em", "armv7e-m", "cortex-m4")
4753 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
4754 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
4755 .Cases("thumbv8", "thumbv8a", "cortex-a53")
4756 .Case("ep9312", "ep9312")
4757 .Case("iwmmxt", "iwmmxt")
4758 .Case("xscale", "xscale")
4759 // If all else failed, return the most base CPU with thumb interworking
4760 // supported by LLVM.
4761 .Default(0);
4762
4763 if (result)
4764 return result;
4765
Joerg Sonnenberger695fdb32014-02-21 21:53:33 +00004766 switch (Triple.getOS()) {
4767 case llvm::Triple::NetBSD:
4768 switch (Triple.getEnvironment()) {
4769 case llvm::Triple::GNUEABIHF:
4770 case llvm::Triple::GNUEABI:
4771 case llvm::Triple::EABIHF:
4772 case llvm::Triple::EABI:
4773 return "arm926ej-s";
4774 default:
4775 return "strongarm";
4776 }
4777 default:
4778 switch (Triple.getEnvironment()) {
4779 case llvm::Triple::EABIHF:
4780 case llvm::Triple::GNUEABIHF:
4781 return "arm1176jzf-s";
4782 default:
4783 return "arm7tdmi";
4784 }
4785 }
Bernard Ogden31561762013-12-12 13:27:11 +00004786}
4787
4788/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004789StringRef arm::getARMTargetCPU(const ArgList &Args,
4790 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004791 // FIXME: Warn on inconsistent use of -mcpu and -march.
4792 // If we have -mcpu=, use that.
4793 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4794 StringRef MCPU = A->getValue();
4795 // Handle -mcpu=native.
4796 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004797 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004798 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004799 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004800 }
4801
4802 return getARMCPUForMArch(Args, Triple);
4803}
4804
4805/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4806/// CPU.
4807//
4808// FIXME: This is redundant with -mcpu, why does LLVM use this.
4809// FIXME: tblgen this, or kill it!
4810const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4811 return llvm::StringSwitch<const char *>(CPU)
4812 .Case("strongarm", "v4")
4813 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4814 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4815 .Cases("arm920", "arm920t", "arm922t", "v4t")
4816 .Cases("arm940t", "ep9312","v4t")
4817 .Cases("arm10tdmi", "arm1020t", "v5")
4818 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4819 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4820 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4821 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4822 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4823 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004824 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004825 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4826 .Cases("cortex-r4", "cortex-r5", "v7r")
4827 .Case("cortex-m0", "v6m")
4828 .Case("cortex-m3", "v7m")
4829 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00004830 .Case("swift", "v7s")
4831 .Cases("cortex-a53", "cortex-a57", "v8")
4832 .Default("");
4833}
4834
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004835bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
4836 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
4837 return A && (A->getValue() == StringRef(Value));
4838}
4839
Tim Northover157d9112014-01-16 08:48:16 +00004840llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004841 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4842 // archs which Darwin doesn't use.
4843
4844 // The matching this routine does is fairly pointless, since it is neither the
4845 // complete architecture list, nor a reasonable subset. The problem is that
4846 // historically the driver driver accepts this and also ties its -march=
4847 // handling to the architecture name, so we need to be careful before removing
4848 // support for it.
4849
4850 // This code must be kept in sync with Clang's Darwin specific argument
4851 // translation.
4852
4853 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4854 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4855 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4856 .Case("ppc64", llvm::Triple::ppc64)
4857 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4858 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4859 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004860 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004861 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004862 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00004863 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00004864 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004865 .Case("r600", llvm::Triple::r600)
4866 .Case("nvptx", llvm::Triple::nvptx)
4867 .Case("nvptx64", llvm::Triple::nvptx64)
4868 .Case("amdil", llvm::Triple::amdil)
4869 .Case("spir", llvm::Triple::spir)
4870 .Default(llvm::Triple::UnknownArch);
4871}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004872
Tim Northover157d9112014-01-16 08:48:16 +00004873void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
4874 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
4875 T.setArch(Arch);
4876
4877 if (Str == "x86_64h")
4878 T.setArchName(Str);
4879 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
4880 T.setOS(llvm::Triple::UnknownOS);
4881 T.setEnvironment(llvm::Triple::MachO);
4882 }
4883}
4884
Bob Wilsondecc03e2012-11-23 06:14:39 +00004885const char *Clang::getBaseInputName(const ArgList &Args,
4886 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004887 return Args.MakeArgString(
4888 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004889}
4890
Bob Wilsondecc03e2012-11-23 06:14:39 +00004891const char *Clang::getBaseInputStem(const ArgList &Args,
4892 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004893 const char *Str = getBaseInputName(Args, Inputs);
4894
Chris Lattner906bb902011-01-16 08:14:11 +00004895 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004896 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004897
4898 return Str;
4899}
4900
Bob Wilsondecc03e2012-11-23 06:14:39 +00004901const char *Clang::getDependencyFileName(const ArgList &Args,
4902 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004903 // FIXME: Think about this more.
4904 std::string Res;
4905
4906 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004907 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004908 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004909 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004910 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004911 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004912 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004913}
4914
Daniel Dunbarbe220842009-03-20 16:06:39 +00004915void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004916 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004917 const InputInfoList &Inputs,
4918 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004919 const char *LinkingOutput) const {
4920 ArgStringList CmdArgs;
4921
4922 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4923 const InputInfo &Input = Inputs[0];
4924
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004925 // Determine the original source input.
4926 const Action *SourceAction = &JA;
4927 while (SourceAction->getKind() != Action::InputClass) {
4928 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4929 SourceAction = SourceAction->getInputs()[0];
4930 }
4931
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00004932 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00004933 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004934 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4935 // FIXME: at run-time detect assembler capabilities or rely on version
4936 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00004937 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004938 const llvm::Triple &T(getToolChain().getTriple());
4939 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004940 CmdArgs.push_back("-Q");
4941 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004942
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004943 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004944 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004945 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004946 if (Args.hasArg(options::OPT_gstabs))
4947 CmdArgs.push_back("--gstabs");
4948 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004949 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004950 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004951
Daniel Dunbarbe220842009-03-20 16:06:39 +00004952 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00004953 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004954
Daniel Dunbar6d484762010-07-22 01:47:22 +00004955 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004956 if (getToolChain().getArch() == llvm::Triple::x86 ||
4957 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004958 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4959 CmdArgs.push_back("-force_cpusubtype_ALL");
4960
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004961 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004962 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004963 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00004964 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004965 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004966 CmdArgs.push_back("-static");
4967
Daniel Dunbarbe220842009-03-20 16:06:39 +00004968 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4969 options::OPT_Xassembler);
4970
4971 assert(Output.isFilename() && "Unexpected lipo output.");
4972 CmdArgs.push_back("-o");
4973 CmdArgs.push_back(Output.getFilename());
4974
Daniel Dunbarb440f562010-08-02 02:38:21 +00004975 assert(Input.isFilename() && "Invalid input.");
4976 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004977
4978 // asm_final spec is empty.
4979
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004980 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004981 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004982 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004983}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004984
Tim Northover157d9112014-01-16 08:48:16 +00004985void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00004986
Tim Northover157d9112014-01-16 08:48:16 +00004987void darwin::MachOTool::AddMachOArch(const ArgList &Args,
4988 ArgStringList &CmdArgs) const {
4989 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004990
Daniel Dunbarc1964212009-03-26 16:23:12 +00004991 // Derived from darwin_arch spec.
4992 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004993 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004994
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004995 // FIXME: Is this needed anymore?
4996 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004997 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004998}
4999
Bill Wendling3b2000f2012-10-02 18:02:50 +00005000bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5001 // We only need to generate a temp path for LTO if we aren't compiling object
5002 // files. When compiling source files, we run 'dsymutil' after linking. We
5003 // don't run 'dsymutil' when compiling object files.
5004 for (InputInfoList::const_iterator
5005 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
5006 if (it->getType() != types::TY_Object)
5007 return true;
5008
5009 return false;
5010}
5011
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005012void darwin::Link::AddLinkArgs(Compilation &C,
5013 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005014 ArgStringList &CmdArgs,
5015 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005016 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005017 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005018
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005019 unsigned Version[3] = { 0, 0, 0 };
5020 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5021 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005022 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005023 Version[1], Version[2], HadExtra) ||
5024 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005025 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005026 << A->getAsString(Args);
5027 }
5028
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005029 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005030 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005031 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5032 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005033
Bob Wilson3d27dad2013-08-02 22:25:34 +00005034 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5035 CmdArgs.push_back("-export_dynamic");
5036
Bill Wendling313b6bf2012-11-16 23:03:00 +00005037 // If we are using LTO, then automatically create a temporary file path for
5038 // the linker to use, so that it's lifetime will extend past a possible
5039 // dsymutil step.
5040 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5041 const char *TmpPath = C.getArgs().MakeArgString(
5042 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5043 C.addTempFile(TmpPath);
5044 CmdArgs.push_back("-object_path_lto");
5045 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005046 }
5047
Daniel Dunbarc1964212009-03-26 16:23:12 +00005048 // Derived from the "link" spec.
5049 Args.AddAllArgs(CmdArgs, options::OPT_static);
5050 if (!Args.hasArg(options::OPT_static))
5051 CmdArgs.push_back("-dynamic");
5052 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5053 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5054 // here. How do we wish to handle such things?
5055 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005056
Daniel Dunbarc1964212009-03-26 16:23:12 +00005057 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005058 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005059 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005060 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005061
5062 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5063 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5064 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5065
5066 Arg *A;
5067 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5068 (A = Args.getLastArg(options::OPT_current__version)) ||
5069 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005070 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005071 << A->getAsString(Args) << "-dynamiclib";
5072
5073 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5074 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5075 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5076 } else {
5077 CmdArgs.push_back("-dylib");
5078
5079 Arg *A;
5080 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5081 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5082 (A = Args.getLastArg(options::OPT_client__name)) ||
5083 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5084 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5085 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005086 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005087 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005088
Daniel Dunbarc1964212009-03-26 16:23:12 +00005089 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5090 "-dylib_compatibility_version");
5091 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5092 "-dylib_current_version");
5093
Tim Northover157d9112014-01-16 08:48:16 +00005094 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005095
5096 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5097 "-dylib_install_name");
5098 }
5099
5100 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5101 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5102 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005103 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005104 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005105 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5106 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5107 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5108 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5109 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5110 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005111 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005112 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5113 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5114 Args.AddAllArgs(CmdArgs, options::OPT_init);
5115
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005116 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005117 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005118
Daniel Dunbarc1964212009-03-26 16:23:12 +00005119 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5120 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5121 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5122 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5123 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005124
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005125 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5126 options::OPT_fno_pie,
5127 options::OPT_fno_PIE)) {
5128 if (A->getOption().matches(options::OPT_fpie) ||
5129 A->getOption().matches(options::OPT_fPIE))
5130 CmdArgs.push_back("-pie");
5131 else
5132 CmdArgs.push_back("-no_pie");
5133 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005134
5135 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5136 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5137 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5138 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5139 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5140 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5141 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5142 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5143 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5144 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5145 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5146 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5147 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5148 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5149 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5150 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005151
Daniel Dunbar84384642011-05-02 21:03:47 +00005152 // Give --sysroot= preference, over the Apple specific behavior to also use
5153 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005154 StringRef sysroot = C.getSysRoot();
5155 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005156 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005157 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005158 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5159 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005160 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005161 }
5162
Daniel Dunbarc1964212009-03-26 16:23:12 +00005163 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5164 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5165 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5166 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5167 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005168 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005169 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5170 Args.AddAllArgs(CmdArgs, options::OPT_y);
5171 Args.AddLastArg(CmdArgs, options::OPT_w);
5172 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5173 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5174 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5175 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5176 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5177 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5178 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5179 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5180 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5181 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5182 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5183 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5184}
5185
5186void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005187 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005188 const InputInfoList &Inputs,
5189 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005190 const char *LinkingOutput) const {
5191 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005192
Daniel Dunbarc1964212009-03-26 16:23:12 +00005193 // The logic here is derived from gcc's behavior; most of which
5194 // comes from specs (starting with link_command). Consult gcc for
5195 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005196 ArgStringList CmdArgs;
5197
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005198 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5199 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5200 options::OPT_ccc_arcmt_migrate)) {
5201 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
5202 (*I)->claim();
5203 const char *Exec =
5204 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5205 CmdArgs.push_back(Output.getFilename());
5206 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5207 return;
5208 }
5209
Daniel Dunbarc1964212009-03-26 16:23:12 +00005210 // I'm not sure why this particular decomposition exists in gcc, but
5211 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005212 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005213
Daniel Dunbarc1964212009-03-26 16:23:12 +00005214 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5215 Args.AddAllArgs(CmdArgs, options::OPT_s);
5216 Args.AddAllArgs(CmdArgs, options::OPT_t);
5217 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5218 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005219 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005220 Args.AddAllArgs(CmdArgs, options::OPT_r);
5221
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005222 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5223 // members of static archive libraries which implement Objective-C classes or
5224 // categories.
5225 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5226 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005227
Daniel Dunbarc1964212009-03-26 16:23:12 +00005228 CmdArgs.push_back("-o");
5229 CmdArgs.push_back(Output.getFilename());
5230
Chad Rosier06fd3c62012-05-16 23:45:12 +00005231 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005232 !Args.hasArg(options::OPT_nostartfiles))
5233 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005234
5235 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005236
Daniel Dunbarc1964212009-03-26 16:23:12 +00005237 if (Args.hasArg(options::OPT_fopenmp))
5238 // This is more complicated in gcc...
5239 CmdArgs.push_back("-lgomp");
5240
Douglas Gregor9295df02012-05-15 21:00:27 +00005241 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5242
Bob Wilson16d93952012-05-15 18:57:39 +00005243 if (isObjCRuntimeLinked(Args) &&
5244 !Args.hasArg(options::OPT_nostdlib) &&
5245 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005246 // We use arclite library for both ARC and subscripting support.
5247 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5248
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005249 CmdArgs.push_back("-framework");
5250 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005251 // Link libobj.
5252 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005253 }
John McCall31168b02011-06-15 23:02:42 +00005254
Daniel Dunbarc1964212009-03-26 16:23:12 +00005255 if (LinkingOutput) {
5256 CmdArgs.push_back("-arch_multiple");
5257 CmdArgs.push_back("-final_output");
5258 CmdArgs.push_back(LinkingOutput);
5259 }
5260
Daniel Dunbarc1964212009-03-26 16:23:12 +00005261 if (Args.hasArg(options::OPT_fnested_functions))
5262 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005263
Daniel Dunbarc1964212009-03-26 16:23:12 +00005264 if (!Args.hasArg(options::OPT_nostdlib) &&
5265 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005266 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005267 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005268
Daniel Dunbarc1964212009-03-26 16:23:12 +00005269 // link_ssp spec is empty.
5270
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005271 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005272 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005273 }
5274
Chad Rosier06fd3c62012-05-16 23:45:12 +00005275 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005276 !Args.hasArg(options::OPT_nostartfiles)) {
5277 // endfile_spec is empty.
5278 }
5279
5280 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5281 Args.AddAllArgs(CmdArgs, options::OPT_F);
5282
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005283 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005284 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005285 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005286}
5287
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005288void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005289 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005290 const InputInfoList &Inputs,
5291 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005292 const char *LinkingOutput) const {
5293 ArgStringList CmdArgs;
5294
5295 CmdArgs.push_back("-create");
5296 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005297
5298 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005299 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005300
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005301 for (InputInfoList::const_iterator
5302 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5303 const InputInfo &II = *it;
5304 assert(II.isFilename() && "Unexpected lipo input.");
5305 CmdArgs.push_back(II.getFilename());
5306 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005307 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005308 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005309 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005310}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005311
Daniel Dunbar88299622010-06-04 18:28:36 +00005312void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005313 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005314 const InputInfoList &Inputs,
5315 const ArgList &Args,
5316 const char *LinkingOutput) const {
5317 ArgStringList CmdArgs;
5318
Daniel Dunbareb86b042011-05-09 17:23:16 +00005319 CmdArgs.push_back("-o");
5320 CmdArgs.push_back(Output.getFilename());
5321
Daniel Dunbar88299622010-06-04 18:28:36 +00005322 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5323 const InputInfo &Input = Inputs[0];
5324 assert(Input.isFilename() && "Unexpected dsymutil input.");
5325 CmdArgs.push_back(Input.getFilename());
5326
Daniel Dunbar88299622010-06-04 18:28:36 +00005327 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005328 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005329 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005330}
5331
Eric Christopher551ef452011-08-23 17:56:55 +00005332void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005333 const InputInfo &Output,
5334 const InputInfoList &Inputs,
5335 const ArgList &Args,
5336 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005337 ArgStringList CmdArgs;
5338 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005339 CmdArgs.push_back("--debug-info");
5340 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005341 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005342
5343 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5344 const InputInfo &Input = Inputs[0];
5345 assert(Input.isFilename() && "Unexpected verify input");
5346
5347 // Grabbing the output of the earlier dsymutil run.
5348 CmdArgs.push_back(Input.getFilename());
5349
5350 const char *Exec =
5351 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5352 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5353}
5354
David Chisnallf571cde2012-02-15 13:39:01 +00005355void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5356 const InputInfo &Output,
5357 const InputInfoList &Inputs,
5358 const ArgList &Args,
5359 const char *LinkingOutput) const {
5360 ArgStringList CmdArgs;
5361
5362 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5363 options::OPT_Xassembler);
5364
5365 CmdArgs.push_back("-o");
5366 CmdArgs.push_back(Output.getFilename());
5367
5368 for (InputInfoList::const_iterator
5369 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5370 const InputInfo &II = *it;
5371 CmdArgs.push_back(II.getFilename());
5372 }
5373
5374 const char *Exec =
5375 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5376 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5377}
5378
5379
5380void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5381 const InputInfo &Output,
5382 const InputInfoList &Inputs,
5383 const ArgList &Args,
5384 const char *LinkingOutput) const {
5385 // FIXME: Find a real GCC, don't hard-code versions here
5386 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5387 const llvm::Triple &T = getToolChain().getTriple();
5388 std::string LibPath = "/usr/lib/";
5389 llvm::Triple::ArchType Arch = T.getArch();
5390 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005391 case llvm::Triple::x86:
5392 GCCLibPath +=
5393 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5394 break;
5395 case llvm::Triple::x86_64:
5396 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5397 GCCLibPath += "/4.5.2/amd64/";
5398 LibPath += "amd64/";
5399 break;
5400 default:
5401 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005402 }
5403
5404 ArgStringList CmdArgs;
5405
David Chisnall272a0712012-02-29 15:06:12 +00005406 // Demangle C++ names in errors
5407 CmdArgs.push_back("-C");
5408
David Chisnallf571cde2012-02-15 13:39:01 +00005409 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5410 (!Args.hasArg(options::OPT_shared))) {
5411 CmdArgs.push_back("-e");
5412 CmdArgs.push_back("_start");
5413 }
5414
5415 if (Args.hasArg(options::OPT_static)) {
5416 CmdArgs.push_back("-Bstatic");
5417 CmdArgs.push_back("-dn");
5418 } else {
5419 CmdArgs.push_back("-Bdynamic");
5420 if (Args.hasArg(options::OPT_shared)) {
5421 CmdArgs.push_back("-shared");
5422 } else {
5423 CmdArgs.push_back("--dynamic-linker");
5424 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5425 }
5426 }
5427
5428 if (Output.isFilename()) {
5429 CmdArgs.push_back("-o");
5430 CmdArgs.push_back(Output.getFilename());
5431 } else {
5432 assert(Output.isNothing() && "Invalid output.");
5433 }
5434
5435 if (!Args.hasArg(options::OPT_nostdlib) &&
5436 !Args.hasArg(options::OPT_nostartfiles)) {
5437 if (!Args.hasArg(options::OPT_shared)) {
5438 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5439 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005440 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005441 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5442 } else {
5443 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005444 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5445 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005446 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005447 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005448 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005449 }
5450
5451 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5452
5453 Args.AddAllArgs(CmdArgs, options::OPT_L);
5454 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5455 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005456 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005457
5458 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5459
5460 if (!Args.hasArg(options::OPT_nostdlib) &&
5461 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005462 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005463 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005464 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005465 if (!Args.hasArg(options::OPT_shared)) {
5466 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005467 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005468 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005469 }
David Chisnallf571cde2012-02-15 13:39:01 +00005470 }
5471
5472 if (!Args.hasArg(options::OPT_nostdlib) &&
5473 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005474 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005475 }
David Chisnall96de9932012-02-16 16:00:47 +00005476 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005477
Alexey Samsonov7811d192014-02-20 13:57:37 +00005478 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00005479
5480 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005481 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005482 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5483}
5484
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005485void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005486 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005487 const InputInfoList &Inputs,
5488 const ArgList &Args,
5489 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005490 ArgStringList CmdArgs;
5491
5492 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5493 options::OPT_Xassembler);
5494
5495 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005496 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005497
5498 for (InputInfoList::const_iterator
5499 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5500 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005501 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005502 }
5503
5504 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005505 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005506 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005507}
5508
5509void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005510 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005511 const InputInfoList &Inputs,
5512 const ArgList &Args,
5513 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005514 ArgStringList CmdArgs;
5515
5516 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005517 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005518 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005519 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005520 }
5521
5522 if (Args.hasArg(options::OPT_static)) {
5523 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005524 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005525 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005526// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005527 CmdArgs.push_back("-Bdynamic");
5528 if (Args.hasArg(options::OPT_shared)) {
5529 CmdArgs.push_back("-shared");
5530 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005531 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005532 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5533 }
5534 }
5535
Daniel Dunbarb440f562010-08-02 02:38:21 +00005536 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005537 CmdArgs.push_back("-o");
5538 CmdArgs.push_back(Output.getFilename());
5539 } else {
5540 assert(Output.isNothing() && "Invalid output.");
5541 }
5542
5543 if (!Args.hasArg(options::OPT_nostdlib) &&
5544 !Args.hasArg(options::OPT_nostartfiles)) {
5545 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005546 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005547 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005548 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005549 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005550 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005551 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005552 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005553 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005554 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005555 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005556 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005557 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005558 }
5559
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005560 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5561 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005562 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005563
5564 Args.AddAllArgs(CmdArgs, options::OPT_L);
5565 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5566 Args.AddAllArgs(CmdArgs, options::OPT_e);
5567
Daniel Dunbar54423b22010-09-17 00:24:54 +00005568 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005569
5570 if (!Args.hasArg(options::OPT_nostdlib) &&
5571 !Args.hasArg(options::OPT_nodefaultlibs)) {
5572 // FIXME: For some reason GCC passes -lgcc before adding
5573 // the default system libraries. Just mimic this for now.
5574 CmdArgs.push_back("-lgcc");
5575
5576 if (Args.hasArg(options::OPT_pthread))
5577 CmdArgs.push_back("-pthread");
5578 if (!Args.hasArg(options::OPT_shared))
5579 CmdArgs.push_back("-lc");
5580 CmdArgs.push_back("-lgcc");
5581 }
5582
5583 if (!Args.hasArg(options::OPT_nostdlib) &&
5584 !Args.hasArg(options::OPT_nostartfiles)) {
5585 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005586 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005587 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005588 }
5589
Alexey Samsonov7811d192014-02-20 13:57:37 +00005590 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005591
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005592 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005593 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005594 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005595}
5596
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005597void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005598 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005599 const InputInfoList &Inputs,
5600 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005601 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005602 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00005603 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005604
Rafael Espindolacc126272014-02-28 01:55:21 +00005605 switch (getToolChain().getArch()) {
5606 case llvm::Triple::x86:
5607 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5608 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005609 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00005610 break;
5611
5612 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005613 CmdArgs.push_back("-mppc");
5614 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00005615 break;
5616
5617 case llvm::Triple::sparc:
5618 CmdArgs.push_back("-32");
5619 NeedsKPIC = true;
5620 break;
5621
5622 case llvm::Triple::sparcv9:
5623 CmdArgs.push_back("-64");
5624 CmdArgs.push_back("-Av9a");
5625 NeedsKPIC = true;
5626 break;
5627
5628 case llvm::Triple::mips64:
5629 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005630 StringRef CPUName;
5631 StringRef ABIName;
5632 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5633
5634 CmdArgs.push_back("-mabi");
5635 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5636
5637 if (getToolChain().getArch() == llvm::Triple::mips64)
5638 CmdArgs.push_back("-EB");
5639 else
5640 CmdArgs.push_back("-EL");
5641
Rafael Espindolacc126272014-02-28 01:55:21 +00005642 NeedsKPIC = true;
5643 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005644 }
5645
Rafael Espindolacc126272014-02-28 01:55:21 +00005646 default:
5647 break;
5648 }
5649
5650 if (NeedsKPIC)
5651 addAssemblerKPIC(Args, CmdArgs);
5652
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005653 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5654 options::OPT_Xassembler);
5655
5656 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005657 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005658
5659 for (InputInfoList::const_iterator
5660 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5661 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005662 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005663 }
5664
5665 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005666 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005667 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005668}
5669
5670void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005671 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005672 const InputInfoList &Inputs,
5673 const ArgList &Args,
5674 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005675 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005676 ArgStringList CmdArgs;
5677
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005678 // Silence warning for "clang -g foo.o -o foo"
5679 Args.ClaimAllArgs(options::OPT_g_Group);
5680 // and "clang -emit-llvm foo.o -o foo"
5681 Args.ClaimAllArgs(options::OPT_emit_llvm);
5682 // and for "clang -w foo.o -o foo". Other warning options are already
5683 // handled somewhere else.
5684 Args.ClaimAllArgs(options::OPT_w);
5685
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005686 if (getToolChain().getArch() == llvm::Triple::mips64)
5687 CmdArgs.push_back("-EB");
5688 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5689 CmdArgs.push_back("-EL");
5690
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005691 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005692 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005693 CmdArgs.push_back("-e");
5694 CmdArgs.push_back("__start");
5695 }
5696
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005697 if (Args.hasArg(options::OPT_static)) {
5698 CmdArgs.push_back("-Bstatic");
5699 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005700 if (Args.hasArg(options::OPT_rdynamic))
5701 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005702 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005703 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005704 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005705 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005706 } else {
5707 CmdArgs.push_back("-dynamic-linker");
5708 CmdArgs.push_back("/usr/libexec/ld.so");
5709 }
5710 }
5711
Rafael Espindola044f7832013-06-05 04:28:55 +00005712 if (Args.hasArg(options::OPT_nopie))
5713 CmdArgs.push_back("-nopie");
5714
Daniel Dunbarb440f562010-08-02 02:38:21 +00005715 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005716 CmdArgs.push_back("-o");
5717 CmdArgs.push_back(Output.getFilename());
5718 } else {
5719 assert(Output.isNothing() && "Invalid output.");
5720 }
5721
5722 if (!Args.hasArg(options::OPT_nostdlib) &&
5723 !Args.hasArg(options::OPT_nostartfiles)) {
5724 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005725 if (Args.hasArg(options::OPT_pg))
5726 CmdArgs.push_back(Args.MakeArgString(
5727 getToolChain().GetFilePath("gcrt0.o")));
5728 else
5729 CmdArgs.push_back(Args.MakeArgString(
5730 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005731 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005732 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005733 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005734 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005735 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005736 }
5737 }
5738
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005739 std::string Triple = getToolChain().getTripleString();
5740 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005741 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005742 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005743 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005744
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005745 Args.AddAllArgs(CmdArgs, options::OPT_L);
5746 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5747 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005748 Args.AddAllArgs(CmdArgs, options::OPT_s);
5749 Args.AddAllArgs(CmdArgs, options::OPT_t);
5750 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5751 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005752
Daniel Dunbar54423b22010-09-17 00:24:54 +00005753 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005754
5755 if (!Args.hasArg(options::OPT_nostdlib) &&
5756 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005757 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005758 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005759 if (Args.hasArg(options::OPT_pg))
5760 CmdArgs.push_back("-lm_p");
5761 else
5762 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005763 }
5764
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005765 // FIXME: For some reason GCC passes -lgcc before adding
5766 // the default system libraries. Just mimic this for now.
5767 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005768
Eric Christopher17674ec2012-09-13 06:32:34 +00005769 if (Args.hasArg(options::OPT_pthread)) {
5770 if (!Args.hasArg(options::OPT_shared) &&
5771 Args.hasArg(options::OPT_pg))
5772 CmdArgs.push_back("-lpthread_p");
5773 else
5774 CmdArgs.push_back("-lpthread");
5775 }
5776
Chandler Carruth45661652011-12-17 22:32:42 +00005777 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005778 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005779 CmdArgs.push_back("-lc_p");
5780 else
5781 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005782 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005783
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005784 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005785 }
5786
5787 if (!Args.hasArg(options::OPT_nostdlib) &&
5788 !Args.hasArg(options::OPT_nostartfiles)) {
5789 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005790 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005791 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005792 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005793 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005794 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005795 }
5796
5797 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005798 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005799 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005800}
Ed Schoutene33194b2009-04-02 19:13:12 +00005801
Eli Friedman9fa28852012-08-08 23:57:20 +00005802void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5803 const InputInfo &Output,
5804 const InputInfoList &Inputs,
5805 const ArgList &Args,
5806 const char *LinkingOutput) const {
5807 ArgStringList CmdArgs;
5808
5809 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5810 options::OPT_Xassembler);
5811
5812 CmdArgs.push_back("-o");
5813 CmdArgs.push_back(Output.getFilename());
5814
5815 for (InputInfoList::const_iterator
5816 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5817 const InputInfo &II = *it;
5818 CmdArgs.push_back(II.getFilename());
5819 }
5820
5821 const char *Exec =
5822 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5823 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5824}
5825
5826void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5827 const InputInfo &Output,
5828 const InputInfoList &Inputs,
5829 const ArgList &Args,
5830 const char *LinkingOutput) const {
5831 const Driver &D = getToolChain().getDriver();
5832 ArgStringList CmdArgs;
5833
5834 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5835 (!Args.hasArg(options::OPT_shared))) {
5836 CmdArgs.push_back("-e");
5837 CmdArgs.push_back("__start");
5838 }
5839
5840 if (Args.hasArg(options::OPT_static)) {
5841 CmdArgs.push_back("-Bstatic");
5842 } else {
5843 if (Args.hasArg(options::OPT_rdynamic))
5844 CmdArgs.push_back("-export-dynamic");
5845 CmdArgs.push_back("--eh-frame-hdr");
5846 CmdArgs.push_back("-Bdynamic");
5847 if (Args.hasArg(options::OPT_shared)) {
5848 CmdArgs.push_back("-shared");
5849 } else {
5850 CmdArgs.push_back("-dynamic-linker");
5851 CmdArgs.push_back("/usr/libexec/ld.so");
5852 }
5853 }
5854
5855 if (Output.isFilename()) {
5856 CmdArgs.push_back("-o");
5857 CmdArgs.push_back(Output.getFilename());
5858 } else {
5859 assert(Output.isNothing() && "Invalid output.");
5860 }
5861
5862 if (!Args.hasArg(options::OPT_nostdlib) &&
5863 !Args.hasArg(options::OPT_nostartfiles)) {
5864 if (!Args.hasArg(options::OPT_shared)) {
5865 if (Args.hasArg(options::OPT_pg))
5866 CmdArgs.push_back(Args.MakeArgString(
5867 getToolChain().GetFilePath("gcrt0.o")));
5868 else
5869 CmdArgs.push_back(Args.MakeArgString(
5870 getToolChain().GetFilePath("crt0.o")));
5871 CmdArgs.push_back(Args.MakeArgString(
5872 getToolChain().GetFilePath("crtbegin.o")));
5873 } else {
5874 CmdArgs.push_back(Args.MakeArgString(
5875 getToolChain().GetFilePath("crtbeginS.o")));
5876 }
5877 }
5878
5879 Args.AddAllArgs(CmdArgs, options::OPT_L);
5880 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5881 Args.AddAllArgs(CmdArgs, options::OPT_e);
5882
5883 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5884
5885 if (!Args.hasArg(options::OPT_nostdlib) &&
5886 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005887 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005888 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5889 if (Args.hasArg(options::OPT_pg))
5890 CmdArgs.push_back("-lm_p");
5891 else
5892 CmdArgs.push_back("-lm");
5893 }
5894
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005895 if (Args.hasArg(options::OPT_pthread)) {
5896 if (!Args.hasArg(options::OPT_shared) &&
5897 Args.hasArg(options::OPT_pg))
5898 CmdArgs.push_back("-lpthread_p");
5899 else
5900 CmdArgs.push_back("-lpthread");
5901 }
5902
Eli Friedman9fa28852012-08-08 23:57:20 +00005903 if (!Args.hasArg(options::OPT_shared)) {
5904 if (Args.hasArg(options::OPT_pg))
5905 CmdArgs.push_back("-lc_p");
5906 else
5907 CmdArgs.push_back("-lc");
5908 }
5909
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005910 StringRef MyArch;
5911 switch (getToolChain().getTriple().getArch()) {
5912 case llvm::Triple::arm:
5913 MyArch = "arm";
5914 break;
5915 case llvm::Triple::x86:
5916 MyArch = "i386";
5917 break;
5918 case llvm::Triple::x86_64:
5919 MyArch = "amd64";
5920 break;
5921 default:
5922 llvm_unreachable("Unsupported architecture");
5923 }
5924 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005925 }
5926
5927 if (!Args.hasArg(options::OPT_nostdlib) &&
5928 !Args.hasArg(options::OPT_nostartfiles)) {
5929 if (!Args.hasArg(options::OPT_shared))
5930 CmdArgs.push_back(Args.MakeArgString(
5931 getToolChain().GetFilePath("crtend.o")));
5932 else
5933 CmdArgs.push_back(Args.MakeArgString(
5934 getToolChain().GetFilePath("crtendS.o")));
5935 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005936
5937 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005938 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005939 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005940}
5941
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005942void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005943 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005944 const InputInfoList &Inputs,
5945 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005946 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005947 ArgStringList CmdArgs;
5948
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005949 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5950 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005951 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005952 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005953 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005954 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005955 else if (getToolChain().getArch() == llvm::Triple::mips ||
5956 getToolChain().getArch() == llvm::Triple::mipsel ||
5957 getToolChain().getArch() == llvm::Triple::mips64 ||
5958 getToolChain().getArch() == llvm::Triple::mips64el) {
5959 StringRef CPUName;
5960 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005961 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005962
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005963 CmdArgs.push_back("-march");
5964 CmdArgs.push_back(CPUName.data());
5965
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005966 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005967 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005968
5969 if (getToolChain().getArch() == llvm::Triple::mips ||
5970 getToolChain().getArch() == llvm::Triple::mips64)
5971 CmdArgs.push_back("-EB");
5972 else
5973 CmdArgs.push_back("-EL");
5974
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00005975 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005976 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5977 getToolChain().getArch() == llvm::Triple::thumb) {
Renato Golinf4421f72014-02-19 10:44:07 +00005978 const Driver &D = getToolChain().getDriver();
5979 llvm::Triple Triple = getToolChain().getTriple();
5980 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
5981
5982 if (FloatABI == "hard") {
5983 CmdArgs.push_back("-mfpu=vfp");
5984 } else {
5985 CmdArgs.push_back("-mfpu=softvfp");
5986 }
5987
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005988 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00005989 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005990 case llvm::Triple::GNUEABI:
5991 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005992 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005993 break;
5994
5995 default:
5996 CmdArgs.push_back("-matpcs");
5997 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00005998 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00005999 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006000 if (getToolChain().getArch() == llvm::Triple::sparc)
6001 CmdArgs.push_back("-Av8plusa");
6002 else
6003 CmdArgs.push_back("-Av9a");
6004
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006005 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006006 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006007
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006008 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6009 options::OPT_Xassembler);
6010
6011 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006012 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006013
6014 for (InputInfoList::const_iterator
6015 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6016 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006017 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006018 }
6019
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006020 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006021 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006022 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006023}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006024
6025void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006026 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006027 const InputInfoList &Inputs,
6028 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006029 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006030 const toolchains::FreeBSD& ToolChain =
6031 static_cast<const toolchains::FreeBSD&>(getToolChain());
6032 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006033 const bool IsPIE =
6034 !Args.hasArg(options::OPT_shared) &&
6035 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006036 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006037
6038 // Silence warning for "clang -g foo.o -o foo"
6039 Args.ClaimAllArgs(options::OPT_g_Group);
6040 // and "clang -emit-llvm foo.o -o foo"
6041 Args.ClaimAllArgs(options::OPT_emit_llvm);
6042 // and for "clang -w foo.o -o foo". Other warning options are already
6043 // handled somewhere else.
6044 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006045
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006046 if (!D.SysRoot.empty())
6047 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6048
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006049 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006050 CmdArgs.push_back("-pie");
6051
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006052 if (Args.hasArg(options::OPT_static)) {
6053 CmdArgs.push_back("-Bstatic");
6054 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006055 if (Args.hasArg(options::OPT_rdynamic))
6056 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006057 CmdArgs.push_back("--eh-frame-hdr");
6058 if (Args.hasArg(options::OPT_shared)) {
6059 CmdArgs.push_back("-Bshareable");
6060 } else {
6061 CmdArgs.push_back("-dynamic-linker");
6062 CmdArgs.push_back("/libexec/ld-elf.so.1");
6063 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006064 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6065 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006066 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6067 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6068 CmdArgs.push_back("--hash-style=both");
6069 }
6070 }
6071 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006072 }
6073
6074 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6075 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006076 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006077 CmdArgs.push_back("-m");
6078 CmdArgs.push_back("elf_i386_fbsd");
6079 }
6080
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006081 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006082 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006083 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006084 }
6085
Daniel Dunbarb440f562010-08-02 02:38:21 +00006086 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006087 CmdArgs.push_back("-o");
6088 CmdArgs.push_back(Output.getFilename());
6089 } else {
6090 assert(Output.isNothing() && "Invalid output.");
6091 }
6092
6093 if (!Args.hasArg(options::OPT_nostdlib) &&
6094 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006095 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006096 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006097 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006098 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006099 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006100 crt1 = "Scrt1.o";
6101 else
6102 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006103 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006104 if (crt1)
6105 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6106
6107 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6108
6109 const char *crtbegin = NULL;
6110 if (Args.hasArg(options::OPT_static))
6111 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006112 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006113 crtbegin = "crtbeginS.o";
6114 else
6115 crtbegin = "crtbegin.o";
6116
6117 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006118 }
6119
6120 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006121 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00006122 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6123 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006124 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006125 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6126 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006127 Args.AddAllArgs(CmdArgs, options::OPT_s);
6128 Args.AddAllArgs(CmdArgs, options::OPT_t);
6129 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6130 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006131
Alp Tokerce365ca2013-12-02 12:43:03 +00006132 if (D.IsUsingLTO(Args))
6133 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006134
Roman Divackyafe2f232012-08-28 15:09:03 +00006135 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006136
6137 if (!Args.hasArg(options::OPT_nostdlib) &&
6138 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006139 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006140 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006141 if (Args.hasArg(options::OPT_pg))
6142 CmdArgs.push_back("-lm_p");
6143 else
6144 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006145 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006146 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6147 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006148 if (Args.hasArg(options::OPT_pg))
6149 CmdArgs.push_back("-lgcc_p");
6150 else
6151 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006152 if (Args.hasArg(options::OPT_static)) {
6153 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006154 } else if (Args.hasArg(options::OPT_pg)) {
6155 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006156 } else {
6157 CmdArgs.push_back("--as-needed");
6158 CmdArgs.push_back("-lgcc_s");
6159 CmdArgs.push_back("--no-as-needed");
6160 }
6161
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006162 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006163 if (Args.hasArg(options::OPT_pg))
6164 CmdArgs.push_back("-lpthread_p");
6165 else
6166 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006167 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006168
Roman Divacky66f22762011-02-10 16:59:40 +00006169 if (Args.hasArg(options::OPT_pg)) {
6170 if (Args.hasArg(options::OPT_shared))
6171 CmdArgs.push_back("-lc");
6172 else
6173 CmdArgs.push_back("-lc_p");
6174 CmdArgs.push_back("-lgcc_p");
6175 } else {
6176 CmdArgs.push_back("-lc");
6177 CmdArgs.push_back("-lgcc");
6178 }
6179
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006180 if (Args.hasArg(options::OPT_static)) {
6181 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006182 } else if (Args.hasArg(options::OPT_pg)) {
6183 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006184 } else {
6185 CmdArgs.push_back("--as-needed");
6186 CmdArgs.push_back("-lgcc_s");
6187 CmdArgs.push_back("--no-as-needed");
6188 }
6189 }
6190
6191 if (!Args.hasArg(options::OPT_nostdlib) &&
6192 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006193 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006195 else
6196 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006197 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006198 }
6199
Alexey Samsonov7811d192014-02-20 13:57:37 +00006200 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006201
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006202 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006203 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006204 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006205}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006206
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006207void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6208 const InputInfo &Output,
6209 const InputInfoList &Inputs,
6210 const ArgList &Args,
6211 const char *LinkingOutput) const {
6212 ArgStringList CmdArgs;
6213
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006214 // GNU as needs different flags for creating the correct output format
6215 // on architectures with different ABIs or optional feature sets.
6216 switch (getToolChain().getArch()) {
6217 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006218 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006219 break;
6220 case llvm::Triple::arm:
6221 case llvm::Triple::thumb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006222 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006223 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006224 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006225 }
6226
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006227 case llvm::Triple::mips:
6228 case llvm::Triple::mipsel:
6229 case llvm::Triple::mips64:
6230 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006231 StringRef CPUName;
6232 StringRef ABIName;
6233 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6234
6235 CmdArgs.push_back("-march");
6236 CmdArgs.push_back(CPUName.data());
6237
6238 CmdArgs.push_back("-mabi");
6239 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6240
6241 if (getToolChain().getArch() == llvm::Triple::mips ||
6242 getToolChain().getArch() == llvm::Triple::mips64)
6243 CmdArgs.push_back("-EB");
6244 else
6245 CmdArgs.push_back("-EL");
6246
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006247 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006248 break;
6249 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006250
6251 case llvm::Triple::sparc:
6252 CmdArgs.push_back("-32");
6253 addAssemblerKPIC(Args, CmdArgs);
6254 break;
6255
6256 case llvm::Triple::sparcv9:
6257 CmdArgs.push_back("-64");
6258 CmdArgs.push_back("-Av9");
6259 addAssemblerKPIC(Args, CmdArgs);
6260 break;
6261
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006262 default:
6263 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006264 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006265
6266 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6267 options::OPT_Xassembler);
6268
6269 CmdArgs.push_back("-o");
6270 CmdArgs.push_back(Output.getFilename());
6271
6272 for (InputInfoList::const_iterator
6273 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6274 const InputInfo &II = *it;
6275 CmdArgs.push_back(II.getFilename());
6276 }
6277
David Chisnallddbd68f2011-09-27 22:03:18 +00006278 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006279 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6280}
6281
6282void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6283 const InputInfo &Output,
6284 const InputInfoList &Inputs,
6285 const ArgList &Args,
6286 const char *LinkingOutput) const {
6287 const Driver &D = getToolChain().getDriver();
6288 ArgStringList CmdArgs;
6289
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006290 if (!D.SysRoot.empty())
6291 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6292
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006293 if (Args.hasArg(options::OPT_static)) {
6294 CmdArgs.push_back("-Bstatic");
6295 } else {
6296 if (Args.hasArg(options::OPT_rdynamic))
6297 CmdArgs.push_back("-export-dynamic");
6298 CmdArgs.push_back("--eh-frame-hdr");
6299 if (Args.hasArg(options::OPT_shared)) {
6300 CmdArgs.push_back("-Bshareable");
6301 } else {
6302 CmdArgs.push_back("-dynamic-linker");
6303 CmdArgs.push_back("/libexec/ld.elf_so");
6304 }
6305 }
6306
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006307 // Many NetBSD architectures support more than one ABI.
6308 // Determine the correct emulation for ld.
6309 switch (getToolChain().getArch()) {
6310 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006311 CmdArgs.push_back("-m");
6312 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006313 break;
6314 case llvm::Triple::arm:
6315 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006316 CmdArgs.push_back("-m");
6317 switch (getToolChain().getTriple().getEnvironment()) {
6318 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006319 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006320 CmdArgs.push_back("armelf_nbsd_eabi");
6321 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006322 case llvm::Triple::EABIHF:
6323 case llvm::Triple::GNUEABIHF:
6324 CmdArgs.push_back("armelf_nbsd_eabihf");
6325 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006326 default:
6327 CmdArgs.push_back("armelf_nbsd");
6328 break;
6329 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006330 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006331 case llvm::Triple::mips64:
6332 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006333 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006334 CmdArgs.push_back("-m");
6335 if (getToolChain().getArch() == llvm::Triple::mips64)
6336 CmdArgs.push_back("elf32btsmip");
6337 else
6338 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006339 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006340 CmdArgs.push_back("-m");
6341 if (getToolChain().getArch() == llvm::Triple::mips64)
6342 CmdArgs.push_back("elf64btsmip");
6343 else
6344 CmdArgs.push_back("elf64ltsmip");
6345 }
6346 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006347
6348 case llvm::Triple::sparc:
6349 CmdArgs.push_back("-m");
6350 CmdArgs.push_back("elf32_sparc");
6351 break;
6352
6353 case llvm::Triple::sparcv9:
6354 CmdArgs.push_back("-m");
6355 CmdArgs.push_back("elf64_sparc");
6356 break;
6357
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006358 default:
6359 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006360 }
6361
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006362 if (Output.isFilename()) {
6363 CmdArgs.push_back("-o");
6364 CmdArgs.push_back(Output.getFilename());
6365 } else {
6366 assert(Output.isNothing() && "Invalid output.");
6367 }
6368
6369 if (!Args.hasArg(options::OPT_nostdlib) &&
6370 !Args.hasArg(options::OPT_nostartfiles)) {
6371 if (!Args.hasArg(options::OPT_shared)) {
6372 CmdArgs.push_back(Args.MakeArgString(
6373 getToolChain().GetFilePath("crt0.o")));
6374 CmdArgs.push_back(Args.MakeArgString(
6375 getToolChain().GetFilePath("crti.o")));
6376 CmdArgs.push_back(Args.MakeArgString(
6377 getToolChain().GetFilePath("crtbegin.o")));
6378 } else {
6379 CmdArgs.push_back(Args.MakeArgString(
6380 getToolChain().GetFilePath("crti.o")));
6381 CmdArgs.push_back(Args.MakeArgString(
6382 getToolChain().GetFilePath("crtbeginS.o")));
6383 }
6384 }
6385
6386 Args.AddAllArgs(CmdArgs, options::OPT_L);
6387 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6388 Args.AddAllArgs(CmdArgs, options::OPT_e);
6389 Args.AddAllArgs(CmdArgs, options::OPT_s);
6390 Args.AddAllArgs(CmdArgs, options::OPT_t);
6391 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6392 Args.AddAllArgs(CmdArgs, options::OPT_r);
6393
6394 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6395
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006396 unsigned Major, Minor, Micro;
6397 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6398 bool useLibgcc = true;
6399 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006400 switch(getToolChain().getArch()) {
6401 case llvm::Triple::x86:
6402 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006403 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006404 break;
6405 default:
6406 break;
6407 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006408 }
6409
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006410 if (!Args.hasArg(options::OPT_nostdlib) &&
6411 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006412 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006413 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6414 CmdArgs.push_back("-lm");
6415 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006416 if (Args.hasArg(options::OPT_pthread))
6417 CmdArgs.push_back("-lpthread");
6418 CmdArgs.push_back("-lc");
6419
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006420 if (useLibgcc) {
6421 if (Args.hasArg(options::OPT_static)) {
6422 // libgcc_eh depends on libc, so resolve as much as possible,
6423 // pull in any new requirements from libc and then get the rest
6424 // of libgcc.
6425 CmdArgs.push_back("-lgcc_eh");
6426 CmdArgs.push_back("-lc");
6427 CmdArgs.push_back("-lgcc");
6428 } else {
6429 CmdArgs.push_back("-lgcc");
6430 CmdArgs.push_back("--as-needed");
6431 CmdArgs.push_back("-lgcc_s");
6432 CmdArgs.push_back("--no-as-needed");
6433 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006434 }
6435 }
6436
6437 if (!Args.hasArg(options::OPT_nostdlib) &&
6438 !Args.hasArg(options::OPT_nostartfiles)) {
6439 if (!Args.hasArg(options::OPT_shared))
6440 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6441 "crtend.o")));
6442 else
6443 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6444 "crtendS.o")));
6445 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6446 "crtn.o")));
6447 }
6448
Alexey Samsonov7811d192014-02-20 13:57:37 +00006449 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006450
Rafael Espindola236db462013-11-09 20:07:19 +00006451 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006452 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6453}
6454
Thomas Schwinge4e555262013-03-28 19:04:25 +00006455void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6456 const InputInfo &Output,
6457 const InputInfoList &Inputs,
6458 const ArgList &Args,
6459 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006460 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006461 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006462
6463 // Add --32/--64 to make sure we get the format we want.
6464 // This is incomplete
6465 if (getToolChain().getArch() == llvm::Triple::x86) {
6466 CmdArgs.push_back("--32");
6467 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6468 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006469 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6470 CmdArgs.push_back("-a32");
6471 CmdArgs.push_back("-mppc");
6472 CmdArgs.push_back("-many");
6473 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6474 CmdArgs.push_back("-a64");
6475 CmdArgs.push_back("-mppc64");
6476 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006477 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6478 CmdArgs.push_back("-a64");
6479 CmdArgs.push_back("-mppc64le");
6480 CmdArgs.push_back("-many");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006481 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6482 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006483 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006484 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006485 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6486 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006487 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006488 NeedsKPIC = true;
Rafael Espindola92b00932010-08-10 00:25:48 +00006489 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006490 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006491 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6492 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006493 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6494 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006495
Tim Northover9c7e0352013-12-12 11:55:52 +00006496 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6497 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006498 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006499
6500 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006501
6502 // FIXME: remove krait check when GNU tools support krait cpu
6503 // for now replace it with -march=armv7-a to avoid a lower
6504 // march from being picked in the absence of a cpu flag.
6505 Arg *A;
6506 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6507 StringRef(A->getValue()) == "krait")
6508 CmdArgs.push_back("-march=armv7-a");
6509 else
6510 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006511 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006512 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6513 getToolChain().getArch() == llvm::Triple::mipsel ||
6514 getToolChain().getArch() == llvm::Triple::mips64 ||
6515 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006516 StringRef CPUName;
6517 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006518 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006519
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006520 CmdArgs.push_back("-march");
6521 CmdArgs.push_back(CPUName.data());
6522
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006523 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006524 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006525
6526 if (getToolChain().getArch() == llvm::Triple::mips ||
6527 getToolChain().getArch() == llvm::Triple::mips64)
6528 CmdArgs.push_back("-EB");
6529 else
6530 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006531
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006532 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6533 if (StringRef(A->getValue()) == "2008")
6534 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6535 }
6536
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006537 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006538 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6539 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6540 options::OPT_mno_micromips);
6541 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6542 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6543
Simon Atanasyanbd986632013-11-26 11:58:04 +00006544 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6545 // Do not use AddLastArg because not all versions of MIPS assembler
6546 // support -mmsa / -mno-msa options.
6547 if (A->getOption().matches(options::OPT_mmsa))
6548 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6549 }
6550
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006551 NeedsKPIC = true;
6552 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6553 // Always pass an -march option, since our default of z10 is later
6554 // than the GNU assembler's default.
6555 StringRef CPUName = getSystemZTargetCPU(Args);
6556 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6557 }
6558
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006559 if (NeedsKPIC)
6560 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00006561
6562 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6563 options::OPT_Xassembler);
6564
6565 CmdArgs.push_back("-o");
6566 CmdArgs.push_back(Output.getFilename());
6567
6568 for (InputInfoList::const_iterator
6569 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6570 const InputInfo &II = *it;
6571 CmdArgs.push_back(II.getFilename());
6572 }
6573
6574 const char *Exec =
6575 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6576 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006577
6578 // Handle the debug info splitting at object creation time if we're
6579 // creating an object.
6580 // TODO: Currently only works on linux with newer objcopy.
6581 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006582 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006583 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6584 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006585}
6586
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006587static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6588 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006589 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006590 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6591 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006592 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006593 CmdArgs.push_back("-lgcc");
6594
Logan Chien3d3373c2012-11-19 12:04:11 +00006595 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006596 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006597 CmdArgs.push_back("-lgcc");
6598 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006599 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006600 CmdArgs.push_back("--as-needed");
6601 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006602 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006603 CmdArgs.push_back("--no-as-needed");
6604 }
6605
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006606 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006607 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006608 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006609 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006610
6611 // According to Android ABI, we have to link with libdl if we are
6612 // linking with non-static libgcc.
6613 //
6614 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6615 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6616 if (isAndroid && !StaticLibgcc)
6617 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006618}
6619
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006620static StringRef getLinuxDynamicLinker(const ArgList &Args,
6621 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006622 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6623 if (ToolChain.getTriple().isArch64Bit())
6624 return "/system/bin/linker64";
6625 else
6626 return "/system/bin/linker";
6627 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6628 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006629 return "/lib/ld-linux.so.2";
6630 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6631 return "/lib/ld-linux-aarch64.so.1";
6632 else if (ToolChain.getArch() == llvm::Triple::arm ||
6633 ToolChain.getArch() == llvm::Triple::thumb) {
6634 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6635 return "/lib/ld-linux-armhf.so.3";
6636 else
6637 return "/lib/ld-linux.so.3";
6638 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6639 ToolChain.getArch() == llvm::Triple::mipsel)
6640 return "/lib/ld.so.1";
6641 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6642 ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006643 if (mips::hasMipsAbiArg(Args, "n32"))
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006644 return "/lib32/ld.so.1";
6645 else
6646 return "/lib64/ld.so.1";
6647 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6648 return "/lib/ld.so.1";
6649 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006650 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006651 ToolChain.getArch() == llvm::Triple::systemz)
6652 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006653 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6654 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006655 else
6656 return "/lib64/ld-linux-x86-64.so.2";
6657}
6658
Renato Golinc4b49242014-02-13 10:01:16 +00006659static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
6660 ArgStringList &CmdArgs, const ArgList &Args) {
6661 // Make use of compiler-rt if --rtlib option is used
6662 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
6663
6664 switch(RLT) {
6665 case ToolChain::RLT_CompilerRT:
6666 addClangRTLinux(TC, Args, CmdArgs);
6667 break;
6668 case ToolChain::RLT_Libgcc:
6669 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
6670 break;
Renato Golinc4b49242014-02-13 10:01:16 +00006671 }
6672}
6673
Thomas Schwinge4e555262013-03-28 19:04:25 +00006674void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6675 const InputInfo &Output,
6676 const InputInfoList &Inputs,
6677 const ArgList &Args,
6678 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006679 const toolchains::Linux& ToolChain =
6680 static_cast<const toolchains::Linux&>(getToolChain());
6681 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006682 const bool isAndroid =
6683 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006684 const bool IsPIE =
6685 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006686 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006687
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006688 ArgStringList CmdArgs;
6689
Rafael Espindolad1002f62010-11-15 18:28:16 +00006690 // Silence warning for "clang -g foo.o -o foo"
6691 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006692 // and "clang -emit-llvm foo.o -o foo"
6693 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006694 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006695 // handled somewhere else.
6696 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006697
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006698 if (!D.SysRoot.empty())
6699 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006700
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006701 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006702 CmdArgs.push_back("-pie");
6703
Rafael Espindola1c76c592010-11-07 22:57:16 +00006704 if (Args.hasArg(options::OPT_rdynamic))
6705 CmdArgs.push_back("-export-dynamic");
6706
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006707 if (Args.hasArg(options::OPT_s))
6708 CmdArgs.push_back("-s");
6709
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006710 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6711 e = ToolChain.ExtraOpts.end();
6712 i != e; ++i)
6713 CmdArgs.push_back(i->c_str());
6714
6715 if (!Args.hasArg(options::OPT_static)) {
6716 CmdArgs.push_back("--eh-frame-hdr");
6717 }
6718
6719 CmdArgs.push_back("-m");
6720 if (ToolChain.getArch() == llvm::Triple::x86)
6721 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006722 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6723 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006724 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006725 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006726 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006727 else if (ToolChain.getArch() == llvm::Triple::ppc)
6728 CmdArgs.push_back("elf32ppclinux");
6729 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6730 CmdArgs.push_back("elf64ppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006731 else if (ToolChain.getArch() == llvm::Triple::sparc)
6732 CmdArgs.push_back("elf32_sparc");
6733 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6734 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006735 else if (ToolChain.getArch() == llvm::Triple::mips)
6736 CmdArgs.push_back("elf32btsmip");
6737 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6738 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006739 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006740 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006741 CmdArgs.push_back("elf32btsmipn32");
6742 else
6743 CmdArgs.push_back("elf64btsmip");
6744 }
6745 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006746 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006747 CmdArgs.push_back("elf32ltsmipn32");
6748 else
6749 CmdArgs.push_back("elf64ltsmip");
6750 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006751 else if (ToolChain.getArch() == llvm::Triple::systemz)
6752 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006753 else
6754 CmdArgs.push_back("elf_x86_64");
6755
6756 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00006757 if (ToolChain.getArch() == llvm::Triple::arm ||
6758 ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006759 CmdArgs.push_back("-Bstatic");
6760 else
6761 CmdArgs.push_back("-static");
6762 } else if (Args.hasArg(options::OPT_shared)) {
6763 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006764 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006765 CmdArgs.push_back("-Bsymbolic");
6766 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006767 }
6768
6769 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006770 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006771 (!Args.hasArg(options::OPT_static) &&
6772 !Args.hasArg(options::OPT_shared))) {
6773 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006774 CmdArgs.push_back(Args.MakeArgString(
6775 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006776 }
6777
6778 CmdArgs.push_back("-o");
6779 CmdArgs.push_back(Output.getFilename());
6780
Rafael Espindola81937ec2010-12-01 01:52:43 +00006781 if (!Args.hasArg(options::OPT_nostdlib) &&
6782 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006783 if (!isAndroid) {
6784 const char *crt1 = NULL;
6785 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006786 if (Args.hasArg(options::OPT_pg))
6787 crt1 = "gcrt1.o";
6788 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006789 crt1 = "Scrt1.o";
6790 else
6791 crt1 = "crt1.o";
6792 }
6793 if (crt1)
6794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006795
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006796 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6797 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006798
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006799 const char *crtbegin;
6800 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006801 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006802 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006803 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006804 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006805 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006806 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006807 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006808 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006809
6810 // Add crtfastmath.o if available and fast math is enabled.
6811 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006812 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006813
6814 Args.AddAllArgs(CmdArgs, options::OPT_L);
6815
6816 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6817
Roman Divackyee8188a2011-03-01 17:53:14 +00006818 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6819 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006820 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006821
Alp Tokerce365ca2013-12-02 12:43:03 +00006822 if (D.IsUsingLTO(Args))
6823 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006824
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006825 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6826 CmdArgs.push_back("--no-demangle");
6827
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006828 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6829
Alexey Samsonovce8ab102014-02-25 12:43:43 +00006830 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00006831 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00006832 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00006833
Hans Wennborg70850d82013-07-18 20:29:38 +00006834 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006835 !Args.hasArg(options::OPT_nostdlib) &&
6836 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006837 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6838 !Args.hasArg(options::OPT_static);
6839 if (OnlyLibstdcxxStatic)
6840 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006841 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006842 if (OnlyLibstdcxxStatic)
6843 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006844 CmdArgs.push_back("-lm");
6845 }
6846
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006847 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006848 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6849 if (Args.hasArg(options::OPT_static))
6850 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006851
Chandler Carruth01538002013-01-17 13:19:29 +00006852 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6853 if (OpenMP) {
6854 CmdArgs.push_back("-lgomp");
6855
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006856 // FIXME: Exclude this for platforms with libgomp that don't require
6857 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006858 CmdArgs.push_back("-lrt");
6859 }
6860
Renato Golinc4b49242014-02-13 10:01:16 +00006861 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006862
Chandler Carruth94a32012012-05-14 18:31:18 +00006863 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006864 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006865 CmdArgs.push_back("-lpthread");
6866
6867 CmdArgs.push_back("-lc");
6868
6869 if (Args.hasArg(options::OPT_static))
6870 CmdArgs.push_back("--end-group");
6871 else
Renato Golinc4b49242014-02-13 10:01:16 +00006872 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00006873 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006874
Rafael Espindola81937ec2010-12-01 01:52:43 +00006875 if (!Args.hasArg(options::OPT_nostartfiles)) {
6876 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006877 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006878 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006879 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006880 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006881 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006882 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006883
Rafael Espindola81937ec2010-12-01 01:52:43 +00006884 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006885 if (!isAndroid)
6886 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006887 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006888 }
6889
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006890 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6891}
Rafael Espindola92b00932010-08-10 00:25:48 +00006892
Chris Lattner3e2ee142010-07-07 16:01:42 +00006893void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006894 const InputInfo &Output,
6895 const InputInfoList &Inputs,
6896 const ArgList &Args,
6897 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006898 ArgStringList CmdArgs;
6899
6900 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6901 options::OPT_Xassembler);
6902
6903 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006904 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006905
6906 for (InputInfoList::const_iterator
6907 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6908 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006909 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006910 }
6911
6912 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006913 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006914 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006915}
6916
6917void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006918 const InputInfo &Output,
6919 const InputInfoList &Inputs,
6920 const ArgList &Args,
6921 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006922 const Driver &D = getToolChain().getDriver();
6923 ArgStringList CmdArgs;
6924
Daniel Dunbarb440f562010-08-02 02:38:21 +00006925 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006926 CmdArgs.push_back("-o");
6927 CmdArgs.push_back(Output.getFilename());
6928 } else {
6929 assert(Output.isNothing() && "Invalid output.");
6930 }
6931
6932 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006933 !Args.hasArg(options::OPT_nostartfiles)) {
6934 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6935 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6936 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6937 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6938 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006939
6940 Args.AddAllArgs(CmdArgs, options::OPT_L);
6941 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6942 Args.AddAllArgs(CmdArgs, options::OPT_e);
6943
Daniel Dunbar54423b22010-09-17 00:24:54 +00006944 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006945
Alexey Samsonov7811d192014-02-20 13:57:37 +00006946 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00006947
Chris Lattner3e2ee142010-07-07 16:01:42 +00006948 if (!Args.hasArg(options::OPT_nostdlib) &&
6949 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006950 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006951 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006952 CmdArgs.push_back("-lm");
6953 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006954 }
6955
6956 if (!Args.hasArg(options::OPT_nostdlib) &&
6957 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006958 if (Args.hasArg(options::OPT_pthread))
6959 CmdArgs.push_back("-lpthread");
6960 CmdArgs.push_back("-lc");
6961 CmdArgs.push_back("-lCompilerRT-Generic");
6962 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6963 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006964 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006965 }
6966
Rafael Espindola236db462013-11-09 20:07:19 +00006967 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006968 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006969}
6970
Daniel Dunbarcc912342009-05-02 18:28:39 +00006971/// DragonFly Tools
6972
6973// For now, DragonFly Assemble does just about the same as for
6974// FreeBSD, but this may change soon.
6975void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006976 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006977 const InputInfoList &Inputs,
6978 const ArgList &Args,
6979 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006980 ArgStringList CmdArgs;
6981
6982 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6983 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006984 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006985 CmdArgs.push_back("--32");
6986
6987 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6988 options::OPT_Xassembler);
6989
6990 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006991 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006992
6993 for (InputInfoList::const_iterator
6994 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6995 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006996 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006997 }
6998
6999 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007000 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007001 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007002}
7003
7004void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007005 const InputInfo &Output,
7006 const InputInfoList &Inputs,
7007 const ArgList &Args,
7008 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007009 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007010 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007011 ArgStringList CmdArgs;
7012
John McCall65b8da02013-04-11 22:55:55 +00007013 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7014 UseGCC47 = false;
7015
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007016 if (!D.SysRoot.empty())
7017 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7018
John McCall65b8da02013-04-11 22:55:55 +00007019 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007020 if (Args.hasArg(options::OPT_static)) {
7021 CmdArgs.push_back("-Bstatic");
7022 } else {
John McCall65b8da02013-04-11 22:55:55 +00007023 if (Args.hasArg(options::OPT_rdynamic))
7024 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007025 if (Args.hasArg(options::OPT_shared))
7026 CmdArgs.push_back("-Bshareable");
7027 else {
7028 CmdArgs.push_back("-dynamic-linker");
7029 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7030 }
John McCall65b8da02013-04-11 22:55:55 +00007031 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007032 }
7033
7034 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7035 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007036 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007037 CmdArgs.push_back("-m");
7038 CmdArgs.push_back("elf_i386");
7039 }
7040
Daniel Dunbarb440f562010-08-02 02:38:21 +00007041 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007042 CmdArgs.push_back("-o");
7043 CmdArgs.push_back(Output.getFilename());
7044 } else {
7045 assert(Output.isNothing() && "Invalid output.");
7046 }
7047
7048 if (!Args.hasArg(options::OPT_nostdlib) &&
7049 !Args.hasArg(options::OPT_nostartfiles)) {
7050 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007051 if (Args.hasArg(options::OPT_pg))
7052 CmdArgs.push_back(Args.MakeArgString(
7053 getToolChain().GetFilePath("gcrt1.o")));
7054 else {
7055 if (Args.hasArg(options::OPT_pie))
7056 CmdArgs.push_back(Args.MakeArgString(
7057 getToolChain().GetFilePath("Scrt1.o")));
7058 else
7059 CmdArgs.push_back(Args.MakeArgString(
7060 getToolChain().GetFilePath("crt1.o")));
7061 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007062 }
John McCall65b8da02013-04-11 22:55:55 +00007063 CmdArgs.push_back(Args.MakeArgString(
7064 getToolChain().GetFilePath("crti.o")));
7065 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7066 CmdArgs.push_back(Args.MakeArgString(
7067 getToolChain().GetFilePath("crtbeginS.o")));
7068 else
7069 CmdArgs.push_back(Args.MakeArgString(
7070 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007071 }
7072
7073 Args.AddAllArgs(CmdArgs, options::OPT_L);
7074 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7075 Args.AddAllArgs(CmdArgs, options::OPT_e);
7076
Daniel Dunbar54423b22010-09-17 00:24:54 +00007077 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007078
7079 if (!Args.hasArg(options::OPT_nostdlib) &&
7080 !Args.hasArg(options::OPT_nodefaultlibs)) {
7081 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7082 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007083 if (UseGCC47)
7084 CmdArgs.push_back("-L/usr/lib/gcc47");
7085 else
7086 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007087
7088 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007089 if (UseGCC47) {
7090 CmdArgs.push_back("-rpath");
7091 CmdArgs.push_back("/usr/lib/gcc47");
7092 } else {
7093 CmdArgs.push_back("-rpath");
7094 CmdArgs.push_back("/usr/lib/gcc44");
7095 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007096 }
7097
Hans Wennborg70850d82013-07-18 20:29:38 +00007098 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007099 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007100 CmdArgs.push_back("-lm");
7101 }
7102
Daniel Dunbarcc912342009-05-02 18:28:39 +00007103 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007104 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007105
7106 if (!Args.hasArg(options::OPT_nolibc)) {
7107 CmdArgs.push_back("-lc");
7108 }
7109
John McCall65b8da02013-04-11 22:55:55 +00007110 if (UseGCC47) {
7111 if (Args.hasArg(options::OPT_static) ||
7112 Args.hasArg(options::OPT_static_libgcc)) {
7113 CmdArgs.push_back("-lgcc");
7114 CmdArgs.push_back("-lgcc_eh");
7115 } else {
7116 if (Args.hasArg(options::OPT_shared_libgcc)) {
7117 CmdArgs.push_back("-lgcc_pic");
7118 if (!Args.hasArg(options::OPT_shared))
7119 CmdArgs.push_back("-lgcc");
7120 } else {
7121 CmdArgs.push_back("-lgcc");
7122 CmdArgs.push_back("--as-needed");
7123 CmdArgs.push_back("-lgcc_pic");
7124 CmdArgs.push_back("--no-as-needed");
7125 }
7126 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007127 } else {
John McCall65b8da02013-04-11 22:55:55 +00007128 if (Args.hasArg(options::OPT_shared)) {
7129 CmdArgs.push_back("-lgcc_pic");
7130 } else {
7131 CmdArgs.push_back("-lgcc");
7132 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007133 }
7134 }
7135
7136 if (!Args.hasArg(options::OPT_nostdlib) &&
7137 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007138 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007139 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007140 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007141 else
7142 CmdArgs.push_back(Args.MakeArgString(
7143 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007144 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007145 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007146 }
7147
Alexey Samsonov7811d192014-02-20 13:57:37 +00007148 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007149
Daniel Dunbarcc912342009-05-02 18:28:39 +00007150 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00007151 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007152 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007153}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007154
7155void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7156 const InputInfo &Output,
7157 const InputInfoList &Inputs,
7158 const ArgList &Args,
7159 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007160 ArgStringList CmdArgs;
7161
7162 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007163 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7164 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007165 } else {
7166 assert(Output.isNothing() && "Invalid output.");
7167 }
7168
7169 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007170 !Args.hasArg(options::OPT_nostartfiles) &&
7171 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007172 CmdArgs.push_back("-defaultlib:libcmt");
7173 }
7174
7175 CmdArgs.push_back("-nologo");
7176
Hans Wennborgf1a74252013-09-10 20:18:04 +00007177 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7178
7179 if (DLL) {
7180 CmdArgs.push_back(Args.MakeArgString("-dll"));
7181
7182 SmallString<128> ImplibName(Output.getFilename());
7183 llvm::sys::path::replace_extension(ImplibName, "lib");
7184 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7185 ImplibName.str()));
7186 }
7187
Peter Collingbourne32701642013-11-01 18:16:25 +00007188 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007189 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007190 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00007191 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00007192 llvm::sys::path::append(LibSanitizer, "lib", "windows");
7193 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00007194 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00007195 } else {
7196 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
7197 }
7198 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00007199 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7200 }
7201
Michael J. Spencere2f49362012-06-18 16:56:04 +00007202 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007203 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007204
7205 // Add filenames immediately.
7206 for (InputInfoList::const_iterator
7207 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7208 if (it->isFilename())
7209 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007210 else
7211 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007212 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007213
7214 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007215 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007216 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7217}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007218
7219void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7220 const InputInfo &Output,
7221 const InputInfoList &Inputs,
7222 const ArgList &Args,
7223 const char *LinkingOutput) const {
7224 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7225}
7226
Hans Wennborg188382e2013-09-20 18:16:35 +00007227// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7228// If one cannot be found, return FallbackName.
7229// We do this special search to prevent clang-cl from falling back onto itself
7230// if it's available as cl.exe on the path.
7231static std::string FindFallback(const char *FallbackName,
7232 const char *ClangProgramPath) {
7233 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7234 if (!OptPath.hasValue())
7235 return FallbackName;
7236
7237#ifdef LLVM_ON_WIN32
7238 const StringRef PathSeparators = ";";
7239#else
7240 const StringRef PathSeparators = ":";
7241#endif
7242
7243 SmallVector<StringRef, 8> PathSegments;
7244 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7245
7246 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7247 const StringRef &PathSegment = PathSegments[i];
7248 if (PathSegment.empty())
7249 continue;
7250
7251 SmallString<128> FilePath(PathSegment);
7252 llvm::sys::path::append(FilePath, FallbackName);
7253 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7254 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7255 return FilePath.str();
7256 }
7257
7258 return FallbackName;
7259}
7260
Hans Wennborg87cfa712013-09-19 20:32:16 +00007261Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7262 const InputInfo &Output,
7263 const InputInfoList &Inputs,
7264 const ArgList &Args,
7265 const char *LinkingOutput) const {
7266 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007267 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007268 CmdArgs.push_back("/c"); // Compile only.
7269 CmdArgs.push_back("/W0"); // No warnings.
7270
7271 // The goal is to be able to invoke this tool correctly based on
7272 // any flag accepted by clang-cl.
7273
7274 // These are spelled the same way in clang and cl.exe,.
7275 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7276 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007277
7278 // Optimization level.
7279 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7280 if (A->getOption().getID() == options::OPT_O0) {
7281 CmdArgs.push_back("/Od");
7282 } else {
7283 StringRef OptLevel = A->getValue();
7284 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7285 A->render(Args, CmdArgs);
7286 else if (OptLevel == "3")
7287 CmdArgs.push_back("/Ox");
7288 }
7289 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007290
7291 // Flags for which clang-cl have an alias.
7292 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7293
7294 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7295 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7296 : "/GR-");
7297 if (Args.hasArg(options::OPT_fsyntax_only))
7298 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007299 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7300 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007301
Hans Wennborg260ff402013-09-27 17:54:18 +00007302 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7303 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7304 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7305
Hans Wennborg87cfa712013-09-19 20:32:16 +00007306 // Flags that can simply be passed through.
7307 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7308 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7309
7310 // The order of these flags is relevant, so pick the last one.
7311 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7312 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7313 A->render(Args, CmdArgs);
7314
7315
7316 // Input filename.
7317 assert(Inputs.size() == 1);
7318 const InputInfo &II = Inputs[0];
7319 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7320 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7321 if (II.isFilename())
7322 CmdArgs.push_back(II.getFilename());
7323 else
7324 II.getInputArg().renderAsInput(Args, CmdArgs);
7325
7326 // Output filename.
7327 assert(Output.getType() == types::TY_Object);
7328 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7329 Output.getFilename());
7330 CmdArgs.push_back(Fo);
7331
Hans Wennborg188382e2013-09-20 18:16:35 +00007332 const Driver &D = getToolChain().getDriver();
7333 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007334
Hans Wennborg188382e2013-09-20 18:16:35 +00007335 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007336}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007337
7338
7339/// XCore Tools
7340// We pass assemble and link construction to the xcc tool.
7341
7342void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7343 const InputInfo &Output,
7344 const InputInfoList &Inputs,
7345 const ArgList &Args,
7346 const char *LinkingOutput) const {
7347 ArgStringList CmdArgs;
7348
7349 CmdArgs.push_back("-o");
7350 CmdArgs.push_back(Output.getFilename());
7351
7352 CmdArgs.push_back("-c");
7353
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007354 if (Args.hasArg(options::OPT_v))
7355 CmdArgs.push_back("-v");
7356
7357 if (Args.hasArg(options::OPT_g_Group))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007358 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007359
Robert Lytton8e95d4e2014-02-11 10:34:45 +00007360 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7361 false))
7362 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007363
7364 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7365 options::OPT_Xassembler);
7366
7367 for (InputInfoList::const_iterator
7368 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7369 const InputInfo &II = *it;
7370 CmdArgs.push_back(II.getFilename());
7371 }
7372
7373 const char *Exec =
7374 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7375 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7376}
7377
7378void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7379 const InputInfo &Output,
7380 const InputInfoList &Inputs,
7381 const ArgList &Args,
7382 const char *LinkingOutput) const {
7383 ArgStringList CmdArgs;
7384
7385 if (Output.isFilename()) {
7386 CmdArgs.push_back("-o");
7387 CmdArgs.push_back(Output.getFilename());
7388 } else {
7389 assert(Output.isNothing() && "Invalid output.");
7390 }
7391
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007392 if (Args.hasArg(options::OPT_v))
7393 CmdArgs.push_back("-v");
7394
Robert Lyttonf7e03c12014-02-13 10:34:44 +00007395 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7396 if (EH.ShouldUseExceptionTables)
7397 CmdArgs.push_back("-fexceptions");
7398
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007399 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7400
7401 const char *Exec =
7402 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7403 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7404}